قدردانی ها

برخی از کدهای پیام به تأیید گیرنده نیاز دارند. در این حالت، گیرنده باید یک تأییدیه (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);
}