Ringraziamenti

Alcuni codici di messaggio richiedono una conferma da parte del destinatario. In questo caso, il destinatario deve inviare una conferma (ACK) o una accettazione negativa (NAK) entro 1 secondo dalla ricezione del messaggio.

Nome gruppo di messaggi Valore
Accettazione 0xFF
Nome codice di conferma Valore
ACK 0x01
NAK 0x02

Le conferme devono essere inviate direttamente dopo la ricezione del messaggio, in modo che il mittente possa agire di conseguenza. Una conferma deve contenere il gruppo di messaggi, il codice e lo stato attuale del messaggio a cui fa riferimento. Ad esempio, se il provider riceve un messaggio contenente l'azione di risposta (0x04010002013C), deve riconoscere l'azione inviando 0xFF0100040401013C dove:

  • 0xFF: evento ACK
  • 0x01: codice ACK
  • 0x0004: lunghezza dei dati aggiuntiva
  • 0x0401: codice e gruppo di messaggi di azione
  • 0x013C: lo stato attuale del gruppo e del codice del messaggio di azione, squillo a destra e timeout di 60 secondi

Per una NAK, il motivo deve essere incluso anche come primo byte di dati aggiuntivi. Ecco alcuni dei motivi:

  • 0 x 00: non supportato
  • 0x01: dispositivo occupato
  • 0 x 02: non consentito a causa dello stato attuale
  • 0x03: non consentito a causa di un codice di autenticazione del messaggio errato
  • 0x04: azione del dispositivo ridondante

Nell'esempio precedente, se l'anello doveva essere NAK invece perché il provider era occupato con un'altra attività, il pacchetto restituito dovrebbe essere impostato su 0xFF02000401040100, dove

  • 0xFF: evento ACK
  • 0x02: codice NAK
  • 0x0004: lunghezza dei dati aggiuntiva
  • 0x01: motivo NAK, dispositivo occupato
  • 0x0401: codice e gruppo di messaggi di azione
  • 0x00: lo stato attuale del gruppo e del codice del messaggio di azione, tutti i componenti smettono di suonare

Esempio:

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