1#ifndef LOCATION_SERVICE_H
2#define LOCATION_SERVICE_H
36 static void getCoordinates(
double& x,
double& y, std::chrono::milliseconds timestamp = std::chrono::milliseconds::zero());
52 static bool loadTrajectoryFromCSV(
const std::string&
filename);
54 static void getCoordinatesAtTime(std::chrono::milliseconds timestamp,
double& x,
double& y);
57 static std::vector<TrajectoryPoint> _trajectory;
58 static double _manual_x, _manual_y;
59 static std::mutex _mutex;
60 static std::chrono::milliseconds _start_time;
63std::mutex LocationService::_mutex;
64std::vector<TrajectoryPoint> LocationService::_trajectory;
65double LocationService::_manual_x = 0;
66double LocationService::_manual_y = 0;
67std::chrono::milliseconds LocationService::_start_time = std::chrono::milliseconds::zero();
70 std::lock_guard<std::mutex>
lock(_mutex);
72 _start_time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().
time_since_epoch());
79 std::lock_guard<std::mutex>
lock(_mutex);
81 if (_trajectory.empty() || timestamp == std::chrono::milliseconds::zero()) {
88 getCoordinatesAtTime(timestamp, x, y);
92 auto now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().
time_since_epoch());
97 std::lock_guard<std::mutex>
lock(_mutex);
103 std::lock_guard<std::mutex>
lock(_mutex);
104 return !_trajectory.empty();
108 std::lock_guard<std::mutex>
lock(_mutex);
109 if (_trajectory.empty())
return std::chrono::milliseconds::zero();
110 return _trajectory.back().timestamp - _trajectory.front().timestamp;
113bool LocationService::loadTrajectoryFromCSV(
const std::string&
filename) {
115 if (!
file.is_open()) {
123 if (std::getline(
file,
line) &&
line.find(
"timestamp") != std::string::npos) {
132 if (
line.empty())
continue;
134 std::stringstream
ss(
line);
136 std::vector<std::string>
values;
139 while (std::getline(
ss,
cell,
',')) {
150 }
catch (
const std::exception&) {
158 std::sort(_trajectory.begin(), _trajectory.end(),
160 return a.timestamp < b.timestamp;
163 return !_trajectory.empty();
166void LocationService::getCoordinatesAtTime(std::chrono::milliseconds timestamp,
double& x,
double& y) {
167 if (_trajectory.empty()) {
174 auto it = std::upper_bound(_trajectory.begin(), _trajectory.end(), timestamp,
176 return ts < point.timestamp;
179 if (
it == _trajectory.begin()) {
181 x = _trajectory.front().x;
182 y = _trajectory.front().y;
183 }
else if (
it == _trajectory.end()) {
185 x = _trajectory.back().x;
186 y = _trajectory.back().y;
Definition location_service.h:29
static void getCurrentCoordinates(double &x, double &y)
Definition location_service.h:91
static void setCurrentCoordinates(double x, double y)
Definition location_service.h:96
static bool loadTrajectory(const std::string &csv_filename)
Definition location_service.h:69
static std::chrono::milliseconds getTrajectoryDuration()
Definition location_service.h:107
static bool hasTrajectory()
Definition location_service.h:102
static void getCoordinates(double &x, double &y, std::chrono::milliseconds timestamp=std::chrono::milliseconds::zero())
Definition location_service.h:78
Select_Debug<(Traits< T >::debugged &&Traits< Debug >::error)> db(Debug_Error l)
Definition debug.h:166
Definition location_service.h:15
double x
Definition location_service.h:16
double radius
Definition location_service.h:18
double y
Definition location_service.h:17
Definition location_service.h:21
TrajectoryPoint(long long ts_ms, double x_coord, double y_coord)
Definition location_service.h:26
double y
Definition location_service.h:24
double x
Definition location_service.h:23
std::chrono::milliseconds timestamp
Definition location_service.h:22