V25
authorjoan <joan@abyz.me.uk>
Wed, 24 Dec 2014 22:12:21 +0000 (22:12 +0000)
committerjoan <joan@abyz.me.uk>
Wed, 24 Dec 2014 22:12:21 +0000 (22:12 +0000)
14 files changed:
command.c
pigpio.3
pigpio.c
pigpio.h
pigpio.py
pigpiod_if.3
pigpiod_if.c
pigpiod_if.h
pigs.1
setup.py
x_pigpio.c
x_pigpiod_if.c
x_pigs
x_pipe

index d35e337179bb24bbcc9203343a84cac19d7a4403..e5a94a5c62c660f1307c387f5c4dbd97d2057c9e 100644 (file)
--- a/command.c
+++ b/command.c
@@ -26,7 +26,7 @@ For more information, please refer to <http://unlicense.org/>
 */
 
 /*
-This version is for pigpio version 24+
+This version is for pigpio version 25+
 */
 
 #include <stdio.h>
@@ -136,7 +136,7 @@ cmdInfo_t cmdInfo[]=
 
    {PI_CMD_SLR,   "SLR",   121, 6}, // gpioSerialRead
    {PI_CMD_SLRC,  "SLRC",  112, 0}, // gpioSerialReadClose
-   {PI_CMD_SLRO,  "SLRO",  121, 0}, // gpioSerialReadOpen
+   {PI_CMD_SLRO,  "SLRO",  131, 0}, // gpioSerialReadOpen
 
    {PI_CMD_SPIC,  "SPIC",  112, 0}, // spiClose
    {PI_CMD_SPIO,  "SPIO",  131, 2}, // spiOpen
@@ -303,7 +303,7 @@ SERWB h bv       Write byte to serial handle.\n\
 \n\
 SLR u num        Read bit bang serial data from gpio.\n\
 SLRC u           Close gpio for bit bang serial data.\n\
-SLRO u b         Open gpio for bit bang serial data.\n\
+SLRO u b db      Open gpio for bit bang serial data.\n\
 \n\
 SPIC h           SPI close handle.\n\
 SPIO sc sb sf    SPI open channel at baud with flags.\n\
