From 028de494e482d142e035be71f04a563bd727466f Mon Sep 17 00:00:00 2001 From: lkoester Date: Mon, 22 Apr 2024 15:47:25 +0200 Subject: [PATCH] got basic action stuff running, now to make error handling better --- Cargo.lock | 201 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + pytmtc/camera_params.py | 31 ++++++ pytmtc/common.py | 28 +++++- pytmtc/pus_tc.py | 56 +++++++++++ pytmtc/tc_definitions.py | 8 ++ scripts/ims100_testapp | Bin 0 -> 34280 bytes src/config.rs | 11 ++- src/handlers/camera.rs | 54 ++++++----- src/logger.rs | 11 +-- 10 files changed, 362 insertions(+), 39 deletions(-) create mode 100644 pytmtc/camera_params.py create mode 100644 scripts/ims100_testapp diff --git a/Cargo.lock b/Cargo.lock index 55bea81..23f9bab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,6 +304,95 @@ dependencies = [ "log", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -326,6 +415,20 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "homedir" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22074da8bba2ef26fc1737ae6c777b5baab5524c2dc403b5c6a76166766ccda5" +dependencies = [ + "cfg-if", + "nix", + "serde", + "widestring", + "windows-sys 0.48.0", + "wmi", +] + [[package]] name = "humantime" version = "2.1.0" @@ -410,6 +513,15 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mio" version = "0.8.11" @@ -422,6 +534,19 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -482,6 +607,7 @@ dependencies = [ "derive-new", "env_logger", "fern", + "homedir", "humantime", "lazy_static", "log", @@ -514,6 +640,18 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -693,6 +831,15 @@ dependencies = [ "serde", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "0.6.14" @@ -893,6 +1040,24 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-implement", + "windows-interface", + "windows-targets 0.52.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -902,6 +1067,28 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-implement" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + +[[package]] +name = "windows-interface" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1050,6 +1237,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "wmi" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f0a4062ca522aad4705a2948fd4061b3857537990202a8ddd5af21607f79a" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror", + "windows", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/Cargo.toml b/Cargo.toml index 46ab7bf..9626af7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ num_enum = "0.7" serde = "1" serde_json = "1" mio = "0.8" +homedir = "0.2" [dependencies.satrs] version = "0.2.0-rc.3" diff --git a/pytmtc/camera_params.py b/pytmtc/camera_params.py new file mode 100644 index 0000000..2562372 --- /dev/null +++ b/pytmtc/camera_params.py @@ -0,0 +1,31 @@ +import struct +from serde import Model, fields + +from common import EXPERIMENT_APID, UniqueId, make_addressable_id + +class CameraParameters(Model): + R: fields.Int() + G: fields.Int() + B: fields.Int() + N: fields.Int() + P: fields.Bool() + E: fields.Int() + W: fields.Int() + + def serialize_for_uplink(self) -> bytearray: + return self.to_json().encode('utf-8') + +# Example serialization +data = bytearray(make_addressable_id(EXPERIMENT_APID, UniqueId.CameraHandler)) +params = CameraParameters(8, 8, 8, 1, True, 200, 1000) +serialized = params.to_json().encode('utf-8') +byte_string = bytearray(struct.pack('!{}s'.format(len(serialized)), serialized)) +print(byte_string) +print(params.serialize_for_uplink()) +data.extend(params.serialize_for_uplink()) +print(data) + +# Example deserialization +data = '{"R": 100, "G": 150, "B": 200, "N": 3, "P": true, "E": 10, "W": 20}' +deserialized_params = CameraParameters.from_json(data) +print(deserialized_params) diff --git a/pytmtc/common.py b/pytmtc/common.py index 56b469f..b8a98dc 100644 --- a/pytmtc/common.py +++ b/pytmtc/common.py @@ -3,13 +3,29 @@ from __future__ import annotations import dataclasses import enum import struct - +from serde import Model, fields EXPERIMENT_ID = 278 EXPERIMENT_APID = 1024 + EXPERIMENT_ID +class UniqueId(enum.IntEnum): + + Controller = 0 + PusEventManagement = 1 + PusRouting = 2 + PusTest = 3 + PusAction = 4 + PusMode = 5 + PusHk = 6 + UdpServer = 7 + TcpServer = 8 + TcpSppClient = 9 + CameraHandler = 10 + + class EventSeverity(enum.IntEnum): + INFO = 0 LOW = 1 MEDIUM = 2 @@ -43,6 +59,12 @@ class AcsHkIds(enum.IntEnum): def make_addressable_id(target_id: int, unique_id: int) -> bytes: - byte_string = bytearray(struct.pack("!I", target_id)) - byte_string.extend(struct.pack("!I", unique_id)) + byte_string = bytearray(struct.pack("!I", unique_id)) + # byte_string = bytearray(struct.pack("!I", target_id)) + # byte_string.extend(struct.pack("!I", unique_id)) return byte_string + +def make_addressable_id_with_action_id(unique_id: int, action_id: int) -> bytes: + byte_string = bytearray(struct.pack("!I", unique_id)) + byte_string.extend(struct.pack("!I", action_id)) + return byte_string \ No newline at end of file diff --git a/pytmtc/pus_tc.py b/pytmtc/pus_tc.py index 3a8e83d..136d311 100644 --- a/pytmtc/pus_tc.py +++ b/pytmtc/pus_tc.py @@ -9,6 +9,10 @@ from tmtccmd.pus.tc.s200_fsfw_mode import Mode from tmtccmd.tmtc import DefaultPusQueueHelper from tmtccmd.pus.s11_tc_sched import create_time_tagged_cmd from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice +from serde import Model, fields + +from camera_params import CameraParameters +from common import EXPERIMENT_APID, UniqueId, make_addressable_id, make_addressable_id_with_action_id _LOGGER = logging.getLogger(__name__) @@ -65,6 +69,38 @@ def create_cmd_definition_tree() -> CmdTreeNode: ) root_node.add_child(scheduler_node) + action_node = CmdTreeNode("action", "Action Node") + cam_node = CmdTreeNode( + "take_image", "Take Image with IMS Imager" + ) + cam_node.add_child( + CmdTreeNode( + "default_single", "Default Single Image Camera Parameters" + ) + ) + cam_node.add_child( + CmdTreeNode( + "balanced_single", "Balanced Single Image Camera Parameters" + ) + ) + cam_node.add_child( + CmdTreeNode( + "default_single_flatsat", "Default Single Image Camera Parameters for use on FlatSat" + ) + ) + cam_node.add_child( + CmdTreeNode( + "balanced_single_flatsat", "Balanced Single Image Camera Parameters for use on FlatSat" + ) + ) + cam_node.add_child( + CmdTreeNode( + "custom_params", "Custom Camera Parameters as specified from file" + ) + ) + action_node.add_child(cam_node) + root_node.add_child(action_node) + return root_node @@ -97,6 +133,26 @@ def pack_pus_telecommands(q: DefaultPusQueueHelper, cmd_path: str): ) if cmd_path_list[0] == "acs": assert len(cmd_path_list) >= 2 + if cmd_path_list[0] == "action": + assert len(cmd_path_list)>= 2 + if cmd_path_list[1] == "take_image": + assert len(cmd_path_list)>= 3 + q.add_log_cmd("Sending PUS take image action request with " + cmd_path_list[2] + " params.") + if cmd_path_list[2] == "default_single": + data = make_addressable_id_with_action_id(UniqueId.CameraHandler, 1) + if cmd_path_list[2] == "balanced_single": + data = make_addressable_id_with_action_id(UniqueId.CameraHandler, 2) + if cmd_path_list[2] == "default_single_flatsat": + data = make_addressable_id_with_action_id(UniqueId.CameraHandler, 3) + if cmd_path_list[2] == "balanced_single_flatsat": + data = make_addressable_id_with_action_id(UniqueId.CameraHandler, 4) + if cmd_path_list[2] == "custom": + data = make_addressable_id_with_action_id(UniqueId.CameraHandler, 5) + params = CameraParameters(8, 8, 8, 1, True, 200, 1000) + bytes = params.serialize_for_uplink() + data.extend(bytes) + print(data.hex(sep=",")) + return q.add_pus_tc(PusTelecommand(service=8, subservice=128, apid=EXPERIMENT_APID, app_data=data)) def handle_set_mode_cmd( diff --git a/pytmtc/tc_definitions.py b/pytmtc/tc_definitions.py index 74fbff8..acd2741 100644 --- a/pytmtc/tc_definitions.py +++ b/pytmtc/tc_definitions.py @@ -35,4 +35,12 @@ def tc_definitions() -> TmtcDefinitionWrapper: info="PUS Service 11 TC Scheduling", op_code_entry=srv_11, ) + srv_8 = OpCodeEntry() + srv_8.add("pic", "Action Request Image") + defs.add_service( + name=CoreServiceList.SERVICE_8, + info="PUS Service 8 Action", + op_code_entry=srv_8, + + ) return defs diff --git a/scripts/ims100_testapp b/scripts/ims100_testapp new file mode 100644 index 0000000000000000000000000000000000000000..956a66bec1ef8a5c9c53f0ad28e7b8f680cb41fd GIT binary patch literal 34280 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%0A}icoybf*CONB0z~CR{clVNSIt&{Y6L; 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 literal 0 HcmV?d00001 diff --git a/src/config.rs b/src/config.rs index 3ebde60..a20e021 100644 --- a/src/config.rs +++ b/src/config.rs @@ -8,7 +8,7 @@ use std::net::Ipv4Addr; use std::path::{Path, PathBuf}; pub const STOP_FILE_NAME: &str = "stop-experiment"; -pub const HOME_FOLER_EXPERIMENT: &str = "/home/exp278"; +pub const HOME_FOLDER_EXPERIMENT: &str = "/home/exp278"; pub const LOG_FOLDER: &str = "logs"; pub const OBSW_SERVER_ADDR: Ipv4Addr = Ipv4Addr::UNSPECIFIED; @@ -40,12 +40,13 @@ pub enum GroupId { lazy_static! { pub static ref HOME_PATH: PathBuf = { - let home_path_default = env::var("HOME").expect("HOME env variable not set"); let mut home_path = PathBuf::new(); - home_path.push(if Path::new(HOME_FOLER_EXPERIMENT).exists() { - HOME_FOLER_EXPERIMENT + let mut home_path_default = homedir::get_my_home().expect("Getting home dir from OS failed.").expect("No home dir found."); + + home_path.push(if Path::new(HOME_FOLDER_EXPERIMENT).exists() { + HOME_FOLDER_EXPERIMENT } else { - &home_path_default + home_path_default.to_str().expect("Error converting to string.") }); home_path }; diff --git a/src/handlers/camera.rs b/src/handlers/camera.rs index 54e0b75..11d6b20 100644 --- a/src/handlers/camera.rs +++ b/src/handlers/camera.rs @@ -36,7 +36,9 @@ use serde::{Deserialize, Serialize}; use std::io::Error; use std::process::Command; use std::sync::mpsc; -use satrs::pus::action::ActionReplyPus; +use satrs::pus::action::{ActionReplyPus, ActionReplyVariant}; + +const IMS_TESTAPP: &str = "scripts/ims100_testapp"; const DEFAULT_SINGLE_CAM_PARAMS: CameraPictureParameters = CameraPictureParameters { R: 8, @@ -83,7 +85,7 @@ const BALANCED_SINGLE_FLATSAT_CAM_PARAMS: CameraPictureParameters = CameraPictur // TODO howto downlink #[derive(Debug)] -pub enum CameraActionIds { +pub enum CameraActionId { DefaultSingle = 1, BalancedSingle = 2, DefaultSingleFlatSat = 3, @@ -91,25 +93,25 @@ pub enum CameraActionIds { CustomParameters = 5, } -impl TryFrom for CameraActionIds { +impl TryFrom for CameraActionId { type Error = (); fn try_from(value: u32) -> Result { match value { - value if value == CameraActionIds::DefaultSingle as u32 => { - Ok(CameraActionIds::DefaultSingle) + value if value == CameraActionId::DefaultSingle as u32 => { + Ok(CameraActionId::DefaultSingle) } - value if value == CameraActionIds::BalancedSingle as u32 => { - Ok(CameraActionIds::BalancedSingle) + value if value == CameraActionId::BalancedSingle as u32 => { + Ok(CameraActionId::BalancedSingle) } - value if value == CameraActionIds::DefaultSingleFlatSat as u32 => { - Ok(CameraActionIds::DefaultSingleFlatSat) + value if value == CameraActionId::DefaultSingleFlatSat as u32 => { + Ok(CameraActionId::DefaultSingleFlatSat) } - value if value == CameraActionIds::BalancedSingleFlatSat as u32 => { - Ok(CameraActionIds::BalancedSingleFlatSat) + value if value == CameraActionId::BalancedSingleFlatSat as u32 => { + Ok(CameraActionId::BalancedSingleFlatSat) } - value if value == CameraActionIds::CustomParameters as u32 => { - Ok(CameraActionIds::CustomParameters) + value if value == CameraActionId::CustomParameters as u32 => { + Ok(CameraActionId::CustomParameters) } _ => Err(()), } @@ -193,15 +195,15 @@ impl IMS100BatchHandler { pub fn handle_action_request( &mut self, - _requestor_info: &MessageMetadata, + requestor_info: &MessageMetadata, action_request: &ActionRequest, ) -> std::io::Result<()> { - let param = match CameraActionIds::try_from(action_request.action_id).unwrap() { - CameraActionIds::DefaultSingle => DEFAULT_SINGLE_CAM_PARAMS, - CameraActionIds::BalancedSingle => BALANCED_SINGLE_CAM_PARAMS, - CameraActionIds::DefaultSingleFlatSat => DEFAULT_SINGLE_FLATSAT_CAM_PARAMS, - CameraActionIds::BalancedSingleFlatSat => BALANCED_SINGLE_FLATSAT_CAM_PARAMS, - CameraActionIds::CustomParameters => match &action_request.variant { + let param = match CameraActionId::try_from(action_request.action_id).expect("Invalid action id") { + CameraActionId::DefaultSingle => DEFAULT_SINGLE_CAM_PARAMS, + CameraActionId::BalancedSingle => BALANCED_SINGLE_CAM_PARAMS, + CameraActionId::DefaultSingleFlatSat => DEFAULT_SINGLE_FLATSAT_CAM_PARAMS, + CameraActionId::BalancedSingleFlatSat => BALANCED_SINGLE_FLATSAT_CAM_PARAMS, + CameraActionId::CustomParameters => match &action_request.variant { ActionRequestVariant::NoData => return Err(Error::other("No Data sent!")), ActionRequestVariant::StoreData(_) => { // let param = serde_json::from_slice() @@ -223,11 +225,13 @@ impl IMS100BatchHandler { _ => return Err(Error::other("Invalid Action Request Variant!")), }, }; - self.take_picture(param) + self.take_picture(param)?; + self.action_reply_tx.send(GenericMessage::new(*requestor_info, ActionReplyPus::new(action_request.action_id, ActionReplyVariant::Completed))).unwrap(); + Ok(()) } pub fn take_picture(&mut self, param: CameraPictureParameters) -> std::io::Result<()> { - let mut cmd = Command::new("ims100_testapp"); + let mut cmd = Command::new(IMS_TESTAPP); cmd.arg("-R") .arg(¶m.R.to_string()) .arg("-G") @@ -314,7 +318,7 @@ impl IMS100BatchHandler { #[cfg(test)] mod tests { use crate::handlers::camera::{ - CameraActionIds, CameraPictureParameters, IMS100BatchHandler, + CameraActionId, CameraPictureParameters, IMS100BatchHandler, DEFAULT_SINGLE_FLATSAT_CAM_PARAMS, }; use crate::requests::CompositeRequest; @@ -359,7 +363,7 @@ mod tests { let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap(); let req = ActionRequest::new( - CameraActionIds::CustomParameters as u32, + CameraActionId::CustomParameters as u32, ActionRequestVariant::VecData(data.as_bytes().to_vec()), ); @@ -374,7 +378,7 @@ mod tests { let data = serde_json::to_string(&DEFAULT_SINGLE_FLATSAT_CAM_PARAMS).unwrap(); let req = ActionRequest::new( - CameraActionIds::CustomParameters as u32, + CameraActionId::CustomParameters as u32, ActionRequestVariant::VecData(data.as_bytes().to_vec()), ); let req = CompositeRequest::Action(req); diff --git a/src/logger.rs b/src/logger.rs index 4df2e97..c9bafc4 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; use ops_sat_rs::config::LOG_FOLDER; @@ -6,6 +6,9 @@ pub fn setup_logger() -> Result<(), fern::InitError> { if !Path::new(LOG_FOLDER).exists() && std::fs::create_dir_all(LOG_FOLDER).is_err() { eprintln!("Failed to create log folder '{}'", LOG_FOLDER); } + let mut path_buf = PathBuf::from(LOG_FOLDER); + path_buf.push(format!("output.log")); + println!("{:?}", path_buf); fern::Dispatch::new() .format(move |out, message, record| { out.finish(format_args!( @@ -18,11 +21,7 @@ pub fn setup_logger() -> Result<(), fern::InitError> { }) .level(log::LevelFilter::Debug) .chain(std::io::stdout()) - .chain(fern::log_file(format!( - "{}/output_{}.log", - LOG_FOLDER, - humantime::format_rfc3339_seconds(std::time::SystemTime::now()) - ))?) + .chain(fern::log_file(path_buf.as_os_str())?) .apply()?; Ok(()) }