|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <optional>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QThread>
 | 
					
						
							|  |  |  | #include <QGeoCoordinate>
 | 
					
						
							|  |  |  | #include <QGeoManeuver>
 | 
					
						
							|  |  |  | #include <QGeoRouteRequest>
 | 
					
						
							|  |  |  | #include <QGeoRouteSegment>
 | 
					
						
							|  |  |  | #include <QGeoRoutingManager>
 | 
					
						
							|  |  |  | #include <QGeoServiceProvider>
 | 
					
						
							|  |  |  | #include <QTimer>
 | 
					
						
							|  |  |  | #include <QMapboxGL>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "cereal/messaging/messaging.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RouteEngine : public QObject {
 | 
					
						
							|  |  |  |   Q_OBJECT
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public:
 | 
					
						
							|  |  |  |   RouteEngine();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SubMaster *sm;
 | 
					
						
							|  |  |  |   PubMaster *pm;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QTimer* msg_timer;
 | 
					
						
							|  |  |  |   QTimer* route_timer;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::optional<int> ui_pid;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Route
 | 
					
						
							|  |  |  |   bool gps_ok = false;
 | 
					
						
							|  |  |  |   QGeoServiceProvider *geoservice_provider;
 | 
					
						
							|  |  |  |   QGeoRoutingManager *routing_manager;
 | 
					
						
							|  |  |  |   QGeoRoute route;
 | 
					
						
							|  |  |  |   QGeoRouteSegment segment;
 | 
					
						
							|  |  |  |   QMapbox::Coordinate nav_destination;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Position
 | 
					
						
							|  |  |  |   std::optional<QMapbox::Coordinate> last_position;
 | 
					
						
							|  |  |  |   std::optional<float> last_bearing;
 | 
					
						
							|  |  |  |   bool localizer_valid = false;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Route recompute
 | 
					
						
							|  |  |  |   bool active = false;
 | 
					
						
							|  |  |  |   int recompute_backoff = 0;
 | 
					
						
							|  |  |  |   int recompute_countdown = 0;
 | 
					
						
							|  |  |  |   void calculateRoute(QMapbox::Coordinate destination);
 | 
					
						
							|  |  |  |   void clearRoute();
 | 
					
						
							|  |  |  |   bool shouldRecompute();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private slots:
 | 
					
						
							|  |  |  |   void routeUpdate();
 | 
					
						
							|  |  |  |   void msgUpdate();
 | 
					
						
							|  |  |  |   void routeCalculated(QGeoRouteReply *reply);
 | 
					
						
							|  |  |  |   void recomputeRoute();
 | 
					
						
							|  |  |  |   void sendRoute();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | signals:
 | 
					
						
							|  |  |  |   void positionUpdated(QMapbox::Coordinate position, float bearing);
 | 
					
						
							|  |  |  |   void routeUpdated(QList<QGeoCoordinate> coordinates);
 | 
					
						
							|  |  |  | };
 |