Podziękowania

Niektóre kody wiadomości wymagają potwierdzenia przez odbiorcę. W takim przypadku odbiorca w ciągu 1 sekundy od otrzymania wiadomości powinien wysłać potwierdzenie (ACK) lub potwierdzenie negatywnego (NAK).

Nazwa grupy wiadomości Wartość
Potwierdzenie 0xFF
Nazwa kodu potwierdzenia Wartość
POTWIERDŹ 0x01
NAK 0x02

Potwierdzenia należy wysyłać bezpośrednio po otrzymaniu wiadomości, aby nadawca mógł podjąć odpowiednie działania. Potwierdzenie powinno zawierać grupę wiadomości, kod i bieżący stan wiadomości, do której się odnosi. Jeśli na przykład Dostawca otrzyma wiadomość zawierającą działanie kontaktowe (0x04010002013C), powinien potwierdzić akcję, wysyłając odpowiedź 0xFF0100040401013C, gdy:

  • 0xFF: akcja ACK
  • 0x01: Kod ACK
  • 0x0004: dodatkowa długość danych
  • 0x0401: kod i grupa wiadomości dotyczących działania
  • 0x013C: bieżący stan grupy wiadomości z zachowaniem kodu, dzwonek w prawo i 60 sekund bezczynności

W przypadku NAK należy podać również powód jako pierwszy bajt dodatkowych danych. Możliwe przyczyny:

  • 0x00: nieobsługiwane
  • 0x01: Urządzenie jest zajęte
  • 0x02: Niedozwolone ze względu na bieżący stan
  • 0x03: Niedozwolone z powodu nieprawidłowego kodu uwierzytelniania wiadomości
  • 0x04: Zbędne działanie urządzenia

W poprzednim przykładzie, jeśli pierścień miał być ustawiony jako NAK, ponieważ dostawca był zajęty innym zadaniem, zwrócony pakiet powinien być ustawiony na 0xFF02000401040100, gdzie

  • 0xFF: akcja ACK
  • 0x02: kod NAK
  • 0x0004: dodatkowa długość danych
  • 0x01: Przyczyna NAK, urządzenie zajęte
  • 0x0401: kod i grupa wiadomości dotyczących działania
  • 0x00: bieżący stan grupy wiadomości i kodu,

Przykład

#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);
}