特別銘謝
部分訊息代碼需要接收方確認。在這種情況下,接收端應在收到訊息後的 1 秒內傳送確認 (ACK) 或負向確認 (NAK)。
訊息群組名稱 | 值 |
---|---|
確認聲明 | 0 倍 |
確認碼名稱 | 值 |
---|---|
確認 | 0x01 |
中 | 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);
}