致谢
某些消息代码需要接收者确认。在这种情况下,接收器应在收到消息后的 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);
}