diff options
author | asanoaozora <fifitaneki@hotmail.com> | 2016-10-14 17:43:53 +0200 |
---|---|---|
committer | asanoaozora <fifitaneki@hotmail.com> | 2016-10-14 17:43:53 +0200 |
commit | 86145b863cc8add76bc98085eddd51309659f76f (patch) | |
tree | a1de6ead4b858d70220afa61192d79ca8f8da0aa /src | |
parent | 275b7621fd06d3a6e8157b97e4a898a04af78f9a (diff) | |
download | poi-service-86145b863cc8add76bc98085eddd51309659f76f.tar.gz |
fix lock in poi capi and mapviewer control
Diffstat (limited to 'src')
4 files changed, 72 insertions, 59 deletions
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 ae407e2..96b1fe5 100644 --- a/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx +++ b/src/navigation/map-viewer/mapviewercontrol-plugin/genivi_mapviewer_mapviewercontrol.cxx @@ -393,24 +393,30 @@ class MapViewerControl throw DBus::ErrorNotSupported("Not yet supported"); } - void + void SetMapViewScale(const uint32_t& SessionHandle, const uint32_t& MapViewInstanceHandle, const uint16_t& ScaleID) - { + { dbg(lvl_debug,"enter\n"); - MapViewerControlObj *obj=handles[MapViewInstanceHandle]; - if (!obj) - throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); - obj->SetMapViewScale(SessionHandle, ScaleID); - } + MapViewerControlObj *obj=handles[MapViewInstanceHandle]; + if (!obj) + throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); + obj->SetMapViewScale(SessionHandle, ScaleID); + //todo: manage the isminmax indicator + MapViewScaleChanged(MapViewInstanceHandle,ScaleID,GENIVI_MAPVIEWER_INVALID); + } - void + void SetMapViewScaleByDelta(const uint32_t& SessionHandle, const uint32_t& MapViewInstanceHandle, const int16_t& ScaleDelta) - { - MapViewerControlObj *obj=handles[MapViewInstanceHandle]; - if (!obj) - throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); - obj->SetMapViewScaleByDelta(SessionHandle, ScaleDelta); - } + { + MapViewerControlObj *obj=handles[MapViewInstanceHandle]; + if (!obj) + throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); + obj->SetMapViewScaleByDelta(SessionHandle, ScaleDelta); + uint8_t current_scale; + DBusCommonAPIEnumeration is_min_max; + obj->GetMapViewScale(current_scale,is_min_max); + MapViewScaleChanged(MapViewInstanceHandle,current_scale,is_min_max); + } void GetMapViewScale(const uint32_t& MapViewInstanceHandle, uint8_t& ScaleID, DBusCommonAPIEnumeration& IsMinMax) diff --git a/src/navigation/map-viewer/mapviewercontrol-server-plugin/genivi_mapviewer_mapviewercontrol.cxx b/src/navigation/map-viewer/mapviewercontrol-server-plugin/genivi_mapviewer_mapviewercontrol.cxx index d63a924..38c2856 100644 --- a/src/navigation/map-viewer/mapviewercontrol-server-plugin/genivi_mapviewer_mapviewercontrol.cxx +++ b/src/navigation/map-viewer/mapviewercontrol-server-plugin/genivi_mapviewer_mapviewercontrol.cxx @@ -75,11 +75,16 @@ using namespace v4::org::genivi::navigation::navigationcore; using namespace v4::org::genivi::navigation; using namespace v4::org::genivi; -static NavigationTypes::Handle m_navigationcore_session; - class MapViewerControlServerStub; class MapMatchedPositionClientProxy; class RoutingClientProxy; +class NavigationCoreSessionClientProxy; + +static std::shared_ptr < CommonAPI::Runtime > runtime; +static NavigationTypes::Handle m_navigationcore_session; +static MapMatchedPositionClientProxy *mp_mapMatchedPositionClientProxy; +static RoutingClientProxy* mp_routingClientProxy; +static NavigationCoreSessionClientProxy* mp_navigationCoreSessionClientProxy; class DisplayedRoute { @@ -117,8 +122,6 @@ class MapViewerControlObj bool m_follow_car; MapViewerControlServerStub *mp_mapviewercontrol; std::vector<DisplayedRoute *> m_displayed_routes; - MapMatchedPositionClientProxy *mp_mapMatchedPositionClientProxy; - RoutingClientProxy* mp_routingClientProxy; struct point m_pan; int m_pan_action; @@ -164,9 +167,8 @@ class MapViewerControlObj static std::map<uint32_t, MapViewerControlObj *> mp_handles; -static std::shared_ptr < CommonAPI::Runtime > runtime; - static void positionVehicleNavitUpdate(std::shared_ptr<MapMatchedPositionProxyDefault> pos, struct vehicle *v); + class MapMatchedPositionClientProxy { public: @@ -189,10 +191,9 @@ class MapMatchedPositionClientProxy { myServiceMapMatchedPosition = runtime->buildProxy<MapMatchedPositionProxy>(domain, instance); -// not working correctly (blocked) so removed for the moment -// while (!myServiceRouting->isAvailable()) { -// usleep(10); -// } + while (!myServiceMapMatchedPosition->isAvailable()) { + usleep(10); + } } void setListeners() @@ -254,10 +255,9 @@ class RoutingClientProxy RoutingClientProxy(const std::string & domain, const std::string & instance) { myServiceRouting = runtime->buildProxy<RoutingProxy>(domain, instance); -// not working correctly (blocked) so removed for the moment -// while (!myServiceRouting->isAvailable()) { -// usleep(10); -// } + while (!myServiceRouting->isAvailable()) { + usleep(10); + } } void connectToMapViewer(MapViewerControlObj *obj) @@ -287,7 +287,6 @@ class RoutingClientProxy void routeCalculationSuccessful(const NavigationTypes::Handle& RouteHandle, const Routing::UnfullfilledRoutePreference& unfullfilledPreferences) { std::vector<DisplayedRoute *>::iterator it; - for (it=m_mapviewerobj->m_displayed_routes.begin() ; it < m_mapviewerobj->m_displayed_routes.end(); it++ ) { if (*it && (*it)->m_handle == RouteHandle) { (*it)->Hide(); @@ -309,15 +308,12 @@ class NavigationCoreSessionClientProxy { myServiceNavigationCoreSession = runtime->buildProxy<SessionProxy>(domain, instance); -// not working correctly (blocked) so removed for the moment -// while (!myServiceRouting->isAvailable()) { -// usleep(10); -// } + while (!myServiceNavigationCoreSession->isAvailable()) { + usleep(10); + } } }; -static NavigationCoreSessionClientProxy* mp_navigationCoreSessionClientProxy; - class MapViewerControlServerStub : public MapViewerControlStubDefault { public: @@ -721,6 +717,8 @@ class MapViewerControlServerStub : public MapViewerControlStubDefault if (!obj) throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); obj->SetMapViewScale(_sessionHandle, _scaleID); + //todo: manage the isminmax indicator + fireMapViewScaleChangedEvent(_mapViewInstanceHandle,_scaleID,MapViewerControl::MapScaleType::INVALID); _reply(); } @@ -733,6 +731,10 @@ class MapViewerControlServerStub : public MapViewerControlStubDefault if (!obj) throw DBus::ErrorInvalidArgs("Invalid mapviewinstance handle"); obj->SetMapViewScaleByDelta(_sessionHandle, _scaleDelta); + uint8_t current_scale; + MapViewerControl::MapScaleType is_min_max; + obj->GetMapViewScale(current_scale,is_min_max); + fireMapViewScaleChangedEvent(_mapViewInstanceHandle,current_scale,is_min_max); _reply(); } @@ -1448,15 +1450,14 @@ MapViewerControlObj::SetMapViewBoundingBox(NavigationTypes::Handle SessionHandle struct coord_rect r; struct coord_geo g; SetFollowCarMode(SessionHandle, false); - dbg(lvl_debug,"%f,%f-%f,%f\n",boundingBox._1._1,boundingBox._1._2,boundingBox._2._1,boundingBox._2._2); g.lat=boundingBox.getTopLeft().getLatitude(); g.lng=boundingBox.getTopLeft().getLongitude(); - transform_from_geo(projection_mg, &g, &r.lu); + transform_from_geo(projection_mg, &g, &r.lu); g.lat=boundingBox.getBottomRight().getLatitude(); - g.lng=boundingBox.getBottomRight().getLatitude(); - transform_from_geo(projection_mg, &g, &r.rl); + g.lng=boundingBox.getBottomRight().getLongitude(); + transform_from_geo(projection_mg, &g, &r.rl); dbg(lvl_debug,"0x%x,0x%x-0x%x,0x%x\n",r.lu.x,r.lu.y,r.rl.x,r.rl.y); - navit_zoom_to_rect(m_navit.u.navit, &r); + navit_zoom_to_rect(m_navit.u.navit, &r); } void @@ -1628,13 +1629,8 @@ MapViewerControlObj::MapViewerControlObj(MapViewerControlServerStub *mapviewerco m_force_draw=false; m_perspective=MapViewerControl::MapPerspective::PERSPECTIVE_2D; m_follow_car=true; - m_navigationcore_session = NavigationTypes::BasicEnum::INVALID; - //init the routing client - const std::string domain = "local"; - const std::string instanceRouting = "Routing"; - mp_routingClientProxy = new RoutingClientProxy(domain,instanceRouting); - mp_routingClientProxy->setListeners(); + //connect the routing client to map viewer mp_routingClientProxy->connectToMapViewer(this); struct attr navit_template; struct attr navit_flags={attr_flags};navit_flags.u.num=2; @@ -1646,7 +1642,7 @@ MapViewerControlObj::MapViewerControlObj(MapViewerControlServerStub *mapviewerco m_navit.u.navit=navit_new(NULL,navit_attrs); if (!m_navit.u.navit) { dbg(lvl_debug,"failed to create new navit instance\n"); - return; + return; } const char *graphics=getenv("NAVIT_GRAPHICS"); if (!graphics) @@ -1692,12 +1688,9 @@ MapViewerControlObj::MapViewerControlObj(MapViewerControlServerStub *mapviewerco m_vehicle.u.vehicle=vehicle_new(&m_navit,vehicle_attrs); navit_add_attr(m_navit.u.navit, &m_vehicle); navit_set_attr(m_navit.u.navit, &m_vehicle); - - // init the map matched position client - const std::string instanceMapMatchedPosition = "MapMatchedPosition"; - mp_mapMatchedPositionClientProxy = new MapMatchedPositionClientProxy(domain,instanceMapMatchedPosition); - mp_mapMatchedPositionClientProxy->setListeners(); + //connect the map matched position client to map viewer mp_mapMatchedPositionClientProxy->connectToMapViewer(this); + // and connect it to the vehicle mp_mapMatchedPositionClientProxy->connectToVehicle(m_vehicle.u.vehicle); navit_init(m_navit.u.navit); graphics_get_data(m_graphics.u.graphics,"window"); @@ -1845,7 +1838,7 @@ void DisplayedRoute::WriteSegment(FILE *out) { if (m_coordinates.size()) { - int i; + size_t i; uint32_t header[3]={2+2*m_coordinates.size(),type_street_route,2*m_coordinates.size()}; fwrite(header, sizeof(header), 1, out); for (i = 0 ; i < m_coordinates.size() ; i++) @@ -1871,8 +1864,8 @@ DisplayedRoute::DisplayedRoute(class MapViewerControlObj *mapviewer, uint8_t Rou m_shown=false; uint32_t totalNumberOfSegments; CommonAPI::CallStatus status; - mapviewer->mp_routingClientProxy->myServiceRouting->getRouteSegments(RouteHandle, 1, valuesToReturn, 0xffffffff, 0, status,totalNumberOfSegments, RouteShape); - m_filename=g_strdup_printf("/tmp/genivi_route_map_%d_%d.bin",mapviewer->m_handle,RouteHandle); + mp_routingClientProxy->myServiceRouting->getRouteSegments(RouteHandle, 1, valuesToReturn, 0xffffffff, 0, status,totalNumberOfSegments, RouteShape); + m_filename=g_strdup_printf("/tmp/genivi_route_map_%d_%d.bin",mapviewer->m_handle,RouteHandle); FILE *f=fopen(m_filename,"w"); int count=RouteShape.size(); bool complete=true; @@ -1935,6 +1928,16 @@ plugin_init(void) const std::string instanceNavigationCoreSession = "Session"; mp_navigationCoreSessionClientProxy = new NavigationCoreSessionClientProxy(domain,instanceNavigationCoreSession); + //init the routing client + const std::string instanceRouting = "Routing"; + mp_routingClientProxy = new RoutingClientProxy(domain,instanceRouting); + mp_routingClientProxy->setListeners(); + + // init the map matched position client + const std::string instanceMapMatchedPosition = "MapMatchedPosition"; + mp_mapMatchedPositionClientProxy = new MapMatchedPositionClientProxy(domain,instanceMapMatchedPosition); + mp_mapMatchedPositionClientProxy->setListeners(); + #if LM if (ilm_init() != ILM_SUCCESS) { dbg(lvl_error,"error on ilm_init\n"); diff --git a/src/navigation/navigation-core/poicam-server-plugin/genivi_poiservice_cam_navit.cxx b/src/navigation/navigation-core/poicam-server-plugin/genivi_poiservice_cam_navit.cxx index 98d4dca..0f98611 100644 --- a/src/navigation/navigation-core/poicam-server-plugin/genivi_poiservice_cam_navit.cxx +++ b/src/navigation/navigation-core/poicam-server-plugin/genivi_poiservice_cam_navit.cxx @@ -444,9 +444,13 @@ plugin_init(void) const std::string instancePOIContentAccess = "POIContentAccess"; myServicePOIContentAccess = runtime->buildProxy<POIContentAccessProxy>(domain, instancePOIContentAccess); - while (!myServicePOIContentAccess->isAvailable()) { + uint8_t counter=0; + while (!myServicePOIContentAccess->isAvailable() && ++counter<100) { usleep(10); } - myServicePOIContentAccessModule->register_cam(); + if (counter<100) + myServicePOIContentAccessModule->register_cam(); + else + printf("NB: POIContentAccessModule not available\n"); } diff --git a/src/navigation/navigation-core/routing-server-plugin/genivi_navigationcore_routing.cxx b/src/navigation/navigation-core/routing-server-plugin/genivi_navigationcore_routing.cxx index 5f1426d..bef3b16 100644 --- a/src/navigation/navigation-core/routing-server-plugin/genivi_navigationcore_routing.cxx +++ b/src/navigation/navigation-core/routing-server-plugin/genivi_navigationcore_routing.cxx @@ -738,10 +738,10 @@ get_map(struct coord *c, struct item *item, int is_end, const std::vector< Routi map[Routing::RouteSegmentType::DISTANCE]=(double)length.u.num; } if (item_attr_get(item, attr_time, &time) && vector_contains(valuesToReturn, Routing::RouteSegmentType::TIME)) { - map[Routing::RouteSegmentType::TIME]=(uint32_t)((time.u.num+5)/10); + map[Routing::RouteSegmentType::TIME]=(uint16_t)((time.u.num+5)/10); } if (item_attr_get(item, attr_speed, &speed) && vector_contains(valuesToReturn, Routing::RouteSegmentType::SPEED)) { - map[Routing::RouteSegmentType::SPEED]=(uint32_t)speed.u.num; + map[Routing::RouteSegmentType::SPEED]=(uint16_t)speed.u.num; } } if (item && vector_contains(valuesToReturn, Routing::RouteSegmentType::ROAD_NAME)) { |