got basic action stuff running, now to make error handling better
This commit is contained in:
@ -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
|
||||
};
|
||||
|
@ -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<u32> for CameraActionIds {
|
||||
impl TryFrom<u32> for CameraActionId {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(value: u32) -> Result<Self, Self::Error> {
|
||||
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);
|
||||
|
@ -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(())
|
||||
}
|
||||
|
Reference in New Issue
Block a user