#ifndef DUMMYAPI_H #define DUMMYAPI_H #include "api.h" class DummyAPI : public API { private: /** all attached listeners */ std::vector listeners; int dstID = -1; bool enabled; std::thread thread; std::string dataFolder; float speed = 1.0f; std::vector points; public: /** ctor with the folder where the data-files reside */ DummyAPI(const std::string& dataFolder) : dataFolder(dataFolder) { ; } void setSpeed(const float speed) { this->speed = speed; } void setTarget(const Point3 p) override { (void) p; throw Exception("not yet implemented!"); } void setTarget(const int id) override { const std::string fileName = dataFolder + "/" + std::to_string(id) + ".dat"; std::ifstream in(fileName); if (id == -1) {throw Exception("call setTarget(id) first!");} if (!in.good()) {throw Exception("failed to load file: '" + fileName + "'");} // load while (in.good() && !in.eof()) { float x, y, z; in >> x; in >> y; in >> z; points.push_back(Point3(x,y,z)); } } void startNavigation() override { enabled = true; dummySender(); } void stopNavigation() override { enabled = false; thread.join(); } void addListener(APIListener* l) override { listeners.push_back(l); } Point3 getDst() { return points[points.size() - 2]; } private: /** send dummy data using the given file */ void dummySender() { // run-loop auto run = [&] () { std::vector pts = points; // local copy while(!pts.empty() && enabled) { Point3 cur = pts.front(); pts.erase(pts.begin()); for (APIListener* l : listeners) {l->onPositionUpdate(cur);} std::this_thread::sleep_for(std::chrono::milliseconds( (int)(500/speed) )); } }; // run thread = std::thread(run); } }; #endif // DUMMYAPI_H