Change the definition of the protocol id.
authorWerner Koch <wk@gnupg.org>
Wed, 24 Aug 2011 14:41:49 +0000 (16:41 +0200)
committerWerner Koch <wk@gnupg.org>
Wed, 24 Aug 2011 14:41:49 +0000 (16:41 +0200)
The protocol ID is now a structured value with the top two bits
indicating the size of the message.  Due to the selection of the
assigned values it is possible to transparently use the original
ElektorBus protocol (i.e. the protocol Id is 0xaa).

ebusdump.c
ebusnode1.c

index 4fd4da4..a8ff1f4 100644 (file)
@@ -73,6 +73,7 @@ main (int argc, char **argv )
   int idx;
   unsigned int value;
   unsigned char buffer[18];
+  unsigned int protocol;
 
   if (argc)
     {
@@ -144,15 +145,18 @@ main (int argc, char **argv )
               if (idx < sizeof (buffer))
                 buffer[idx] = c;
 
-              if (topmode && !idx && c != 0x41)
+              if (!idx)
+                protocol = (c & 0x3f);
+
+              if (topmode && !idx && (c & 0xc0) != 0x80)
                 {
-                  printf ("\x1b[1;1H" "[bad_protocol] %02x", c);
+                  printf ("\x1b[1;1H" "[bad protocol_msglen] %02x", c);
                   synced = 0;
                   any = 1;
                 }
-              else if (idx < 2)
+              else if (idx < 2 && protocol == 0x31)
                 ; /* Printed later.  */
-              else if (topmode && idx == 2)
+              else if (topmode && idx == 2 && protocol == 0x31)
                 {
                   if (c >= FIRST_NODE_ID && c <= LAST_NODE_ID)
                     printf ("\x1b[%d;1H", c+1 );
@@ -163,7 +167,7 @@ main (int argc, char **argv )
                   printf (" %02x", buffer[2]);
                   any = 1;
                 }
-              else if (topmode && idx > 3 && idx < 16)
+              else if (topmode && idx > 3 && idx < 16 && protocol == 0x31)
                 {
                   switch (idx)
                     {
@@ -201,12 +205,12 @@ main (int argc, char **argv )
                 {
                   if (idx && idx < 16)
                     putchar (' ');
-                  else if (idx == 16)
+                  else if (idx == 16 && protocol == 0x31)
                     printf (" crc: ");
-                  else if (idx == 18)
+                  else if (idx == 18 && protocol == 0x31)
                     printf (" trash: ");
                   printf ("%02x", c);
-                  if (idx == 17)
+                  if (idx == 17 && protocol == 0x31)
                     {
                       unsigned int crc = compute_crc (buffer);
                       if ((crc >> 8) == buffer[16] && (crc&0xff) == buffer[17])
index b13f75a..282739f 100644 (file)
    message.  It is used instead of the 0xaa byte of the original (May
    2011) ElektorBus protocol.  Defined values:
 
-   0x00            RFU
-   0x01 ... 0x3f   Assigned values
-   0x40            RFU
-   0x41 ... 0x4f   Experimental protocols.
-   0x50            RFU
-   0x51 ... 0x77   RFU
-   0x78 ... 0x7f   Not used to help the framing layer.
-   0x80 ... 0xff   RFU (bit 7 may be used as an urgent option).
+   | Bit 7 .. 6 | Bit 5 .. 0   |
+   |------------+--------------|
+   | Msglen     | ProtocolType |
+   |------------+--------------|
+
+   | Msglen | Description          |
+   |--------+----------------------|
+   |      0 | 48 byte + 2 byte CRC |
+   |      1 | 32 byte + 2 byte CRC |
+   |      2 | 16 byte + 2 byte CRC |
+   |      3 | RFU                  |
+   |        |                      |
+
+   | ProtocolType  | Description            | Allowed Protocoltypes |
+   |---------------+------------------------+-----------------------|
+   | 0x00          | Not used               | -                     |
+   | 0x01 ... 0x2f | Assigned values        |                       |
+   | 0x2a          | ElektorBus Application | 0                     |
+   | 0x30 ... 0x37 | Experimental protocols |                       |
+   | 0x38 ... 0x3e | RFU                    |                       |
+   | 0x3f          | Not used               |                       |
+
+   10101010
 
  */
-#define PROTOCOL_ID   0x41
+#define PROTOCOL_MSGLEN_MASK  0xc0
+#define PROTOCOL_TYPE_MASK    0x3f
+#define PROTOCOL_MSGLEN_48    0x00
+#define PROTOCOL_MSGLEN_32    0x40
+#define PROTOCOL_MSGLEN_16    0x80
+
+#define PROTOCOL_EBUS_TEST  (PROTOCOL_MSGLEN_16 | 0x31)
 
 /* Typedefs.  */
 typedef unsigned char byte;
@@ -470,9 +491,9 @@ ISR (USART_RX_vect)
                 }
             }
         }
-      else if (idx == 0 && c != PROTOCOL_ID)
+      else if (idx == 0 && (c & PROTOCOL_MSGLEN_MASK) != PROTOCOL_MSGLEN_16)
         {
-          /* Protocol mismatch - ignore this message.  */
+          /* Protocol length mismatch - ignore this message.  */
           /* Switch a lit collision LED off. */
           LED_Collision &= ~_BV(LED_Collision_BIT);
           /* Prepare for the next frame.  */
@@ -585,8 +606,8 @@ send_message (byte recp_id, const byte *data)
   /* Prepare the message.  For now we ignore the supplied DATA and
      send some stats instead.  */
   idx = 0;
-  tx_buffer[idx++] = PROTOCOL_ID;
-  tx_buffer[idx++] = 0;  /* fixme: This is the mode byte.  */
+  tx_buffer[idx++] = PROTOCOL_EBUS_TEST;
+  tx_buffer[idx++] = 0;
   tx_buffer[idx++] = config.nodeid_lo;
   tx_buffer[idx++] = recp_id;
   tx_buffer[idx++] = current_time >> 8;
@@ -735,7 +756,7 @@ send_message (byte recp_id, const byte *data)
    quickly and see what to do.  We need to return as soon as possible,
    so that the caller may re-enable the receiver.  */
 static void
-process_message (void)
+process_ebus_test (void)
 {
   /* Is this a broadcast or is it directed to us.  If not we don't
      need to care about it.  */
@@ -828,7 +849,15 @@ main (void)
       if (rx_ready)
         {
           /* Process the message.  */
-          process_message ();
+          switch ((rx_buffer[0] & PROTOCOL_TYPE_MASK))
+            {
+            case PROTOCOL_EBUS_TEST:
+              process_ebus_test ();
+              break;
+            default:
+              /* Ignore all other protocols.  */
+              break;
+            }
           /* Re-enable the receiver.  */
           rx_ready = 0;
         }