datacalls decoding patches
[gnokii.git] / common / protocol / fbus.c
index 87e98fe..34c0507 100644 (file)
@@ -60,6 +60,8 @@ u8 MessageBuffer[FBUS_MAX_RECEIVE_LENGTH * 6],MultiMessageBuffer[FBUS_MAX_RECEIV
 
 u8        RequestSequenceNumber = 0x00;
 
+int fbus_decoding=0;
+
 #ifdef DEBUG   
 char *N61_PrintDevice(int Device)
 {
@@ -78,11 +80,12 @@ char *N61_PrintDevice(int Device)
 void N61_RX_DisplayMessage()
 {
 #ifdef DEBUG
+  hexdump(MessageLength-2,MessageBuffer);
+
   fprintf(stdout, _("Msg Dest: %s\n"), N61_PrintDevice(MessageDestination));
   fprintf(stdout, _("Msg Source: %s\n"), N61_PrintDevice(MessageSource));
   fprintf(stdout, _("Msg Type: %02x\n"), MessageType);
-
-  hexdump(MessageLength-2,MessageBuffer);
+  fprintf(stdout, _("Msg Seq: %d\n"), MessageBuffer[MessageLength-1] & 0x0f);
 #endif
 
   AppendLog(MessageBuffer,MessageLength-2,true);
@@ -207,6 +210,9 @@ int FBUS_SendAck(u8 message_type, u8 message_seq) {
 
   unsigned char request[6];
 
+  if (fbus_decoding)
+    return 0;
+
   request[0] = message_type;
   request[1] = message_seq;
 
@@ -233,7 +239,9 @@ void FBUS_Terminate(void)
 
 void FBUS_RX_StateMachine(unsigned char rx_byte) {
 
+#if 0
   static struct timeval time_now, time_last, time_diff;
+#endif
   
   static int checksum[2];
   
@@ -263,6 +271,7 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
 
   case FBUS_RX_Discarding:
 
+#if 0
 #ifndef VC6
     gettimeofday(&time_now, NULL);
     timersub(&time_now, &time_last, &time_diff);
@@ -272,13 +281,21 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
     }
     /* else fall through to... */
 #endif
+#endif
 
-  case FBUS_RX_Sync:
+  case FBUS_RX_Sync: {
+static int discarded=0,discarded55=0;
 
       if ((CurrentConnectionType==GCT_FBUS && rx_byte == FBUS_FRAME_ID) ||
           ((CurrentConnectionType==GCT_Infrared ||
           CurrentConnectionType==GCT_Tekram) && rx_byte == FBUS_IR_FRAME_ID)) {
 
+       if (discarded) {
+         printf("[discarded %d bytes, %d were NOT 0x55]\n",discarded,discarded-discarded55);
+         discarded=0;
+         discarded55=0;
+         }
+
         BufferCount = 0;
 
        RX_State = FBUS_RX_GetDestination;
@@ -289,11 +306,16 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
       } else {
         /* Lost frame sync */
         RX_State = FBUS_RX_Discarding;
+#if 0
 #ifndef VC6
         gettimeofday(&time_last, NULL);
 #endif
+#endif
+       discarded++;
+       if (rx_byte == 0x55)
+         discarded55++;
       }    
-    break;
+    break;
 
   case FBUS_RX_GetDestination:
 
@@ -385,6 +407,7 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
 
       /* Is the checksum correct? */
       if (checksum[0] == checksum[1]) {
+u8 msgseq;
          
         if (RX_Multiple) {
 
@@ -406,7 +429,7 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
            }
            MultiMessageLength=MultiMessageLength+MessageLength-2;
 
-            FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);          
+           msgseq=MessageBuffer[MessageLength-1] & 0x0f;
                
             if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
             {
@@ -420,15 +443,22 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
               /* Do not debug Ack and RLP frames to detail. */
               if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
                 N61_RX_DisplayMessage();
+             else {
+               if (MessageType == FBUS_FRTYPE_ACK)
+                 puts("[ignoring print of ACK]");
+               else
+                 puts("[ignoring print of RLP]");
+               }
 
               GSM->DispatchMessage(MessageLength-2, MessageBuffer, MessageType);
             }
 
+            FBUS_SendAck(MessageType, msgseq);
+
          } else {
 
             /* We do not want to send ACK of ACKs and ACK of RLP frames. */
             if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1) {
-              FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);
 
               if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
               {
@@ -438,13 +468,16 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
 #endif
                 RX_State = FBUS_RX_Sync;
               }
+
+             msgseq=MessageBuffer[MessageLength-1] & 0x0f;
+             FBUS_SendAck(MessageType, msgseq);
             }
          }
         } else {
+         msgseq=MessageBuffer[MessageLength-1] & 0x0f;
 
           /* We do not want to send ACK of ACKs and ACK of RLP frames. */
           if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1) {
-            FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);
 
             if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
             {
@@ -458,17 +491,23 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
            }
          }
 
-          if (!RX_Multiple && MessageDestination!=FBUS_DEVICE_PHONE ) {
+          if (!RX_Multiple /* && MessageDestination!=FBUS_DEVICE_PHONE */ ) {
             /* Do not debug Ack and RLP frames to detail. */
             if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
               N61_RX_DisplayMessage();
+           else {
+             if (MessageType == FBUS_FRTYPE_ACK)
+               puts("[ignoring print of ACK]");
+             else
+               puts("[ignoring print of RLP]");
+             }
 
             GSM->DispatchMessage(MessageLength-2, MessageBuffer, MessageType);
           }
 
 #ifdef DEBUG
           /* When make debug and message is to phone display it */
-         if (MessageDestination==FBUS_DEVICE_PHONE) {
+         if (MessageDestination==FBUS_DEVICE_PHONE && !fbus_decoding) {
             for (i=MessageLength;i>=0;i--)
               MessageBuffer[i+6]=MessageBuffer[i];
             MessageBuffer[0]=FBUS_FRAME_ID;
@@ -482,7 +521,12 @@ void FBUS_RX_StateMachine(unsigned char rx_byte) {
            NULL_TX_DisplayMessage(MessageLength, MessageBuffer);
           }
 #endif   
+          if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
+           FBUS_SendAck(MessageType, msgseq);
        }
+#ifdef DEBUG
+       putchar('\n');
+#endif
       } else {
 #ifdef DEBUG
           fprintf(stdout, _("Bad checksum %02x (should be %02x), msg len=%i !\n"),checksum[0],checksum[1],MessageLength);