use chrono::{Local, TimeZone};
use jt808::models::{Jt808, Jt808BodySerialize, Jt808BodyTrans, Ver808};
use jt_util::{
bytes::{IBuffRead, IBuffWrite},
};
#[derive(Debug, Default)]
pub struct Jt0x1205 {
pub sn: u16,
pub file_list: Vec<JtVideoFileListItem>,
}
impl Jt808BodySerialize for Jt0x1205 {
fn write(&mut self, ver: &Ver808, buf: &mut dyn IBuffWrite) {
buf.put_u16(self.sn);
buf.put_u32(self.file_list.len() as u32);
for item in self.file_list.iter_mut() {
item.write(ver, buf);
}
}
fn len(&self, _ver: &Ver808) -> usize {
6 + self.file_list.len() * 28
}
}
impl Jt808BodyTrans for Jt0x1205 {
fn fill_new<T>(buf: &mut T, jt808: &Jt808) -> Self
where
T: IBuffRead,
{
let sn = buf.get_u16();
let file_count = buf.get_u32() as usize;
let mut file_list = Vec::<JtVideoFileListItem>::with_capacity(file_count);
for _i in 0..file_count {
file_list.push(JtVideoFileListItem::fill_new(buf, jt808));
}
Self { sn, file_list }
}
}
#[derive(Debug, Default)]
pub struct JtVideoFileListItem {
pub channel: u8,
pub starttime: i64,
pub endtime: i64,
pub alarm: u64,
pub media_type: u8,
pub stream_type: u8,
pub storage_type: u8,
pub file_size: u32,
}
impl Jt808BodySerialize for JtVideoFileListItem {
fn write(&mut self, _ver: &Ver808, buf: &mut dyn IBuffWrite) {
buf.put_u8(self.channel);
if self.starttime == 0 {
buf.put_slice(&[0; 6]);
} else {
buf.put_dt_bcd6(Local.timestamp(self.starttime, 0));
}
if self.endtime == 0 {
buf.put_slice(&[0; 6]);
} else {
buf.put_dt_bcd6(Local.timestamp(self.endtime, 0));
}
buf.put_u64(self.alarm);
buf.put_u8(self.media_type);
buf.put_u8(self.stream_type);
buf.put_u8(self.storage_type);
buf.put_u32(self.file_size);
}
fn len(&self, _ver: &Ver808) -> usize {
28
}
}
impl Jt808BodyTrans for JtVideoFileListItem {
fn fill_new<T>(buf: &mut T, _jt808: &Jt808) -> Self
where
T: IBuffRead,
{
Self {
channel: buf.get_u8(),
starttime: buf.get_dt_bcd6_timestamp(),
endtime: buf.get_dt_bcd6_timestamp(),
alarm: buf.get_u64(),
media_type: buf.get_u8(),
stream_type: buf.get_u8(),
storage_type: buf.get_u8(),
file_size: buf.get_u32(),
}
}
}