Support für BiDiB

Senderoutine (für seriellen Link)

Auf einem seriellen Link verwendet BiDiB ein besonderes Byte (das sogenannte MAGIC) zur Kennzeichnung eines Datenrahmens. Damit nicht irrtümlich innerhalb der Daten ein MAGIC erkannt wird, muss man verhindern, dass ein normales Datum mit Inhalt =MAGIC übertragen wird. Das erfolgt mittels Voranstellen eines weiteren Sonderzeichens (ESCAPE) und Verändern des Datums. Folglich muss man ESCAPE selbst auch ESCAPE'n, um nicht irrtümlich am Empfänger was Falsches zu dekodieren.

Die zu sendenden Zeichen werden auf MAGIC und ESCAPE geprüft und fallweise wird ein ESCAPE eingefügt. Das tatsächliche Absenden eines Zeichens erfolgt dann mit der Übergabe in den Ausgangsbuffer (tx_fifo_write).


static void bidib_send(unsigned char c)
  {
    if ((c == BIDIB_PKT_MAGIC) || (c == BIDIB_PKT_ESCAPE) )
      {
        tx_fifo_write(BIDIB_PKT_ESCAPE);        // escape this char
        c = c ^ 0x20;                           // 'veraendern'
      }
    tx_fifo_write(c);
  }

Für das Senden des MAGIC-Zeichens ist eine separate Routine erforderlich, MAGIC soll ja genau in diesem Fall nicht ESCAPE'd werden:


  static void bidib_send_delimiter(void)
  {
    tx_fifo_write(BIDIB_PKT_MAGIC);
  }

Senden einer BiDiB-Nachricht

Aus beiden obigen Routinen und der CRC-Berechnung lässt sich nun leicht eine Senderoutine für BiDiB-Nachrichten bauen:


void send_bidib_message(unsigned char *message)
  {
    unsigned char i=0;
    unsigned char length;
    unsigned char tx_crc = 0;

    bidib_send_delimiter();                       // MAGIC senden

    length = message[0];
    bidib_send(length);
    tx_crc = crc_array[length ^ tx_crc];          // CRC berechnen

    for (i=1; i<=length; i++)
      {
        bidib_send(message[i]);
        tx_crc = crc_array[message[i] ^ tx_crc];
      }
    bidib_send(tx_crc);
    bidib_send_delimiter();                       // abschliessendes MAGIC senden
  }

Das abschließende MAGIC darf (und soll!) auch gleichzeitig das eröffnende MAGIC der nächsten Nachricht sein.

Beispiel: Senden einer SYS_MAGIC-Nachricht

Diese Senderoutine wird nun verwendet, um die Nachrichten zu versenden, hier mal am Beispiel der MSG_SYS_MAGIC gezeigt:


const unsigned char bidib_sys_magic[] =         // this is our answer for SYS_MAGIC
  { 5,              // size
    0x00,           // addr
    0x00,           // msg_num
    MSG_SYS_MAGIC,
    BIDIB_SYS_MAGIC & 0xFF,
    (BIDIB_SYS_MAGIC >> 8) & 0xFF,
  };

static void bidib_send_sys_magic(void)
  {
    send_bidib_message((unsigned char *) bidib_sys_magic);
    bidib_tx0_msg_num = 0;
  }