///|
/// AlarmCRBlockReq — the alarm communication relationship requested in an AR
/// Connect. Field order and defaults mirror the C# reference
/// `JIYUAN.PROFINET.IO.Block.AlarmCRBlockReq`.
pub(all) struct AlarmCRBlockReq {
  alarm_cr_type : Int
  lt : Int
  alarm_cr_properties : Int
  rta_timeout_factor : Int
  rta_retries : Int
  local_alarm_reference : Int
  max_alarm_data_length : Int
  alarm_cr_tag_header_high : Int
  alarm_cr_tag_header_low : Int
} derive(Eq, Debug)

///|
/// Default AlarmCR matching the C# reference (LT=0x8892, retries=3,
/// max data length=200, tag headers 0xC000/0xA000).
pub fn AlarmCRBlockReq::default() -> AlarmCRBlockReq {
  AlarmCRBlockReq::{
    alarm_cr_type: 1,
    lt: 0x8892,
    alarm_cr_properties: 0,
    rta_timeout_factor: 1,
    rta_retries: 3,
    local_alarm_reference: 0,
    max_alarm_data_length: 200,
    alarm_cr_tag_header_high: 0xC000,
    alarm_cr_tag_header_low: 0xA000,
  }
}

///|
/// Encode the AlarmCR block body (without the IO block header). 20 bytes,
/// all big-endian.
pub fn encode_alarm_cr_block_req(req : AlarmCRBlockReq) -> Bytes {
  let output : Array[Byte] = []
  push_u16_be(output, req.alarm_cr_type)
  push_u16_be(output, req.lt)
  push_u32_be(output, req.alarm_cr_properties)
  push_u16_be(output, req.rta_timeout_factor)
  push_u16_be(output, req.rta_retries)
  push_u16_be(output, req.local_alarm_reference)
  push_u16_be(output, req.max_alarm_data_length)
  push_u16_be(output, req.alarm_cr_tag_header_high)
  push_u16_be(output, req.alarm_cr_tag_header_low)
  Bytes::from_array(output)
}