use postcard::experimental::max_size::MaxSize;
use rmk_types::connection::ConnectionStatus;
use serde::{Deserialize, Serialize};
#[cfg(feature = "dfu_split")]
use serde::{Deserializer, Serializer};
#[cfg(feature = "_ble")]
use crate::event::BatteryStatusEvent;
use crate::event::{KeyboardEvent, PointingEvent};
#[cfg(feature = "_ble")]
pub mod ble;
pub mod central;
pub(crate) mod driver;
pub mod peripheral;
#[cfg(feature = "rp2040")]
pub mod rp;
#[cfg(not(feature = "_ble"))]
pub mod serial;
pub const SPLIT_MESSAGE_MAX_SIZE: usize = SplitMessage::POSTCARD_MAX_SIZE + 4;
#[derive(Debug, Clone, Copy)]
pub struct PeripheralMatrixConfig {
pub rows: u8,
pub cols: u8,
pub row_offset: u8,
pub col_offset: u8,
}
#[repr(u8)]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, MaxSize)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum SplitMessage {
Key(KeyboardEvent),
Pointing(PointingEvent),
LedState(bool),
ConnectionStatus(ConnectionStatus),
Address([u8; 6]),
ClearPeer,
KeyboardIndicator(u8),
Layer(u8),
#[cfg(feature = "display")]
Wpm(u16),
#[cfg(feature = "display")]
Modifier(u8),
SleepState(bool),
#[cfg(feature = "_ble")]
BatteryStatus(BatteryStatusEvent),
#[cfg(feature = "dfu_split")]
FirmwareHashQuery,
#[cfg(feature = "dfu_split")]
FirmwareHashResponse(u32),
#[cfg(feature = "dfu_split")]
FirmwareChunk {
offset: u32,
len: u16,
data: FirmwareChunkData,
},
#[cfg(feature = "dfu_split")]
FirmwareChunkAck { offset: u32, crc: u32 },
#[cfg(feature = "dfu_split")]
FirmwareUpdateComplete,
#[cfg(feature = "dfu_split")]
FirmwareCrcReport(u32),
#[cfg(feature = "dfu_split")]
FirmwareCrcOk,
#[cfg(feature = "dfu_split")]
FirmwareCrcFail,
#[cfg(feature = "dfu_split")]
FirmwareUpdateConfirm,
}
#[cfg(feature = "dfu_split")]
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct FirmwareChunkData(pub [u8; 256]);
#[cfg(feature = "dfu_split")]
impl Serialize for FirmwareChunkData {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.as_slice().serialize(serializer)
}
}
#[cfg(feature = "dfu_split")]
impl<'de> Deserialize<'de> for FirmwareChunkData {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
use serde::de::Error;
let buf: &[u8] = Deserialize::deserialize(deserializer)?;
if buf.len() > 256 {
return Err(D::Error::custom("firmware chunk exceeds 256 bytes"));
}
let mut data = [0u8; 256];
data[..buf.len()].copy_from_slice(buf);
Ok(FirmwareChunkData(data))
}
}
#[cfg(feature = "dfu_split")]
impl MaxSize for FirmwareChunkData {
const POSTCARD_MAX_SIZE: usize = 258;
}