2024-02-07 18:10:47 +01:00
|
|
|
mod acs;
|
|
|
|
mod events;
|
2022-12-19 17:03:26 +01:00
|
|
|
mod hk;
|
2024-04-10 12:57:32 +02:00
|
|
|
mod interface;
|
2024-01-30 23:48:46 +01:00
|
|
|
mod logger;
|
2022-08-29 01:33:32 +02:00
|
|
|
mod pus;
|
2022-12-19 17:03:26 +01:00
|
|
|
mod requests;
|
2022-08-29 01:33:32 +02:00
|
|
|
mod tmtc;
|
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
use crate::events::EventHandler;
|
2024-04-10 12:57:32 +02:00
|
|
|
use crate::interface::udp::DynamicUdpTmHandler;
|
2024-02-07 18:10:47 +01:00
|
|
|
use crate::pus::stack::PusStack;
|
2024-04-16 11:04:22 +02:00
|
|
|
use crate::tmtc::tc_source::{TcSourceTaskDynamic, TcSourceTaskStatic};
|
2024-04-24 14:30:45 +02:00
|
|
|
use crate::tmtc::tm_sink::{TmSinkDynamic, TmSinkStatic};
|
2024-02-07 18:10:47 +01:00
|
|
|
use log::info;
|
|
|
|
use pus::test::create_test_service_dynamic;
|
2024-02-12 15:51:37 +01:00
|
|
|
use satrs::hal::std::tcp_server::ServerConfig;
|
|
|
|
use satrs::hal::std::udp_server::UdpTcServer;
|
2024-04-04 15:18:53 +02:00
|
|
|
use satrs::request::GenericMessage;
|
2024-04-16 11:04:22 +02:00
|
|
|
use satrs::tmtc::{PacketSenderWithSharedPool, SharedPacketPool};
|
2024-02-07 18:10:47 +01:00
|
|
|
use satrs_example::config::pool::{create_sched_tc_pool, create_static_pools};
|
|
|
|
use satrs_example::config::tasks::{
|
|
|
|
FREQ_MS_AOCS, FREQ_MS_EVENT_HANDLING, FREQ_MS_PUS_STACK, FREQ_MS_UDP_TMTC,
|
|
|
|
};
|
2024-04-04 15:18:53 +02:00
|
|
|
use satrs_example::config::{OBSW_SERVER_ADDR, PACKET_ID_VALIDATOR, SERVER_PORT};
|
2023-02-15 22:30:32 +01:00
|
|
|
|
2024-04-04 15:18:53 +02:00
|
|
|
use crate::acs::mgm::{MgmHandlerLis3Mdl, MpscModeLeafInterface, SpiDummyInterface};
|
2024-04-10 12:57:32 +02:00
|
|
|
use crate::interface::tcp::{SyncTcpTmSource, TcpTask};
|
|
|
|
use crate::interface::udp::{StaticUdpTmHandler, UdpTmtcServer};
|
2024-01-30 23:48:46 +01:00
|
|
|
use crate::logger::setup_logger;
|
2024-02-07 18:10:47 +01:00
|
|
|
use crate::pus::action::{create_action_service_dynamic, create_action_service_static};
|
|
|
|
use crate::pus::event::{create_event_service_dynamic, create_event_service_static};
|
|
|
|
use crate::pus::hk::{create_hk_service_dynamic, create_hk_service_static};
|
2024-04-04 15:18:53 +02:00
|
|
|
use crate::pus::mode::{create_mode_service_dynamic, create_mode_service_static};
|
2024-02-07 18:10:47 +01:00
|
|
|
use crate::pus::scheduler::{create_scheduler_service_dynamic, create_scheduler_service_static};
|
|
|
|
use crate::pus::test::create_test_service_static;
|
2024-04-16 11:04:22 +02:00
|
|
|
use crate::pus::{PusTcDistributor, PusTcMpscRouter};
|
2024-04-04 15:18:53 +02:00
|
|
|
use crate::requests::{CompositeRequest, GenericRequestRouter};
|
|
|
|
use satrs::mode::ModeRequest;
|
2024-02-12 15:51:37 +01:00
|
|
|
use satrs::pus::event_man::EventRequestWithToken;
|
2024-03-29 16:22:40 +01:00
|
|
|
use satrs::spacepackets::{time::cds::CdsTime, time::TimeWriter};
|
2024-04-16 11:04:22 +02:00
|
|
|
use satrs_example::config::components::{MGM_HANDLER_0, TCP_SERVER, UDP_SERVER};
|
2022-08-29 01:33:32 +02:00
|
|
|
use std::net::{IpAddr, SocketAddr};
|
2024-04-04 15:18:53 +02:00
|
|
|
use std::sync::mpsc;
|
2023-07-05 11:25:23 +02:00
|
|
|
use std::sync::{Arc, RwLock};
|
2022-08-29 01:33:32 +02:00
|
|
|
use std::thread;
|
2022-12-20 15:33:00 +01:00
|
|
|
use std::time::Duration;
|
2022-08-29 01:33:32 +02:00
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
#[allow(dead_code)]
|
|
|
|
fn static_tmtc_pool_main() {
|
|
|
|
let (tm_pool, tc_pool) = create_static_pools();
|
2024-04-16 11:04:22 +02:00
|
|
|
let shared_tm_pool = Arc::new(RwLock::new(tm_pool));
|
|
|
|
let shared_tc_pool = Arc::new(RwLock::new(tc_pool));
|
|
|
|
let shared_tm_pool_wrapper = SharedPacketPool::new(&shared_tm_pool);
|
|
|
|
let shared_tc_pool_wrapper = SharedPacketPool::new(&shared_tc_pool);
|
2024-02-26 11:41:42 +01:00
|
|
|
let (tc_source_tx, tc_source_rx) = mpsc::sync_channel(50);
|
2024-04-24 14:30:45 +02:00
|
|
|
let (tm_sink_tx, tm_sink_rx) = mpsc::sync_channel(50);
|
2024-02-26 11:41:42 +01:00
|
|
|
let (tm_server_tx, tm_server_rx) = mpsc::sync_channel(50);
|
2024-02-07 18:10:47 +01:00
|
|
|
|
2024-04-24 14:30:45 +02:00
|
|
|
let tm_sink_tx_sender =
|
|
|
|
PacketSenderWithSharedPool::new(tm_sink_tx.clone(), shared_tm_pool_wrapper.clone());
|
2024-04-04 15:18:53 +02:00
|
|
|
|
|
|
|
let (mgm_handler_composite_tx, mgm_handler_composite_rx) =
|
|
|
|
mpsc::channel::<GenericMessage<CompositeRequest>>();
|
|
|
|
let (mgm_handler_mode_tx, mgm_handler_mode_rx) = mpsc::channel::<GenericMessage<ModeRequest>>();
|
2022-11-13 21:07:16 +01:00
|
|
|
|
2023-02-16 01:02:14 +01:00
|
|
|
// Some request are targetable. This map is used to retrieve sender handles based on a target ID.
|
2024-02-20 14:33:21 +01:00
|
|
|
let mut request_map = GenericRequestRouter::default();
|
2024-04-04 15:18:53 +02:00
|
|
|
request_map
|
|
|
|
.composite_router_map
|
|
|
|
.insert(MGM_HANDLER_0.id(), mgm_handler_composite_tx);
|
|
|
|
request_map
|
|
|
|
.mode_router_map
|
|
|
|
.insert(MGM_HANDLER_0.id(), mgm_handler_mode_tx);
|
2022-12-19 17:03:26 +01:00
|
|
|
|
2024-02-08 17:42:36 +01:00
|
|
|
// This helper structure is used by all telecommand providers which need to send telecommands
|
|
|
|
// to the TC source.
|
2024-04-16 11:04:22 +02:00
|
|
|
let tc_source = PacketSenderWithSharedPool::new(tc_source_tx, shared_tc_pool_wrapper.clone());
|
2022-12-21 22:14:42 +01:00
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
// Create event handling components
|
|
|
|
// These sender handles are used to send event requests, for example to enable or disable
|
|
|
|
// certain events.
|
2024-04-24 14:30:45 +02:00
|
|
|
let (event_tx, event_rx) = mpsc::sync_channel(100);
|
2024-02-07 18:10:47 +01:00
|
|
|
let (event_request_tx, event_request_rx) = mpsc::channel::<EventRequestWithToken>();
|
|
|
|
|
|
|
|
// The event task is the core handler to perform the event routing and TM handling as specified
|
|
|
|
// in the sat-rs documentation.
|
2024-04-24 14:30:45 +02:00
|
|
|
let mut event_handler = EventHandler::new(tm_sink_tx.clone(), event_rx, event_request_rx);
|
2024-04-04 15:18:53 +02:00
|
|
|
|
|
|
|
let (pus_test_tx, pus_test_rx) = mpsc::channel();
|
|
|
|
let (pus_event_tx, pus_event_rx) = mpsc::channel();
|
|
|
|
let (pus_sched_tx, pus_sched_rx) = mpsc::channel();
|
|
|
|
let (pus_hk_tx, pus_hk_rx) = mpsc::channel();
|
|
|
|
let (pus_action_tx, pus_action_rx) = mpsc::channel();
|
|
|
|
let (pus_mode_tx, pus_mode_rx) = mpsc::channel();
|
|
|
|
|
|
|
|
let (_pus_action_reply_tx, pus_action_reply_rx) = mpsc::channel();
|
|
|
|
let (pus_hk_reply_tx, pus_hk_reply_rx) = mpsc::channel();
|
|
|
|
let (pus_mode_reply_tx, pus_mode_reply_rx) = mpsc::channel();
|
2022-12-22 09:15:59 +01:00
|
|
|
|
2023-07-04 18:51:54 +02:00
|
|
|
let pus_router = PusTcMpscRouter {
|
2024-04-04 15:18:53 +02:00
|
|
|
test_tc_sender: pus_test_tx,
|
|
|
|
event_tc_sender: pus_event_tx,
|
|
|
|
sched_tc_sender: pus_sched_tx,
|
|
|
|
hk_tc_sender: pus_hk_tx,
|
|
|
|
action_tc_sender: pus_action_tx,
|
|
|
|
mode_tc_sender: pus_mode_tx,
|
2023-07-04 18:51:54 +02:00
|
|
|
};
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_test_service = create_test_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool.clone(),
|
2024-04-24 14:30:45 +02:00
|
|
|
event_tx.clone(),
|
2023-07-04 18:51:54 +02:00
|
|
|
pus_test_rx,
|
2023-07-10 00:29:31 +02:00
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_scheduler_service = create_scheduler_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-02-08 17:42:36 +01:00
|
|
|
tc_source.clone(),
|
2023-07-10 00:29:31 +02:00
|
|
|
pus_sched_rx,
|
2024-02-07 18:10:47 +01:00
|
|
|
create_sched_tc_pool(),
|
2023-07-10 00:29:31 +02:00
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_event_service = create_event_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool.clone(),
|
2023-07-05 14:25:51 +02:00
|
|
|
pus_event_rx,
|
|
|
|
event_request_tx,
|
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_action_service = create_action_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool.clone(),
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_action_rx,
|
2023-07-05 21:08:04 +02:00
|
|
|
request_map.clone(),
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_action_reply_rx,
|
2023-07-05 21:08:04 +02:00
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_hk_service = create_hk_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool.clone(),
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_hk_rx,
|
2024-04-04 15:18:53 +02:00
|
|
|
request_map.clone(),
|
|
|
|
pus_hk_reply_rx,
|
|
|
|
);
|
|
|
|
let pus_mode_service = create_mode_service_static(
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx_sender.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool.clone(),
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_mode_rx,
|
2023-07-06 00:49:18 +02:00
|
|
|
request_map,
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_mode_reply_rx,
|
2023-07-06 00:49:18 +02:00
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let mut pus_stack = PusStack::new(
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_test_service,
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_hk_service,
|
|
|
|
pus_event_service,
|
|
|
|
pus_action_service,
|
|
|
|
pus_scheduler_service,
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_mode_service,
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
2023-07-06 00:49:18 +02:00
|
|
|
|
2024-02-08 17:42:36 +01:00
|
|
|
let mut tmtc_task = TcSourceTaskStatic::new(
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tc_pool_wrapper.clone(),
|
2024-02-08 17:42:36 +01:00
|
|
|
tc_source_rx,
|
2024-04-24 14:30:45 +02:00
|
|
|
PusTcDistributor::new(tm_sink_tx_sender, pus_router),
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
2023-09-27 00:21:03 +02:00
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
let sock_addr = SocketAddr::new(IpAddr::V4(OBSW_SERVER_ADDR), SERVER_PORT);
|
2024-04-16 11:04:22 +02:00
|
|
|
let udp_tc_server = UdpTcServer::new(UDP_SERVER.id(), sock_addr, 2048, tc_source.clone())
|
2023-09-27 00:21:03 +02:00
|
|
|
.expect("creating UDP TMTC server failed");
|
|
|
|
let mut udp_tmtc_server = UdpTmtcServer {
|
|
|
|
udp_tc_server,
|
2024-02-07 18:10:47 +01:00
|
|
|
tm_handler: StaticUdpTmHandler {
|
2024-02-08 17:42:36 +01:00
|
|
|
tm_rx: tm_server_rx,
|
2024-04-16 11:04:22 +02:00
|
|
|
tm_store: shared_tm_pool.clone(),
|
2024-02-07 18:10:47 +01:00
|
|
|
},
|
2023-09-27 00:21:03 +02:00
|
|
|
};
|
|
|
|
|
2024-04-16 11:04:22 +02:00
|
|
|
let tcp_server_cfg = ServerConfig::new(
|
|
|
|
TCP_SERVER.id(),
|
|
|
|
sock_addr,
|
|
|
|
Duration::from_millis(400),
|
|
|
|
4096,
|
|
|
|
8192,
|
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let sync_tm_tcp_source = SyncTcpTmSource::new(200);
|
|
|
|
let mut tcp_server = TcpTask::new(
|
|
|
|
tcp_server_cfg,
|
|
|
|
sync_tm_tcp_source.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
tc_source.clone(),
|
2024-04-04 15:18:53 +02:00
|
|
|
PACKET_ID_VALIDATOR.clone(),
|
2024-02-07 18:10:47 +01:00
|
|
|
)
|
|
|
|
.expect("tcp server creation failed");
|
|
|
|
|
2024-04-24 14:30:45 +02:00
|
|
|
let mut tm_sink = TmSinkStatic::new(
|
2024-04-16 11:04:22 +02:00
|
|
|
shared_tm_pool_wrapper,
|
2024-02-07 18:10:47 +01:00
|
|
|
sync_tm_tcp_source,
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_rx,
|
2024-02-07 18:10:47 +01:00
|
|
|
tm_server_tx,
|
|
|
|
);
|
|
|
|
|
2024-04-04 15:18:53 +02:00
|
|
|
let (mgm_handler_mode_reply_to_parent_tx, _mgm_handler_mode_reply_to_parent_rx) =
|
|
|
|
mpsc::channel();
|
|
|
|
|
|
|
|
let dummy_spi_interface = SpiDummyInterface::default();
|
|
|
|
let shared_mgm_set = Arc::default();
|
|
|
|
let mode_leaf_interface = MpscModeLeafInterface {
|
|
|
|
request_rx: mgm_handler_mode_rx,
|
|
|
|
reply_tx_to_pus: pus_mode_reply_tx,
|
|
|
|
reply_tx_to_parent: mgm_handler_mode_reply_to_parent_tx,
|
|
|
|
};
|
|
|
|
let mut mgm_handler = MgmHandlerLis3Mdl::new(
|
|
|
|
MGM_HANDLER_0,
|
|
|
|
"MGM_0",
|
|
|
|
mode_leaf_interface,
|
|
|
|
mgm_handler_composite_rx,
|
|
|
|
pus_hk_reply_tx,
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink_tx,
|
2024-04-04 15:18:53 +02:00
|
|
|
dummy_spi_interface,
|
|
|
|
shared_mgm_set,
|
|
|
|
);
|
|
|
|
|
2023-09-27 00:25:50 +02:00
|
|
|
info!("Starting TMTC and UDP task");
|
2023-09-29 14:11:03 +02:00
|
|
|
let jh_udp_tmtc = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("SATRS tmtc-udp".to_string())
|
2023-09-29 14:11:03 +02:00
|
|
|
.spawn(move || {
|
|
|
|
info!("Running UDP server on port {SERVER_PORT}");
|
|
|
|
loop {
|
|
|
|
udp_tmtc_server.periodic_operation();
|
|
|
|
tmtc_task.periodic_operation();
|
2024-02-07 18:10:47 +01:00
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_UDP_TMTC));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
info!("Starting TCP task");
|
|
|
|
let jh_tcp = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs tcp".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || {
|
|
|
|
info!("Running TCP server on port {SERVER_PORT}");
|
|
|
|
loop {
|
|
|
|
tcp_server.periodic_operation();
|
2023-09-29 14:11:03 +02:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
info!("Starting TM funnel task");
|
|
|
|
let jh_tm_funnel = thread::Builder::new()
|
2024-04-24 14:30:45 +02:00
|
|
|
.name("tm sink".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
2024-04-24 14:30:45 +02:00
|
|
|
tm_sink.operation();
|
2024-02-07 18:10:47 +01:00
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
info!("Starting event handling task");
|
|
|
|
let jh_event_handling = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs events".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
|
|
|
event_handler.periodic_operation();
|
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_EVENT_HANDLING));
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
info!("Starting AOCS thread");
|
|
|
|
let jh_aocs = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs aocs".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
2024-04-04 15:18:53 +02:00
|
|
|
mgm_handler.periodic_operation();
|
2024-02-07 18:10:47 +01:00
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_AOCS));
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
info!("Starting PUS handler thread");
|
|
|
|
let jh_pus_handler = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs pus".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
|
|
|
pus_stack.periodic_operation();
|
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_PUS_STACK));
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
jh_udp_tmtc
|
|
|
|
.join()
|
|
|
|
.expect("Joining UDP TMTC server thread failed");
|
|
|
|
jh_tcp
|
|
|
|
.join()
|
|
|
|
.expect("Joining TCP TMTC server thread failed");
|
|
|
|
jh_tm_funnel
|
|
|
|
.join()
|
|
|
|
.expect("Joining TM Funnel thread failed");
|
|
|
|
jh_event_handling
|
|
|
|
.join()
|
|
|
|
.expect("Joining Event Manager thread failed");
|
|
|
|
jh_aocs.join().expect("Joining AOCS thread failed");
|
|
|
|
jh_pus_handler
|
|
|
|
.join()
|
|
|
|
.expect("Joining PUS handler thread failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
fn dyn_tmtc_pool_main() {
|
2024-04-04 15:18:53 +02:00
|
|
|
let (tc_source_tx, tc_source_rx) = mpsc::channel();
|
|
|
|
let (tm_funnel_tx, tm_funnel_rx) = mpsc::channel();
|
|
|
|
let (tm_server_tx, tm_server_rx) = mpsc::channel();
|
|
|
|
|
|
|
|
// Some request are targetable. This map is used to retrieve sender handles based on a target ID.
|
|
|
|
let (mgm_handler_composite_tx, mgm_handler_composite_rx) =
|
|
|
|
mpsc::channel::<GenericMessage<CompositeRequest>>();
|
|
|
|
let (mgm_handler_mode_tx, mgm_handler_mode_rx) = mpsc::channel::<GenericMessage<ModeRequest>>();
|
2024-02-07 18:10:47 +01:00
|
|
|
|
|
|
|
// Some request are targetable. This map is used to retrieve sender handles based on a target ID.
|
2024-02-20 14:33:21 +01:00
|
|
|
let mut request_map = GenericRequestRouter::default();
|
2024-04-04 15:18:53 +02:00
|
|
|
request_map
|
|
|
|
.composite_router_map
|
|
|
|
.insert(MGM_HANDLER_0.raw(), mgm_handler_composite_tx);
|
|
|
|
request_map
|
|
|
|
.mode_router_map
|
|
|
|
.insert(MGM_HANDLER_0.raw(), mgm_handler_mode_tx);
|
2024-02-07 18:10:47 +01:00
|
|
|
|
|
|
|
// Create event handling components
|
|
|
|
// These sender handles are used to send event requests, for example to enable or disable
|
|
|
|
// certain events.
|
2024-04-24 14:30:45 +02:00
|
|
|
let (event_tx, event_rx) = mpsc::sync_channel(100);
|
2024-02-07 18:10:47 +01:00
|
|
|
let (event_request_tx, event_request_rx) = mpsc::channel::<EventRequestWithToken>();
|
|
|
|
// The event task is the core handler to perform the event routing and TM handling as specified
|
|
|
|
// in the sat-rs documentation.
|
2024-04-24 14:30:45 +02:00
|
|
|
let mut event_handler = EventHandler::new(tm_funnel_tx.clone(), event_rx, event_request_rx);
|
2024-04-04 15:18:53 +02:00
|
|
|
|
|
|
|
let (pus_test_tx, pus_test_rx) = mpsc::channel();
|
|
|
|
let (pus_event_tx, pus_event_rx) = mpsc::channel();
|
|
|
|
let (pus_sched_tx, pus_sched_rx) = mpsc::channel();
|
|
|
|
let (pus_hk_tx, pus_hk_rx) = mpsc::channel();
|
|
|
|
let (pus_action_tx, pus_action_rx) = mpsc::channel();
|
|
|
|
let (pus_mode_tx, pus_mode_rx) = mpsc::channel();
|
|
|
|
|
|
|
|
let (_pus_action_reply_tx, pus_action_reply_rx) = mpsc::channel();
|
|
|
|
let (pus_hk_reply_tx, pus_hk_reply_rx) = mpsc::channel();
|
|
|
|
let (pus_mode_reply_tx, pus_mode_reply_rx) = mpsc::channel();
|
2024-02-07 18:10:47 +01:00
|
|
|
|
|
|
|
let pus_router = PusTcMpscRouter {
|
2024-04-04 15:18:53 +02:00
|
|
|
test_tc_sender: pus_test_tx,
|
|
|
|
event_tc_sender: pus_event_tx,
|
|
|
|
sched_tc_sender: pus_sched_tx,
|
|
|
|
hk_tc_sender: pus_hk_tx,
|
|
|
|
action_tc_sender: pus_action_tx,
|
|
|
|
mode_tc_sender: pus_mode_tx,
|
2024-02-07 18:10:47 +01:00
|
|
|
};
|
|
|
|
|
2024-04-24 14:30:45 +02:00
|
|
|
let pus_test_service =
|
|
|
|
create_test_service_dynamic(tm_funnel_tx.clone(), event_tx.clone(), pus_test_rx);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_scheduler_service = create_scheduler_service_dynamic(
|
|
|
|
tm_funnel_tx.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
tc_source_tx.clone(),
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_sched_rx,
|
|
|
|
create_sched_tc_pool(),
|
|
|
|
);
|
|
|
|
|
2024-04-04 15:18:53 +02:00
|
|
|
let pus_event_service =
|
|
|
|
create_event_service_dynamic(tm_funnel_tx.clone(), pus_event_rx, event_request_tx);
|
2024-02-07 18:10:47 +01:00
|
|
|
let pus_action_service = create_action_service_dynamic(
|
|
|
|
tm_funnel_tx.clone(),
|
|
|
|
pus_action_rx,
|
|
|
|
request_map.clone(),
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_action_reply_rx,
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
|
|
|
let pus_hk_service = create_hk_service_dynamic(
|
|
|
|
tm_funnel_tx.clone(),
|
|
|
|
pus_hk_rx,
|
2024-04-04 15:18:53 +02:00
|
|
|
request_map.clone(),
|
|
|
|
pus_hk_reply_rx,
|
|
|
|
);
|
|
|
|
let pus_mode_service = create_mode_service_dynamic(
|
|
|
|
tm_funnel_tx.clone(),
|
|
|
|
pus_mode_rx,
|
2024-02-07 18:10:47 +01:00
|
|
|
request_map,
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_mode_reply_rx,
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
|
|
|
let mut pus_stack = PusStack::new(
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_test_service,
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_hk_service,
|
|
|
|
pus_event_service,
|
|
|
|
pus_action_service,
|
|
|
|
pus_scheduler_service,
|
2024-04-04 15:18:53 +02:00
|
|
|
pus_mode_service,
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
|
|
|
|
2024-02-08 17:42:36 +01:00
|
|
|
let mut tmtc_task = TcSourceTaskDynamic::new(
|
2024-02-07 18:10:47 +01:00
|
|
|
tc_source_rx,
|
2024-04-16 11:04:22 +02:00
|
|
|
PusTcDistributor::new(tm_funnel_tx.clone(), pus_router),
|
2024-02-07 18:10:47 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
let sock_addr = SocketAddr::new(IpAddr::V4(OBSW_SERVER_ADDR), SERVER_PORT);
|
2024-04-16 11:04:22 +02:00
|
|
|
let udp_tc_server = UdpTcServer::new(UDP_SERVER.id(), sock_addr, 2048, tc_source_tx.clone())
|
2024-02-07 18:10:47 +01:00
|
|
|
.expect("creating UDP TMTC server failed");
|
|
|
|
let mut udp_tmtc_server = UdpTmtcServer {
|
|
|
|
udp_tc_server,
|
|
|
|
tm_handler: DynamicUdpTmHandler {
|
|
|
|
tm_rx: tm_server_rx,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2024-04-16 11:04:22 +02:00
|
|
|
let tcp_server_cfg = ServerConfig::new(
|
|
|
|
TCP_SERVER.id(),
|
|
|
|
sock_addr,
|
|
|
|
Duration::from_millis(400),
|
|
|
|
4096,
|
|
|
|
8192,
|
|
|
|
);
|
2024-02-07 18:10:47 +01:00
|
|
|
let sync_tm_tcp_source = SyncTcpTmSource::new(200);
|
2023-09-29 14:11:03 +02:00
|
|
|
let mut tcp_server = TcpTask::new(
|
|
|
|
tcp_server_cfg,
|
|
|
|
sync_tm_tcp_source.clone(),
|
2024-04-16 11:04:22 +02:00
|
|
|
tc_source_tx.clone(),
|
2024-04-04 15:18:53 +02:00
|
|
|
PACKET_ID_VALIDATOR.clone(),
|
2023-09-29 14:11:03 +02:00
|
|
|
)
|
|
|
|
.expect("tcp server creation failed");
|
2024-02-07 18:10:47 +01:00
|
|
|
|
2024-04-24 14:30:45 +02:00
|
|
|
let mut tm_funnel = TmSinkDynamic::new(sync_tm_tcp_source, tm_funnel_rx, tm_server_tx);
|
2024-02-07 18:10:47 +01:00
|
|
|
|
2024-04-04 15:18:53 +02:00
|
|
|
let (mgm_handler_mode_reply_to_parent_tx, _mgm_handler_mode_reply_to_parent_rx) =
|
|
|
|
mpsc::channel();
|
|
|
|
let dummy_spi_interface = SpiDummyInterface::default();
|
|
|
|
let shared_mgm_set = Arc::default();
|
|
|
|
let mode_leaf_interface = MpscModeLeafInterface {
|
|
|
|
request_rx: mgm_handler_mode_rx,
|
|
|
|
reply_tx_to_pus: pus_mode_reply_tx,
|
|
|
|
reply_tx_to_parent: mgm_handler_mode_reply_to_parent_tx,
|
|
|
|
};
|
|
|
|
let mut mgm_handler = MgmHandlerLis3Mdl::new(
|
|
|
|
MGM_HANDLER_0,
|
|
|
|
"MGM_0",
|
|
|
|
mode_leaf_interface,
|
|
|
|
mgm_handler_composite_rx,
|
|
|
|
pus_hk_reply_tx,
|
|
|
|
tm_funnel_tx,
|
|
|
|
dummy_spi_interface,
|
|
|
|
shared_mgm_set,
|
|
|
|
);
|
|
|
|
|
2024-02-07 18:10:47 +01:00
|
|
|
info!("Starting TMTC and UDP task");
|
|
|
|
let jh_udp_tmtc = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs tmtc-udp".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || {
|
|
|
|
info!("Running UDP server on port {SERVER_PORT}");
|
|
|
|
loop {
|
|
|
|
udp_tmtc_server.periodic_operation();
|
|
|
|
tmtc_task.periodic_operation();
|
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_UDP_TMTC));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
2023-09-29 14:11:03 +02:00
|
|
|
info!("Starting TCP task");
|
|
|
|
let jh_tcp = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs tcp".to_string())
|
2023-09-29 14:11:03 +02:00
|
|
|
.spawn(move || {
|
|
|
|
info!("Running TCP server on port {SERVER_PORT}");
|
|
|
|
loop {
|
|
|
|
tcp_server.periodic_operation();
|
|
|
|
}
|
2023-02-16 01:02:14 +01:00
|
|
|
})
|
|
|
|
.unwrap();
|
2022-08-29 01:33:32 +02:00
|
|
|
|
2023-02-15 22:30:32 +01:00
|
|
|
info!("Starting TM funnel task");
|
2024-02-07 18:10:47 +01:00
|
|
|
let jh_tm_funnel = thread::Builder::new()
|
2024-04-25 11:11:31 +02:00
|
|
|
.name("sat-rs tm-sink".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
|
|
|
tm_funnel.operation();
|
2023-02-16 01:02:14 +01:00
|
|
|
})
|
|
|
|
.unwrap();
|
2022-11-12 23:37:19 +01:00
|
|
|
|
2023-02-15 22:30:32 +01:00
|
|
|
info!("Starting event handling task");
|
2024-02-07 18:10:47 +01:00
|
|
|
let jh_event_handling = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs events".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
|
|
|
event_handler.periodic_operation();
|
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_EVENT_HANDLING));
|
2023-02-16 01:02:14 +01:00
|
|
|
})
|
|
|
|
.unwrap();
|
2022-11-12 23:37:19 +01:00
|
|
|
|
2023-02-15 22:30:32 +01:00
|
|
|
info!("Starting AOCS thread");
|
2024-02-07 18:10:47 +01:00
|
|
|
let jh_aocs = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs aocs".to_string())
|
2024-02-07 18:10:47 +01:00
|
|
|
.spawn(move || loop {
|
2024-04-04 15:18:53 +02:00
|
|
|
mgm_handler.periodic_operation();
|
2024-02-07 18:10:47 +01:00
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_AOCS));
|
2023-02-16 01:02:14 +01:00
|
|
|
})
|
|
|
|
.unwrap();
|
2022-12-20 15:33:00 +01:00
|
|
|
|
2023-07-04 15:17:43 +02:00
|
|
|
info!("Starting PUS handler thread");
|
2024-02-07 18:10:47 +01:00
|
|
|
let jh_pus_handler = thread::Builder::new()
|
2024-04-10 11:54:05 +02:00
|
|
|
.name("sat-rs pus".to_string())
|
2023-07-04 21:13:26 +02:00
|
|
|
.spawn(move || loop {
|
2024-02-07 18:10:47 +01:00
|
|
|
pus_stack.periodic_operation();
|
|
|
|
thread::sleep(Duration::from_millis(FREQ_MS_PUS_STACK));
|
2023-07-04 18:51:54 +02:00
|
|
|
})
|
|
|
|
.unwrap();
|
2024-02-07 18:10:47 +01:00
|
|
|
|
2023-09-29 14:11:03 +02:00
|
|
|
jh_udp_tmtc
|
|
|
|
.join()
|
|
|
|
.expect("Joining UDP TMTC server thread failed");
|
|
|
|
jh_tcp
|
|
|
|
.join()
|
|
|
|
.expect("Joining TCP TMTC server thread failed");
|
2024-02-07 18:10:47 +01:00
|
|
|
jh_tm_funnel
|
|
|
|
.join()
|
|
|
|
.expect("Joining TM Funnel thread failed");
|
|
|
|
jh_event_handling
|
|
|
|
.join()
|
|
|
|
.expect("Joining Event Manager thread failed");
|
|
|
|
jh_aocs.join().expect("Joining AOCS thread failed");
|
|
|
|
jh_pus_handler
|
|
|
|
.join()
|
|
|
|
.expect("Joining PUS handler thread failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
setup_logger().expect("setting up logging with fern failed");
|
|
|
|
println!("Running OBSW example");
|
|
|
|
#[cfg(not(feature = "dyn_tmtc"))]
|
|
|
|
static_tmtc_pool_main();
|
|
|
|
#[cfg(feature = "dyn_tmtc")]
|
|
|
|
dyn_tmtc_pool_main();
|
2022-08-29 01:33:32 +02:00
|
|
|
}
|
2022-11-13 21:07:16 +01:00
|
|
|
|
2024-03-29 16:22:40 +01:00
|
|
|
pub fn update_time(time_provider: &mut CdsTime, timestamp: &mut [u8]) {
|
2022-11-13 21:07:16 +01:00
|
|
|
time_provider
|
|
|
|
.update_from_now()
|
|
|
|
.expect("Could not get current time");
|
|
|
|
time_provider
|
|
|
|
.write_to_bytes(timestamp)
|
|
|
|
.expect("Writing timestamp failed");
|
|
|
|
}
|