# pragma once
# include <cassert>
# include <memory>
# include <string>
# 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 < capnp : : byte > 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 < kj : : byte > 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 < capnp : : word > init_data ;
std : : unique_ptr < RawFile > rlog , qlog ;
} ;
kj : : Array < capnp : : word > logger_build_init_data ( ) ;
std : : string logger_get_identifier ( std : : string key ) ;