1#![cfg_attr(not(feature = "std"), no_std)]
2#[cfg(not(feature = "std"))]
3extern crate alloc;
4
5use cu29_clock::RobotClock;
6use cu29_log_runtime::LoggerRuntime;
7use cu29_runtime::curuntime::CopperContext;
8use cu29_traits::{CuResult, UnifiedLogType};
9use cu29_unifiedlog::{stream_write, UnifiedLogger, UnifiedLoggerBuilder};
10use simplelog::TermLogger;
11#[cfg(debug_assertions)]
12use simplelog::{ColorChoice, Config, LevelFilter, TerminalMode};
13use std::path::Path;
14use std::sync::{Arc, Mutex};
15
16pub fn basic_copper_setup(
31 unifiedlogger_output_base_name: &Path,
32 slab_size: Option<usize>,
33 _text_log: bool,
34 clock: Option<RobotClock>,
35) -> CuResult<CopperContext> {
36 let preallocated_size = slab_size.unwrap_or(1024 * 1024 * 10);
37 let UnifiedLogger::Write(logger) = UnifiedLoggerBuilder::new()
38 .write(true)
39 .create(true)
40 .file_base_name(unifiedlogger_output_base_name)
41 .preallocated_size(preallocated_size)
42 .build()
43 .expect("Failed to create logger")
44 else {
45 panic!("Failed to create logger")
46 };
47 let unified_logger = Arc::new(Mutex::new(logger));
48 let structured_stream = stream_write(
49 unified_logger.clone(),
50 UnifiedLogType::StructuredLogLine,
51 4096 * 10,
52 )?;
53
54 #[cfg(debug_assertions)]
55 let extra: Option<TermLogger> = if _text_log {
56 let slow_text_logger = TermLogger::new(
57 LevelFilter::Debug,
58 Config::default(),
59 TerminalMode::Mixed,
60 ColorChoice::Auto,
61 );
62 Some(*slow_text_logger)
63 } else {
64 None
65 };
66
67 #[cfg(not(debug_assertions))]
68 let extra: Option<TermLogger> = None;
69
70 let clock = clock.unwrap_or_default();
71 let structured_logging = LoggerRuntime::init(clock.clone(), structured_stream, extra);
72 Ok(CopperContext {
73 unified_logger: unified_logger.clone(),
74 logger_runtime: structured_logging,
75 clock,
76 })
77}