|  |  |  | @ -39,6 +39,8 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #define Encoder RawLogger | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | namespace { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | constexpr int MAIN_BITRATE = 5000000; | 
			
		
	
		
			
				
					|  |  |  |  | constexpr int MAIN_FPS = 20; | 
			
		
	
		
			
				
					|  |  |  |  | #ifndef QCOM2 | 
			
		
	
	
		
			
				
					|  |  |  | @ -51,6 +53,10 @@ constexpr int DCAM_BITRATE = MAIN_BITRATE; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define NO_CAMERA_PATIENCE 500 // fall back to time-based rotation if all cameras are dead
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const int SEGMENT_LENGTH = getenv("LOGGERD_TEST") ? atoi(getenv("LOGGERD_SEGMENT_LENGTH")) : 60; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | ExitHandler do_exit; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = { | 
			
		
	
		
			
				
					|  |  |  |  |   [LOG_CAMERA_ID_FCAMERA] = { | 
			
		
	
		
			
				
					|  |  |  |  |     .stream_type = VISION_STREAM_YUV_BACK, | 
			
		
	
	
		
			
				
					|  |  |  | @ -96,13 +102,6 @@ LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = { | 
			
		
	
		
			
				
					|  |  |  |  |   }, | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | namespace { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | constexpr int SEGMENT_LENGTH = 60; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | ExitHandler do_exit; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class RotateState { | 
			
		
	
		
			
				
					|  |  |  |  | public: | 
			
		
	
		
			
				
					|  |  |  |  |   SubSocket* fpkt_sock; | 
			
		
	
	
		
			
				
					|  |  |  | @ -311,9 +310,7 @@ void encoder_thread(int cam_idx) { | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static int clear_locks_fn(const char* fpath, const struct stat *sb, int tyupeflag) { | 
			
		
	
		
			
				
					|  |  |  |  | int clear_locks_fn(const char* fpath, const struct stat *sb, int tyupeflag) { | 
			
		
	
		
			
				
					|  |  |  |  |   const char* dot = strrchr(fpath, '.'); | 
			
		
	
		
			
				
					|  |  |  |  |   if (dot && strcmp(dot, ".lock") == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |     unlink(fpath); | 
			
		
	
	
		
			
				
					|  |  |  | @ -321,19 +318,16 @@ static int clear_locks_fn(const char* fpath, const struct stat *sb, int tyupefla | 
			
		
	
		
			
				
					|  |  |  |  |   return 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void clear_locks() { | 
			
		
	
		
			
				
					|  |  |  |  | void clear_locks() { | 
			
		
	
		
			
				
					|  |  |  |  |   ftw(LOG_ROOT.c_str(), clear_locks_fn, 16); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | } // namespace
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int main(int argc, char** argv) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   setpriority(PRIO_PROCESS, 0, -12); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   int segment_length = SEGMENT_LENGTH; | 
			
		
	
		
			
				
					|  |  |  |  |   if (getenv("LOGGERD_TEST")) { | 
			
		
	
		
			
				
					|  |  |  |  |     segment_length = atoi(getenv("LOGGERD_SEGMENT_LENGTH")); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   clear_locks(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // setup messaging
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -464,7 +458,7 @@ int main(int argc, char** argv) { | 
			
		
	
		
			
				
					|  |  |  |  |         new_segment = true; | 
			
		
	
		
			
				
					|  |  |  |  |         for (auto &r : s.rotate_state) { | 
			
		
	
		
			
				
					|  |  |  |  |           // this *should* be redundant on tici since all camera frames are synced
 | 
			
		
	
		
			
				
					|  |  |  |  |           new_segment &= (((r.stream_frame_id >= r.last_rotate_frame_id + segment_length * MAIN_FPS) && | 
			
		
	
		
			
				
					|  |  |  |  |           new_segment &= (((r.stream_frame_id >= r.last_rotate_frame_id + SEGMENT_LENGTH * MAIN_FPS) && | 
			
		
	
		
			
				
					|  |  |  |  |                           (!r.should_rotate) && (r.initialized)) || | 
			
		
	
		
			
				
					|  |  |  |  |                           (!r.enabled)); | 
			
		
	
		
			
				
					|  |  |  |  | #ifndef QCOM2 | 
			
		
	
	
		
			
				
					|  |  |  | @ -472,7 +466,7 @@ int main(int argc, char** argv) { | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |  |         if (tms - last_rotate_tms > segment_length * 1000) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (tms - last_rotate_tms > SEGMENT_LENGTH * 1000) { | 
			
		
	
		
			
				
					|  |  |  |  |           new_segment = true; | 
			
		
	
		
			
				
					|  |  |  |  |           LOGW("no camera packet seen. auto rotated"); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |