Program Listing for File cesium.h

Return to documentation for file (interfaces/cesium.h)

#pragma once

// Suppress warnings from crow third-party library
#ifdef __GNUC__
#  pragma GCC diagnostic push
#  pragma GCC diagnostic ignored "-Wuninitialized"
#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#endif
#ifdef __clang__
#  pragma clang diagnostic push
#  pragma clang diagnostic ignored "-Wuninitialized"
#endif

#include <crow.h>

#ifdef __GNUC__
#  pragma GCC diagnostic pop
#endif
#ifdef __clang__
#  pragma clang diagnostic pop
#endif

#include <Eigen/Dense>
#include <chrono>
#include <filesystem>
#include <mutex>
#include <nlohmann/json.hpp>
#include <string>
#include <thread>
#include <vector>

#include "lupnt/core/constants.h"
#include "lupnt/core/definitions.h"

namespace lupnt {

  struct Entity {
    std::string id;
    std::string name;
    VecX times;
    MatX3 positions;
    std::vector<int> color;
    std::string description;
    BodyId body_id;
    std::string initial_time_utc;
    int size;
  };

  class CesiumViewer {
  public:
    CesiumViewer(int port = 8080, const std::string& host = "127.0.0.1");

    ~CesiumViewer();

    void Run();

    void AddEntity(const VecX& times, const MatX3& positions,
                   const std::string& entity_id = "Entity", const std::string& name = "Entity",
                   const std::vector<int>& color = {255, 0, 255},
                   const std::string& description = "Entity orbit", BodyId body_id = BodyId::MOON,
                   int size = 5);

    void ClearEntities();

    void Stop();

  private:
    crow::SimpleApp app_;
    std::filesystem::path static_path_;
    std::string host_;
    int port_;
    std::vector<Entity> entities_;
    std::mutex mutex_;
    std::thread server_thread_;
    bool running_ = false;

    void SetupRoutes();

    std::string CreateCzmlDataForEntity(const Entity& entity);

    static std::chrono::system_clock::time_point ParseIso8601(const std::string& s);
  };

}  // namespace lupnt