From e31de24c6f882a41ed13086712e97539cbf7b1a2 Mon Sep 17 00:00:00 2001 From: asanoaozora Date: Thu, 31 Aug 2017 17:25:00 +0200 Subject: fix bug on successive guidance launches with create/delete route The bug has been fixed by a navit patch :-( it still needs to be investigated with navit team --- .../genivi_mapviewer_mapviewercontrol.cxx | 10 +- .../genivi_navigationcore_guidance.cxx | 131 +++--- .../genivi_navigationcore_locationinput.cxx | 4 +- .../genivi_navigationcore_routing.cxx | 4 +- ...on-guidance-when-delete-and-recreate-route.diff | 13 + .../poi-cam/genivi_poiservice_cam_navit.cxx | 26 +- src/navigation/update_navit.sh | 1 + src/navigation/update_third_party.sh | 2 +- test/navigation/resource/location-poi.xml | 10 + test/navigation/script/lbs-api-test.e4p | 3 +- test/navigation/script/test-all | 12 +- test/navigation/script/test-guidance.py | 2 +- test/navigation/script/test-poi-guidance.py | 450 +++++++++++++++++++++ test/navigation/script/test-poi.py | 2 + 14 files changed, 576 insertions(+), 94 deletions(-) create mode 100644 src/navigation/patches/avoid-crash-on-guidance-when-delete-and-recreate-route.diff create mode 100644 test/navigation/resource/location-poi.xml create mode 100755 test/navigation/script/test-poi-guidance.py diff --git a/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx b/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx index a26583a..6082063 100644 --- a/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx +++ b/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx @@ -1048,7 +1048,7 @@ MapViewerControlObj::SetMapViewPerspective(uint32_t SessionHandle, uint16_t MapV transform_set_pitch(trans, 40); break; } - navit_draw_async(m_navit.u.navit, 1); + navit_draw(m_navit.u.navit); } } @@ -1266,7 +1266,7 @@ MapViewerControlObj::SetCameraHeadingAngle(uint32_t sessionHandle, int32_t angle struct attr orientation={attr_orientation}; orientation.u.num=angle; navit_set_attr(m_navit.u.navit, &orientation); - navit_draw_async(m_navit.u.navit, 1); + navit_draw(m_navit.u.navit); } void @@ -1356,7 +1356,7 @@ MapViewerControlObj::SetCameraHeadingTrackUp(uint32_t sessionHandle) struct attr orientation={attr_orientation}; orientation.u.num=-1; navit_set_attr(m_navit.u.navit, &orientation); - navit_draw_async(m_navit.u.navit, 1); + navit_draw(m_navit.u.navit); } void @@ -1368,7 +1368,7 @@ MapViewerControlObj::SetTargetPoint(uint32_t SessionHandle, ::DBus::Struct< doub g.lat=target._1; g.lng=target._2; navit_set_attr(m_navit.u.navit, ¢er); - navit_draw_async(m_navit.u.navit, 1); + navit_draw(m_navit.u.navit); } void @@ -1877,7 +1877,7 @@ DisplayedRoute::WriteSegment(FILE *out) { if (m_coordinates.size()) { int i; - uint32_t header[3]={2+2*m_coordinates.size(),type_street_route,2*m_coordinates.size()}; + uint32_t header[3]={2+2*(uint32_t)m_coordinates.size(),type_street_route,2*(uint32_t)m_coordinates.size()}; fwrite(header, sizeof(header), 1, out); for (i = 0 ; i < m_coordinates.size() ; i++) fwrite(&m_coordinates[i], sizeof(struct coord), 1, out); diff --git a/src/navigation/navigation-core/guidance-plugin/genivi_navigationcore_guidance.cxx b/src/navigation/navigation-core/guidance-plugin/genivi_navigationcore_guidance.cxx index 42a649a..cc64b72 100644 --- a/src/navigation/navigation-core/guidance-plugin/genivi_navigationcore_guidance.cxx +++ b/src/navigation/navigation-core/guidance-plugin/genivi_navigationcore_guidance.cxx @@ -106,7 +106,8 @@ class GuidanceObj public: struct callback *m_guidance_callback; struct attr m_route, m_vehicleprofile, m_tracking_callback; - uint32_t m_session,m_route_handle; + struct attr m_vehicle_speed; + uint32_t m_session,m_route_handle; Guidance *m_guidance; #if (SPEECH_ENABLED) SpeechOutput *m_speechoutput; @@ -133,8 +134,6 @@ class GuidanceObj }; void GuidanceObj_Callback(GuidanceObj *obj); -static class GuidanceObj *s_guidance; -static struct attr vehicle_speed={attr_speed,(char *)40}; static struct navit * get_navit(void) @@ -218,12 +217,11 @@ class Guidance void StartGuidance(const uint32_t& SessionHandle, const uint32_t& RouteHandle) { - dbg(lvl_debug,"enter\n"); if (m_guidance_active) { - dbg(lvl_debug,"guidance already active\n"); - throw DBus::ErrorFailed("guidance already active"); + LOG_ERROR_MSG(gCtx,"guidance already active"); + throw DBus::ErrorFailed("guidance already active"); } else { - s_guidance=new GuidanceObj(this, SessionHandle, RouteHandle); + mp_guidance=new GuidanceObj(this, SessionHandle, RouteHandle); m_guidance_active=true; LOG_INFO_MSG(gCtx,"Guidance started"); } @@ -232,12 +230,11 @@ class Guidance void StopGuidance(const uint32_t& SessionHandle) { - dbg(lvl_debug,"enter\n"); if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); - throw DBus::ErrorFailed("no guidance active"); + LOG_ERROR_MSG(gCtx,"no guidance active"); + throw DBus::ErrorFailed("no guidance active"); } else { - delete(s_guidance); + delete(mp_guidance); m_guidance_active=false; LOG_INFO_MSG(gCtx,"Guidance stopped"); } @@ -246,12 +243,11 @@ class Guidance void GetDestinationInformation(uint32_t& offset, uint32_t& travelTime, int32_t& direction, int32_t& side, int16_t& timeZone, int16_t& daylightSavingTime) { - dbg(lvl_debug,"enter\n"); if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); - throw DBus::ErrorFailed("no guidance active"); + LOG_ERROR_MSG(gCtx,"no guidance active"); + throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->GetDestinationInformation(offset, travelTime, direction, timeZone); + mp_guidance->GetDestinationInformation(offset, travelTime, direction, timeZone); } } @@ -270,10 +266,10 @@ class Guidance PauseGuidance(const uint32_t& sessionHandle) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); + LOG_ERROR_MSG(gCtx,"no guidance active"); throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->PauseGuidance(sessionHandle); + mp_guidance->PauseGuidance(sessionHandle); } } @@ -281,10 +277,10 @@ class Guidance ResumeGuidance(const uint32_t& sessionHandle) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); - throw DBus::ErrorFailed("no guidance active"); + LOG_ERROR_MSG(gCtx,"no guidance active"); + throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->ResumeGuidance(sessionHandle); + mp_guidance->ResumeGuidance(sessionHandle); } } @@ -292,10 +288,10 @@ class Guidance SetVoiceGuidance(const bool& activate, const std::string& voice) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); + LOG_ERROR_MSG(gCtx,"no guidance active"); throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->SetVoiceGuidance(activate,voice); + mp_guidance->SetVoiceGuidance(activate,voice); } return(0); //not implemented yet } @@ -304,10 +300,10 @@ class Guidance GetGuidanceDetails(bool& voiceGuidance, bool& vehicleOnTheRoad, bool& isDestinationReached, int32_t& maneuver) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); - throw DBus::ErrorFailed("no guidance active"); + LOG_ERROR_MSG(gCtx,"no guidance active"); + throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->GetGuidanceDetails(voiceGuidance, vehicleOnTheRoad, isDestinationReached, maneuver); + mp_guidance->GetGuidanceDetails(voiceGuidance, vehicleOnTheRoad, isDestinationReached, maneuver); } } @@ -315,10 +311,10 @@ class Guidance PlayVoiceManeuver() { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); + LOG_ERROR_MSG(gCtx,"no guidance active"); throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->PlayVoiceManeuver(); + mp_guidance->PlayVoiceManeuver(); } return(0); //not implemented yet } @@ -333,10 +329,10 @@ class Guidance GetManeuversList(const uint16_t& requestedNumberOfManeuvers, const uint32_t& maneuverOffset, int32_t& error, uint16_t& numberOfManeuvers, std::vector< ::DBus::Struct< std::vector< ::DBus::Struct< std::string, std::vector< ::DBus::Struct< int32_t, std::string > >, std::string > >, std::string, std::string, std::string, std::string, uint16_t, int32_t, uint32_t, std::vector< ::DBus::Struct< uint32_t, uint32_t, int32_t, int32_t, std::map< int32_t, ::DBus::Struct< uint8_t, ::DBus::Variant > > > > > >& maneuversList) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); - throw DBus::ErrorFailed("no guidance active"); + LOG_ERROR_MSG(gCtx,"no guidance active"); + throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->GetManeuversList(requestedNumberOfManeuvers, maneuverOffset, numberOfManeuvers, maneuversList); + mp_guidance->GetManeuversList(requestedNumberOfManeuvers, maneuverOffset, numberOfManeuvers, maneuversList); } error=0; //not used } @@ -358,7 +354,7 @@ class Guidance GetGuidanceStatus(int32_t& guidanceStatus, uint32_t& routeHandle) { if (m_guidance_active==true) { - s_guidance->GetGuidanceStatus(guidanceStatus, routeHandle); + mp_guidance->GetGuidanceStatus(guidanceStatus, routeHandle); } else { guidanceStatus=GENIVI_NAVIGATIONCORE_INACTIVE; routeHandle=0; @@ -369,10 +365,10 @@ class Guidance SetVoiceGuidanceSettings(const int32_t& promptMode) { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); + LOG_ERROR_MSG(gCtx,"no guidance active"); throw DBus::ErrorFailed("no guidance active"); } else { - s_guidance->SetVoiceGuidanceSettings(promptMode); + mp_guidance->SetVoiceGuidanceSettings(promptMode); } return(0); //not implemented yet } @@ -381,10 +377,10 @@ class Guidance GetVoiceGuidanceSettings() { if (m_guidance_active==false) { - dbg(lvl_debug,"no guidance active\n"); + LOG_ERROR_MSG(gCtx,"no guidance active"); throw DBus::ErrorFailed("no guidance active"); } else { - return s_guidance->GetVoiceGuidanceSettings(); + return mp_guidance->GetVoiceGuidanceSettings(); } } @@ -400,6 +396,8 @@ class Guidance throw DBus::ErrorNotSupported("Not yet supported"); } + GuidanceObj *mp_guidance; + bool m_simulationMode; bool m_guidance_active; }; @@ -428,7 +426,7 @@ GuidanceObj::GetDestinationInformation(uint32_t& Distance, uint32_t& TravelTime, if (!idx) throw DBus::ErrorFailed("internal error:navigation has only one coordinate"); if (destination_time.u.num == -1 || destination_length.u.num == -1) { - dbg(lvl_debug,"time %d length %d\n",(int) destination_time.u.num, (int) destination_length.u.num); + LOG_ERROR(gCtx,"time %d length %d",(int) destination_time.u.num, (int) destination_length.u.num); throw DBus::ErrorFailed("internal error:failed to get time or length"); } Distance=destination_length.u.num; @@ -588,7 +586,7 @@ GuidanceObj::GetManeuver(struct item *item, uint32_t& DistanceToManeuver, int32_ data._2=variant_enumeration(GENIVI_NAVIGATIONCORE_RIGHT); break; default: - dbg(lvl_error,"Unable to convert type %s\n",item_to_name(item->type)); + LOG_ERROR(gCtx,"Unable to convert type %s",item_to_name(item->type)); Maneuver=GENIVI_NAVIGATIONCORE_INVALID; index = GENIVI_NAVIGATIONCORE_INVALID; data._2=variant_enumeration(GENIVI_NAVIGATIONCORE_INVALID); @@ -668,7 +666,7 @@ GuidanceObj::ResumeGuidance(uint32_t sessionHandle) GuidanceObj_Callback(this); if (vehicle) { - vehicle_set_attr(vehicle, &vehicle_speed); + vehicle_set_attr(vehicle, &m_vehicle_speed); } m_paused=false; } @@ -717,19 +715,17 @@ GuidanceObj_Callback(GuidanceObj *obj) struct attr level; struct map_rect *mr; struct item *item; - dbg(lvl_debug,"enter\n"); if (obj->m_paused) return; - mr=obj->get_map_rect(); + mr=obj->get_map_rect(); if (!mr) { LOG_ERROR_MSG(gCtx,"Failed to get map rect"); - dbg(lvl_debug,"failed to get map rect\n"); return; } item=obj->get_item(mr); if (item && item_attr_get(item, attr_level, &level)) { int maneuver; - dbg(lvl_debug,"level=%d\n",(int) level.u.num); + LOG_INFO(gCtx,"Level: %d",(int) level.u.num); switch(level.u.num) { case 3: maneuver=GENIVI_NAVIGATIONCORE_PASSED; @@ -750,7 +746,6 @@ GuidanceObj_Callback(GuidanceObj *obj) LOG_INFO(gCtx,"Maneuver: %d",maneuver); } else { LOG_ERROR(gCtx,"Maneuver item not found: %p",item); - dbg(lvl_debug,"failed to get level item=%p\n",item); } } @@ -766,9 +761,8 @@ variant_double(double d) void GuidanceObj_TrackingCallback(GuidanceObj *obj) { - dbg(lvl_debug,"enter\n"); struct attr attr; - route_set_position_from_tracking(obj->m_route.u.route, get_tracking(), projection_mg); + route_set_position_from_tracking(obj->m_route.u.route, get_tracking(), projection_mg); if (!obj->m_paused) obj->m_guidance->PositionOnRouteChanged(0); //to do return the current offset on the route in meters from the beginning of the route @@ -806,14 +800,15 @@ GuidanceObj::GuidanceObj(Guidance *guidance, uint32_t SessionHandle, uint32_t Ro m_guidance=guidance; m_session=SessionHandle; m_route_handle=RouteHandle; - m_guidance_callback=callback_new_1(reinterpret_cast(GuidanceObj_Callback), this); - m_paused=false; + m_guidance_callback=callback_new_1(reinterpret_cast(GuidanceObj_Callback), this); + m_paused=false; m_voice_guidance=false; m_kind_of_voice="DEFAULT"; m_prompt_mode=GENIVI_NAVIGATIONCORE_MANUAL_PROMPT; m_tracking_callback.type=attr_callback; m_tracking_callback.u.callback=NULL; struct attr id={attr_id}; + m_vehicle_speed={attr_speed,(char *)40}; id.u.num=RouteHandle; struct attr *in[]={&id, NULL}; struct attr **ret=NULL; @@ -825,22 +820,21 @@ GuidanceObj::GuidanceObj(Guidance *guidance, uint32_t SessionHandle, uint32_t Ro #endif if (navit_get_attr(navit, attr_callback_list, &callback_list, NULL)) { callback_list_call_attr_4(callback_list.u.callback_list, attr_command, "navit_genivi_get_route", in, &ret, NULL); - if (ret && ret[0] && ret[1] && ret[0]->type == attr_route && ret[1]->type == attr_vehicleprofile) { + if (ret && ret[0] && ret[1] && ret[0]->type == attr_route && ret[1]->type == attr_vehicleprofile) { struct tracking *tracking=get_tracking(); - m_route=*ret[0]; - m_vehicleprofile=*ret[1]; + m_route=*ret[0]; + m_vehicleprofile=*ret[1]; m_tracking_callback.u.callback=callback_new_attr_1(reinterpret_cast(GuidanceObj_TrackingCallback), attr_position_coord_geo, this); - tracking_add_attr(tracking, &m_tracking_callback); - struct vehicle *demo=get_vehicle("demo:"); - if (demo) { - vehicle_set_attr(demo, &m_route); - vehicle_set_attr(demo, &vehicle_speed); + tracking_add_attr(tracking, &m_tracking_callback); + struct vehicle *vehicle=get_vehicle("demo:"); + if (vehicle) { + vehicle_set_attr(vehicle, &m_route); + vehicle_set_attr(vehicle, &m_vehicle_speed); } - navigation_set_route(get_navigation(), m_route.u.route); - tracking_set_route(get_tracking(), m_route.u.route); - navigation_register_callback(get_navigation(), attr_navigation_speech, m_guidance_callback); - GuidanceObj_Callback(this); - } + tracking_set_route(get_tracking(), m_route.u.route); + navigation_set_route(get_navigation(), m_route.u.route); + navigation_register_callback(get_navigation(), attr_navigation_speech, m_guidance_callback); + } g_free(ret); } m_guidance->GuidanceStatusChanged(GENIVI_NAVIGATIONCORE_ACTIVE, RouteHandle); @@ -849,16 +843,23 @@ GuidanceObj::GuidanceObj(Guidance *guidance, uint32_t SessionHandle, uint32_t Ro GuidanceObj::~GuidanceObj() { - if (m_tracking_callback.u.callback) { + navigation_unregister_callback(get_navigation(), attr_navigation_speech, m_guidance_callback); + + struct vehicle *vehicle=get_vehicle("demo:"); + if (vehicle) { + vehicle_remove_attr(vehicle,&m_route); + vehicle_remove_attr(vehicle,&m_vehicle_speed); + } + + if (m_tracking_callback.u.callback) { struct tracking *tracking=get_tracking(); if (tracking) tracking_remove_attr(tracking, &m_tracking_callback); callback_destroy(m_tracking_callback.u.callback); } - if (m_guidance_callback) { - navigation_unregister_callback(get_navigation(), attr_navigation_speech, m_guidance_callback); - callback_destroy(m_guidance_callback); - } + + callback_destroy(m_guidance_callback); + m_guidance->GuidanceStatusChanged(GENIVI_NAVIGATIONCORE_INACTIVE, m_route_handle); #if (SPEECH_ENABLED) delete(m_speechoutput); diff --git a/src/navigation/navigation-core/locationinput-plugin/genivi_navigationcore_locationinput.cxx b/src/navigation/navigation-core/locationinput-plugin/genivi_navigationcore_locationinput.cxx index 7cdfa95..ea1458b 100644 --- a/src/navigation/navigation-core/locationinput-plugin/genivi_navigationcore_locationinput.cxx +++ b/src/navigation/navigation-core/locationinput-plugin/genivi_navigationcore_locationinput.cxx @@ -294,7 +294,7 @@ LocationInputObj::Spell(uint32_t SessionHandle, const std::string& InputCharacte char *newstr; const char *input=InputCharacter.c_str(); int len=strlen(input)+1; - LOG_DEBUG(gCtx,"Input '%s' (%d)",input,strlen(input)); + LOG_DEBUG(gCtx,"Input '%s' (%lu)",input,strlen(input)); if (m_search.u.str && strlen(m_search.u.str)) { const char *i=input; char c; @@ -318,7 +318,7 @@ LocationInputObj::Spell(uint32_t SessionHandle, const std::string& InputCharacte newstr=NULL; } g_free(m_search.u.str); - LOG_DEBUG(gCtx,"Search string '%s' (%d)",newstr,strlen(newstr)); + LOG_DEBUG(gCtx,"Search string '%s' (%lu)",newstr,strlen(newstr)); m_search.u.str=newstr; m_windowsize=MaxWindowSize; diff --git a/src/navigation/navigation-core/routing-plugin/genivi_navigationcore_routing.cxx b/src/navigation/navigation-core/routing-plugin/genivi_navigationcore_routing.cxx index d2cc16f..99156d6 100644 --- a/src/navigation/navigation-core/routing-plugin/genivi_navigationcore_routing.cxx +++ b/src/navigation/navigation-core/routing-plugin/genivi_navigationcore_routing.cxx @@ -914,7 +914,7 @@ RoutingObj::RoutingObj(Routing *routing, uint32_t session, uint32_t handle) struct attr callback; m_routing=routing; - m_session=session; + m_session=session; m_handle=handle; m_route.type=attr_route; m_route.u.route=route_new(NULL, NULL); @@ -935,7 +935,7 @@ RoutingObj::~RoutingObj() callback.type=attr_callback; callback.u.callback=m_callback; - route_remove_attr(m_route.u.route, &callback); + route_remove_attr(m_route.u.route, &callback); callback_destroy(m_callback); route_destroy(m_route.u.route); } diff --git a/src/navigation/patches/avoid-crash-on-guidance-when-delete-and-recreate-route.diff b/src/navigation/patches/avoid-crash-on-guidance-when-delete-and-recreate-route.diff new file mode 100644 index 0000000..90fae7d --- /dev/null +++ b/src/navigation/patches/avoid-crash-on-guidance-when-delete-and-recreate-route.diff @@ -0,0 +1,13 @@ +Index: navit/navit/route.c +=================================================================== +--- navit/route.c (revision 5827) ++++ navit/route.c (working copy) +@@ -4103,7 +4103,7 @@ route_remove_attr(struct route *this_, struct attr *attr) + dbg(lvl_debug,"enter\n"); + switch (attr->type) { + case attr_callback: +- callback_list_remove(this_->cbl2, attr->u.callback); ++// callback_list_remove(this_->cbl2, attr->u.callback); + return 1; + case attr_vehicle: + this_->v=NULL; diff --git a/src/navigation/poi-cam/genivi_poiservice_cam_navit.cxx b/src/navigation/poi-cam/genivi_poiservice_cam_navit.cxx index 65c38f9..9680be7 100644 --- a/src/navigation/poi-cam/genivi_poiservice_cam_navit.cxx +++ b/src/navigation/poi-cam/genivi_poiservice_cam_navit.cxx @@ -174,7 +174,7 @@ class ContentAccessModule class PoiContentAccess *pca; pca=new PoiContentAccess(*conns[POI_CONTENTACCESS_CONNECTION]); int camid=pca->RegisterContentAccessModule(cam_name); - dbg(lvl_debug,"camid=%d\n",camid); + LOG_INFO(gCtx,"camid=%d",camid); std::vector< ::DBus::Struct< ::DBus::Struct< std::vector< uint32_t >, DBusCommonAPIVariant, std::string, std::string, DBusCommonAPIVariant >, std::vector< ::DBus::Struct< uint32_t, std::string, int32_t, std::vector< ::DBus::Struct< int32_t, std::string, DBusCommonAPIVariant > > > >, std::vector< ::DBus::Struct< uint32_t, std::string > > > > poiCategories1; ::DBus::Struct< ::DBus::Struct< std::vector< uint32_t >, DBusCommonAPIVariant, std::string, std::string, DBusCommonAPIVariant >, std::vector< ::DBus::Struct< uint32_t, std::string, int32_t, std::vector< ::DBus::Struct< int32_t, std::string, DBusCommonAPIVariant > > > >, std::vector< ::DBus::Struct< uint32_t, std::string > > > poiCategory; size_t i; @@ -239,7 +239,7 @@ class ContentAccessModule { struct attr label; struct coord c; - dbg(lvl_debug,"adding poi\n"); + LOG_DEBUG_MSG(gCtx,"adding poi"); ::DBus::Struct< uint32_t, std::string, uint32_t, ::DBus::Struct< double, double, double >, uint16_t, std::vector< ::DBus::Struct< uint32_t, int32_t, DBusCommonAPIVariant > > > result; ::DBus::Struct< uint32_t, int32_t, DBusCommonAPIVariant > attribute; bool stringMatched=false; @@ -372,7 +372,7 @@ class ContentAccessModule { struct attr navit; struct coord_geo g; - dbg(lvl_debug,"enter handle=%d size=%d location=%f,%f,%d string='%s' sortOption=%d\n",poiSearchHandle, maxSize, location._1,location._2,location._3, inputString.c_str(), sortOption); + LOG_DEBUG(gCtx,"enter handle=%d size=%d location=%f,%f,%f string='%s' sortOption=%d",poiSearchHandle, maxSize, location._1,location._2,location._3, inputString.c_str(), sortOption); m_max_requested_size=maxSize; m_resultList.resize(0); m_max_radius=0; @@ -380,7 +380,7 @@ class ContentAccessModule poiCategoryIdRadius categoryIdRadius; m_poiCategoriesIdRadius.clear(); for (int i = 0 ; i < poiCategories.size(); i++) { - dbg(lvl_debug,"category %d %d\n",poiCategories[i]._1,poiCategories[i]._2); + LOG_DEBUG(gCtx,"category %d %d",poiCategories[i]._1,poiCategories[i]._2); categoryIdRadius.givenId=poiCategories[i]._1; categoryIdRadius.radius=poiCategories[i]._2; m_poiCategoriesIdRadius.push_back(categoryIdRadius); @@ -388,21 +388,21 @@ class ContentAccessModule m_max_radius=poiCategories[i]._2; } for (int i = 0 ; i < poiAttributes.size(); i++) { - dbg(lvl_debug,"attribute %d %d %d %d %d\n",poiAttributes[i]._1, poiAttributes[i]._2, poiAttributes[i]._3, poiAttributes[i]._5, poiAttributes[i]._6); + LOG_DEBUG(gCtx,"attribute %d %d %d %d %d",poiAttributes[i]._1, poiAttributes[i]._2, poiAttributes[i]._3, poiAttributes[i]._5, poiAttributes[i]._6); } - dbg(lvl_debug,"max radius %d\n",m_max_radius); + LOG_DEBUG(gCtx,"max radius %d",m_max_radius); if (!m_mapset) { if (!config_get_attr(config, attr_navit, &navit, NULL)) { - dbg(lvl_debug,"failed to get navit\n"); + LOG_ERROR_MSG(gCtx,"failed to get navit"); return; } m_mapset=navit_get_mapset(navit.u.navit); } - dbg(lvl_debug,"mapset %p\n",m_mapset); + LOG_DEBUG(gCtx,"mapset %p",m_mapset); g.lat=location._1; g.lng=location._2; transform_from_geo(projection_mg, &g, &m_center); - dbg(lvl_debug,"c 0x%x,0x%x\n",m_center.x,m_center.y); + LOG_DEBUG(gCtx,"c 0x%x,0x%x",m_center.x,m_center.y); m_scale=transform_scale(m_center.y); int d=m_max_radius*10/m_scale; m_selection.next=NULL; @@ -464,8 +464,8 @@ class ContentAccessModule void PoiSearchCanceled(const uint32_t& poiSearchHandle) { - dbg(lvl_debug,"enter\n"); - } + //to do something + } void ResultListRequested(const uint8_t& camId, const uint32_t& poiSearchHandle, const std::vector< uint32_t >& attributeList, int32_t& statusValue, uint16_t& resultListSize, std::vector< ::DBus::Struct< uint32_t, std::string, uint32_t, ::DBus::Struct< double, double, double >, uint16_t, std::vector< ::DBus::Struct< uint32_t, int32_t, DBusCommonAPIVariant > > > >& resultList) @@ -507,7 +507,6 @@ class ContentAccessModule std::vector< ::DBus::Struct< ::DBus::Struct< uint32_t, std::string, ::DBus::Struct< double, double, double > >, std::vector< uint32_t >, std::vector< ::DBus::Struct< uint32_t, int32_t, DBusCommonAPIVariant > > > > PoiDetailsRequested(const std::vector< uint32_t >& source_id) { - dbg(lvl_debug,"enter\n"); std::vector< ::DBus::Struct< ::DBus::Struct< uint32_t, std::string, ::DBus::Struct< double, double, double > >, std::vector< uint32_t >, std::vector< ::DBus::Struct< uint32_t, int32_t, DBusCommonAPIVariant > > > > ret; for (int i = 0 ; i < source_id.size() ; i++) { int sid=source_id[i]; @@ -533,7 +532,6 @@ plugin_init(void) DLT_REGISTER_APP("POIC","POI CONTENT ACCESS MODULE SERVER"); DLT_REGISTER_CONTEXT(gCtx,"POIC","Global Context"); - dbg(lvl_debug,"enter\n"); event_request_system("glib","genivi_poiservice"); int i; for (i = 0 ; i < CONNECTION_AMOUNT ; i++) { @@ -549,6 +547,6 @@ plugin_init(void) try { server->register_cam(); } catch(...) { - dbg(lvl_debug,"Exception during register_cam\n"); + LOG_ERROR_MSG(gCtx,"Exception during register_cam"); } } diff --git a/src/navigation/update_navit.sh b/src/navigation/update_navit.sh index 615fb40..671aaa7 100755 --- a/src/navigation/update_navit.sh +++ b/src/navigation/update_navit.sh @@ -17,6 +17,7 @@ cd navit git checkout $navit_version patch -p0 -i ../patches/search_list_get_unique.diff patch -p0 -i ../patches/fsa_issue_padding.diff +patch -p0 -i ../patches/avoid-crash-on-guidance-when-delete-and-recreate-route.diff cd ../ diff --git a/src/navigation/update_third_party.sh b/src/navigation/update_third_party.sh index 784f8b6..712ebb4 100755 --- a/src/navigation/update_third_party.sh +++ b/src/navigation/update_third_party.sh @@ -1,7 +1,7 @@ #!/bin/bash positioning_version='9725fe1f553197042d6445997690d452a73490c0' -navit_version='28478e7f26c1a0eedc06fb4765e2f736079c6f0c' +navit_version='f5abdd317e10d56226300d001469595658a605e4' echo "version of positioning is: $positioning_version" echo "version of navit is: $navit_version" diff --git a/test/navigation/resource/location-poi.xml b/test/navigation/resource/location-poi.xml new file mode 100644 index 0000000..3bc4fda --- /dev/null +++ b/test/navigation/resource/location-poi.xml @@ -0,0 +1,10 @@ + + +46.206659 +6.1410842 +Switzerland +Genève +Rue Vallin +11 + + diff --git a/test/navigation/script/lbs-api-test.e4p b/test/navigation/script/lbs-api-test.e4p index 45e2b76..b0f184b 100644 --- a/test/navigation/script/lbs-api-test.e4p +++ b/test/navigation/script/lbs-api-test.e4p @@ -1,7 +1,7 @@ - + en_US @@ -23,6 +23,7 @@ test-location-input.py test-route-calculation.py genivi.py + test-poi-guidance.py diff --git a/test/navigation/script/test-all b/test/navigation/script/test-all index ac90fda..f762500 100755 --- a/test/navigation/script/test-all +++ b/test/navigation/script/test-all @@ -2,13 +2,13 @@ export PYTHONIOENCODING=utf-8 -result="$(./test-poi.py -l ../resource/location.xml -s "sChü" 2>&1 >/dev/null)" +result="$(./test-location-input.py -l ../resource/locations.xml 2>&1 >/dev/null)" echo $result if [[ $result != *"PASSED"* ]]; then exit 1 fi -result="$(./test-location-input.py -l ../resource/locations.xml 2>&1 >/dev/null)" +result="$(./test-address-input.py -l ../resource/location.xml 2>&1 >/dev/null)" echo $result if [[ $result != *"PASSED"* ]]; then exit 1 @@ -20,7 +20,13 @@ if [[ $result != *"PASSED"* ]]; then exit 1 fi -result="$(./test-address-input.py -l ../resource/location.xml 2>&1 >/dev/null)" +result="$(./test-poi.py -l ../resource/location.xml -s "sChü" 2>&1 >/dev/null)" +echo $result +if [[ $result != *"PASSED"* ]]; then + exit 1 +fi + +result="$(./test-poi-guidance.py -l ../resource/location-poi.xml -s "cOnT" 2>&1 >/dev/null)" echo $result if [[ $result != *"PASSED"* ]]; then exit 1 diff --git a/test/navigation/script/test-guidance.py b/test/navigation/script/test-guidance.py index 983b668..6ebfbaf 100755 --- a/test/navigation/script/test-guidance.py +++ b/test/navigation/script/test-guidance.py @@ -45,7 +45,7 @@ except dltTriggerNotBuilt: #import pdb;pdb.set_trace() #name of the test -test_name = "guidance" +test_name = "guidance/map viewer" #constants used into the script TIME_OUT = 240000 diff --git a/test/navigation/script/test-poi-guidance.py b/test/navigation/script/test-poi-guidance.py new file mode 100755 index 0000000..b62adf7 --- /dev/null +++ b/test/navigation/script/test-poi-guidance.py @@ -0,0 +1,450 @@ +#!/usr/bin/python + +""" +************************************************************************** +* @licence app begin@ +* SPDX-License-Identifier: MPL-2.0 +* +* \copyright Copyright (C) 2017, PSA GROUP +* +* \file test-poi-guidance.py +* +* \brief This simple test shows how the poi search +* could be easily tested using a python script +* +* \author Philippe Colliot +* +* \version 1.0 +* +* This Source Code Form is subject to the terms of the +* Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with +# this file, You can obtain one at http://mozilla.org/MPL/2.0/. +* List of changes: +* +* @licence end@ +************************************************************************** +""" + +import dbus +import gobject +import dbus.mainloop.glib +import xml.dom.minidom +import argparse +import sys +import os.path +import genivi +try: + from dltTrigger import * + dltTrigger=True + print('DLT signal sent') +except dltTriggerNotBuilt: + dltTrigger=False +#import pdb; pdb.set_trace() + +#name of the test +test_name = "poi search/route/guidance" + +#constants used into the script +TIME_OUT = 120000 +ID_FUEL = 256 +ID_HOTEL = 257 +ID_CAR_PARKING = 258 +ID_BAR = 259 +ID_RESTAURANT = 260 +ATTRIBUTE_SOURCE = 0 +ATTRIBUTE_PHONE = 2 +RADIUS_HOTEL = 100 #in tenth of meter ! +RADIUS_RESTAURANT = 500 +MAX_WINDOW_SIZE = 100 +OFFSET = 0 +NUMBER_OF_SEGMENTS = 500 +SPEED_FACTOR = 16 + +# List of coordinates +LATITUDE = list() +LONGITUDE = list() +ALTITUDE = list() +COUNTRY_STRING = list() +CITY_STRING = list() +STREET_STRING = list() +HOUSE_NUMBER_STRING = list() + +#add signal receivers +def routing_routeCalculationProgressUpdate_handler(routeHandle, status, percentage): + print ('Route Calculation: ' + str(int(percentage)) + ' %') + +def routing_routeCalculationSuccessful_handler(routeHandle,unfullfilledPreferences): + global g_guidance_active + print ('Route Calculation Successfull: ' + str(routeHandle)) + #get route overview + overview = g_routing_interface.GetRouteOverview(dbus.UInt32(g_route_handle),dbus.Array([dbus.Int32(genivi.TOTAL_DISTANCE),dbus.Int32(genivi.TOTAL_TIME)])) + #retrieve distance + totalDistance = dbus.Struct(overview[dbus.Int32(genivi.TOTAL_DISTANCE)]) + print ('Total Distance: ' + str(totalDistance[1]/1000) + ' km') + totalTime = dbus.Struct(overview[dbus.Int32(genivi.TOTAL_TIME)]) + m, s = divmod(totalTime[1], 60) + h, m = divmod(m, 60) + print ("Total Time: %d:%02d:%02d" % (h, m, s)) + #get route segments GetRouteSegments(const uint32_t& routeHandle, const int16_t& detailLevel, const std::vector< DBusCommonAPIEnumeration >& valuesToReturn, const uint32_t& numberOfSegments, const uint32_t& offset, uint32_t& totalNumberOfSegments, std::vector< std::map< DBusCommonAPIEnumeration, DBusCommonAPIVariant > >& routeSegments) + valuesToReturn = [dbus.Int32(genivi.ROAD_NAME), + dbus.Int32(genivi.START_LATITUDE), + dbus.Int32(genivi.END_LATITUDE), + dbus.Int32(genivi.START_LONGITUDE), + dbus.Int32(genivi.END_LONGITUDE), + dbus.Int32(genivi.DISTANCE), + dbus.Int32(genivi.TIME), + dbus.Int32(genivi.SPEED)] + numberOfSegments = NUMBER_OF_SEGMENTS + detailLevel = 0 + offset = 0 + ret = g_routing_interface.GetRouteSegments(dbus.UInt32(g_route_handle),dbus.Int16(detailLevel),dbus.Array(valuesToReturn),dbus.UInt32(numberOfSegments),dbus.UInt32(offset)) + print ("Total number of segments: " + str(ret[0]) ) + #len(ret[1]) is size + #ret[1][0][genivi.START_LATITUDE] is the start latitude + g_guidance_active = True +# pdb.set_trace() + launch_guidance(routeHandle) + +def session_sessionDeleted_handler(sessionHandle): + print('Session handle deleted: '+str(sessionHandle)) + if sessionHandle == g_navigationcore_session_handle: + exit(0) + else: + exit(1) + +def routing_routeDeleted_handler(routeHandle): + print('Route handle deleted: '+str(routeHandle)) + +def guidance_guidanceStatusChanged_handler(guidanceStatus,routeHandle): + global g_guidance_active + global g_total_amount_of_maneuvers + print('Guidance status changed: '+str(guidanceStatus)) + if guidanceStatus != genivi.ACTIVE and g_guidance_active == True: + g_guidance_active = False + g_routing_interface.DeleteRoute(dbus.UInt32(g_navigationcore_session_handle),dbus.UInt32(g_route_handle)) + g_navigationcore_session_interface.DeleteSession(dbus.UInt32(g_navigationcore_session_handle)) + else: + ret = g_guidance_interface.GetDestinationInformation() + m, s = divmod(ret[1], 60) + h, m = divmod(m, 60) + print ("Travel Time: %d:%02d:%02d" % (h, m, s)) + ret = g_guidance_interface.GetManeuversList(dbus.UInt16(10),dbus.UInt32(0)) + print ("Number of maneuvers: " +str(ret[1])) + print ("Next road to turn: " +ret[2][0][4]) + +def guidance_positionOnRouteChanged_handler(offsetOnRoute): + print ("Offset on route: " +str(offsetOnRoute)) + +def guidance_maneuverChanged_handler(maneuver): + if maneuver == genivi.PASSED: + print ("Maneuver passed ") + else: + print ("Maneuver: " +str(maneuver)) + ret = g_guidance_interface.GetDestinationInformation() + m, s = divmod(ret[1], 60) + h, m = divmod(m, 60) + print ("Travel Time: %d:%02d:%02d" % (h, m, s)) + ret = g_guidance_interface.GetManeuversList(dbus.UInt16(10),dbus.UInt32(0)) + print ("Number of maneuvers: " +str(ret[1])) + print ("Next road to turn: " +ret[2][0][4]) + #shortcut to end the guidance before reaching the destination + g_mapmatchedposition_interface.PauseSimulation(dbus.UInt32(g_navigationcore_session_handle)) + g_mapmatchedposition_interface.SetSimulationMode(dbus.UInt32(g_navigationcore_session_handle),dbus.Boolean(False)) + g_guidance_interface.StopGuidance(dbus.UInt32(g_navigationcore_session_handle)) + +def guidance_waypointReached_handler(isDestination): + print("Waypoint reached: " +str(isDestination)) + if isDestination == 1: + g_mapmatchedposition_interface.PauseSimulation(dbus.UInt32(g_navigationcore_session_handle)) + g_mapmatchedposition_interface.SetSimulationMode(dbus.UInt32(g_navigationcore_session_handle),dbus.Boolean(False)) + g_guidance_interface.StopGuidance(dbus.UInt32(g_navigationcore_session_handle)) + +def mapmatchedposition_simulationStatusChanged_handler(simulationStatus): + print ("Simulation status: " +str(simulationStatus)) + + +def poi_configurationChanged_signal_handler(changedSettings): + for changedSetting in changedSettings: + if changedSetting == genivi.LOCALE: + ret=g_poiConfiguration_interface.GetLocale() + print("language: " + ret[0]) + print("country: " + ret[1]) + print("script: " + ret[2]) + +def poi_poiStatus_signal_handler(poiSearchHandle,statusValue): + if poiSearchHandle == g_searchHandle: + if statusValue == genivi.SEARCH_FINISHED: + print("Search finished") + elif statusValue == genivi.SEARCH_NOT_STARTED: + g_poiSearch_interface.DeletePoiSearchHandle(poiSearchHandle) + launch_route_calculation(0) + +def poi_resultListChanged_signal_handler(poiSearchHandle,resultListSize): + global g_locations + global start + global destination + poiList=[] + if poiSearchHandle == g_searchHandle: + if resultListSize != 0: + ret=g_poiSearch_interface.RequestResultList(dbus.UInt32(poiSearchHandle),dbus.UInt16(OFFSET),dbus.UInt16(MAX_WINDOW_SIZE),[ATTRIBUTE_SOURCE,ATTRIBUTE_PHONE]) + if ret[0] == genivi.SEARCH_FINISHED and ret[1] >= 0: + print("Results: "+str(int(ret[1]))) + for result in ret[2]: + poiList.append(result[0]) + ret=g_poiSearch_interface.GetPoiDetails(poiList) + for resultDetail in ret: + if resultDetail[1][0] == ID_HOTEL: + print("Hotel: " +resultDetail[0][1]) + start=resultDetail[0][1] + g_locations["start"]=[resultDetail[0][2][0],resultDetail[0][2][1]] + elif resultDetail[1][0] == ID_RESTAURANT: + print("Restaurant: " +resultDetail[0][1]) + destination=resultDetail[0][1] + g_locations["destination"]=[resultDetail[0][2][0],resultDetail[0][2][1]] + g_poiSearch_interface.CancelPoiSearch(dbus.UInt32(poiSearchHandle)) + else: + print('No poi found') + g_poiSearch_interface.CancelPoiSearch(dbus.UInt32(poiSearchHandle)) + +def timeout(): + print ('Timeout Expired\n') + exit(1) + +def exit(value): + global g_exit + g_exit=value + if dltTrigger==True: + stopTrigger(test_name) + loop.quit() + +def launch_guidance(route): + g_guidance_interface.StartGuidance(dbus.UInt32(g_navigationcore_session_handle),dbus.UInt32(route)) + g_mapmatchedposition_interface.SetSimulationMode(dbus.UInt32(g_navigationcore_session_handle),dbus.Boolean(True)) + g_mapmatchedposition_interface.SetSimulationSpeed(dbus.UInt32(g_navigationcore_session_handle), dbus.Byte(SPEED_FACTOR)) + g_mapmatchedposition_interface.StartSimulation(dbus.UInt32(g_navigationcore_session_handle)) + +def launch_route_calculation(route): + global g_current_route + global g_route_handle + global g_routing_interface + global g_navigationcore_session_handle + global g_locations + global start + global destination + g_current_route = route + #get route handle + ret = g_routing_interface.CreateRoute(dbus.UInt32(g_navigationcore_session_handle)) + g_route_handle=ret[1] + print ('Route handle: ' + str(g_route_handle)) + print ('Calculating route from \ + '+start+'(' + str(g_locations["start"][0]) + ',' + str(g_locations["start"][1]) + ') to \ + '+destination+'(' + str(g_locations["destination"][0]) + ',' + str(g_locations["destination"][1]) + ')' ) + #set waypoints + waypointDoubleCapiType = 0x03 + g_routing_interface.SetWaypoints(dbus.UInt32(g_navigationcore_session_handle), \ + dbus.UInt32(g_route_handle), \ + dbus.Boolean(0), \ + dbus.Array([ \ + dbus.Dictionary({dbus.Int32(genivi.LATITUDE):dbus.Struct([dbus.Byte(waypointDoubleCapiType),dbus.Double(g_locations["start"][0])]),dbus.Int32(genivi.LONGITUDE):dbus.Struct([dbus.Byte(waypointDoubleCapiType),dbus.Double(g_locations["start"][1])])}), \ + dbus.Dictionary({dbus.Int32(genivi.LATITUDE):dbus.Struct([dbus.Byte(waypointDoubleCapiType),dbus.Double(g_locations["destination"][0])]),dbus.Int32(genivi.LONGITUDE):dbus.Struct([dbus.Byte(waypointDoubleCapiType),dbus.Double(g_locations["destination"][1])])}) \ + ]) \ + ) + + #calculate route + g_routing_interface.CalculateRoute(dbus.UInt32(g_navigationcore_session_handle),dbus.UInt32(g_route_handle)) + +print('\n--------------------------') +print('Poi Test') +print('--------------------------\n') + +#this script loads a file that could contains several locations but only uses the first one (to avoid creating specific resource) +g_exit=0 + +parser = argparse.ArgumentParser(description='Poi Test for navigation PoC and FSA.') +parser.add_argument('-l','--loc',action='store', dest='locations', help='List of locations in xml format') +parser.add_argument("-v", "--verbose", action='store_true',help='print the whole log messages') +parser.add_argument('-s','--string',action='store', dest='string', help='String to search') +args = parser.parse_args() + +if args.string == None: + print('string to search is missing, by default no string, get all') + stringToSearch='' +else: + stringToSearch=args.string + +if args.locations == None: + print('location file is missing') + print >>sys.stderr,'Test '+test_name+' FAILED' + sys.exit(1) +else: + if not os.path.isfile(args.locations): + print('file not exists') + print >>sys.stderr,'Test '+test_name+' FAILED' + sys.exit(1) + try: + DOMTree = xml.dom.minidom.parse(args.locations) + except OSError as e: + print >>sys.stderr,'Test '+test_name+' FAILED' + sys.exit(1) + location_set = DOMTree.documentElement + +print("Area : %s" % location_set.getAttribute("area")) + +locations = location_set.getElementsByTagName("location") + +for location in location_set.getElementsByTagName("location"): + LATITUDE.append(location.getElementsByTagName("latitude")[0].childNodes[0].data) + LONGITUDE.append(location.getElementsByTagName("longitude")[0].childNodes[0].data) + ALTITUDE.append(0) + COUNTRY_STRING.append(location.getElementsByTagName("country")[0].childNodes[0].data) + CITY_STRING.append(location.getElementsByTagName("city")[0].childNodes[0].data) + STREET_STRING.append(location.getElementsByTagName("street")[0].childNodes[0].data) + HOUSE_NUMBER_STRING.append(location.getElementsByTagName("number")[0].childNodes[0].data) + +if __name__ == '__main__': + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + +print("Search for hotel and restaurant with keyword: "+ stringToSearch) + +#connect to session bus +bus = dbus.SessionBus() + +bus.add_signal_receiver(routing_routeCalculationProgressUpdate_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Routing", \ + signal_name = "RouteCalculationProgressUpdate") + +bus.add_signal_receiver(routing_routeCalculationSuccessful_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Routing", \ + signal_name = "RouteCalculationSuccessful") + +bus.add_signal_receiver(routing_routeDeleted_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Routing", \ + signal_name = "RouteDeleted") + +bus.add_signal_receiver(session_sessionDeleted_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Session", \ + signal_name = "SessionDeleted") + +bus.add_signal_receiver(guidance_guidanceStatusChanged_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Guidance", \ + signal_name = "GuidanceStatusChanged") + +bus.add_signal_receiver(guidance_positionOnRouteChanged_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Guidance", \ + signal_name = "PositionOnRouteChanged") + +bus.add_signal_receiver(guidance_maneuverChanged_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Guidance", \ + signal_name = "ManeuverChanged") + +bus.add_signal_receiver(guidance_waypointReached_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.Guidance", \ + signal_name = "WaypointReached") + +bus.add_signal_receiver(mapmatchedposition_simulationStatusChanged_handler, \ + dbus_interface = "org.genivi.navigation.navigationcore.MapMatchedPosition", \ + signal_name = "SimulationStatusChanged") + +bus.add_signal_receiver(poi_configurationChanged_signal_handler, \ + dbus_interface = "org.genivi.navigation.poiservice.POIConfiguration", \ + signal_name = "ConfigurationChanged") + +bus.add_signal_receiver(poi_poiStatus_signal_handler, \ + dbus_interface = "org.genivi.navigation.poiservice.POISearch", \ + signal_name = "PoiStatus") + +bus.add_signal_receiver(poi_resultListChanged_signal_handler, \ + dbus_interface = "org.genivi.navigation.poiservice.POISearch", \ + signal_name = "ResultListChanged") + +if dltTrigger==True: + startTrigger(test_name) + +navigationcore_session_obj = bus.get_object('org.genivi.navigation.navigationcore.Session','/org/genivi/navigationcore') +g_navigationcore_session_interface = dbus.Interface(navigationcore_session_obj, dbus_interface='org.genivi.navigation.navigationcore.Session') + +routing_obj = bus.get_object('org.genivi.navigation.navigationcore.Routing','/org/genivi/navigationcore') +g_routing_interface = dbus.Interface(routing_obj, dbus_interface='org.genivi.navigation.navigationcore.Routing') + +guidance_obj = bus.get_object('org.genivi.navigation.navigationcore.Guidance','/org/genivi/navigationcore') +g_guidance_interface = dbus.Interface(guidance_obj, dbus_interface='org.genivi.navigation.navigationcore.Guidance') + +mapviewer_session_obj = bus.get_object('org.genivi.navigation.mapviewer.Session','/org/genivi/mapviewer') +g_mapviewer_session_interface = dbus.Interface(mapviewer_session_obj, dbus_interface='org.genivi.navigation.mapviewer.Session') + +mapmatchedposition_obj = bus.get_object('org.genivi.navigation.navigationcore.MapMatchedPosition','/org/genivi/navigationcore') +g_mapmatchedposition_interface = dbus.Interface(mapmatchedposition_obj, dbus_interface='org.genivi.navigation.navigationcore.MapMatchedPosition') + +poiConfiguration = bus.get_object('org.genivi.navigation.poiservice.POIConfiguration','/org/genivi/poiservice/POIConfiguration') +g_poiConfiguration_interface = dbus.Interface(poiConfiguration, dbus_interface='org.genivi.navigation.poiservice.POIConfiguration') + +poiContentAccess = bus.get_object('org.genivi.navigation.poiservice.POIContentAccess','/org/genivi/poiservice/POIContentAccess') +g_poiContentAccess_interface = dbus.Interface(poiContentAccess, dbus_interface='org.genivi.navigation.poiservice.POIContentAccess') + +poiSearch = bus.get_object('org.genivi.navigation.poiservice.POISearch','/org/genivi/poiservice/POISearch') +g_poiSearch_interface = dbus.Interface(poiSearch, dbus_interface='org.genivi.navigation.poiservice.POISearch') + +g_poiConfiguration_interface.SetLocale(dbus.String("fra"),dbus.String("FRA"),dbus.String("Latn")) + +#get navigationcore session handle +ret = g_navigationcore_session_handle = g_navigationcore_session_interface.CreateSession(dbus.String("test guidance")) +g_navigationcore_session_handle=ret[1] +print ('Navigation core session handle: ' + str(g_navigationcore_session_handle)) + +g_current_route = 0 +g_guidance_active = False +g_locations = {} +start="" +dest="" +categories=[] +ret=g_poiSearch_interface.GetAvailableCategories() +for categoryAndName in ret: + if categoryAndName[0] == ID_HOTEL or categoryAndName[0] == ID_RESTAURANT: + print("Category ID: " + str(int(categoryAndName[0]))) + categories.append(categoryAndName[0]) + print("Name: " + categoryAndName[1]) + +attributes_hotel=[] +attributes_restaurant=[] +attributesDetails=[] +ret=g_poiSearch_interface.GetCategoriesDetails(categories) +for results in ret: + if results[0][0] == ID_HOTEL: + for attribute in results[1]: + attributes_hotel.append(attribute[0]) + attributesDetails.append(dbus.Struct([dbus.UInt32(attribute[0]),dbus.UInt32(ID_HOTEL),dbus.Int32(1280),dbus.Struct([dbus.Byte(2),dbus.String("")]),dbus.Int32(1314),dbus.Boolean(False)])) + elif results[0][0] == ID_RESTAURANT: + for attribute in results[1]: + attributes_restaurant.append(attribute[0]) + attributesDetails.append(dbus.Struct([dbus.UInt32(attribute[0]),dbus.UInt32(ID_RESTAURANT),dbus.Int32(1280),dbus.Struct([dbus.Byte(2),dbus.String("")]),dbus.Int32(1314),dbus.Boolean(False)])) + +ret=g_poiSearch_interface.GetRootCategory() + +g_searchHandle=g_poiSearch_interface.CreatePoiSearchHandle() +print("Search handle: " + str(int(g_searchHandle))) + +#init the target (it's the first location in the input file by default) and test +index=0 +lat = LATITUDE[index] +lon = LONGITUDE[index] +alt = ALTITUDE[index] + +g_poiSearch_interface.SetCenter(g_searchHandle,dbus.Struct([dbus.Double(lat),dbus.Double(lon),dbus.Double(alt)])) + +g_poiSearch_interface.SetCategories(g_searchHandle,[dbus.Struct([dbus.UInt32(ID_HOTEL),dbus.UInt32(RADIUS_HOTEL)]),dbus.Struct([dbus.UInt32(ID_RESTAURANT),dbus.UInt32(RADIUS_RESTAURANT)])]) + +g_poiSearch_interface.SetAttributes(g_searchHandle,attributesDetails) + +g_poiSearch_interface.StartPoiSearch(g_searchHandle,stringToSearch,dbus.Int32(genivi.SORT_BY_DISTANCE)) + + +#main loop +gobject.timeout_add(TIME_OUT, timeout) +loop = gobject.MainLoop() +loop.run() +if g_exit == 1: + print >>sys.stderr,'Test '+test_name+' FAILED' +else: + print >>sys.stderr,'Test '+test_name+' PASSED' +sys.exit(g_exit) + diff --git a/test/navigation/script/test-poi.py b/test/navigation/script/test-poi.py index 690bea5..5c127a0 100755 --- a/test/navigation/script/test-poi.py +++ b/test/navigation/script/test-poi.py @@ -96,8 +96,10 @@ def catch_poi_resultListChanged_signal_handler(poiSearchHandle,resultListSize): for resultDetail in ret: if resultDetail[1][0] == ID_HOTEL: print("Hotel: " +resultDetail[0][1]) + print("Latitude: "+str(resultDetail[0][2][0])+" Longitude: "+str(resultDetail[0][2][1])) elif resultDetail[1][0] == ID_RESTAURANT: print("Restaurant: " +resultDetail[0][1]) + print("Latitude: "+str(resultDetail[0][2][0])+" Longitude: "+str(resultDetail[0][2][1])) g_poiSearch_interface.CancelPoiSearch(dbus.UInt32(poiSearchHandle)) else: print('No poi found') -- cgit v1.2.1