use crate::adapter::{PacketAdapter, StreamAdapter};
+use crate::link_setup::LinkSetup;
use crate::tnc::Tnc;
use m17core::kiss::{KissBuffer, KissCommand, KissFrame};
use m17core::protocol::{EncryptionType, LsfFrame, PacketType, StreamFrame};
}
pub fn close(&self) {
+ // TODO: blocking function to indicate TNC has finished closing
+ // then we could call this in a signal handler to ensure PTT is dropped before quit
let _ = self.event_tx.send(TncControlEvent::Close);
}
}
}
impl TxHandle {
- pub fn transmit_packet(&self, packet_type: PacketType, payload: &[u8]) {
- // hang on where do we get the LSF details from? We need a destination obviously
- // our source address needs to be configured here too
- // also there is possible CAN, encryption, meta payload
-
- // we will immediately convert this into a KISS payload before sending into channel so we only need borrow on data
+ pub fn transmit_packet(&self, link_setup: &LinkSetup, packet_type: PacketType, payload: &[u8]) {
+ let (pack_type, pack_type_len) = packet_type.as_proto();
+ if pack_type_len + payload.len() > 823 {
+ // TODO: error for invalid transmission type
+ return;
+ }
+ let mut full_payload = vec![];
+ full_payload.extend_from_slice(&pack_type[0..pack_type_len]);
+ full_payload.extend_from_slice(&payload);
+ let crc = m17core::crc::m17_crc(&full_payload);
+ full_payload.extend_from_slice(&crc.to_be_bytes());
+ let kiss_frame = KissFrame::new_full_packet(&link_setup.raw.0, &full_payload).unwrap();
+ let _ = self.event_tx.send(TncControlEvent::Kiss(kiss_frame));
}
- // add more methods here for stream outgoing
-
- pub fn transmit_stream_start(&self, lsf: LsfFrame) {
- // TODO: is asking for an LsfFrame a good idea or unfriendly API?
- // What I should do here is create a LinkSetup struct which wraps an LsfFrame and can be loaded with a raw one
- let kiss_frame = KissFrame::new_stream_setup(&lsf.0).unwrap();
+ pub fn transmit_stream_start(&self, link_setup: &LinkSetup) {
+ let kiss_frame = KissFrame::new_stream_setup(&link_setup.raw.0).unwrap();
let _ = self.event_tx.send(TncControlEvent::Kiss(kiss_frame));
}
// as long as there is only one TNC it is implied there is only ever one stream transmission in flight
- pub fn transmit_stream_next(&self, stream: StreamFrame) {
+ pub fn transmit_stream_next(&self, stream: &StreamFrame) {
let kiss_frame = KissFrame::new_stream_data(&stream).unwrap();
let _ = self.event_tx.send(TncControlEvent::Kiss(kiss_frame));
}
adapters.read().unwrap().packet.values().cloned().collect();
for s in subs {
s.packet_received(
- lsf.clone(),
+ LinkSetup::new_raw(lsf.clone()),
packet_type.clone(),
packet_payload.clone(),
);
let subs: Vec<_> =
adapters.read().unwrap().stream.values().cloned().collect();
for s in subs {
- s.stream_began(lsf.clone());
+ s.stream_began(LinkSetup::new_raw(lsf.clone()));
}
} else if n == 26 {
if !stream_running {