#pragma once #include #include #include #include "cereal/messaging/messaging.h" #include "common/util.h" #include "system/hardware/hw.h" class RawFile { public: RawFile(const std::string &path) { file = util::safe_fopen(path.c_str(), "wb"); assert(file != nullptr); } ~RawFile() { util::safe_fflush(file); int err = fclose(file); assert(err == 0); } inline void write(void* data, size_t size) { int written = util::safe_fwrite(data, 1, size, file); assert(written == size); } inline void write(kj::ArrayPtr array) { write(array.begin(), array.size()); } private: FILE* file = nullptr; }; typedef cereal::Sentinel::SentinelType SentinelType; class LoggerState { public: LoggerState(const std::string& log_root = Path::log_root()); ~LoggerState(); bool next(); void write(uint8_t* data, size_t size, bool in_qlog); inline int segment() const { return part; } inline const std::string& segmentPath() const { return segment_path; } inline const std::string& routeName() const { return route_name; } inline void write(kj::ArrayPtr bytes, bool in_qlog) { write(bytes.begin(), bytes.size(), in_qlog); } inline void setExitSignal(int signal) { exit_signal = signal; } protected: int part = -1, exit_signal = 0; std::string route_path, route_name, segment_path, lock_file; kj::Array init_data; std::unique_ptr rlog, qlog; }; kj::Array logger_build_init_data(); std::string logger_get_identifier(std::string key);