Gordons Projects

--> Projects Top-Level GIT

Bumped the version to 2.40 - correctly this time, I hope.
[wiringPi] / wiringPi / wpiExtensions.c
index 2761945..53fafc0 100644 (file)
 #include "ads1115.h"
 #include "sn3218.h"
 #include "drcSerial.h"
+#include "drcNet.h"
+#include "../wiringPiD/drcNetCmd.h"
 #include "pseudoPins.h"
 #include "bmp180.h"
 #include "htu21d.h"
 #include "ds18b20.h"
+#include "rht03.h"
 
 #include "wpiExtensions.h"
 
@@ -134,12 +137,16 @@ static char *extractInt (char *progName, char *p, int *num)
 /*
  * extractStr:
  *     Check & return a string at the given location (prefixed by a :)
+ *     Note: The string can be enclosed in []'s to escape colons. This is
+ *     so we can handle IPv6 addresses which contain colons and the []'s is
+ *     a common way to prepresent them.
  *********************************************************************************
  */
 
 static char *extractStr (char *progName, char *p, char **str)
 {
   char *q, *r ;
+  int quoted = FALSE ;
 
   if (*p != ':')
   {
@@ -149,21 +156,38 @@ static char *extractStr (char *progName, char *p, char **str)
 
   ++p ;
 
-  if (!isprint (*p))
+  if (*p == '[')
+  {
+    quoted = TRUE ;
+    ++p ;
+  }
+
+  if (!isprint (*p))   // Is this needed?
   {
     verbError ("%s: character expected", progName) ;
     return NULL ;
   }
 
   q = p ;
-  while ((*q != 0) && (*q != ':'))
-    ++q ;
+  if (quoted)
+  {
+    while ((*q != 0) && (*q != ']'))
+      ++q ;
+  }
+  else
+  {
+    while ((*q != 0) && (*q != ':'))
+      ++q ;
+  }
 
   *str = r = calloc (q - p + 2, 1) ;   // Zeros it
 
   while (p != q)
     *r++ = *p++ ;
-    
+
+  if (quoted)                          // Skip over the ] to the :
+    ++p ;
+
   return p ;
 }
 
@@ -496,6 +520,24 @@ static int doExtensionDs18b20 (char *progName, int pinBase, char *params)
 
 
 /*
+ * doExtensionRht03:
+ *     Maxdetect 1-Wire Temperature & Humidity
+ *     rht03:base:piPin
+ *********************************************************************************
+ */
+
+static int doExtensionRht03 (char *progName, int pinBase, char *params)
+{
+  int piPin ;
+
+  if ((params = extractInt (progName, params, &piPin)) == NULL)
+    return FALSE ;
+
+  return rht03Setup (pinBase, piPin) ;
+}
+
+
+/*
  * doExtensionMax31855:
  *     Analog IO
  *     max31855:base:spiChan
@@ -698,9 +740,9 @@ static int doExtensionDrcS (char *progName, int pinBase, char *params)
   if ((params = extractInt (progName, params, &pins)) == NULL)
     return FALSE ;
 
-  if ((pins < 1) || (pins > 100))
+  if ((pins < 1) || (pins > 1000))
   {
-    verbError ("%s: pins (%d) out of range (2-100)", progName, pins) ;
+    verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ;
     return FALSE ;
   }
   
@@ -728,6 +770,59 @@ static int doExtensionDrcS (char *progName, int pinBase, char *params)
 }
 
 
+/*
+ * doExtensionDrcNet:
+ *     Interface to a DRC Network system
+ *     drcn:base:pins:ipAddress:port:password
+ *********************************************************************************
+ */
+
+static int doExtensionDrcNet (char *progName, int pinBase, char *params)
+{
+  int pins ;
+  char *ipAddress, *port, *password ;
+  char pPort [1024] ;
+
+  if ((params = extractInt (progName, params, &pins)) == NULL)
+    return FALSE ;
+
+  if ((pins < 1) || (pins > 1000))
+  {
+    verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ;
+    return FALSE ;
+  }
+  
+  if ((params = extractStr (progName, params, &ipAddress)) == NULL)
+    return FALSE ;
+
+  if (strlen (ipAddress) == 0)
+  {
+    verbError ("%s: ipAddress required", progName) ;
+    return FALSE ;
+  }
+
+  if ((params = extractStr (progName, params, &port)) == NULL)
+    return FALSE ;
+
+  if (strlen (port) == 0)
+  {
+    sprintf (pPort, "%d", DEFAULT_SERVER_PORT) ;
+    port = pPort ;
+  }
+
+  if ((params = extractStr (progName, params, &password)) == NULL)
+    return FALSE ;
+
+  if (strlen (password) == 0)
+  {
+    verbError ("%s: password required", progName) ;
+    return FALSE ;
+  }
+
+  return drcSetupNet (pinBase, pins, ipAddress, port, password) ;
+}
+
+
 
 /*
  * Function list
@@ -748,6 +843,7 @@ static struct extensionFunctionStruct extensionFunctions [] =
   { "pseudoPins",      &doExtensionPseudoPins  },
   { "htu21d",          &doExtensionHtu21d      },
   { "ds18b20",         &doExtensionDs18b20     },
+  { "rht03",           &doExtensionRht03       },
   { "mcp3002",         &doExtensionMcp3002     },
   { "mcp3004",         &doExtensionMcp3004     },
   { "mcp4802",         &doExtensionMcp4802     },
@@ -757,6 +853,7 @@ static struct extensionFunctionStruct extensionFunctions [] =
   { "max5322",         &doExtensionMax5322     },
   { "sn3218",          &doExtensionSn3218      },
   { "drcs",            &doExtensionDrcS        },
+  { "drcn",            &doExtensionDrcNet      },
   { NULL,              NULL                    },
 } ;
 
@@ -826,6 +923,6 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors)
       return extensionFn->function (progName, pinBase, p) ;
   }
 
-  verbError ("%s: extension %s not found", progName, extension) ;
+  fprintf (stderr, "%s: extension %s not found", progName, extension) ;
   return FALSE ;
 }