use crate::constants::{PROTO_CBM, PROTO_WRITE_ATN, PROTO_WRITE_TALK};
use crate::DeviceChannel;
#[allow(unused_imports)]
use log::{debug, error, info, trace, warn};
use std::fmt;
#[derive(Debug, PartialEq, Default)]
pub enum BusMode {
Talking(DeviceChannel),
Listening(DeviceChannel),
#[default]
Idle,
}
impl fmt::Display for BusMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BusMode::Talking(dc) => write!(f, "Talking: {dc}"),
BusMode::Listening(dc) => write!(f, "Listening: {dc}"),
BusMode::Idle => write!(f, "Idle"),
}
}
}
#[derive(Debug)]
pub enum BusCommand {
Talk(DeviceChannel),
Listen(DeviceChannel),
ListenNoChannel(u8),
Untalk,
Unlisten,
Open(DeviceChannel),
Close(DeviceChannel),
}
impl fmt::Display for BusCommand {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BusCommand::Talk(dc) => write!(f, "Talk: {dc}"),
BusCommand::Listen(dc) => write!(f, "Listen: {dc}"),
BusCommand::ListenNoChannel(device) => write!(f, "Listen: {device}"),
BusCommand::Untalk => write!(f, "Untalk"),
BusCommand::Unlisten => write!(f, "Unlisten"),
BusCommand::Open(dc) => write!(f, "Open: {dc}"),
BusCommand::Close(dc) => write!(f, "Close: {dc}"),
}
}
}
impl BusCommand {
#[must_use]
pub fn protocol(&self) -> u8 {
match self {
BusCommand::Talk(_) => PROTO_CBM | PROTO_WRITE_ATN | PROTO_WRITE_TALK,
_ => PROTO_CBM | PROTO_WRITE_ATN,
}
}
#[must_use]
pub fn command_bytes(&self) -> Vec<u8> {
match self {
BusCommand::Talk(dc) => dc.as_talk_bytes(),
BusCommand::Listen(dc) => dc.as_listen_bytes(),
BusCommand::ListenNoChannel(device) => vec![0x20 | device],
BusCommand::Untalk => vec![0x5f],
BusCommand::Unlisten => vec![0x3f],
BusCommand::Open(dc) => dc.as_open_bytes(),
BusCommand::Close(dc) => dc.as_close_bytes(),
}
}
}