致谢

某些消息代码需要接收者确认。在这种情况下,接收器应在收到消息后的 1 秒内发送确认 (ACK) 或否定确认 (NAK)。

消息组名称
确认 0xFF
确认码名称
ACK 0x01
NAK 0x02

应在收到消息后直接发送确认,以便发送者相应地采取行动。确认消息应包含所引用的消息的消息组、代码和当前状态。例如,如果提供程序收到包含响铃操作 (0x04010002013C) 的消息,则应通过发回 0xFF0100040401013C 确认此操作:

  • 0xFF:ACK 事件
  • 0x01:ACK 代码
  • 0x0004:额外的数据长度
  • 0x0401:操作消息组和代码
  • 0x013C:操作消息组和代码的当前状态,右耳机响铃和 60 秒超时

对于 NAK,应将原因也作为附加数据的第一个字节包含在内。原因包括:

  • 0x00:不支持
  • 0x01:设备繁忙
  • 0x02:由于当前状态,不允许
  • 0x03:由于邮件身份验证代码不正确,因此不允许
  • 0x04:设备操作冗余

在上一个示例中,如果由于提供程序正忙于执行其他任务而改为响铃为 NAK,则应将返回的数据包设置为 0xFF02000401040100,其中

  • 0xFF:ACK 事件
  • 0x02:NAK 代码
  • 0x0004:额外的数据长度
  • 0x01:NAK 原因,设备繁忙
  • 0x0401:操作消息组和代码
  • 0x00:操作消息组和代码的当前状态,所有组件都会停止响铃

例如:

#define FP_MSG_ACK                                  0x01
#define FP_MSG_NAK                                  0x02
#define FP_MSG_GROUP_ACK                            0xFF


static void fp_msg_send_ack(uint8_t msgGroup, uint8_t msgCode)
{
    FP_MESSAGE_STREAM  req = {FP_MSG_GROUP_ACK, FP_MSG_ACK, 0, 2};

    req.data[0] = msgGroup;
    req.data[1] = msgCode;

   fp_send((uint8_t *)&req);
}

static void fp_msg_send_nak(uint8_t reason, uint8_t msgGroup, uint8_t msgCode)
{
//reason= 0x00: Not supported, 0x01: Device busy, or 0x02: Not allowed due to current state
    FP_MESSAGE_STREAM  req = {FP_MSG_GROUP_ACK, FP_MSG_NAK, 0, 3};

    req.data[0] = reason;
    req.data[1] = msgGroup;
    req.data[2] = msgCode;

   fp_send((uint8_t *)&req);
}