]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
only one UDP PAckage can be received, i.e. 64K; Timeout set to 3s, 3 retries in case...
authorhadaq <hadaq>
Wed, 18 Jul 2012 00:16:50 +0000 (00:16 +0000)
committerhadaq <hadaq>
Wed, 18 Jul 2012 00:16:50 +0000 (00:16 +0000)
libtrbnet/trberror.c
libtrbnet/trberror.h
libtrbnet/trbnet.c

index 017b19a2802d158f9701673fdca43569a080be55..0b82483d571d1ffe7544eccdb049d0ea86874904 100644 (file)
@@ -6,7 +6,7 @@
 #include "trberror.h"
 
 /* Error Handling */
-#define NUM_ERRORS 39
+#define NUM_ERRORS 40
 int trb_errno = TRB_NONE;
 
 TRB_TERM trb_term = {0, 0, 0, 0}; 
@@ -91,7 +91,8 @@ const char* trb_errorstr(int trberrno)
     "Pexor Device Error ioctl call, FIFO Transfer Error",
     "Command is not supported by TRB3",
     "TRB3 Socket Error",
-    "TRB3 Socket Timeout"
+    "TRB3 Socket Timeout",
+    "TRB3 incomplete UDP Package, data > 64K"
   };
   
   if (trberrno < NUM_ERRORS) {
index 1acb8662a6ba783d196ee1c0e3410e89fa8e9384..7ffb9985828aa7ff2384f3d81c1dbed78896a51c 100644 (file)
@@ -46,7 +46,8 @@ typedef enum {
   TRB_PEXOR_DEVICE_FIFO_TRANSFER = 35,
   TRB_TRB3_CMD_NOT_SUPPORTED = 36,
   TRB_TRB3_SOCKET_ERROR = 37,
-  TRB_TRB3_SOCKET_TIMEOUT = 38
+  TRB_TRB3_SOCKET_TIMEOUT = 38,
+  TRB_TRB3_INCOMPLETE_UDP = 39
 } TRB_ERROR;
 
 /* last TRBNet-TermPackage */
index 8f6d4da1670bdff754e8d52cc0354410e6c19bee..68c2eff9b785505cbcb65b22513df04a93dd3586 100644 (file)
@@ -1,9 +1,11 @@
-#ifdef PEXOR
-const char trbnet_version[] = "$Revision: 4.28 $  Local Pexor";
+#ifdef ETRAX
+const char trbnet_version[] = "$Revision: 4.29 $  Local Etrax";
+#elif defined PEXOR
+const char trbnet_version[] = "$Revision: 4.29 $  Local Pexor";
 #elif defined TRB3
-const char trbnet_version[] = "$Revision: 4.28 $  Local TRB3";
+const char trbnet_version[] = "$Revision: 4.29 $  Local TRB3";
 #else
-const char trbnet_version[] = "$Revision: 4.28 $  Local Etrax";
+const char trbnet_version[] = "$Revision: 4.29 $  UNKNOWN, i.e. ERROR";
 #endif
 
 #include <stdlib.h>
@@ -415,6 +417,7 @@ static int getUDPPackage()
 
 static int sendTrbPackage(size_t size)
 {
+  unsigned int timeoutCtr = 0;
   int status;
   int i;
   
@@ -429,13 +432,23 @@ static int sendTrbPackage(size_t size)
     udpBuffer[i] = htons(udpBuffer[i]);
   }
   
-  if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
-    trb_errno = TRB_TRB3_SOCKET_ERROR;
-    return -1;
-  }
+  while (timeoutCtr < 3) {
+    if (trb_debug > 2) {
+      fprintf(stderr, "Send UDP request attempt #%d\n", timeoutCtr);
+    }
+    if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
+      trb_errno = TRB_TRB3_SOCKET_ERROR;
+      return -1;
+    }
   
-  /* GetData */
-  status = getUDPPackage();
+    /* GetData */
+    status = getUDPPackage();
+    if (status > 0) break;  /* Success */
+    if (trb_errno == TRB_TRB3_SOCKET_ERROR) break; /* UDP Error */ 
+    
+    /* UDP Timeout, resend request */
+    timeoutCtr++;
+  }
   
   return status;
 }
@@ -1276,11 +1289,8 @@ int trb_fifo_read(uint8_t channel,
     tmp++;
 #else
     if (tmp - dataBuffer >= dataBufferSize) {
-      /* Get next UDP BUffer */
-      if (getUDPPackage() <= 0) {
-        return -1;
-      }
-      tmp = dataBuffer;
+      trb_errno = TRB_TRB3_INCOMPLETE_UDP;
+      return -1;
     } else {      
       tmp++;
     }
@@ -1610,8 +1620,8 @@ int init_ports()
   }
 
   /* Set Socket Timepout */
-  tv.tv_sec = 10;  /* 30 Secs Timeout */
-  tv.tv_usec = 0;  // Not init'ing this can cause strange errors
+  tv.tv_sec = 3;    /* 10 Secs Timeout */
+  tv.tv_usec = 0;  /* do not init this, it can cause strange errors */
   setsockopt(trb3_sockfd_in, SOL_SOCKET, SO_RCVTIMEO, 
              (char *)&tv,sizeof(struct timeval));