#pragma once #include #include #include #include #include #include #include #include "cereal/messaging/messaging.h" enum CameraType { RoadCam = 0, DriverCam, WideRoadCam }; enum class ReplyMsgType { Info, Debug, Warning, Critical }; typedef std::function ReplayMessageHandler; void installMessageHandler(ReplayMessageHandler); void logMessage(ReplyMsgType type, const char* fmt, ...); #define rInfo(fmt, ...) ::logMessage(ReplyMsgType::Info, fmt, ## __VA_ARGS__) #define rDebug(fmt, ...) ::logMessage(ReplyMsgType::Debug, fmt, ## __VA_ARGS__) #define rWarning(fmt, ...) ::logMessage(ReplyMsgType::Warning, fmt, ## __VA_ARGS__) #define rError(fmt, ...) ::logMessage(ReplyMsgType::Critical , fmt, ## __VA_ARGS__) class MonotonicBuffer { public: MonotonicBuffer(size_t initial_size) : next_buffer_size(initial_size) {} ~MonotonicBuffer(); void *allocate(size_t bytes, size_t alignment = 16ul); void deallocate(void *p) {} private: void *current_buf = nullptr; size_t next_buffer_size = 0; size_t available = 0; std::deque buffers; static constexpr float growth_factor = 1.5; }; std::string sha256(const std::string &str); void precise_nano_sleep(int64_t nanoseconds, std::atomic &should_exit); std::string decompressBZ2(const std::string &in, std::atomic *abort = nullptr); std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic *abort = nullptr); std::string decompressZST(const std::string &in, std::atomic *abort = nullptr); std::string decompressZST(const std::byte *in, size_t in_size, std::atomic *abort = nullptr); std::string getUrlWithoutQuery(const std::string &url); size_t getRemoteFileSize(const std::string &url, std::atomic *abort = nullptr); std::string httpGet(const std::string &url, size_t chunk_size = 0, std::atomic *abort = nullptr); typedef std::function DownloadProgressHandler; void installDownloadProgressHandler(DownloadProgressHandler); bool httpDownload(const std::string &url, const std::string &file, size_t chunk_size = 0, std::atomic *abort = nullptr); std::string formattedDataSize(size_t size); std::string extractFileName(const std::string& file); std::vector split(std::string_view source, char delimiter); template std::string join(const Iterable& elements, const std::string& separator) { std::ostringstream oss; for (auto it = elements.begin(); it != elements.end(); ++it) { if (it != elements.begin()) oss << separator; oss << *it; } return oss.str(); }