@@ -682,7 +682,7 @@ int cmdParse(
          break;
 
       case 121: /* HC I2CRD  I2CRR  I2CRW  I2CWB I2CWQ  P  PFS  PRS
-                   PWM  S  SERVO  SLR  SLRO  W  WDOG  WRITE
+                   PWM  S  SERVO  SLR  W  WDOG  WRITE
 
                    Two positive parameters.
                 */
@@ -778,7 +778,7 @@ int cmdParse(
 
          break;
 
-      case 131: /* HP I2CO  I2CPC  I2CRI  I2CWB  I2CWW  SPIO  TRIG
+      case 131: /* HP I2CO  I2CPC  I2CRI  I2CWB  I2CWW  SLRO  SPIO  TRIG
 
                    Three positive parameters.
                 */
index 6abef88840cc870bb412a53c021f9022ea7e7b15..25af5c97b6c5995f08c8c6d49c3a5e08dbef9953 100644 (file)
--- a/pigpio.3
+++ b/pigpio.3
@@ -530,7 +530,16 @@ PI_BAD_USER_GPIO or PI_NOT_PWM_GPIO.
 .br
 
 .br
-Range defaults to 255.
+For normal PWM the dutycycle will be out of the defined range
+for the gpio (see \fBgpioGetPWMrange\fP).  If a hardware clock is
+active on the gpio the reported dutycycle will be 500 (out of 1000).
+If hardware PWM is active on the gpio the reported dutycycle
+will be out of a 1000.
+
+.br
+
+.br
+Normal PWM range defaults to 255.
 
 .IP "\fBint gpioSetPWMrange(unsigned user_gpio, unsigned range)\fP"
 .IP "" 4
@@ -617,6 +626,12 @@ user_gpio: 0-31
 
 .br
 
+.br
+If a hardware clock or hardware PWM is active on the gpio
+the reported range will be 1000.
+
+.br
+
 .br
 \fBExample\fP
 .br
@@ -644,6 +659,12 @@ user_gpio: 0-31
 
 .br
 
+.br
+If a hardware clock or hardware PWM is active on the gpio
+the reported real range will be 1000.
+
+.br
+
 .br
 \fBExample\fP
 .br
@@ -784,6 +805,15 @@ user_gpio: 0-31
 
 .br
 
+.br
+For normal PWM the frequency will be that defined for the gpio by
+\fBgpioSetPWMfrequency\fP.  If a hardware clock is active on the gpio
+the reported frequency will be that set by \fBgpioHardwareClock\fP.
+If hardware PWM is active on the gpio the reported frequency
+will be that set by \fBgpioHardwarePWM\fP.
+
+.br
+
 .br
 \fBExample\fP
 .br
@@ -1884,7 +1914,7 @@ waveform created since \fBgpioInitialise\fP was called.
 This function returns the maximum possible size of a waveform in DMA
 control blocks.
 
-.IP "\fBint gpioSerialReadOpen(unsigned user_gpio, unsigned bbBaud)\fP"
+.IP "\fBint gpioSerialReadOpen(unsigned user_gpio, unsigned bbBaud, unsigned bbBits)\fP"
 .IP "" 4
 This function opens a gpio for bit bang reading of serial data.
 
@@ -1897,6 +1927,8 @@ user_gpio: 0-31
 .br
    bbBaud: 100-250000
 .br
+   bbBits: 1-32
+.br
 
 .EE
 
@@ -1904,7 +1936,7 @@ user_gpio: 0-31
 
 .br
 Returns 0 if OK, otherwise PI_BAD_USER_GPIO, PI_BAD_WAVE_BAUD,
-or PI_GPIO_IN_USE.
+PI_BAD_DATABITS, or PI_GPIO_IN_USE.
 
 .br
 
@@ -1943,6 +1975,19 @@ user_gpio: 0-31, previously opened with \fBgpioSerialReadOpen\fP
 Returns the number of bytes copied if OK, otherwise PI_BAD_USER_GPIO
 or PI_NOT_SERIAL_GPIO.
 
+.br
+
+.br
+The bytes returned for each character depend upon the number of
+data bits \fBbbBits\fP specified in the \fBgpioSerialReadOpen\fP command.
+
+.br
+
+.br
+For \fBbbBits\fP 1-8 there will be one byte per character.
+For \fBbbBits\fP 9-16 there will be two bytes per character.
+For \fBbbBits\fP 17-32 there will be four bytes per character.
+
 .IP "\fBint gpioSerialReadClose(unsigned user_gpio)\fP"
 .IP "" 4
 This function closes a gpio for bit bang reading of serial data.
index 6ed7db5666f795549944cebe37a2391116df5dcb..d15fe2f1011054830cac6f10959e4402f1a48cb1 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 24 */
+/* pigpio version 25 */
 
 #include <stdio.h>
 #include <string.h>
@@ -924,20 +924,22 @@ typedef struct
 typedef struct
 {
    int      gpio;
-   char   buf;
+   char    *buf;
    uint32_t bufSize;
    int      readPos;
    int      writePos;
-   uint32_t baud;
-   uint32_t fullBit;
-   uint32_t halfBit;
-   int      timeout;
-   uint32_t startBitTick;
-   uint32_t nextBitDiff;
+   uint32_t baud; /* 50-250000 */
+   uint32_t fullBit; /* nanoseconds */
+   uint32_t halfBit; /* nanoseconds */
+   int      timeout; /* millisconds */
+   uint32_t startBitTick; /* microseconds */
+   uint32_t nextBitDiff; /* nanoseconds */
    int      bit;
-   int      byte;
+   uint32_t data;
+   int      bytes; /* 1, 2, 4 */
    int      level;
    int      mode;
+   int      dataBits; /* 1-32 */
 } wfRx_t;
 
 union my_smbus_data
@@ -1007,7 +1009,7 @@ static wfStats_t wfStats=
 
 static rawWaveInfo_t waveInfo[PI_MAX_WAVES];
 
-static volatile wfRx_t wfRx[PI_MAX_USER_GPIO+1];
+static wfRx_t wfRx[PI_MAX_USER_GPIO+1];
 
 static int waveOutBotCB  = 0;
 static int waveOutTopCB  = NUM_WAVE_CBS;
@@ -1116,6 +1118,8 @@ CC: 00 CLK0, 01 CLK1, 10 CLK2
  gpio44 GPCLK1 ALT0 Compute module only (reserved for system use)
 */
 
+uint32_t hw_clk_freq[3];
+
 uint8_t clkDef[PI_MAX_GPIO + 1] =
 {
  /*             0     1     2     3     4     5     6     7     8     9 */
@@ -1146,6 +1150,9 @@ uint8_t clkDef[PI_MAX_GPIO + 1] =
  gpio53 pwm1 ALT1
 */
 
+uint32_t hw_pwm_freq[2];
+uint32_t hw_pwm_duty[2];
+
 uint8_t PWMDef[PI_MAX_GPIO + 1] =
 {
    /*          0     1     2     3     4     5     6     7     8     9 */
@@ -1666,7 +1673,9 @@ static int myDoCommand(uint32_t *p, unsigned bufSize, char *buf)
 
       case PI_CMD_SLRC: res = gpioSerialReadClose(p[1]); break;
 
-      case PI_CMD_SLRO: res = gpioSerialReadOpen(p[1], p[2]); break;
+      case PI_CMD_SLRO:
+            memcpy(&p[4], buf, 4);
+            res = gpioSerialReadOpen(p[1], p[2], p[4]); break;
 
 
 
@@ -2262,44 +2271,48 @@ static int wave2Cbs(unsigned wave_mode)
 
 /* ----------------------------------------------------------------------- */
 
-static void waveRxSerial(volatile wfRx_t *s, int level, uint32_t tick)
+static void waveRxSerial(wfRx_t *s, int level, uint32_t tick)
 {
-   int diffTicks;
+   int diffTicks, lastLevel;
    int newWritePos;
 
    if (s->bit >= 0)
    {
       diffTicks = tick - s->startBitTick;
 
-      if (level != PI_TIMEOUT) s->level = level;
+      if (level != PI_TIMEOUT)
+      {
+         s->level = level;
+         lastLevel = !level;
+      }
+      else lastLevel = s->level;
 
-      while ((s->bit < 9) && (diffTicks > s->nextBitDiff))
+      while ((s->bit <= s->dataBits) && (diffTicks > (s->nextBitDiff/1000)))
       {
          if (s->bit)
          {
-            if (!(s->level)) s->byte |= (1<<(s->bit-1));
+            if (lastLevel) s->data |= (1<<(s->bit-1));
          }
-         else s->byte = 0;
+         else s->data = 0;
 
          ++(s->bit);
 
          s->nextBitDiff += s->fullBit;
       }
 
-      if (s->bit == 9)
+      if (s->bit > s->dataBits)
       {
-         s->buf[s->writePos] = s->byte;
+         memcpy(s->buf + s->writePos, &s->data, s->bytes);
 
          /* don't let writePos catch readPos */
 
-         newWritePos = s->writePos;
-
-         if (++newWritePos >= s->bufSize) newWritePos = 0;
+         newWritePos = (s->writePos + s->bytes) % (s->bufSize);
 
          if (newWritePos != s->readPos) s->writePos = newWritePos;
 
-         if (level == 0) /* true transition high->low, not a timeout */
+         if (level == 0)
          {
+            gpioSetWatchdog(s->gpio, s->timeout);
             s->bit          = 0;
             s->startBitTick = tick;
             s->nextBitDiff  = s->halfBit;
@@ -5741,6 +5754,7 @@ static void initClock(int mainClock)
 
    clkSrc  = CLK_CTL_SRC_PLLD;
    clkDivI = 50 * micros; /* 10      MHz - 1      MHz */
+   //if (!mainClock) clkDivI = 40 * micros;
    clkBits = BITS;        /* 10/BITS MHz - 1/BITS MHz */
    clkDivF = 0;
    clkMash = 0;
@@ -6387,35 +6401,34 @@ static void switchFunctionOff(unsigned gpio)
    unsigned clock, pwm;
    int cctl[] = {CLK_GP0_CTL, CLK_GP1_CTL, CLK_GP2_CTL};
 
-   if (gpio <= PI_MAX_GPIO)
+   switch (gpioInfo[gpio].is)
    {
-      switch (gpioInfo[gpio].is)
-      {
-         case GPIO_SERVO:
-            /* switch servo off */
-            myGpioSetServo(gpio, gpioInfo[gpio].width, 0);
-            gpioInfo[gpio].width = 0;
-            break;
+      case GPIO_SERVO:
+         /* switch servo off */
+         myGpioSetServo(gpio, gpioInfo[gpio].width, 0);
+         gpioInfo[gpio].width = 0;
+         break;
 
-         case GPIO_PWM:
-            /* switch pwm off */
-            myGpioSetPwm(gpio, gpioInfo[gpio].width, 0);
-            gpioInfo[gpio].width = 0;
-            break;
+      case GPIO_PWM:
+         /* switch pwm off */
+         myGpioSetPwm(gpio, gpioInfo[gpio].width, 0);
+         gpioInfo[gpio].width = 0;
+         break;
 
-         case GPIO_HW_CLK:
-            /* switch hardware clock off */
-            clock = (clkDef[gpio] >> 4) & 3;
-            clkReg[cctl[clock]] = CLK_PASSWD | CLK_CTL_KILL;
-            break;
+      case GPIO_HW_CLK:
+         /* switch hardware clock off */
+         clock = (clkDef[gpio] >> 4) & 3;
+         clkReg[cctl[clock]] = CLK_PASSWD | CLK_CTL_KILL;
+         gpioInfo[gpio].width = 0;
+         break;
 
-         case GPIO_HW_PWM:
-            /* switch hardware PWM off */
-            pwm = (PWMDef[gpio] >> 4) & 3;
-            if (pwm == 0) pwmReg[PWM_CTL] &= (~PWM_CTL_PWEN1);
-            else          pwmReg[PWM_CTL] &= (~PWM_CTL_PWEN2);
-            break;
-      }
+      case GPIO_HW_PWM:
+         /* switch hardware PWM off */
+         pwm = (PWMDef[gpio] >> 4) & 3;
+         if (pwm == 0) pwmReg[PWM_CTL] &= (~PWM_CTL_PWEN1);
+         else          pwmReg[PWM_CTL] &= (~PWM_CTL_PWEN2);
+         gpioInfo[gpio].width = 0;
+         break;
    }
 }
 
@@ -6428,6 +6441,7 @@ static void stopHardwarePWM(void)
       if (gpioInfo[i].is == GPIO_HW_PWM)
       {
          switchFunctionOff(i);
+
          gpioInfo[i].is = GPIO_UNDEFINED;
       }
    }
@@ -6456,11 +6470,10 @@ int gpioSetMode(unsigned gpio, unsigned mode)
 
    if (mode != old_mode)
    {
-      if (gpio <= PI_MAX_USER_GPIO)
-      {
-         switchFunctionOff(gpio);
-         gpioInfo[gpio].is = GPIO_UNDEFINED;
-      }
+      switchFunctionOff(gpio);
+
+      gpioInfo[gpio].is = GPIO_UNDEFINED;
+
       gpioReg[reg] = (gpioReg[reg] & ~(7<<shift)) | (mode<<shift);
    }
 
@@ -6552,17 +6565,14 @@ int gpioWrite(unsigned gpio, unsigned level)
    {
       if (gpioInfo[gpio].is != GPIO_WRITE)
       {
-         if (gpioInfo[gpio].is == GPIO_UNDEFINED)
-         {
-            /* stop a glitch between setting mode then level */
-            if (level == PI_OFF) *(gpioReg + GPCLR0 + BANK) = BIT;
-            else                 *(gpioReg + GPSET0 + BANK) = BIT;
-         }
-         else
-         {
-            switchFunctionOff(gpio);
-         }
+         /* stop a glitch between setting mode then level */
+         if (level == PI_OFF) *(gpioReg + GPCLR0 + BANK) = BIT;
+         else                 *(gpioReg + GPSET0 + BANK) = BIT;
+
+         switchFunctionOff(gpio);
+
          gpioSetMode(gpio, PI_OUTPUT);
+
          gpioInfo[gpio].is = GPIO_WRITE;
       }
    }
@@ -6590,14 +6600,10 @@ int gpioPWM(unsigned gpio, unsigned val)
 
    if (gpioInfo[gpio].is != GPIO_PWM)
    {
-      if (gpioInfo[gpio].is == GPIO_UNDEFINED)
-      {
-      }
-      else
-      {
-         switchFunctionOff(gpio);
-      }
+      switchFunctionOff(gpio);
+
       gpioSetMode(gpio, PI_OUTPUT);
+
       gpioInfo[gpio].is = GPIO_PWM;
    }
 
@@ -6612,6 +6618,8 @@ int gpioPWM(unsigned gpio, unsigned val)
 
 int gpioGetPWMdutycycle(unsigned gpio)
 {
+   unsigned pwm;
+
    DBG(DBG_USER, "gpio=%d", gpio);
 
    CHECK_INITED;
@@ -6619,10 +6627,21 @@ int gpioGetPWMdutycycle(unsigned gpio)
    if (gpio > PI_MAX_USER_GPIO)
       SOFT_ERROR(PI_BAD_USER_GPIO, "bad gpio (%d)", gpio);
 
-   if (gpioInfo[gpio].is != GPIO_PWM)
-      SOFT_ERROR(PI_NOT_PWM_GPIO, "not a PWM gpio (%d)", gpio);
+   switch (gpioInfo[gpio].is)
+   {
+      case GPIO_PWM:
+         return gpioInfo[gpio].width;
 
-   return gpioInfo[gpio].width;
+      case GPIO_HW_PWM:
+         pwm = (PWMDef[gpio] >> 4) & 3;
+         return hw_pwm_duty[pwm];
+
+      case GPIO_HW_CLK:
+         return PI_HW_PWM_RANGE/2;
+
+      default:
+         SOFT_ERROR(PI_NOT_PWM_GPIO, "not a PWM gpio (%d)", gpio);
+   }
 }
 
 
@@ -6676,7 +6695,15 @@ int gpioGetPWMrange(unsigned gpio)
    if (gpio > PI_MAX_USER_GPIO)
       SOFT_ERROR(PI_BAD_USER_GPIO, "bad gpio (%d)", gpio);
 
-   return gpioInfo[gpio].range;
+   switch (gpioInfo[gpio].is)
+   {
+      case GPIO_HW_PWM:
+      case GPIO_HW_CLK:
+         return PI_HW_PWM_RANGE;
+
+      default:
+         return gpioInfo[gpio].range;
+   }
 }
 
 
@@ -6691,7 +6718,15 @@ int gpioGetPWMrealRange(unsigned gpio)
    if (gpio > PI_MAX_USER_GPIO)
       SOFT_ERROR(PI_BAD_USER_GPIO, "bad gpio (%d)", gpio);
 
-   return pwmRealRange[gpioInfo[gpio].freqIdx];
+   switch (gpioInfo[gpio].is)
+   {
+      case GPIO_HW_PWM:
+      case GPIO_HW_CLK:
+         return PI_HW_PWM_RANGE;
+
+      default:
+         return pwmRealRange[gpioInfo[gpio].freqIdx];
+   }
 }
 
 
@@ -6751,6 +6786,8 @@ int gpioSetPWMfrequency(unsigned gpio, unsigned frequency)
 
 int gpioGetPWMfrequency(unsigned gpio)
 {
+   unsigned pwm, clock;
+
    DBG(DBG_USER, "gpio=%d", gpio);
 
    CHECK_INITED;
@@ -6758,7 +6795,19 @@ int gpioGetPWMfrequency(unsigned gpio)
    if (gpio > PI_MAX_USER_GPIO)
       SOFT_ERROR(PI_BAD_USER_GPIO, "bad gpio (%d)", gpio);
 
-   return pwmFreq[gpioInfo[gpio].freqIdx];
+   switch (gpioInfo[gpio].is)
+   {
+      case GPIO_HW_PWM:
+         pwm = (PWMDef[gpio] >> 4) & 3;
+         return hw_pwm_freq[pwm];
+
+      case GPIO_HW_CLK:
+         clock = (clkDef[gpio] >> 4) & 3;
+         return hw_clk_freq[clock];
+
+      default:
+         return pwmFreq[gpioInfo[gpio].freqIdx];
+   }
 }
 
 
@@ -6783,14 +6832,10 @@ int gpioServo(unsigned gpio, unsigned val)
 
    if (gpioInfo[gpio].is != GPIO_SERVO)
    {
-      if (gpioInfo[gpio].is == GPIO_UNDEFINED)
-      {
-      }
-      else
-      {
-         switchFunctionOff(gpio);
-      }
+      switchFunctionOff(gpio);
+
       gpioSetMode(gpio, PI_OUTPUT);
+
       gpioInfo[gpio].is = GPIO_SERVO;
    }
 
@@ -7435,11 +7480,11 @@ int gpioWaveGetMaxCbs(void)
 
 /*-------------------------------------------------------------------------*/
 
-int gpioSerialReadOpen(unsigned gpio, unsigned bbBaud)
+int gpioSerialReadOpen(unsigned gpio, unsigned bbBaud, unsigned bbBits)
 {
    int bitTime, timeout;
 
-   DBG(DBG_USER, "gpio=%d bbBaud=%d", gpio, bbBaud);
+   DBG(DBG_USER, "gpio=%d bbBaud=%d bbBits=%d", gpio, bbBaud, bbBits);
 
    CHECK_INITED;
 
@@ -7450,12 +7495,17 @@ int gpioSerialReadOpen(unsigned gpio, unsigned bbBaud)
       SOFT_ERROR(PI_BAD_WAVE_BAUD,
          "gpio %d, bad baud rate (%d)", gpio, bbBaud);
 
+   if ((bbBits < PI_MIN_WAVE_DATABITS) || (bbBits > PI_MAX_WAVE_DATABITS))
+      SOFT_ERROR(PI_BAD_DATABITS,
+         "gpio %d, bad data bits (%d)", gpio, bbBits);
+
    if (wfRx[gpio].mode != PI_WFRX_NONE)
       SOFT_ERROR(PI_GPIO_IN_USE, "gpio %d is already being used", gpio);
 
-   bitTime = MILLION / bbBaud;
+   bitTime = (1000 * MILLION) / bbBaud; /* nanoseconds */
+
+   timeout  = ((bbBits+2) * bitTime)/MILLION; /* milliseconds */
 
-   timeout  = (10 * bitTime)/1000;
    if (timeout < 1) timeout = 1;
 
    wfRx[gpio].gpio     = gpio;
@@ -7464,11 +7514,16 @@ int gpioSerialReadOpen(unsigned gpio, unsigned bbBaud)
    wfRx[gpio].mode     = PI_WFRX_SERIAL;
    wfRx[gpio].baud     = bbBaud;
    wfRx[gpio].timeout  = timeout;
-   wfRx[gpio].fullBit  = bitTime;
-   wfRx[gpio].halfBit  = bitTime/2;
+   wfRx[gpio].fullBit  = bitTime;         /* nanoseconds */
+   wfRx[gpio].halfBit  = (bitTime/2)+500; /* nanoseconds (500 for rounding) */
    wfRx[gpio].readPos  = 0;
    wfRx[gpio].writePos = 0;
    wfRx[gpio].bit      = -1;
+   wfRx[gpio].dataBits = bbBits;
+
+   if      (bbBits <  9) wfRx[gpio].bytes = 1;
+   else if (bbBits < 17) wfRx[gpio].bytes = 2;
+   else                  wfRx[gpio].bytes = 4;
 
    gpioSetAlertFunc(gpio, waveRxBit);
 
@@ -7506,6 +7561,10 @@ int gpioSerialRead(unsigned gpio, void *buf, size_t bufSize)
 
       if (bytes > bufSize) bytes = bufSize;
 
+      /* copy in multiples of the data size in bytes */
+
+      bytes = (bytes / p->bytes) * p->bytes;
+
       if (buf) memcpy(buf, p->buf+p->readPos, bytes);
 
       p->readPos += bytes;
@@ -8426,6 +8485,10 @@ int gpioHardwareClock(unsigned gpio, unsigned frequency)
    {
       if (chooseBestClock(&clkInf, frequency, CLK_SRCS, cfreq))
       {
+         /* record the clock frequency */
+
+         hw_clk_freq[clock] = frequency;
+
          initHWClk(cctl[clock], cdiv[clock],
             csrc[clkInf.clock], clkInf.div, clkInf.frac, mash);
 
@@ -8496,6 +8559,11 @@ int gpioHardwarePWM(
    {
       if (chooseBestClock(&clkInf, frequency, CLK_SRCS, cfreq))
       {
+         /* record the PWM frequency and dutycycle */
+
+         hw_pwm_freq[pwm] = frequency / PI_HW_PWM_RANGE;
+         hw_pwm_duty[pwm] = dutycycle;
+
          /* Abort any waveform transmission in progress */
 
          if (gpioWaveTxBusy()) gpioWaveTxStop();
@@ -8535,14 +8603,10 @@ int gpioHardwarePWM(
 
          if (gpioInfo[gpio].is != GPIO_HW_PWM)
          {
-            if (gpioInfo[gpio].is == GPIO_UNDEFINED)
-            {
-            }
-            else
-            {
-               switchFunctionOff(gpio);
-            }
+            switchFunctionOff(gpio);
+
             gpioSetMode(gpio, mode);
+
             gpioInfo[gpio].is = GPIO_HW_PWM;
          }
       }
index 6bc2e2643ab42f2898efd2c475fc608a911d8661..3f8edb804a91e68375ffdafb933ab1052e8c7542 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 24
+#define PIGPIO_VERSION 25
 
 /*TEXT
 
@@ -812,7 +812,13 @@ user_gpio: 0-31
 Returns between 0 (off) and range (fully on) if OK, otherwise
 PI_BAD_USER_GPIO or PI_NOT_PWM_GPIO.
 
-Range defaults to 255.
+For normal PWM the dutycycle will be out of the defined range
+for the gpio (see [*gpioGetPWMrange*]).  If a hardware clock is
+active on the gpio the reported dutycycle will be 500 (out of 1000).
+If hardware PWM is active on the gpio the reported dutycycle
+will be out of a 1000.
+
+Normal PWM range defaults to 255.
 D*/
 
 
@@ -861,6 +867,9 @@ PI_BAD_USER_GPIO.
 user_gpio: 0-31
 . .
 
+If a hardware clock or hardware PWM is active on the gpio
+the reported range will be 1000.
+
 ...
 r = gpioGetPWMrange(23);
 ...
@@ -877,6 +886,9 @@ PI_BAD_USER_GPIO.
 user_gpio: 0-31
 . .
 
+If a hardware clock or hardware PWM is active on the gpio
+the reported real range will be 1000.
+
 ...
 rr = gpioGetPWMrealRange(17);
 ...
@@ -950,6 +962,12 @@ PI_BAD_USER_GPIO.
 user_gpio: 0-31
 . .
 
+For normal PWM the frequency will be that defined for the gpio by
+[*gpioSetPWMfrequency*].  If a hardware clock is active on the gpio
+the reported frequency will be that set by [*gpioHardwareClock*].
+If hardware PWM is active on the gpio the reported frequency
+will be that set by [*gpioHardwarePWM*].
+
 ...
 f = gpioGetPWMfrequency(23); // Get frequency used for gpio23.
 ...
@@ -1603,17 +1621,18 @@ D*/
 
 
 /*F*/
-int gpioSerialReadOpen(unsigned user_gpio, unsigned bbBaud);
+int gpioSerialReadOpen(unsigned user_gpio, unsigned bbBaud, unsigned bbBits);
 /*D
 This function opens a gpio for bit bang reading of serial data.
 
 . .
 user_gpio: 0-31
    bbBaud: 100-250000
+   bbBits: 1-32
 . .
 
 Returns 0 if OK, otherwise PI_BAD_USER_GPIO, PI_BAD_WAVE_BAUD,
-or PI_GPIO_IN_USE.
+PI_BAD_DATABITS, or PI_GPIO_IN_USE.
 
 The serial data is returned in a cyclic buffer and is read using
 [*gpioSerialRead*].
@@ -1637,6 +1656,13 @@ user_gpio: 0-31, previously opened with [*gpioSerialReadOpen*]
 
 Returns the number of bytes copied if OK, otherwise PI_BAD_USER_GPIO
 or PI_NOT_SERIAL_GPIO.
+
+The bytes returned for each character depend upon the number of
+data bits [*bbBits*] specified in the [*gpioSerialReadOpen*] command.
+
+For [*bbBits*] 1-8 there will be one byte per character.
+For [*bbBits*] 9-16 there will be two bytes per character.
+For [*bbBits*] 17-32 there will be four bytes per character.
 D*/
 
 
index 44c41e1cf0fd8b51018dd51c5eb55fafe7816796..5ca345f48a9914f556aebb9be607ae808ec5b7fe 100644 (file)
--- a/pigpio.py
+++ b/pigpio.py
@@ -252,7 +252,7 @@ import threading
 import os
 import atexit
 
-VERSION = "1.14"
+VERSION = "1.15"
 
 exceptions = True
 
@@ -1049,6 +1049,13 @@ class pi():
 
       Returns the PWM dutycycle.
 
+
+      For normal PWM the dutycycle will be out of the defined range
+      for the gpio (see [*get_PWM_range*]).  If a hardware clock is
+      active on the gpio the reported dutycycle will be 500
+      (out of 1000).  If hardware PWM is active on the gpio the
+      reported dutycycle will be out of a 1000.
+
       ...
       pi.set_PWM_dutycycle(4, 25)
       print(pi.get_PWM_dutycycle(4))
@@ -1082,6 +1089,9 @@ class pi():
 
       user_gpio:= 0-31.
 
+      If a hardware clock or hardware PWM is active on the gpio
+      the reported range will be 1000.
+
       ...
       pi.set_PWM_range(9, 500)
       print(pi.get_PWM_range(9))
@@ -1097,6 +1107,9 @@ class pi():
 
       user_gpio:= 0-31.
 
+      If a hardware clock or hardware PWM is active on the gpio
+      the reported real range will be 1000.
+
       ...
       pi.set_PWM_frequency(4, 800)
       print(pi.get_PWM_real_range(4))
@@ -1135,6 +1148,12 @@ class pi():
 
       Returns the frequency (in Hz) used for the gpio.
 
+      For normal PWM the frequency will be that defined for the gpio
+      by [*set_PWM_frequency*].  If a hardware clock is active on the
+      gpio the reported frequency will be that set by [*hardware_clock*].
+      If hardware PWM is active on the gpio the reported frequency
+      will be that set by [*hardware_PWM*].
+
       ...
       pi.set_PWM_frequency(4,0)
       print(pi.get_PWM_frequency(4))
@@ -1684,7 +1703,7 @@ class pi():
                   to output.
         bb_baud:= baud rate to use.
            data:= the bytes to write.
-         offset:= number of microseconds from the starts of the
+         offset:= number of microseconds from the start of the
                   waveform, default 0.
         bb_bits:= number of data bits, default 8.
         bb_stop:= number of stop half bits, default 2.
@@ -2858,12 +2877,13 @@ class pi():
       """
       return _u2i(_pigpio_command(self.sl, _PI_CMD_PROCD, script_id, 0))
 
-   def bb_serial_read_open(self, user_gpio, bb_baud):
+   def bb_serial_read_open(self, user_gpio, bb_baud, bb_bits=8):
       """
       Opens a gpio for bit bang reading of serial data.
 
       user_gpio:= 0-31, the gpio to use.
         bb_baud:= 300-250000, the baud rate.
+        bb_bits:= 1-32, the number of bits per word, default 8.
 
       The serial data is held in a cyclic buffer and is read using
       [*bb_serial_read*].
@@ -2876,8 +2896,16 @@ class pi():
       status = pi.bb_serial_read_open(17, 9600)
       ...
       """
-      return _u2i(_pigpio_command(
-         self.sl, _PI_CMD_SLRO, user_gpio, bb_baud))
+      # pigpio message format
+
+      # I p1 user_gpio
+      # I p2 bb_baud
+      # I p3 4
+      ## extension ##
+      # I bb_bits
+      extents = [struct.pack("I", bb_bits)]
+      return _u2i(_pigpio_command_ext(
+         self.sl, _PI_CMD_SLRO, user_gpio, bb_baud, 4, extents))
 
    def bb_serial_read(self, user_gpio):
       """
@@ -2890,6 +2918,14 @@ class pi():
       number of bytes read will be less than zero (and will contain
       the error code).
 
+      The bytes returned for each character depend upon the number of
+      data bits [*bb_bits*] specified in the [*bb_serial_read_open*]
+      command.
+
+      For [*bb_bits*] 1-8 there will be one byte per character.
+      For [*bb_bits*] 9-16 there will be two bytes per character.
+      For [*bb_bits*] 17-32 there will be four bytes per character.
+
       ...
       (count, data) = pi.bb_serial_read(4)
       ...
index 576b2c3094eb2f003b9c49d63b6fcee9503f30fa..0af3b824506cbc103cd884e8c245ea8d0dc59996 100644 (file)
@@ -457,6 +457,15 @@ user_gpio: 0-31.
 .br
 Returns 0 if OK, otherwise PI_BAD_USER_GPIO or PI_NOT_PWM_GPIO.
 
+.br
+
+.br
+For normal PWM the dutycycle will be out of the defined range
+for the gpio (see \fBget_PWM_range\fP).  If a hardware clock is
+active on the gpio the reported dutycycle will be 500 (out of 1000).
+If hardware PWM is active on the gpio the reported dutycycle
+will be out of a 1000.
+
 .IP "\fBint set_PWM_range(unsigned user_gpio, unsigned range)\fP"
 .IP "" 4
 Set the range of PWM values to be used on the gpio.
@@ -535,6 +544,12 @@ user_gpio: 0-31.
 Returns the dutycycle range used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
 
+.br
+
+.br
+If a hardware clock or hardware PWM is active on the gpio the
+reported range will be 1000.
+
 .IP "\fBint get_PWM_real_range(unsigned user_gpio)\fP"
 .IP "" 4
 Get the real underlying range of PWM values being used on the gpio.
@@ -555,6 +570,12 @@ user_gpio: 0-31.
 Returns the real range used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
 
+.br
+
+.br
+If a hardware clock or hardware PWM is active on the gpio the
+reported real range will be 1000.
+
 .IP "\fBint set_PWM_frequency(unsigned user_gpio, unsigned frequency)\fP"
 .IP "" 4
 Set the frequency (in Hz) of the PWM to be used on the gpio.
@@ -654,6 +675,15 @@ user_gpio: 0-31.
 
 .br
 
+.br
+For normal PWM the frequency will be that defined for the gpio by
+\fBset_PWM_frequency\fP.  If a hardware clock is active on the gpio the
+reported frequency will be that set by \fBhardware_clock\fP.  If hardware
+PWM is active on the gpio the reported frequency will be that set by
+\fBhardware_PWM\fP.
+
+.br
+
 .br
 Returns the frequency (in hertz) used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
@@ -1892,7 +1922,7 @@ script_id: >=0, as returned by \fBstore_script\fP.
 .br
 The function returns 0 if OK, otherwise PI_BAD_SCRIPT_ID.
 
-.IP "\fBint bb_serial_read_open(unsigned user_gpio, unsigned bbBaud)\fP"
+.IP "\fBint bb_serial_read_open(unsigned user_gpio, unsigned bbBaud, unsigned bbBits)\fP"
 .IP "" 4
 This function opens a gpio for bit bang reading of serial data.
 
@@ -1905,6 +1935,8 @@ user_gpio: 0-31.
 .br
    bbBaud: 100-250000
 .br
+   bbBits: 1-32
+.br
 
 .EE
 
@@ -1951,6 +1983,19 @@ user_gpio: 0-31, previously opened with \fBbb_serial_read_open\fP.
 Returns the number of bytes copied if OK, otherwise PI_BAD_USER_GPIO
 or PI_NOT_SERIAL_GPIO.
 
+.br
+
+.br
+The bytes returned for each character depend upon the number of
+data bits \fBbbBits\fP specified in the \fBbb_serial_read_open\fP command.
+
+.br
+
+.br
+For \fBbbBits\fP 1-8 there will be one byte per character.
+For \fBbbBits\fP 9-16 there will be two bytes per character.
+For \fBbbBits\fP 17-32 there will be four bytes per character.
+
 .IP "\fBint bb_serial_read_close(unsigned user_gpio)\fP"
 .IP "" 4
 This function closes a gpio for bit bang reading of serial data.
index 488e72a020f987a8076f755c28679b40ccbc01c9..c51e6a5fa74b8249f11f446be21d7d6d848c0a5e 100644 (file)
@@ -864,8 +864,24 @@ int stop_script(unsigned script_id)
 int delete_script(unsigned script_id)
    {return pigpio_command(gPigCommand, PI_CMD_PROCD, script_id, 0, 1);}
 
-int bb_serial_read_open(unsigned user_gpio, unsigned baud)
-   {return pigpio_command(gPigCommand, PI_CMD_SLRO, user_gpio, baud, 1);}
+int bb_serial_read_open(unsigned user_gpio, unsigned baud, uint32_t bbBits)
+{
+   gpioExtent_t ext[1];
+   
+   /*
+   p1=user_gpio
+   p2=baud
+   p3=4
+   ## extension ##
+   unsigned bbBits
+   */
+
+   ext[0].size = sizeof(uint32_t);
+   ext[0].ptr = &bbBits;
+
+   return pigpio_command_ext(
+      gPigCommand, PI_CMD_SLRO, user_gpio, baud, 4, 1, ext, 1);
+}
 
 int bb_serial_read(unsigned user_gpio, void *buf, size_t bufSize)
 {
index 4fc199ecebcf5cca19301edb52ce47ab73284209..61596fa857f7457704bbd540c91c145a97b19a2a 100644 (file)
@@ -30,7 +30,7 @@ For more information, please refer to <http://unlicense.org/>
 
 #include "pigpio.h"
 
-#define PIGPIOD_IF_VERSION 12
+#define PIGPIOD_IF_VERSION 13
 
 /*TEXT
 
@@ -464,6 +464,12 @@ user_gpio: 0-31.
 . .
 
 Returns 0 if OK, otherwise PI_BAD_USER_GPIO or PI_NOT_PWM_GPIO.
+
+For normal PWM the dutycycle will be out of the defined range
+for the gpio (see [*get_PWM_range*]).  If a hardware clock is
+active on the gpio the reported dutycycle will be 500 (out of 1000).
+If hardware PWM is active on the gpio the reported dutycycle
+will be out of a 1000.
 D*/
 
 /*F*/
@@ -507,6 +513,9 @@ user_gpio: 0-31.
 
 Returns the dutycycle range used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
+
+If a hardware clock or hardware PWM is active on the gpio the
+reported range will be 1000.
 D*/
 
 /*F*/
@@ -520,6 +529,9 @@ user_gpio: 0-31.
 
 Returns the real range used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
+
+If a hardware clock or hardware PWM is active on the gpio the
+reported real range will be 1000.
 D*/
 
 /*F*/
@@ -575,6 +587,12 @@ Get the frequency of PWM being used on the gpio.
 user_gpio: 0-31.
 . .
 
+For normal PWM the frequency will be that defined for the gpio by
+[*set_PWM_frequency*].  If a hardware clock is active on the gpio the
+reported frequency will be that set by [*hardware_clock*].  If hardware
+PWM is active on the gpio the reported frequency will be that set by
+[*hardware_PWM*].
+
 Returns the frequency (in hertz) used for the gpio if OK,
 otherwise PI_BAD_USER_GPIO.
 D*/
@@ -1343,13 +1361,14 @@ The function returns 0 if OK, otherwise PI_BAD_SCRIPT_ID.
 D*/
 
 /*F*/
-int bb_serial_read_open(unsigned user_gpio, unsigned bbBaud);
+int bb_serial_read_open(unsigned user_gpio, unsigned bbBaud, unsigned bbBits);
 /*D
 This function opens a gpio for bit bang reading of serial data.
 
 . .
 user_gpio: 0-31.
    bbBaud: 100-250000
+   bbBits: 1-32
 . .
 
 Returns 0 if OK, otherwise PI_BAD_USER_GPIO, PI_BAD_WAVE_BAUD,
@@ -1376,6 +1395,13 @@ user_gpio: 0-31, previously opened with [*bb_serial_read_open*].
 
 Returns the number of bytes copied if OK, otherwise PI_BAD_USER_GPIO
 or PI_NOT_SERIAL_GPIO.
+
+The bytes returned for each character depend upon the number of
+data bits [*bbBits*] specified in the [*bb_serial_read_open*] command.
+
+For [*bbBits*] 1-8 there will be one byte per character.
+For [*bbBits*] 9-16 there will be two bytes per character.
+For [*bbBits*] 17-32 there will be four bytes per character.
 D*/
 
 /*F*/
diff --git a/pigs.1 b/pigs.1
index 5449176180605e4f2f8f05df31e067c96e3d3438..6235830f71dbc5272da6b2fe87245635dac44aee 100644 (file)
--- a/pigs.1
+++ b/pigs.1
@@ -361,6 +361,13 @@ This command returns the PWM dutycycle in use on gpio \fBu\fP.
 Upon success the dutycycle is returned.  On error a negative
 status code will be returned.
 
+.br
+For normal PWM the dutycycle will be out of the defined range
+for the gpio (see \fBPRG\fP).  If a hardware clock is active on
+the gpio the reported dutycycle will be 500 (out of 1000).
+If hardware PWM is active on the gpio the reported dutycycle
+will be out of a 1000.
+
 .br
 
 \fBExample\fP
@@ -1482,6 +1489,13 @@ This command returns the PWM frequency in Hz used for gpio \fBu\fP.
 Upon success the PWM frequency is returned.  On error a negative
 status code will be returned.
 
+.br
+For normal PWM the frequency will be that defined for the gpio
+by \fBPFS\fP.  If a hardware clock is active on the gpio
+the reported frequency will be that set by \fBHC\fP.
+If hardware PWM is active on the gpio the reported frequency
+will be that set by \fBHP\fP.
+
 .br
 
 \fBExample\fP
@@ -1610,6 +1624,10 @@ This command returns the dutycycle range for gpio \fBu\fP.
 Upon success the range is returned.  On error a negative status code
 will be returned.
 
+.br
+If a hardware clock or hardware PWM is active on the gpio the reported
+range will be 1000.
+
 .br
 
 \fBExample\fP
@@ -1838,6 +1856,10 @@ ERROR: unknown script id
 .br
 This command returns the real underlying range used by gpio \fBu\fP.
 
+.br
+If a hardware clock or hardware PWM is active on the gpio the
+reported range will be 1000.
+
 .br
 Upon success the real range is returned.  On error a negative status code
 will be returned.
@@ -2269,6 +2291,17 @@ is returned.  On error a negative status code will be returned.
 .br
 The gpio \fBu\fP should have been initialised with the \fBSLRO\fP command.
 
+.br
+The bytes returned for each character depend upon the number of
+data bits \fBdb\fP specified in the \fBSLRO\fP command.
+
+.br
+For \fBdb\fP 1-8 there will be one byte per character.
+.br
+For \fBdb\fP 9-16 there will be two bytes per character.
+.br
+For \fBdb\fP 17-32 there will be four bytes per character.
+
 .br
 
 \fBExample\fP
@@ -2315,12 +2348,12 @@ ERROR: no serial read in progress on gpio
 
 .br
 
-.IP "\fBSLRO u b\fP - Open gpio for bit bang serial data"
+.IP "\fBSLRO u b db\fP - Open gpio for bit bang serial data"
 .IP "" 4
 
 .br
 This command opens gpio \fBu\fP for reading bit bang serial data
-at \fBb\fP baud.
+at \fBb\fP baud and \fBdb\fP data bits.
 
 .br
 Upon success nothing is returned.  On error a negative status code
@@ -2339,11 +2372,11 @@ in a timely fashion.
 .br
 
 .EX
-$ pigs slro 23 19200
+$ pigs slro 23 19200 8
 .br
 
 .br
-$ pigs slro 23 19200
+$ pigs slro 23 19200 8
 .br
 -50
 .br
index 2791a4fa084334c92df6f44eb29b3c1f00e4a122..6e6be8a51965c93ced080262479f17b559ff9047 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 from distutils.core import setup
 
 setup(name='pigpio',
-      version='1.14',
+      version='1.15',
       author='joan',
       author_email='joan@abyz.co.uk',
       maintainer='joan',
index 5c42ad8857e8559e00d7b415dad9c29c425173d3..e3270f959db4cd15c8e2e69579a06ba463e3f004 100644 (file)
@@ -392,7 +392,7 @@ To the lascivious pleasing of a lute.\n\
 
    /* gpioSerialReadOpen changes the alert function */
 
-   e = gpioSerialReadOpen(GPIO, BAUD);
+   e = gpioSerialReadOpen(GPIO, BAUD, 8);
    CHECK(5, 6, e, 0, 0, "serial read open");
 
    gpioWaveClear();
index a0d7a301da4f994d8e19420184b27d90712afc86..c1ff6c3ee82c8ab39c53d67ddc9a256c7cb31c12 100644 (file)
@@ -366,7 +366,7 @@ To the lascivious pleasing of a lute.\n\
    e = wave_tx_stop();
    CHECK(5, 5, e, 0, 0, "wave tx stop");
 
-   e = bb_serial_read_open(GPIO, BAUD);
+   e = bb_serial_read_open(GPIO, BAUD, 8);
    CHECK(5, 6, e, 0, 0, "serial read open");
 
    wave_clear();
diff --git a/x_pigs b/x_pigs
index db1b82d1b4973e864d6d58ccba969445dcbbc0c9..34c0642a88736f214063b2840fb114f3583e4711 100755 (executable)
--- a/x_pigs
+++ b/x_pigs
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-VERSION=24
+VERSION=25
 
 GPIO=4
 
@@ -189,7 +189,7 @@ if [[ $s = "" ]]; then echo "SERVO-d ok"; else echo "SERVO-d fail ($s)"; fi
 
 s=$(pigs wvclr)
 if [[ $s = "" ]]; then echo "SLR-a ok"; else echo "SLR-a fail ($s)"; fi
-s=$(pigs slro $GPIO 1200)
+s=$(pigs slro $GPIO 1200 8)
 if [[ $s = "" ]]; then echo "SLR-b ok"; else echo "SLR-b fail ($s)"; fi
 s=$(pigs wvas $GPIO 1200 8 2 0 0x6d 0x79 0x20 0x6e 0x61 0x6d 0x65 0x20 0x69 0x73 0x20 0x6a 0x6f 0x61 0x6e)
 if [[ $s = 95 ]]; then echo "SLR-c ok"; else echo "SLR-c fail ($s)"; fi
diff --git a/x_pipe b/x_pipe
index 6d9dafc3d4c1bfd6bf794a851957ac23d07481ec..744dee50de02f572dc3da4070181b1c480a80f34 100755 (executable)
--- a/x_pipe
+++ b/x_pipe
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-VERSION=24
+VERSION=25
 
 GPIO=4
 
@@ -258,7 +258,7 @@ if [[ $s = 0 ]]; then echo "SERVO-d ok"; else echo "SERVO-d fail ($s)"; fi
 echo "wvclr" >/dev/pigpio
 read -t 1 s </dev/pigout
 if [[ $s = 0 ]]; then echo "SLR-a ok"; else echo "SLR-a fail ($s)"; fi
-echo "slro $GPIO 1200" >/dev/pigpio
+echo "slro $GPIO 1200 8" >/dev/pigpio
 read -t 1 s </dev/pigout
 if [[ $s = 0 ]]; then echo "SLR-b ok"; else echo "SLR-b fail ($s)"; fi
 echo "wvas $GPIO 1200 8 2 0 0x6d 0x79 0x20 0x6e 0x61 0x6d 0x65 0x20 0x69 0x73 0x20 0x6a 0x6f 0x61 0x6e" >/dev/pigpio