#pragma once #include #include #include #include #include #include #include #include "openpilot/cereal/messaging/messaging.h" enum CameraType { NarrowRoadCam = 0, CabinCam, 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; }; void precise_nano_sleep(int64_t nanoseconds, std::atomic &interrupt_requested); std::string getUrlWithoutQuery(const std::string &url); 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(); }