قدردانی ها
برخی از کدهای پیام به تأیید گیرنده نیاز دارند. در این حالت، گیرنده باید یک تأییدیه (ACK) یا تأیید منفی (NAK) را ظرف 1 ثانیه پس از دریافت پیام ارسال کند.
نام گروه پیام | ارزش |
---|---|
تصدیق | 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);
}