use elevatorpro::network::{self, local_network, udp_broadcast};
use elevatorpro::backup;
use elevatorpro::elevator_logic;
use elevatorpro::manager;
use elevatorpro::world_view;
use elevatorpro::init;
use elevatorpro::print;
use tokio::sync::watch;
#[tokio::main]
async fn main()
{
let is_backup = init::parse_args();
let mut self_container: Option<world_view::ElevatorContainer> = None;
if is_backup
{
print::info(format!("Starting backup-process..."));
self_container = backup::run_as_backup().await;
}
init::build_cost_fn().await;
print::info("Starting master process...".to_string());
let mut worldview = init::initialize_worldview(self_container.as_ref()).await;
print::worldview(&worldview, Some(network::ConnectionStatus::new()));
let main_mpscs = local_network::Mpscs::new();
let (wv_watch_tx, wv_watch_rx) = watch::channel(worldview.clone());
let (network_watch_tx, network_watch_rx) = watch::channel(network::ConnectionStatus::new());
let packetloss_rx = network_watch_rx.clone();
let _ = wv_watch_tx.send(worldview.clone());
let mpsc_rxs = main_mpscs.rxs;
let elevator_states_tx = main_mpscs.txs.elevator_states;
let delegated_tasks_tx = main_mpscs.txs.delegated_tasks;
let udp_wv_tx = main_mpscs.txs.udp_wv;
let remove_container_tx = main_mpscs.txs.remove_container;
let container_tx = main_mpscs.txs.container;
let sent_container_tx = main_mpscs.txs.sent_container;
let connection_to_master_failed_tx = main_mpscs.txs.connection_to_master_failed;
let new_wv_after_offline_tx = main_mpscs.txs.new_wv_after_offline;
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Starting to monitor internet".to_string());
network::watch_ethernet(wv_watch_rx, network_watch_tx, new_wv_after_offline_tx).await;
});
}
{
tokio::spawn(async move {
print::info("Starting to update worldview".to_string());
local_network::update_wv_watch(mpsc_rxs, wv_watch_tx, &mut worldview).await;
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Starting to run local elevator".to_string());
elevator_logic::run_local_elevator(wv_watch_rx, elevator_states_tx).await;
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Staring task manager".to_string());
manager::start_manager(wv_watch_rx, delegated_tasks_tx).await;
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
let _backup_task = tokio::spawn(async move {
print::info("Starting backup".to_string());
tokio::spawn(backup::start_backup_server(wv_watch_rx, network_watch_rx));
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Starting to listen for UDP-broadcast".to_string());
let _ = udp_broadcast::start_udp_listener(wv_watch_rx, udp_wv_tx).await;
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Starting UDP-broadcaster".to_string());
let _ = udp_broadcast::start_udp_broadcaster(wv_watch_rx).await;
});
}
{
let wv_watch_rx = wv_watch_rx.clone();
tokio::spawn(async move {
print::info("Starting UDP direct network".to_string());
network::udp_direct::start_direct_udp_broadcast(
wv_watch_rx,
container_tx,
packetloss_rx,
connection_to_master_failed_tx,
remove_container_tx,
sent_container_tx,
).await;
});
}
loop{
tokio::task::yield_now().await;
}
}