1use core::convert::TryFrom;
2
3use crate::{KnxError, Result};
4
5const APCI_MASK: u8 = 0xc0;
6const GROUP_VALUE_READ_BITS: u8 = 0x00;
7const GROUP_VALUE_RESPONSE_BITS: u8 = 0x40;
8const GROUP_VALUE_WRITE_BITS: u8 = 0x80;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13pub enum Apci {
14 GroupValueRead,
17 GroupValueResponse,
19 GroupValueWrite,
21}
22
23impl Apci {
24 pub const fn service_bits(self) -> u8 {
31 match self {
32 Self::GroupValueRead => GROUP_VALUE_READ_BITS,
33 Self::GroupValueResponse => GROUP_VALUE_RESPONSE_BITS,
34 Self::GroupValueWrite => GROUP_VALUE_WRITE_BITS,
35 }
36 }
37}
38
39impl TryFrom<u8> for Apci {
40 type Error = KnxError;
41
42 fn try_from(value: u8) -> Result<Self> {
43 match value & APCI_MASK {
44 GROUP_VALUE_READ_BITS => Ok(Self::GroupValueRead),
45 GROUP_VALUE_RESPONSE_BITS => Ok(Self::GroupValueResponse),
46 GROUP_VALUE_WRITE_BITS => Ok(Self::GroupValueWrite),
47 _ => Err(KnxError::InvalidFrame("unsupported APCI service")),
48 }
49 }
50}