use deku::prelude::*;
use crate::{app::command::Command, types::VarInt};
#[derive(DekuRead, DekuWrite, Default, Debug, Clone, PartialEq)]
#[deku(bits = 2, type = "u8")]
pub enum GroupCondition {
#[default]
#[deku(id = "0")]
Any,
#[deku(id = "1")]
NotEqual,
#[deku(id = "2")]
Equal,
#[deku(id = "3")]
GreaterThan,
}
#[derive(DekuRead, DekuWrite, Clone, Debug, PartialEq, Default)]
pub struct Control {
#[deku(bits = 1)]
is_dialog_start: bool,
#[deku(bits = 1)]
has_tl: bool,
#[deku(bits = 1)]
has_te: bool,
#[deku(bits = 1)]
is_ack_requested: bool,
#[deku(bits = 1)]
is_ack_not_void: bool,
#[deku(bits = 1)]
is_ack_record_requested: bool,
#[deku(bits = 1)]
has_agc: bool,
}
#[derive(DekuRead, DekuWrite, Clone, Debug, PartialEq, Default)]
pub struct AckTemplate {
transaction_id_start: u8,
transaction_id_stop: u8,
}
#[derive(DekuRead, DekuWrite, Clone, Debug, PartialEq, Default)]
#[deku(ctx = "command_length: u32", ctx_default = "u32::MAX")]
pub struct Frame {
control: Control,
dialog_id: u8,
transaction_id: u8,
#[deku(cond = "control.has_agc")]
target_rx_level_i: Option<u8>,
#[deku(cond = "control.has_tl")]
tl: Option<VarInt>,
#[deku(cond = "control.has_te")]
te: Option<VarInt>,
#[deku(cond = "control.is_ack_requested && control.is_dialog_start")]
tc: Option<VarInt>,
#[deku(cond = "control.is_ack_not_void")]
ack_template: Option<AckTemplate>,
#[deku(ctx = "command_length")]
command: Command,
}