V59
authorjoan <joan@abyz.co.uk>
Thu, 22 Dec 2016 18:07:09 +0000 (18:07 +0000)
committerjoan <joan@abyz.co.uk>
Thu, 22 Dec 2016 18:07:09 +0000 (18:07 +0000)
pigpio.c
pigpio.h
pigpio.py
pigpiod_if2.3
pigpiod_if2.h
setup.py

index eacb301ffba4faf18be56b146afe374a37e300d3..22aefbf9faf5d77ca28a3932082d250c01d24760 100644 (file)
--- a/pigpio.c
+++ b/pigpio.c
@@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 For more information, please refer to <http://unlicense.org/>
 */
 
-/* pigpio version 58 */
+/* pigpio version 59 */
 
 /* include ------------------------------------------------------- */
 
@@ -897,6 +897,8 @@ typedef struct
    uint16_t width;
    uint16_t range; /* dutycycles specified by 0 .. range */
    uint16_t freqIdx;
+   uint16_t deferOff;
+   uint16_t deferRng;
 } gpioInfo_t;
 
 typedef struct
@@ -2507,6 +2509,7 @@ static void myGpioSetPwm(unsigned gpio, int oldVal, int newVal)
 {
    int switchGpioOff;
    int newOff, oldOff, realRange, cycles, i;
+   int deferOff, deferRng;
 
    DBG(DBG_INTERNAL,
       "myGpioSetPwm %d from %d to %d", gpio, oldVal, newVal);
@@ -2520,6 +2523,18 @@ static void myGpioSetPwm(unsigned gpio, int oldVal, int newVal)
    newOff = (newVal * realRange)/gpioInfo[gpio].range;
    oldOff = (oldVal * realRange)/gpioInfo[gpio].range;
 
+   deferOff = gpioInfo[gpio].deferOff;
+   deferRng = gpioInfo[gpio].deferRng;
+
+   if (gpioInfo[gpio].deferOff)
+   {
+      for (i=0; i<SUPERLEVEL; i+=deferRng)
+      {
+         myClearGpioOff(gpio, i+deferOff);
+      }
+      gpioInfo[gpio].deferOff = 0;
+   }
+
    if (newOff != oldOff)
    {
       if (newOff && oldOff)                      /* PWM CHANGE */
@@ -2527,8 +2542,16 @@ static void myGpioSetPwm(unsigned gpio, int oldVal, int newVal)
          for (i=0; i<SUPERLEVEL; i+=realRange)
             mySetGpioOff(gpio, i+newOff);
 
-         for (i=0; i<SUPERLEVEL; i+=realRange)
-            myClearGpioOff(gpio, i+oldOff);
+         if (newOff > oldOff)
+         {
+            for (i=0; i<SUPERLEVEL; i+=realRange)
+               myClearGpioOff(gpio, i+oldOff);
+         }
+         else
+         {
+            gpioInfo[gpio].deferOff = oldOff;
+            gpioInfo[gpio].deferRng = realRange;
+         }
       }
       else if (newOff)                           /* PWM START */
       {
@@ -2565,6 +2588,7 @@ static void myGpioSetPwm(unsigned gpio, int oldVal, int newVal)
 static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
 {
    int newOff, oldOff, realRange, cycles, i;
+   int deferOff, deferRng;
 
    DBG(DBG_INTERNAL,
       "myGpioSetServo %d from %d to %d", gpio, oldVal, newVal);
@@ -2575,6 +2599,18 @@ static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
    newOff = (newVal * realRange)/20000;
    oldOff = (oldVal * realRange)/20000;
 
+   deferOff = gpioInfo[gpio].deferOff;
+   deferRng = gpioInfo[gpio].deferRng;
+
+   if (gpioInfo[gpio].deferOff)
+   {
+      for (i=0; i<SUPERLEVEL; i+=deferRng)
+      {
+         myClearGpioOff(gpio, i+deferOff);
+      }
+      gpioInfo[gpio].deferOff = 0;
+   }
+
    if (newOff != oldOff)
    {
       if (newOff && oldOff)                       /* SERVO CHANGE */
@@ -2582,8 +2618,16 @@ static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
          for (i=0; i<SUPERLEVEL; i+=realRange)
             mySetGpioOff(gpio, i+newOff);
 
-         for (i=0; i<SUPERLEVEL; i+=realRange)
-            myClearGpioOff(gpio, i+oldOff);
+         if (newOff > oldOff)
+         {
+            for (i=0; i<SUPERLEVEL; i+=realRange)
+               myClearGpioOff(gpio, i+oldOff);
+         }
+         else
+         {
+            gpioInfo[gpio].deferOff = oldOff;
+            gpioInfo[gpio].deferRng = realRange;
+         }
       }
       else if (newOff)                            /* SERVO START */
       {
@@ -2592,8 +2636,7 @@ static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
 
          /* schedule new gpio on */
 
-         for (i=0; i<SUPERCYCLE; i+=cycles)
-            mySetGpioOn(gpio, i);
+         for (i=0; i<SUPERCYCLE; i+=cycles) mySetGpioOn(gpio, i);
       }
       else                                        /* SERVO STOP */
       {
@@ -8537,11 +8580,11 @@ int gpioSetPullUpDown(unsigned gpio, unsigned pud)
 
    *(gpioReg + GPPUD) = pud;
 
-   myGpioDelay(20);
+   myGpioDelay(1);
 
    *(gpioReg + GPPUDCLK0 + BANK) = BIT;
 
-   myGpioDelay(20);
+   myGpioDelay(1);
 
    *(gpioReg + GPPUD) = 0;
 
@@ -10091,7 +10134,7 @@ static void I2C_delay(wfRx_t *w)
 
 static void I2C_clock_stretch(wfRx_t *w)
 {
-   uint32_t now, max_stretch=10000;
+   uint32_t now, max_stretch=100000;
 
    myGpioSetMode(w->I.SCL, PI_INPUT);
    now = gpioTick();
@@ -10348,7 +10391,7 @@ int bbI2CZip(
             {
                if (!ack)
                {
-                  if ((bytes + outPos) < outLen)
+                  if ((bytes + outPos) <= outLen)
                   {
                      for (i=0; i<(bytes-1); i++)
                      {
@@ -10373,7 +10416,7 @@ int bbI2CZip(
             {
                if (!ack)
                {
-                  if ((bytes + inPos) < inLen)
+                  if ((bytes + inPos) <= inLen)
                   {
                      for (i=0; i<(bytes-1); i++)
                      {
@@ -10382,7 +10425,7 @@ int bbI2CZip(
                      }
                      ack = I2CPutByte(w, inBuf[inPos++]);
                   }
-                  else status = PI_BAD_I2C_RLEN;
+                  else status = PI_BAD_I2C_WLEN;
                } else status = PI_I2C_WRITE_FAILED;
             }
             else status = PI_BAD_I2C_CMD;
@@ -11224,6 +11267,7 @@ static void *pthISRThread(void *x)
       {
          lseek(fd, 0, SEEK_SET);    /* consume interrupt */
          read(fd, buf, sizeof buf);
+
          if (retval)
          {
             if (levels & (1<<isr->gpio)) level = PI_ON; else level = PI_OFF;
index d4217442782a2ee2b50025898e7c1c39020e58f1..06d12a3b63ea2e2f6f8fb0f987ec1c90a98a4598 100644 (file)
--- a/pigpio.h
+++ b/pigpio.h
@@ -31,7 +31,7 @@ For more information, please refer to <http://unlicense.org/>
 #include <stdint.h>
 #include <pthread.h>
 
-#define PIGPIO_VERSION 58
+#define PIGPIO_VERSION 59
 
 /*TEXT
 
index b22202e41817447f9e4ae3f0d268a25810021d6e..4876ab18cd429ec47ef969eda8f8bd05ed5ebf67 100644 (file)
--- a/pigpio.py
+++ b/pigpio.py
@@ -299,7 +299,7 @@ import threading
 import os
 import atexit
 
-VERSION = "1.34"
+VERSION = "1.35"
 
 exceptions = True
 
@@ -1744,12 +1744,11 @@ class pi():
 
       The watchdog may be cancelled by setting timeout to 0.
 
-      If no level change has been detected for the GPIO for timeout
-      milliseconds any notification for the GPIO has a report written
-      to the fifo with the flags set to indicate a watchdog timeout.
+      Once a watchdog has been started callbacks for the GPIO
+      will be triggered whenever there has been no GPIO activity
+      for the timeout interval.
 
-      The callback class interprets the flags and will
-      call registered callbacks for the GPIO with level TIMEOUT.
+      The callback will receive the special level TIMEOUT.
 
       ...
       pi.set_watchdog(23, 1000) # 1000 ms watchdog on GPIO 23
index 5b25e0c60450c6f7faf81fa307cc57b1c28da740..d0d56a73514977dd18b674785822ed8820827739 100644 (file)
@@ -6065,7 +6065,7 @@ to cancel the callback.
 .EX
 typedef void (*CBFunc_t)
 .br
-   (unsigned user_gpio, unsigned level, uint32_t tick);
+   (int pi, unsigned user_gpio, unsigned level, uint32_t tick);
 .br
 
 .EE
@@ -6079,7 +6079,7 @@ typedef void (*CBFunc_t)
 .EX
 typedef void (*CBFuncEx_t)
 .br
-   (unsigned user_gpio, unsigned level, uint32_t tick, void * userdata);
+   (int pi, unsigned user_gpio, unsigned level, uint32_t tick, void * userdata);
 .br
 
 .EE
index dc6f70147a8e26d2fae2eea64c2335c93408f796..0ed67199b6813ab4b0a7a41e7ba0660f2074e664 100644 (file)
@@ -3641,13 +3641,13 @@ to cancel the callback.
 CBFunc_t::
 . .
 typedef void (*CBFunc_t)
-   (unsigned user_gpio, unsigned level, uint32_t tick);
+   (int pi, unsigned user_gpio, unsigned level, uint32_t tick);
 . .
 
 CBFuncEx_t::
 . .
 typedef void (*CBFuncEx_t)
-   (unsigned user_gpio, unsigned level, uint32_t tick, void * userdata);
+   (int pi, unsigned user_gpio, unsigned level, uint32_t tick, void * userdata);
 . .
 
 char::
index 2921df839bcda94c07ea264d36981cd9b88c6cb3..619acd5d9f55127d4723620521b3bf258e817c7f 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1,26 +1,17 @@
 #!/usr/bin/env python
 
-from setuptools import setup, find_packages
+from distutils.core import setup
 
-setup(
-    name='pigpio',
-    version='1.34',
-    author='joan',
-    author_email='joan@abyz.co.uk',
-    maintainer='joan',
-    maintainer_email='joan@abyz.co.uk',
-    url='http://abyz.co.uk/rpi/pigpio/python.html',
-    description='Raspberry Pi GPIO module',
-    long_description='Raspberry Python module to access the pigpio daemon',
-    download_url='http://abyz.co.uk/rpi/pigpio/pigpio.zip',
-    license='unlicense.org',
-    keywords=[
-        'raspberrypi',
-        'gpio',
-    ],
-    packages=find_packages(),
-    classifiers=[
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 3",
-    ]
-)
+setup(name='pigpio',
+      version='1.35',
+      author='joan',
+      author_email='joan@abyz.co.uk',
+      maintainer='joan',
+      maintainer_email='joan@abyz.co.uk',
+      url='http://abyz.co.uk/rpi/pigpio/python.html/',
+      description='Raspberry gpio module',
+      long_description='Raspberry Python module to access the pigpio daemon',
+      download_url='http://abyz.co.uk/rpi/pigpio/pigpio.zip',
+      license='unlicense.org',
+      py_modules=['pigpio']
+     )