use protobuf::Message;
include!(concat!(env!("OUT_DIR"), "/protos/mod.rs"));
use crate::cot_base::{CursorOnTarget, Sendable};
use crate::host::{get_cot_version, get_known_host_id, get_os};
use crate::time::Time;
use crate::udp_sender::UdpSender;
use cotevent::CotEvent;
use std::io::Result;
use std::time::{SystemTime, UNIX_EPOCH};
use takmessage::TakMessage;
use takv::Takv;
pub struct ProtoSender {
tak_message: TakMessage,
sender: UdpSender,
}
impl ProtoSender {
pub fn new(addr: &str, port: u16) -> Result<Self> {
let tak_message = TakMessage::new();
let sender = UdpSender::new(addr, port).expect("Couldn't setup multicast");
Ok(ProtoSender {
tak_message,
sender,
})
}
fn _current_time_millis() -> u128 {
let start = SystemTime::now();
let since_the_epoch = start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
since_the_epoch.as_millis()
}
pub fn send(&mut self, cursor_on_target: &impl Sendable) {
let cot: CursorOnTarget = cursor_on_target.get_cot();
let mut cot_event = CotEvent::new();
cot_event.type_ = cot.type_string.as_ref().unwrap().to_string();
cot_event.uid = cot.uid.clone();
cot_event.how = "h-e".to_string();
cot_event.sendTime = Time::now_millis() as u64;
cot_event.startTime = Time::now_millis() as u64;
cot_event.staleTime = Time::stale_time_millis() as u64 + 120000;
cot_event.lon = cot.point.longitude;
cot_event.lat = cot.point.latitude;
cot_event.hae = cot.point.hae;
cot_event.ce = cot.point.ce;
cot_event.le = cot.point.le;
let mut takv = Takv::new();
takv.version = get_cot_version();
takv.platform = "RustCot".to_string();
takv.os = get_os();
takv.device = get_known_host_id();
let mut detail = detail::Detail::new();
detail.xmlDetail = cot.get_xml_detail().to_string();
detail.takv = ::protobuf::MessageField::some(takv);
cot_event.detail = ::protobuf::MessageField::some(detail);
self.tak_message.cotEvent = ::protobuf::MessageField::some(cot_event);
let message_bytes = self
.tak_message
.write_to_bytes()
.expect("Failed to serialize TakMessage");
let mut header: Vec<u8> = vec![191, 1, 191];
header.extend_from_slice(&message_bytes);
self.sender
.send(&header)
.expect("Couldn't send data via UDP");
}
}