From 55e189eda5e4791d7e581a1d4d9bc17c71869964 Mon Sep 17 00:00:00 2001 From: Connor Gibson Date: Sun, 1 Jun 2025 15:15:56 -0700 Subject: [PATCH 01/22] Switch to stdbool.h - Add `#include to all files previously using the `TRUE`/`FALSE` macros - Replace all instances of `TRUE`/`FALSE` with `true`/`false`, respectively - Definitions of `TRUE`/`FALSE` macros retained in wiringPi.h for compatibility. --- devLib/lcd.c | 12 +- devLib/maxdetect.c | 26 ++-- examples/Gertboard/vumeter.c | 6 +- examples/PiFace/ladder.c | 14 +- examples/PiGlow/piGlow1.c | 6 +- examples/PiGlow/piglow.c | 8 +- examples/clock.c | 18 +-- examples/lcd-adafruit.c | 22 ++- examples/lcd.c | 13 +- examples/spiSpeed.c | 8 +- gpio/gpio.c | 16 +-- gpio/readall.c | 6 +- wiringPi/ads1115.c | 5 +- wiringPi/bmp180.c | 5 +- wiringPi/drcNet.c | 7 +- wiringPi/drcSerial.c | 11 +- wiringPi/ds18b20.c | 7 +- wiringPi/htu21d.c | 9 +- wiringPi/max31855.c | 5 +- wiringPi/max5322.c | 6 +- wiringPi/mcp23008.c | 5 +- wiringPi/mcp23016.c | 5 +- wiringPi/mcp23017.c | 5 +- wiringPi/mcp23s08.c | 5 +- wiringPi/mcp23s17.c | 5 +- wiringPi/mcp3002.c | 6 +- wiringPi/mcp3004.c | 6 +- wiringPi/mcp3422.c | 5 +- wiringPi/mcp4802.c | 6 +- wiringPi/pcf8574.c | 5 +- wiringPi/pcf8591.c | 5 +- wiringPi/pseudoPins.c | 11 +- wiringPi/rht03.c | 23 +-- wiringPi/sn3218.c | 6 +- wiringPi/sr595.c | 3 +- wiringPi/test/wiringpi_xotest_test1_spi.c | 3 +- wiringPi/wiringPi.c | 29 ++-- wiringPi/wiringPi.h | 13 +- wiringPi/wpiExtensions.c | 167 +++++++++++----------- wiringPiD/network.c | 4 +- wiringPiD/runRemote.c | 3 +- wiringPiD/wiringpid.c | 9 +- 42 files changed, 262 insertions(+), 277 deletions(-) diff --git a/devLib/lcd.c b/devLib/lcd.c index 0491bb9..1bb0807 100644 --- a/devLib/lcd.c +++ b/devLib/lcd.c @@ -27,16 +27,12 @@ #include #include #include +#include #include #include "lcd.h" -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - // HD44780U Commands #define LCD_CLEAR 0x01 @@ -483,9 +479,9 @@ int lcdInit (const int rows, const int cols, const int bits, // Rest of the initialisation sequence - lcdDisplay (lcdFd, TRUE) ; - lcdCursor (lcdFd, FALSE) ; - lcdCursorBlink (lcdFd, FALSE) ; + lcdDisplay (lcdFd, true) ; + lcdCursor (lcdFd, false) ; + lcdCursorBlink (lcdFd, false) ; lcdClear (lcdFd) ; putCommand (lcd, LCD_ENTRY | LCD_ENTRY_ID) ; diff --git a/devLib/maxdetect.c b/devLib/maxdetect.c index 69537bd..b864891 100644 --- a/devLib/maxdetect.c +++ b/devLib/maxdetect.c @@ -24,6 +24,7 @@ #include #include +#include //#include //#include @@ -31,11 +32,6 @@ #include "maxdetect.h" -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - /* * maxDetectLowHighWait: @@ -58,7 +54,7 @@ static int maxDetectLowHighWait (const int pin) { gettimeofday (&now, NULL) ; if (timercmp (&now, &timeUp, >)) - return FALSE ; + return false ; } // Wait for it to go HIGH @@ -72,10 +68,10 @@ static int maxDetectLowHighWait (const int pin) { gettimeofday (&now, NULL) ; if (timercmp (&now, &timeUp, >)) - return FALSE ; + return false ; } - return TRUE ; + return true ; } @@ -110,7 +106,7 @@ static unsigned int maxDetectClockByte (const int pin) /* * maxDetectRead: * Read in and return the 4 data bytes from the MaxDetect sensor. - * Return TRUE/FALSE depending on the checksum validity + * Return true/false depending on the checksum validity ********************************************************************************* */ @@ -136,7 +132,7 @@ int maxDetectRead (const int pin, unsigned char buffer [4]) // Now wait for sensor to pull pin low if (!maxDetectLowHighWait (pin)) - return FALSE ; + return false ; // and read in 5 bytes (40 bits) @@ -165,7 +161,7 @@ int maxDetectRead (const int pin, unsigned char buffer [4]) // reading is probably bogus. if ((took.tv_sec != 0) || (took.tv_usec > 16000)) - return FALSE ; + return false ; return checksum == localBuf [4] ; } @@ -196,7 +192,7 @@ int readRHT03 (const int pin, int *temp, int *rh) { *rh = lastRh ; *temp = lastTemp ; - return TRUE ; + return true ; } // Set timeout for next read @@ -214,7 +210,7 @@ int readRHT03 (const int pin, int *temp, int *rh) result = maxDetectRead (pin, buffer) ; if (!result) - return FALSE ; + return false ; *rh = (buffer [0] * 256 + buffer [1]) ; *temp = (buffer [2] * 256 + buffer [3]) ; @@ -229,10 +225,10 @@ int readRHT03 (const int pin, int *temp, int *rh) // (which does seem to happen - no realtime here) if ((*rh > 999) || (*temp > 800) || (*temp < -400)) - return FALSE ; + return false ; lastRh = *rh ; lastTemp = *temp ; - return TRUE ; + return true ; } diff --git a/examples/Gertboard/vumeter.c b/examples/Gertboard/vumeter.c index 9643ace..5117a11 100644 --- a/examples/Gertboard/vumeter.c +++ b/examples/Gertboard/vumeter.c @@ -18,16 +18,12 @@ #include #include +#include #include #include #include -#ifndef TRUE -#define TRUE (1==1) -#define FALSE (!TRUE) -#endif - #define B_SIZE 1000 #define S_SIZE 128 diff --git a/examples/PiFace/ladder.c b/examples/PiFace/ladder.c index 4f08a6f..2c37473 100644 --- a/examples/PiFace/ladder.c +++ b/examples/PiFace/ladder.c @@ -7,17 +7,13 @@ #include #include +#include #include #include #include #include -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - #undef DEBUG #define NUM_LEDS 8 @@ -244,7 +240,7 @@ void ledOnAction (void) if (digitalRead (PIFACE) == LOW) { chargeCapacitor () ; - ledBargraph (vCap, TRUE) ; + ledBargraph (vCap, true) ; } } @@ -264,7 +260,7 @@ void ledOffAction (void) if (digitalRead (PIFACE) == LOW) { vCap = vCapLast = 0.0 ; - ledBargraph (vCap, FALSE) ; + ledBargraph (vCap, false) ; // Wait until we release the button @@ -300,7 +296,7 @@ int main (void) // LED ON: - (void)ledBargraph (vCap, TRUE) ; + (void)ledBargraph (vCap, true) ; then = millis () + ledOnTime ; while (millis () < then) { @@ -323,7 +319,7 @@ int main (void) // LED OFF: - (void)ledBargraph (vCap, FALSE) ; + (void)ledBargraph (vCap, false) ; then = millis () + ledOffTime ; while (millis () < then) { diff --git a/examples/PiGlow/piGlow1.c b/examples/PiGlow/piGlow1.c index b04dc30..06a4f51 100644 --- a/examples/PiGlow/piGlow1.c +++ b/examples/PiGlow/piGlow1.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -32,11 +33,6 @@ #define PIGLOW_BASE 533 -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif - /* * keypressed: clearKeypressed: diff --git a/examples/PiGlow/piglow.c b/examples/PiGlow/piglow.c index b83be61..a0c28ce 100644 --- a/examples/PiGlow/piglow.c +++ b/examples/PiGlow/piglow.c @@ -26,11 +26,7 @@ #include #include #include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif +#include #include #include @@ -81,7 +77,7 @@ int main (int argc, char *argv []) // Initialise the piGlow devLib - piGlowSetup (FALSE) ; + piGlowSetup (false) ; if (argc == 1) failUsage () ; diff --git a/examples/clock.c b/examples/clock.c index a6b6567..30c3941 100644 --- a/examples/clock.c +++ b/examples/clock.c @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -45,11 +46,6 @@ #include #include -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - double clockRadius ; double thickness, barLen ; int maxX, maxY ; @@ -130,15 +126,15 @@ void drawClockFace (void) double d, px1, py1, px2, py2 ; lcd128x64clear (0) ; - lcd128x64circle (0,0, clockRadius, 1, TRUE) ; - lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; + lcd128x64circle (0,0, clockRadius, 1, true) ; + lcd128x64circle (0,0, clockRadius - thickness, 0, true) ; // The four big indicators for 12,15,30 and 45 - lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 - lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 - lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 - lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 + lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, true) ; // 12 + lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, true) ; // 3 + lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, true) ; // 6 + lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, true) ; // 9 // Smaller 5 and 1 minute ticks diff --git a/examples/lcd-adafruit.c b/examples/lcd-adafruit.c index 7600aaf..925564e 100644 --- a/examples/lcd-adafruit.c +++ b/examples/lcd-adafruit.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -34,11 +35,6 @@ #include #include -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - // Defines for the Adafruit Pi LCD interface board @@ -251,7 +247,7 @@ int main (int argc, char *argv[]) { int colour ; int cols = 16 ; - int waitForRelease = FALSE ; + int waitForRelease = false ; struct tm *t ; time_t tim ; @@ -287,13 +283,13 @@ int main (int argc, char *argv[]) lcdPuts (lcdHandle, "User Char: ") ; lcdPutchar (lcdHandle, 2) ; - lcdCursor (lcdHandle, TRUE) ; - lcdCursorBlink (lcdHandle, TRUE) ; + lcdCursor (lcdHandle, true) ; + lcdCursorBlink (lcdHandle, true) ; waitForEnter () ; - lcdCursor (lcdHandle, FALSE) ; - lcdCursorBlink (lcdHandle, FALSE) ; + lcdCursor (lcdHandle, false) ; + lcdCursorBlink (lcdHandle, false) ; speedTest () ; @@ -320,7 +316,7 @@ int main (int argc, char *argv[]) if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW)) continue ; else - waitForRelease = FALSE ; + waitForRelease = false ; } if (digitalRead (AF_UP) == LOW) // Pushed @@ -329,7 +325,7 @@ int main (int argc, char *argv[]) if (colour == 8) colour = 0 ; setBacklightColour (colour) ; - waitForRelease = TRUE ; + waitForRelease = true ; } if (digitalRead (AF_DOWN) == LOW) // Pushed @@ -338,7 +334,7 @@ int main (int argc, char *argv[]) if (colour == -1) colour = 7 ; setBacklightColour (colour) ; - waitForRelease = TRUE ; + waitForRelease = true ; } } diff --git a/examples/lcd.c b/examples/lcd.c index b006173..9584550 100644 --- a/examples/lcd.c +++ b/examples/lcd.c @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -47,10 +48,6 @@ #include #include -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif static unsigned char newChar [8] = { @@ -247,13 +244,13 @@ int main (int argc, char *argv[]) lcdPuts (lcdHandle, "User Char: ") ; lcdPutchar (lcdHandle, 2) ; - lcdCursor (lcdHandle, TRUE) ; - lcdCursorBlink (lcdHandle, TRUE) ; + lcdCursor (lcdHandle, true) ; + lcdCursorBlink (lcdHandle, true) ; waitForEnter () ; - lcdCursor (lcdHandle, FALSE) ; - lcdCursorBlink (lcdHandle, FALSE) ; + lcdCursor (lcdHandle, false) ; + lcdCursorBlink (lcdHandle, false) ; lcdClear (lcdHandle) ; for (;;) diff --git a/examples/spiSpeed.c b/examples/spiSpeed.c index cfadfe7..09cdce7 100644 --- a/examples/spiSpeed.c +++ b/examples/spiSpeed.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -36,9 +37,6 @@ #include #include -#define TRUE (1==1) -#define FALSE (!TRUE) - #define SPI_CHAN 0 #define NUM_TIMES 100 #define MAX_SIZE (1024*1024) @@ -78,7 +76,7 @@ int main (void) printf ("| MHz | Size | mS/Trans | TpS | Mb/Sec | Latency mS |\n") ; printf ("+-------+--------+----------+----------+-----------+------------+\n") ; - spiFail = FALSE ; + spiFail = false ; spiSetup (speed * 1000000) ; for (size = 1 ; size <= MAX_SIZE ; size *= 2) { @@ -89,7 +87,7 @@ int main (void) if (wiringPiSPIDataRW (SPI_CHAN, myData, size) == -1) { printf ("SPI failure: %s\n", strerror (errno)) ; - spiFail = TRUE ; + spiFail = true ; break ; } end = millis () ; diff --git a/gpio/gpio.c b/gpio/gpio.c index b5f0182..8eae4d1 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -51,11 +52,6 @@ extern void doReadall (void) ; extern void doAllReadall (void) ; extern void doQmode (int argc, char *argv []) ; -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - #define PI_USB_POWER_CONTROL 38 #define I2CDETECT "i2cdetect" #define MODPROBE "modprobe" @@ -992,12 +988,12 @@ int main (int argc, char *argv []) if (getenv ("WIRINGPI_DEBUG") != NULL) { printf ("gpio: wiringPi debug mode enabled\n") ; - wiringPiDebug = TRUE ; + wiringPiDebug = true ; } if (getenv ("GPIO_DEBUG") != NULL) { printf ("gpio: gpio debug mode enabled\n") ; - gpioDebug = TRUE ; + gpioDebug = true ; } if (argc == 1) @@ -1159,7 +1155,7 @@ int main (int argc, char *argv []) exit (EXIT_FAILURE) ; } - if (!loadWPiExtension (argv [0], argv [2], TRUE)) + if (!loadWPiExtension (argv [0], argv [2], true)) { fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; exit (EXIT_FAILURE) ; @@ -1209,8 +1205,8 @@ int main (int argc, char *argv []) else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argv [0]) ; else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; - else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; - else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; + else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, true) ; + else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, false) ; else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; else if (strcasecmp (argv [1], "wfis" ) == 0) doWfi2 (argc, argv) ; else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; diff --git a/gpio/readall.c b/gpio/readall.c index 6e2aa18..3812e53 100644 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -37,11 +38,6 @@ extern int wpMode ; -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - /* * doReadallExternal: * A relatively crude way to read the pins on an external device. diff --git a/wiringPi/ads1115.c b/wiringPi/ads1115.c index 44e53cb..2e927f2 100644 --- a/wiringPi/ads1115.c +++ b/wiringPi/ads1115.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -278,7 +279,7 @@ int ads1115Setup (const int pinBase, int i2cAddr) int fd ; if ((fd = wiringPiI2CSetup (i2cAddr)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 8) ; @@ -289,5 +290,5 @@ int ads1115Setup (const int pinBase, int i2cAddr) node->analogWrite = myAnalogWrite ; node->digitalWrite = myDigitalWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/bmp180.c b/wiringPi/bmp180.c index bf6c209..2b7e8ac 100644 --- a/wiringPi/bmp180.c +++ b/wiringPi/bmp180.c @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -192,7 +193,7 @@ int bmp180Setup (const int pinBase) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (I2C_ADDRESS)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 4) ; @@ -233,5 +234,5 @@ int bmp180Setup (const int pinBase) p1 = 1.0 - 7357.0 * pow (2.0, -20.0) ; p2 = 3038.0 * 100.0 * pow (2.0, -36.0) ; - return TRUE ; + return true ; } diff --git a/wiringPi/drcNet.c b/wiringPi/drcNet.c index 88ff655..79d71c6 100644 --- a/wiringPi/drcNet.c +++ b/wiringPi/drcNet.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -342,12 +343,12 @@ int drcSetupNet (const int pinBase, const int numPins, const char *ipAddress, co struct wiringPiNodeStruct *node ; if ((fd = _drcSetupNet (ipAddress, port, password)) < 0) - return FALSE ; + return false ; len = sizeof (struct drcNetComStruct) ; if (setsockopt (fd, SOL_SOCKET, SO_RCVLOWAT, (void *)&len, sizeof (len)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, numPins) ; @@ -361,5 +362,5 @@ int drcSetupNet (const int pinBase, const int numPins, const char *ipAddress, co node->digitalWrite = myDigitalWrite ; node->pwmWrite = myPwmWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/drcSerial.c b/wiringPi/drcSerial.c index 6ffc2b1..45288e3 100644 --- a/wiringPi/drcSerial.c +++ b/wiringPi/drcSerial.c @@ -23,6 +23,7 @@ */ #include +#include #include #include #include @@ -151,7 +152,7 @@ int drcSetupSerial (const int pinBase, const int numPins, const char *device, co struct wiringPiNodeStruct *node ; if ((fd = serialOpen (device, baud)) < 0) - return FALSE ; + return false ; delay (10) ; // May need longer if it's an Uno that reboots on the open... @@ -160,7 +161,7 @@ int drcSetupSerial (const int pinBase, const int numPins, const char *device, co while (serialDataAvail (fd)) (void)serialGetchar (fd) ; - ok = FALSE ; + ok = false ; for (tries = 1 ; (tries < 5) && (!ok) ; ++tries) { serialPutchar (fd, '@') ; // Ping @@ -170,7 +171,7 @@ int drcSetupSerial (const int pinBase, const int numPins, const char *device, co { if (serialGetchar (fd) == '@') { - ok = TRUE ; + ok = true ; break ; } } @@ -179,7 +180,7 @@ int drcSetupSerial (const int pinBase, const int numPins, const char *device, co if (!ok) { serialClose (fd) ; - return FALSE ; + return false ; } node = wiringPiNewNode (pinBase, numPins) ; @@ -192,5 +193,5 @@ int drcSetupSerial (const int pinBase, const int numPins, const char *device, co node->digitalWrite = myDigitalWrite ; node->pwmWrite = myPwmWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/ds18b20.c b/wiringPi/ds18b20.c index c4ec4fd..b12b247 100644 --- a/wiringPi/ds18b20.c +++ b/wiringPi/ds18b20.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -123,7 +124,7 @@ int ds18b20Setup (const int pinBase, const char *deviceId) // Allocate space for the filename if ((fileName = malloc (strlen (W1_PREFIX) + strlen (W1_POSTFIX) + strlen (deviceId) + 1)) == NULL) - return FALSE ; + return false ; sprintf (fileName, "%s%s%s", W1_PREFIX, deviceId, W1_POSTFIX) ; @@ -132,7 +133,7 @@ int ds18b20Setup (const int pinBase, const char *deviceId) free (fileName) ; if (fd < 0) - return FALSE ; + return false ; // We'll keep the file open, to make access a little faster // although it's very slow reading these things anyway )-: @@ -142,5 +143,5 @@ int ds18b20Setup (const int pinBase, const char *deviceId) node->fd = fd ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/htu21d.c b/wiringPi/htu21d.c index 11f20eb..1fde612 100644 --- a/wiringPi/htu21d.c +++ b/wiringPi/htu21d.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -40,7 +41,7 @@ int checksum (UNU uint8_t data [4]) { - return TRUE ; + return true ; } @@ -127,7 +128,7 @@ int htu21dSetup (const int pinBase) int status ; if ((fd = wiringPiI2CSetup (I2C_ADDRESS)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 2) ; @@ -138,7 +139,7 @@ int htu21dSetup (const int pinBase) data = 0xFE ; if (write (fd, &data, 1) != 1) - return FALSE ; + return false ; delay (15) ; @@ -146,5 +147,5 @@ int htu21dSetup (const int pinBase) status = wiringPiI2CReadReg8 (fd, 0xE7) ; - return (status == 0x02) ? TRUE : FALSE ; + return (status == 0x02) ? true : false ; } diff --git a/wiringPi/max31855.c b/wiringPi/max31855.c index 46fe74d..54e19bd 100644 --- a/wiringPi/max31855.c +++ b/wiringPi/max31855.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -88,12 +89,12 @@ int max31855Setup (const int pinBase, int spiChannel) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 5000000) < 0) // 5MHz - prob 4 on the Pi - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 4) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/max5322.c b/wiringPi/max5322.c index 888b01a..a8f4810 100644 --- a/wiringPi/max5322.c +++ b/wiringPi/max5322.c @@ -22,6 +22,8 @@ *********************************************************************** */ +#include + #include #include @@ -66,7 +68,7 @@ int max5322Setup (const int pinBase, int spiChannel) unsigned char spiData [2] ; if (wiringPiSPISetup (spiChannel, 8000000) < 0) // 10MHz Max - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 2) ; @@ -80,5 +82,5 @@ int max5322Setup (const int pinBase, int spiChannel) wiringPiSPIDataRW (node->fd, spiData, 2) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp23008.c b/wiringPi/mcp23008.c index bff6f49..22e5a5d 100644 --- a/wiringPi/mcp23008.c +++ b/wiringPi/mcp23008.c @@ -23,6 +23,7 @@ */ #include +#include #include #include "wiringPi.h" @@ -132,7 +133,7 @@ int mcp23008Setup (const int pinBase, const int i2cAddress) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; wiringPiI2CWriteReg8 (fd, MCP23x08_IOCON, IOCON_INIT) ; @@ -145,5 +146,5 @@ int mcp23008Setup (const int pinBase, const int i2cAddress) node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CReadReg8 (fd, MCP23x08_OLAT) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp23016.c b/wiringPi/mcp23016.c index b4669ba..4726967 100644 --- a/wiringPi/mcp23016.c +++ b/wiringPi/mcp23016.c @@ -23,6 +23,7 @@ */ #include +#include #include #include "wiringPi.h" @@ -146,7 +147,7 @@ int mcp23016Setup (const int pinBase, const int i2cAddress) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ; wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ; @@ -160,5 +161,5 @@ int mcp23016Setup (const int pinBase, const int i2cAddress) node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ; node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp23017.c b/wiringPi/mcp23017.c index eedf059..da45fb0 100644 --- a/wiringPi/mcp23017.c +++ b/wiringPi/mcp23017.c @@ -23,6 +23,7 @@ */ #include +#include #include #include "wiringPi.h" @@ -177,7 +178,7 @@ int mcp23017Setup (const int pinBase, const int i2cAddress) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; wiringPiI2CWriteReg8 (fd, MCP23x17_IOCON, IOCON_INIT) ; @@ -191,5 +192,5 @@ int mcp23017Setup (const int pinBase, const int i2cAddress) node->data2 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATA) ; node->data3 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATB) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp23s08.c b/wiringPi/mcp23s08.c index d9dbee7..a44733e 100644 --- a/wiringPi/mcp23s08.c +++ b/wiringPi/mcp23s08.c @@ -24,6 +24,7 @@ #include #include +#include #include "wiringPi.h" #include "wiringPiSPI.h" @@ -170,7 +171,7 @@ int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiPort, MCP_SPEED) < 0) - return FALSE ; + return false ; writeByte (spiPort, devId, MCP23x08_IOCON, IOCON_INIT) ; @@ -184,5 +185,5 @@ int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) node->digitalWrite = myDigitalWrite ; node->data2 = readByte (spiPort, devId, MCP23x08_OLAT) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp23s17.c b/wiringPi/mcp23s17.c index daf7f40..56117f5 100644 --- a/wiringPi/mcp23s17.c +++ b/wiringPi/mcp23s17.c @@ -24,6 +24,7 @@ #include #include +#include #include "wiringPi.h" #include "wiringPiSPI.h" @@ -215,7 +216,7 @@ int mcp23s17Setup (const int pinBase, const int spiPort, const int devId) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiPort, MCP_SPEED) < 0) - return FALSE ; + return false ; writeByte (spiPort, devId, MCP23x17_IOCON, IOCON_INIT | IOCON_HAEN) ; writeByte (spiPort, devId, MCP23x17_IOCONB, IOCON_INIT | IOCON_HAEN) ; @@ -231,5 +232,5 @@ int mcp23s17Setup (const int pinBase, const int spiPort, const int devId) node->data2 = readByte (spiPort, devId, MCP23x17_OLATA) ; node->data3 = readByte (spiPort, devId, MCP23x17_OLATB) ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp3002.c b/wiringPi/mcp3002.c index 04ce10a..c890053 100644 --- a/wiringPi/mcp3002.c +++ b/wiringPi/mcp3002.c @@ -22,6 +22,8 @@ *********************************************************************** */ +#include + #include #include @@ -65,12 +67,12 @@ int mcp3002Setup (const int pinBase, int spiChannel) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp3004.c b/wiringPi/mcp3004.c index 0bfc8a7..3cca2bd 100644 --- a/wiringPi/mcp3004.c +++ b/wiringPi/mcp3004.c @@ -24,6 +24,8 @@ *********************************************************************** */ +#include + #include #include @@ -65,12 +67,12 @@ int mcp3004Setup (const int pinBase, int spiChannel) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 8) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp3422.c b/wiringPi/mcp3422.c index fd441a5..0057dd4 100644 --- a/wiringPi/mcp3422.c +++ b/wiringPi/mcp3422.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -117,7 +118,7 @@ int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 4) ; @@ -126,5 +127,5 @@ int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) node->data1 = gain ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/mcp4802.c b/wiringPi/mcp4802.c index 4a411eb..ac65de9 100644 --- a/wiringPi/mcp4802.c +++ b/wiringPi/mcp4802.c @@ -22,6 +22,8 @@ *********************************************************************** */ +#include + #include #include @@ -65,12 +67,12 @@ int mcp4802Setup (const int pinBase, int spiChannel) struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogWrite = myAnalogWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/pcf8574.c b/wiringPi/pcf8574.c index 61b4cc7..b40fbe9 100644 --- a/wiringPi/pcf8574.c +++ b/wiringPi/pcf8574.c @@ -23,6 +23,7 @@ */ #include +#include #include #include "wiringPi.h" @@ -113,7 +114,7 @@ int pcf8574Setup (const int pinBase, const int i2cAddress) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 8) ; @@ -123,5 +124,5 @@ int pcf8574Setup (const int pinBase, const int i2cAddress) node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CRead (fd) ; - return TRUE ; + return true ; } diff --git a/wiringPi/pcf8591.c b/wiringPi/pcf8591.c index 10beb6b..0ad812d 100644 --- a/wiringPi/pcf8591.c +++ b/wiringPi/pcf8591.c @@ -24,6 +24,7 @@ */ #include +#include #include #include "wiringPi.h" @@ -82,7 +83,7 @@ int pcf8591Setup (const int pinBase, const int i2cAddress) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; + return false ; node = wiringPiNewNode (pinBase, 4) ; @@ -90,5 +91,5 @@ int pcf8591Setup (const int pinBase, const int i2cAddress) node->analogRead = myAnalogRead ; node->analogWrite = myAnalogWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/pseudoPins.c b/wiringPi/pseudoPins.c index c162457..e41a5ab 100644 --- a/wiringPi/pseudoPins.c +++ b/wiringPi/pseudoPins.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -80,24 +81,24 @@ int pseudoPinsSetup(const int pinBase) node = wiringPiNewNode(pinBase, PSEUDO_PINS); if (node == NULL) { fprintf(stderr, "Error creating new wiringPi node"); - return FALSE; + return false; } node->fd = shm_open(SHARED_NAME, O_CREAT | O_RDWR, 0666); if (node->fd < 0) { perror("Error opening shared memory"); - return FALSE; + return false; } if (ftruncate(node->fd, PSEUDO_PINS * sizeof(int)) < 0) { perror("Error resizing shared memory"); - return FALSE; + return false; } ptr = mmap(NULL, PSEUDO_PINS * sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, node->fd, 0); if (ptr == MAP_FAILED) { perror("Error mapping shared memory"); - return FALSE; + return false; } node->data0 = (unsigned int)(uintptr_t)ptr; @@ -105,5 +106,5 @@ int pseudoPinsSetup(const int pinBase) node->analogRead = myAnalogRead; node->analogWrite = myAnalogWrite; - return TRUE; + return true; } diff --git a/wiringPi/rht03.c b/wiringPi/rht03.c index 25d844f..99461b6 100644 --- a/wiringPi/rht03.c +++ b/wiringPi/rht03.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "wiringPi.h" @@ -51,7 +52,7 @@ static int maxDetectLowHighWait (const int pin) { gettimeofday (&now, NULL) ; if (timercmp (&now, &timeUp, >)) - return FALSE ; + return false ; } // Wait for it to go HIGH @@ -65,10 +66,10 @@ static int maxDetectLowHighWait (const int pin) { gettimeofday (&now, NULL) ; if (timercmp (&now, &timeUp, >)) - return FALSE ; + return false ; } - return TRUE ; + return true ; } @@ -103,7 +104,7 @@ static unsigned int maxDetectClockByte (const int pin) /* * maxDetectRead: * Read in and return the 4 data bytes from the MaxDetect sensor. - * Return TRUE/FALSE depending on the checksum validity + * Return true/false depending on the checksum validity ********************************************************************************* */ @@ -129,7 +130,7 @@ static int maxDetectRead (const int pin, unsigned char buffer [4]) // Now wait for sensor to pull pin low if (!maxDetectLowHighWait (pin)) - return FALSE ; + return false ; // and read in 5 bytes (40 bits) @@ -158,7 +159,7 @@ static int maxDetectRead (const int pin, unsigned char buffer [4]) // reading is probably bogus. if ((took.tv_sec != 0) || (took.tv_usec > 16000)) - return FALSE ; + return false ; return checksum == localBuf [4] ; } @@ -181,7 +182,7 @@ static int myReadRHT03 (const int pin, int *temp, int *rh) result = maxDetectRead (pin, buffer) ; if (!result) - return FALSE ; + return false ; *rh = (buffer [0] * 256 + buffer [1]) ; *temp = (buffer [2] * 256 + buffer [3]) ; @@ -196,9 +197,9 @@ static int myReadRHT03 (const int pin, int *temp, int *rh) // (which does seem to happen - no realtime here) if ((*rh > 999) || (*temp > 800) || (*temp < -400)) - return FALSE ; + return false ; - return TRUE ; + return true ; } @@ -239,7 +240,7 @@ int rht03Setup (const int pinBase, const int piPin) struct wiringPiNodeStruct *node ; if ((piPin & PI_GPIO_MASK) != 0) // Must be an on-board pin - return FALSE ; + return false ; // 2 pins - temperature and humidity @@ -248,5 +249,5 @@ int rht03Setup (const int pinBase, const int piPin) node->fd = piPin ; node->analogRead = myAnalogRead ; - return TRUE ; + return true ; } diff --git a/wiringPi/sn3218.c b/wiringPi/sn3218.c index 1302286..9b4ba2c 100644 --- a/wiringPi/sn3218.c +++ b/wiringPi/sn3218.c @@ -22,6 +22,8 @@ *********************************************************************** */ +#include + #include #include @@ -55,7 +57,7 @@ int sn3218Setup (const int pinBase) struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (0x54)) < 0) - return FALSE ; + return false ; // Setup the chip - initialise all 18 LEDs to off @@ -71,5 +73,5 @@ int sn3218Setup (const int pinBase) node->fd = fd ; node->analogWrite = myAnalogWrite ; - return TRUE ; + return true ; } diff --git a/wiringPi/sr595.c b/wiringPi/sr595.c index b42e583..384785e 100644 --- a/wiringPi/sr595.c +++ b/wiringPi/sr595.c @@ -29,6 +29,7 @@ #include #include +#include #include "wiringPi.h" @@ -105,5 +106,5 @@ int sr595Setup (const int pinBase, const int numPins, pinMode (clockPin, OUTPUT) ; pinMode (latchPin, OUTPUT) ; - return TRUE ; + return true ; } diff --git a/wiringPi/test/wiringpi_xotest_test1_spi.c b/wiringPi/test/wiringpi_xotest_test1_spi.c index 80ca562..5c11f67 100644 --- a/wiringPi/test/wiringpi_xotest_test1_spi.c +++ b/wiringPi/test/wiringpi_xotest_test1_spi.c @@ -2,14 +2,13 @@ // Compile: gcc -Wall wiringpi_xotest_test1_spi.c -o wiringpi_xotest_test1_spi -lwiringPi #include +#include #include #include #include #include "wpi_test.h" #include -#define TRUE (1==1) -#define FALSE (!TRUE) #define CHAN_CONFIG_SINGLE 8 #define CHAN_CONFIG_DIFF 0 diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 5bbe5b3..3bc45c7 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -251,8 +252,8 @@ static volatile unsigned int GPIO_RIO ; #define PAGE_SIZE (4*1024) #define BLOCK_SIZE (4*1024) -static unsigned int usingGpioMem = FALSE ; -static int wiringPiSetuped = FALSE ; +static unsigned int usingGpioMem = false ; +static int wiringPiSetuped = false ; // PWM // Word offsets into the PWM control region @@ -447,12 +448,12 @@ static int RaspberryPiLayout = -1; // Debugging & Return codes -int wiringPiDebug = FALSE ; -int wiringPiReturnCodes = FALSE ; +int wiringPiDebug = false ; +int wiringPiReturnCodes = false ; // Use /dev/gpiomem ? -int wiringPiTryGpioMem = FALSE ; +int wiringPiTryGpioMem = false ; enum WPIFlag { WPI_FLAG_INPUT = 0x04, @@ -3423,13 +3424,13 @@ int wiringPiSetup (void) if (wiringPiSetuped) return 0 ; - wiringPiSetuped = TRUE ; + wiringPiSetuped = true ; if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; + wiringPiDebug = true ; if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; + wiringPiReturnCodes = true ; if (wiringPiDebug) printf ("wiringPi: wiringPiSetup called\n") ; @@ -3485,7 +3486,7 @@ int wiringPiSetup (void) gpioToPwmPort[19] = 3; } - usingGpioMem = FALSE; + usingGpioMem = false; if (gpiomemGlobal==NULL || (fd = open (gpiomemGlobal, O_RDWR | O_SYNC | O_CLOEXEC)) < 0) { if (wiringPiDebug) { @@ -3494,7 +3495,7 @@ int wiringPiSetup (void) if (gpiomemModule && (fd = open (gpiomemModule, O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) // We're using gpiomem { piGpioBase = 0 ; - usingGpioMem = TRUE ; + usingGpioMem = true ; } else return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open %s or %s: %s.\n" @@ -3678,15 +3679,15 @@ int wiringPiSetupGpioDevice (enum WPIPinType pinType) { printf ("wiringPi: wiringPiSetupGpioDevice(%d) called\n", (int)pinType) ; } if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; + wiringPiDebug = true ; if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; + wiringPiReturnCodes = true ; if (wiringPiGpioDeviceGetFd()<0) { return -1; } - wiringPiSetuped = TRUE ; + wiringPiSetuped = true ; if (piGpioLayout () == GPIO_LAYOUT_PI1_REV1){ pinToGpio = pinToGpioR1 ; @@ -3709,7 +3710,7 @@ int wiringPiSetupGpioDevice (enum WPIPinType pinType) { wiringPiMode = WPI_MODE_GPIO_DEVICE_PHYS; break; default: - wiringPiSetuped = FALSE; + wiringPiSetuped = false; return -1; } diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index aa3c753..819a58f 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -24,13 +24,14 @@ #ifndef __WIRING_PI_H__ #define __WIRING_PI_H__ -// C doesn't have true/false by default and I can never remember which -// way round they are, so ... -// (and yes, I know about stdbool.h but I like capitals for these and I'm old) +#include -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) +// macros retained for old code compatibility, we now use stdbool.h +#ifndef TRUE + #define TRUE true +#endif +#ifndef FALSE + #define FALSE false #endif // GCC warning suppressor diff --git a/wiringPi/wpiExtensions.c b/wiringPi/wpiExtensions.c index 8668806..572a4bc 100644 --- a/wiringPi/wpiExtensions.c +++ b/wiringPi/wpiExtensions.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -146,7 +147,7 @@ static char *extractInt (char *progName, char *p, int *num) static char *extractStr (char *progName, char *p, char **str) { char *q, *r ; - int quoted = FALSE ; + int quoted = false ; if (*p != ':') { @@ -158,7 +159,7 @@ static char *extractStr (char *progName, char *p, char **str) if (*p == '[') { - quoted = TRUE ; + quoted = true ; ++p ; } @@ -205,17 +206,17 @@ static int doExtensionMcp23008 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x01) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } mcp23008Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -231,17 +232,17 @@ static int doExtensionMcp23016 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } mcp23016Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -257,17 +258,17 @@ static int doExtensionMcp23017 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } mcp23017Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -283,26 +284,26 @@ static int doExtensionMcp23s08 (char *progName, int pinBase, char *params) int spi, port ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI address (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &port)) == NULL) - return FALSE ; + return false ; if ((port < 0) || (port > 7)) { verbError ("%s: port address (%d) out of range", progName, port) ; - return FALSE ; + return false ; } mcp23s08Setup (pinBase, spi, port) ; - return TRUE ; + return true ; } @@ -318,26 +319,26 @@ static int doExtensionMcp23s17 (char *progName, int pinBase, char *params) int spi, port ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI address (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &port)) == NULL) - return FALSE ; + return false ; if ((port < 0) || (port > 7)) { verbError ("%s: port address (%d) out of range", progName, port) ; - return FALSE ; + return false ; } mcp23s17Setup (pinBase, spi, port) ; - return TRUE ; + return true ; } @@ -355,26 +356,26 @@ static int doExtensionSr595 (char *progName, int pinBase, char *params) // Extract pins if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; + return false ; if ((pins < 8) || (pins > 32)) { verbError ("%s: pin count (%d) out of range - 8-32 expected.", progName, pins) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &data)) == NULL) - return FALSE ; + return false ; if ((params = extractInt (progName, params, &clock)) == NULL) - return FALSE ; + return false ; if ((params = extractInt (progName, params, &latch)) == NULL) - return FALSE ; + return false ; sr595Setup (pinBase, pins, data, clock, latch) ; - return TRUE ; + return true ; } @@ -390,17 +391,17 @@ static int doExtensionPcf8574 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } pcf8574Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -416,17 +417,17 @@ static int doExtensionAds1115 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } ads1115Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -442,17 +443,17 @@ static int doExtensionPcf8591 (char *progName, int pinBase, char *params) int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } pcf8591Setup (pinBase, i2c) ; - return TRUE ; + return true ; } @@ -467,7 +468,7 @@ static int doExtensionPseudoPins (UNU char *progName, int pinBase, UNU char *par { pseudoPinsSetup (pinBase) ; - return TRUE ; + return true ; } @@ -482,7 +483,7 @@ static int doExtensionBmp180 (UNU char *progName, int pinBase, UNU char *params) { bmp180Setup (pinBase) ; - return TRUE ; + return true ; } @@ -497,7 +498,7 @@ static int doExtensionHtu21d (UNU char *progName, int pinBase, UNU char *params) { htu21dSetup (pinBase) ; - return TRUE ; + return true ; } @@ -513,7 +514,7 @@ static int doExtensionDs18b20 (char *progName, int pinBase, char *params) char *serialNum ; if ((params = extractStr (progName, params, &serialNum)) == NULL) - return FALSE ; + return false ; return ds18b20Setup (pinBase, serialNum) ; } @@ -531,7 +532,7 @@ static int doExtensionRht03 (char *progName, int pinBase, char *params) int piPin ; if ((params = extractInt (progName, params, &piPin)) == NULL) - return FALSE ; + return false ; return rht03Setup (pinBase, piPin) ; } @@ -549,17 +550,17 @@ static int doExtensionMax31855 (char *progName, int pinBase, char *params) int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } max31855Setup (pinBase, spi) ; - return TRUE ; + return true ; } @@ -575,17 +576,17 @@ static int doExtensionMcp3002 (char *progName, int pinBase, char *params) int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } mcp3002Setup (pinBase, spi) ; - return TRUE ; + return true ; } @@ -601,17 +602,17 @@ static int doExtensionMcp3004 (char *progName, int pinBase, char *params) int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } mcp3004Setup (pinBase, spi) ; - return TRUE ; + return true ; } @@ -627,17 +628,17 @@ static int doExtensionMax5322 (char *progName, int pinBase, char *params) int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } max5322Setup (pinBase, spi) ; - return TRUE ; + return true ; } @@ -653,17 +654,17 @@ static int doExtensionMcp4802 (char *progName, int pinBase, char *params) int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; + return false ; if ((spi < 0) || (spi > 1)) { verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; + return false ; } mcp4802Setup (pinBase, spi) ; - return TRUE ; + return true ; } @@ -677,7 +678,7 @@ static int doExtensionMcp4802 (char *progName, int pinBase, char *params) static int doExtensionSn3218 (UNU char *progName, int pinBase, UNU char *params) { sn3218Setup (pinBase) ; - return TRUE ; + return true ; } @@ -693,35 +694,35 @@ static int doExtensionMcp3422 (char *progName, int pinBase, char *params) int i2c, sampleRate, gain ; if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; + return false ; if ((i2c < 0x03) || (i2c > 0x77)) { verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &sampleRate)) == NULL) - return FALSE ; + return false ; if ((sampleRate < 0) || (sampleRate > 3)) { verbError ("%s: sample rate (%d) out of range", progName, sampleRate) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &gain)) == NULL) - return FALSE ; + return false ; if ((gain < 0) || (gain > 3)) { verbError ("%s: gain (%d) out of range", progName, gain) ; - return FALSE ; + return false ; } mcp3422Setup (pinBase, i2c, sampleRate, gain) ; - return TRUE ; + return true ; } @@ -738,35 +739,35 @@ static int doExtensionDrcS (char *progName, int pinBase, char *params) int pins, baud ; if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; + return false ; if ((pins < 1) || (pins > 1000)) { verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ; - return FALSE ; + return false ; } if ((params = extractStr (progName, params, &port)) == NULL) - return FALSE ; + return false ; if (strlen (port) == 0) { verbError ("%s: serial port device name required", progName) ; - return FALSE ; + return false ; } if ((params = extractInt (progName, params, &baud)) == NULL) - return FALSE ; + return false ; if ((baud < 1) || (baud > 4000000)) { verbError ("%s: baud rate (%d) out of range", progName, baud) ; - return FALSE ; + return false ; } drcSetupSerial (pinBase, pins, port, baud) ; - return TRUE ; + return true ; } @@ -784,25 +785,25 @@ static int doExtensionDrcNet (char *progName, int pinBase, char *params) char pPort [1024] ; if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; + return false ; if ((pins < 1) || (pins > 1000)) { verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ; - return FALSE ; + return false ; } if ((params = extractStr (progName, params, &ipAddress)) == NULL) - return FALSE ; + return false ; if (strlen (ipAddress) == 0) { verbError ("%s: ipAddress required", progName) ; - return FALSE ; + return false ; } if ((params = extractStr (progName, params, &port)) == NULL) - return FALSE ; + return false ; if (strlen (port) == 0) { @@ -811,12 +812,12 @@ static int doExtensionDrcNet (char *progName, int pinBase, char *params) } if ((params = extractStr (progName, params, &password)) == NULL) - return FALSE ; + return false ; if (strlen (password) == 0) { verbError ("%s: password required", progName) ; - return FALSE ; + return false ; } return drcSetupNet (pinBase, pins, ipAddress, port, password) ; @@ -883,7 +884,7 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors) if (!*p) // ran out of characters { verbError ("%s: extension name not terminated by a colon", progName) ; - return FALSE ; + return false ; } ++p ; } @@ -894,7 +895,7 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors) if (!isdigit (*p)) { verbError ("%s: decimal pinBase number expected after extension name", progName) ; - return FALSE ; + return false ; } while (isdigit (*p)) @@ -902,7 +903,7 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors) if (pinBase > 2147483647) // 2^31-1 ... Lets be realistic here... { verbError ("%s: pinBase too large", progName) ; - return FALSE ; + return false ; } pinBase = pinBase * 10 + (*p - '0') ; @@ -912,7 +913,7 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors) if (pinBase < 64) { verbError ("%s: pinBase (%d) too small. Minimum is 64.", progName, pinBase) ; - return FALSE ; + return false ; } // Search for extensions: @@ -924,5 +925,5 @@ int loadWPiExtension (char *progName, char *extensionData, int printErrors) } fprintf (stderr, "%s: extension %s not found", progName, extension) ; - return FALSE ; + return false ; } diff --git a/wiringPiD/network.c b/wiringPiD/network.c index 0c58d3b..f8636c7 100644 --- a/wiringPiD/network.c +++ b/wiringPiD/network.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -36,9 +37,6 @@ #include "network.h" -#define TRUE (1==1) -#define FALSE (!TRUE) - // Local data #define SALT_LEN 16 diff --git a/wiringPiD/runRemote.c b/wiringPiD/runRemote.c index d00ddf2..913c1ed 100644 --- a/wiringPiD/runRemote.c +++ b/wiringPiD/runRemote.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,7 @@ -int noLocalPins = FALSE ; +int noLocalPins = false ; void runRemoteCommands (int fd) diff --git a/wiringPiD/wiringpid.c b/wiringPiD/wiringpid.c index 235e290..3eb02e2 100644 --- a/wiringPiD/wiringpid.c +++ b/wiringPiD/wiringpid.c @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -46,7 +47,7 @@ // Globals static const char *usage = "[-h] [-d] [-g | -1 | -z] [[-x extension:pin:params] ...] password" ; -static int doDaemon = FALSE ; +static int doDaemon = false ; // @@ -156,7 +157,7 @@ int main (int argc, char *argv []) exit (EXIT_FAILURE) ; } - doDaemon = TRUE ; + doDaemon = true ; daemonise (PIDFILE) ; for (i = 2 ; i < argc ; ++i) @@ -216,7 +217,7 @@ int main (int argc, char *argv []) for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; - noLocalPins = TRUE ; + noLocalPins = true ; ++wpiSetup ; continue ; } @@ -263,7 +264,7 @@ int main (int argc, char *argv []) logMsg ("Loading extension: %s", argv [2]) ; - if (!loadWPiExtension (argv [0], argv [2], TRUE)) + if (!loadWPiExtension (argv [0], argv [2], true)) { logMsg ("Extension load failed: %s", strerror (errno)) ; exit (EXIT_FAILURE) ; From 454d50319a59bfe31502440800d4a40ec8bc9eab Mon Sep 17 00:00:00 2001 From: Connor Gibson Date: Sat, 7 Jun 2025 15:02:05 -0700 Subject: [PATCH 02/22] Add void argument list for `void GetRP1Memory(void)` Function definitions without an argument list are disallowed in C23. Removed dropped arguments in later call to function. --- wiringPi/wiringPi.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 5bbe5b3..2065463 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -3326,8 +3326,7 @@ int CheckPCIeFileContent(const char* pcieaddress, const char* filename, const ch } -void GetRP1Memory() { - +void GetRP1Memory(void) { pciemem_RP1[0] = '\0'; DIR *dir = opendir(pcie_path); struct dirent *entry; @@ -3360,7 +3359,7 @@ int wiringPiGlobalMemoryAccess(void) piBoard(); if (piRP1Model()) { - GetRP1Memory(pciemem_RP1, sizeof(pciemem_RP1)); + GetRP1Memory(); gpiomemGlobal = pciemem_RP1; MMAP_size = pciemem_RP1_Size; BaseAddr = 0x00000000; From b243be74d4381fea3e807be8b99c894958e8ddd9 Mon Sep 17 00:00:00 2001 From: Connor Gibson Date: Sat, 7 Jun 2025 15:03:29 -0700 Subject: [PATCH 03/22] Swap out-of-order arguments to calloc --- wiringPi/wiringPi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 2065463..9381df9 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -1688,7 +1688,7 @@ struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) if (wiringPiFindNode (pin) != NULL) (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; - node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros + node = (struct wiringPiNodeStruct *)calloc(1, sizeof (struct wiringPiNodeStruct)); // calloc zeros if (node == NULL) (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; From 74a28addd6c476e7c8303f3c78c4c04d8d6944a1 Mon Sep 17 00:00:00 2001 From: Naoki Iwakami Date: Thu, 19 Jun 2025 14:49:25 +0000 Subject: [PATCH 04/22] Have wiringPiISR and wiringPiISR2 return error on failure in initialization The each function initializes the event listener loop in a spawned listener thread. The new thread does not report errors back to the original caller. So the function misses initialization errors. The code is fixed to initialize the event listener in the original thread before spawning the listener thread so that the function can pick up errors and return them to the user. --- wiringPi/wiringPi.c | 148 +++++++++++++++++++++++++++----------------- 1 file changed, 90 insertions(+), 58 deletions(-) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 50523dd..341d6df 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -2868,42 +2868,36 @@ int waitForInterruptClose(int pin) { } /* - * interruptHandlerV2: - * This is a thread and gets started to wait for the interrupt we're - * hoping to catch. It will call the user-function when the interrupt - * fires. + * interruptHandlerInit: + * Initializes an interrupt handler before starting the listener loop in a + * separate thread. + * Returns: >0 on successful initialization, 0 if the listener loop does not + * have to start, -1 on error. ********************************************************************************* */ -void *interruptHandlerV2(void *arg) +static int interruptHandlerInit(int pin) { - const char* strmode = ""; - int pin, EdgeMode, ret, fd, attr, i; - unsigned int readret; + const char* strmode = ""; + int EdgeMode, ret, attr; unsigned long debounce_period_us; - struct pollfd polls ; struct gpio_v2_line_config config; struct gpio_v2_line_request req; - struct gpio_v2_line_event evdat[64]; - struct WPIWfiStatus wfiStatus; - struct timespec tspec = {0, 5e5}; /* 0.5 ms timeout {0, 1e6} */ - - pin = *(int *)arg; - if (wiringPiGpioDeviceGetFd()<0) { - return NULL; + if (wiringPiGpioDeviceGetFd() < 0) { + return -1; } - + EdgeMode = isrEdgeMode[pin]; debounce_period_us = isrDebouncePeriodUs[pin]; - + if (wiringPiDebug) { printf ("interruptHandlerV2: GPIO line %d, edge mode %d, debounce_period_us %lu \n", pin, EdgeMode, debounce_period_us) ; - } - + } + memset(&req, 0, sizeof(req)); memset(&config, 0, sizeof(config)); - + /* setup config */ config.flags = GPIO_V2_LINE_FLAG_INPUT; switch(EdgeMode) { @@ -2912,7 +2906,7 @@ void *interruptHandlerV2(void *arg) if (wiringPiDebug) { printf ("interruptHandlerV2: waitForInterruptMode edge mode INT_EDGE_SETUP - exiting\n") ; } - return NULL; + return 0; case INT_EDGE_FALLING: config.flags |= GPIO_V2_LINE_FLAG_EDGE_FALLING; strmode = "falling"; @@ -2927,7 +2921,7 @@ void *interruptHandlerV2(void *arg) break; } strcpy(req.consumer, "wiringpi_gpio_irq"); - + if (debounce_period_us) { attr = config.num_attrs; config.num_attrs++; @@ -2935,7 +2929,7 @@ void *interruptHandlerV2(void *arg) config.attrs[attr].attr.id = GPIO_V2_LINE_ATTR_ID_DEBOUNCE; config.attrs[attr].attr.debounce_period_us = debounce_period_us; } - + req.num_lines = 1; req.event_buffer_size = 45; req.offsets[0] = pin; @@ -2944,16 +2938,46 @@ void *interruptHandlerV2(void *arg) ret = ioctl(chipFd, GPIO_V2_GET_LINE_IOCTL, &req); if (ret == -1) { ReportDeviceError("interruptHandlerV2: get line event", pin , strmode, ret); - return NULL; + return -1; } - if (wiringPiDebug) - printf ("interruptHandlerV2: GPIO get line %d , mode %s succeded, fd=%d\n", pin, strmode, req.fd) ; + if (wiringPiDebug) { + printf ("interruptHandlerV2: GPIO get line %d , mode %s succeded, fd=%d\n", pin, strmode, req.fd); + } + + return req.fd; +} + +struct interrupt_handler_params { + int pin; + int fd; +}; + +/* + * interruptHandlerV2: + * This is a thread and gets started to wait for the interrupt we're + * hoping to catch. It will call the user-function when the interrupt + * fires. + ********************************************************************************* + */ + +static void *interruptHandlerV2(void *arg) +{ + struct interrupt_handler_params *params; + int pin, ret, fd, i; + unsigned int readret; + struct pollfd polls ; + struct gpio_v2_line_event evdat[64]; + struct WPIWfiStatus wfiStatus; + struct timespec tspec = {0, 5e5}; /* 0.5 ms timeout {0, 1e6} */ + + params = (struct interrupt_handler_params *)arg; + pin = params->pin; + fd = params->fd; /* set event fd */ - fd = req.fd; isrFds [pin] = fd; - + (void)piHiPri (55) ; // Only effective if we run as root for (;;) { // check if event data is available, check if interruptHandlerV2 thread must be canceled @@ -2962,24 +2986,24 @@ void *interruptHandlerV2(void *arg) polls.fd = fd; polls.events = POLLIN | POLLPRI; polls.revents = 0; - + // get event data, this is also a cancelation point, when pthread_cancel is called ret = ppoll(&polls, 1, &tspec, NULL); // returns -1 on error, 0 on timeout, >0 number of elements - + if (ret < 0) { // we do not reach this point if canceled, ppoll does not return, is Cancellation Point - if (wiringPiDebug) + if (wiringPiDebug) printf("interruptHandlerV2: ERROR: poll returned=%d\n", ret); - pthread_exit(NULL); + pthread_exit(NULL); return NULL; // never landing here - } else if (ret == 0) { -// if (wiringPiDebug) + } else if (ret == 0) { +// if (wiringPiDebug) // printf("interruptHandlerV2: timeout: poll returned=%d\n", ret); continue; } else { if (wiringPiDebug) printf ("interruptHandlerV2: IRQ line %d received %d events, fd=%d\n", pin, ret, isrFds[pin]) ; - if (polls.revents & POLLIN) { + if (polls.revents & POLLIN) { /* read event data */ readret = read(fd, &evdat, sizeof(evdat)); if (readret >= sizeof(evdat[0])) { @@ -2989,7 +3013,7 @@ void *interruptHandlerV2(void *arg) ret = readret/sizeof(evdat[0]); // number of events read from fd for (i = 0; i < ret; ++i) { if (isrFunctionsV2[pin]) { - if (wiringPiDebug) + if (wiringPiDebug) printf( "interruptHandlerV2: GPIO EVENT at %llu on line %u (%u|%u) \n", evdat[i].timestamp_ns, evdat[i].offset, evdat[i].line_seqno, evdat[i].seqno); wfiStatus.statusOK = 1; wfiStatus.pinBCM = pin; @@ -3006,10 +3030,10 @@ void *interruptHandlerV2(void *arg) break; default: wfiStatus.edge = INT_EDGE_SETUP; // edge = 0 - if (wiringPiDebug) + if (wiringPiDebug) printf("waitForInterrupt2: unknown event\n"); break; - } + } wfiStatus.timeStamp_us = evdat[i].timestamp_ns/1000LL; if (wiringPiDebug) { printf( "interruptHandlerV2: call isr function\n"); @@ -3033,7 +3057,7 @@ void *interruptHandlerV2(void *arg) else { // if thread canceled we do not reach this point, read(...) does not return, is Cancellation Point if (wiringPiDebug) printf ("interruptHandlerV2: reading events from fd received signal, exit thread\n"); - pthread_exit(NULL); + pthread_exit(NULL); return NULL; // never landing here } } @@ -3041,9 +3065,8 @@ void *interruptHandlerV2(void *arg) } } - /* - * wiringPiISR: + * wiringPiISRInternal: * Pi Specific. * Take the details and create an interrupt handler that will do a call- * back to the user supplied function. @@ -3072,30 +3095,39 @@ int wiringPiISRInternal(int pin, int edgeMode, void (*function)(struct WPIWfiSta isrFunctions[pin] = functionClassic; isrEdgeMode[pin] = edgeMode; isrDebouncePeriodUs[pin] = debounce_period_us; - + if (wiringPiDebug) { printf("wiringPi: mutex in\n"); } pthread_mutex_lock (&pinMutex) ; - pinPass = pin ; - if (wiringPiDebug) { - printf("wiringPi: pthread_create before 0x%lX\n", (unsigned long)isrThreads[pin]); + struct interrupt_handler_params params = { + .pin = pin, + }; + params.fd = interruptHandlerInit(pin); + if (params.fd < 0) { + pthread_mutex_unlock (&pinMutex) ; + return -1; } - if (pthread_create (&isrThreads[pin], NULL, interruptHandlerV2, &pin)==0) { + + pinPass = pin ; + if (params.fd > 0) { if (wiringPiDebug) { - printf("wiringPi: pthread_create successed, 0x%lX\n", (unsigned long)isrThreads[pin]); + printf("wiringPi: pthread_create before 0x%lX\n", (unsigned long)isrThreads[pin]); } -/* while (pinPass != -1) - delay (1) ; */ - // wait so that interruptHandler is up und running. - // when interruptHandler is running, the calling function wiringPiISR - // must be still alive, otherwise the thread argument &pin points into nirwana, - // when it is picked up from interruptHandler. - delay (10); - } else { - if (wiringPiDebug) { - printf("wiringPi: pthread_create failed\n"); + if (pthread_create (&isrThreads[pin], NULL, interruptHandlerV2, ¶ms)==0) { + if (wiringPiDebug) { + printf("wiringPi: pthread_create successed, 0x%lX\n", (unsigned long)isrThreads[pin]); + } + } else { + if (wiringPiDebug) { + printf("wiringPi: pthread_create failed\n"); + } } + // wait so that interruptHandler is up und running. + // when interruptHandler is running, the calling function wiringPiISRInternal + // must be still alive, otherwise the thread argument ¶m points into nirwana, + // when it is picked up from interruptHandlerV2. + delay(10); } if (wiringPiDebug) { From e020bb8b6c0f0222bf6a758f4ac333829e5b0ab1 Mon Sep 17 00:00:00 2001 From: Naoki Iwakami Date: Thu, 19 Jun 2025 19:37:03 +0000 Subject: [PATCH 05/22] Fix issues found by tests --- wiringPi/wiringPi.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 341d6df..aa165ce 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -2876,11 +2876,10 @@ int waitForInterruptClose(int pin) { ********************************************************************************* */ -static int interruptHandlerInit(int pin) +static int interruptHandlerInit(int pin, int EdgeMode, unsigned long debounce_period_us) { const char* strmode = ""; - int EdgeMode, ret, attr; - unsigned long debounce_period_us; + int ret, attr; struct gpio_v2_line_config config; struct gpio_v2_line_request req; @@ -2888,9 +2887,6 @@ static int interruptHandlerInit(int pin) return -1; } - EdgeMode = isrEdgeMode[pin]; - debounce_period_us = isrDebouncePeriodUs[pin]; - if (wiringPiDebug) { printf ("interruptHandlerV2: GPIO line %d, edge mode %d, debounce_period_us %lu \n", pin, EdgeMode, debounce_period_us) ; } @@ -3087,15 +3083,9 @@ int wiringPiISRInternal(int pin, int edgeMode, void (*function)(struct WPIWfiSta printf("wiringPi: wiringPiISR pin %d, edgeMode %d\n", pin, edgeMode); } if (isrFunctions[pin] || isrFunctionsV2[pin]) { - fprintf(stderr, "wiringPi: ISR function already active, ignoring \n"); + fprintf(stderr, "wiringPi: ISR function already active\n"); } - isrFunctionsV2[pin] = function; - isrUserdata[pin] = userdata; - isrFunctions[pin] = functionClassic; - isrEdgeMode[pin] = edgeMode; - isrDebouncePeriodUs[pin] = debounce_period_us; - if (wiringPiDebug) { printf("wiringPi: mutex in\n"); } @@ -3103,12 +3093,19 @@ int wiringPiISRInternal(int pin, int edgeMode, void (*function)(struct WPIWfiSta struct interrupt_handler_params params = { .pin = pin, }; - params.fd = interruptHandlerInit(pin); + params.fd = interruptHandlerInit(pin, edgeMode, debounce_period_us); if (params.fd < 0) { pthread_mutex_unlock (&pinMutex) ; return -1; } + // OK to start the new ISR. Update the table. + isrFunctionsV2[pin] = function; + isrUserdata[pin] = userdata; + isrFunctions[pin] = functionClassic; + isrEdgeMode[pin] = edgeMode; + isrDebouncePeriodUs[pin] = debounce_period_us; + pinPass = pin ; if (params.fd > 0) { if (wiringPiDebug) { From 1c23447a7b2feec6813ccb7de699f23163216e00 Mon Sep 17 00:00:00 2001 From: Connor Gibson Date: Sat, 2 Aug 2025 19:12:12 -0700 Subject: [PATCH 06/22] Replace switch with if-else Fixes #386 --- wiringPi/wiringPi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 50523dd..4537192 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -2300,10 +2300,10 @@ int digitalRead (int pin) } if (ISRP1MODEL) { - switch(gpio[2*pin] & RP1_STATUS_LEVEL_MASK) { - default: // 11 or 00 not allowed, give LOW! - case RP1_STATUS_LEVEL_LOW: return LOW ; - case RP1_STATUS_LEVEL_HIGH: return HIGH ; + if ((gpio[2*pin] & RP1_STATUS_LEVEL_MASK) == RP1_STATUS_LEVEL_HIGH) { + return HIGH; + } else { // 11 or 00 not allowed, give LOW! + return LOW; } } else { if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) From e4ab8a78b3a5b9e472380d105bbbd813c3d56519 Mon Sep 17 00:00:00 2001 From: Naoki Iwakami Date: Fri, 29 Aug 2025 05:24:49 +0000 Subject: [PATCH 07/22] Add gtest cases for ISR --- wiringPi/gtest/.gitignore | 2 + wiringPi/gtest/Makefile | 92 ++++++++++++ wiringPi/gtest/README.md | 26 ++++ wiringPi/gtest/run_isr.cpp | 31 ++++ wiringPi/gtest/test_isr_both.cpp | 51 +++++++ .../test_isr_conflict_between_processes.cpp | 68 +++++++++ wiringPi/gtest/test_isr_falling.cpp | 57 ++++++++ wiringPi/gtest/test_isr_restart.cpp | 67 +++++++++ wiringPi/gtest/test_isr_restart2.cpp | 109 ++++++++++++++ wiringPi/gtest/test_isr_rising.cpp | 80 +++++++++++ wiringPi/gtest/test_isr_rising2.cpp | 135 ++++++++++++++++++ 11 files changed, 718 insertions(+) create mode 100644 wiringPi/gtest/.gitignore create mode 100644 wiringPi/gtest/Makefile create mode 100644 wiringPi/gtest/README.md create mode 100644 wiringPi/gtest/run_isr.cpp create mode 100644 wiringPi/gtest/test_isr_both.cpp create mode 100644 wiringPi/gtest/test_isr_conflict_between_processes.cpp create mode 100644 wiringPi/gtest/test_isr_falling.cpp create mode 100644 wiringPi/gtest/test_isr_restart.cpp create mode 100644 wiringPi/gtest/test_isr_restart2.cpp create mode 100644 wiringPi/gtest/test_isr_rising.cpp create mode 100644 wiringPi/gtest/test_isr_rising2.cpp diff --git a/wiringPi/gtest/.gitignore b/wiringPi/gtest/.gitignore new file mode 100644 index 0000000..b868581 --- /dev/null +++ b/wiringPi/gtest/.gitignore @@ -0,0 +1,2 @@ +bin +googletest-main diff --git a/wiringPi/gtest/Makefile b/wiringPi/gtest/Makefile new file mode 100644 index 0000000..87e679c --- /dev/null +++ b/wiringPi/gtest/Makefile @@ -0,0 +1,92 @@ +CXX := g++ +CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -g \ + -Igoogletest-main/googletest/include -Igoogletest-main/googlemock/include +LDFLAGS := -pthread +WIRING_PI_LIBS := -lwiringPi + +# Where to download googletest +GTEST_URL := https://github.com/google/googletest/archive/refs/heads/main.zip +GTEST_ZIP := googletest.zip +GTEST_DIR := googletest-main + +# Output directory +BIN_DIR := bin + +# Helper program +RUN_ISR_SRC := run_isr.cpp +RUN_ISR_BIN := $(BIN_DIR)/run_isr + +# Need BCM1 <-> BCM12 connection +TEST_SRCS := \ + test_isr_both.cpp \ + test_isr_conflict_between_processes.cpp \ + test_isr_falling.cpp \ + test_isr_restart.cpp \ + test_isr_restart2.cpp \ + test_isr_rising.cpp \ + test_isr_rising2.cpp + +# Derive test binaries (in bin/) +TEST_BINS := $(addprefix $(BIN_DIR)/, $(TEST_SRCS:.cpp=)) + +# gtest/gmock sources +GTEST_SRCS := $(GTEST_DIR)/googletest/src/gtest-all.cc +GMOCK_SRCS := $(GTEST_DIR)/googlemock/src/gmock-all.cc +GTEST_MAIN := $(GTEST_DIR)/googletest/src/gtest_main.cc +GTEST_INCLUDES := -I$(GTEST_DIR)/googletest/include -I$(GTEST_DIR)/googlemock/include + +GTEST_OBJS := $(GTEST_SRCS:.cc=.o) +GMOCK_OBJS := $(GMOCK_SRCS:.cc=.o) +GTEST_MAIN_OBJ := $(GTEST_MAIN:.cc=.o) + +# Default: build everything +all: $(GTEST_DIR) $(BIN_DIR) $(TEST_BINS) $(RUN_ISR_BIN) + +# Rule: build normal test binaries +$(filter-out $(BIN_DIR)/test_conflict_between_processes,$(TEST_BINS)): $(BIN_DIR)/%: %.cpp $(GTEST_OBJS) $(GMOCK_OBJS) $(GTEST_MAIN_OBJ) + $(CXX) $(CXXFLAGS) $< $(GTEST_OBJS) $(GMOCK_OBJS) $(GTEST_MAIN_OBJ) -o $@ $(LDFLAGS) $(WIRING_PI_LIBS) + +# Special case: test_conflict_between_processes depends on run_isr +$(BIN_DIR)/test_conflict_between_processes: test_conflict_between_processes.cpp $(GTEST_OBJS) $(GMOCK_OBJS) $(GTEST_MAIN_OBJ) $(RUN_ISR_BIN) + $(CXX) $(CXXFLAGS) $< $(GTEST_OBJS) $(GMOCK_OBJS) $(GTEST_MAIN_OBJ) -o $@ $(LDFLAGS) $(WIRING_PI_LIBS) + +# Build run_isr +$(RUN_ISR_BIN): $(RUN_ISR_SRC) | $(BIN_DIR) + $(CXX) $(CXXFLAGS) $< -o $@ $(WIRING_PI_LIBS) + +# Ensure bin directory exists +$(BIN_DIR): + mkdir -p $(BIN_DIR) + +# Download googletest if not already present +$(GTEST_DIR): + @echo "Downloading GoogleTest..." + curl -L $(GTEST_URL) -o $(GTEST_ZIP) + unzip -q $(GTEST_ZIP) + rm -f $(GTEST_ZIP) + +# Generic rules for compiling gtest/gmock sources +%.o: %.cc + $(CXX) $(CXXFLAGS) $(GTEST_INCLUDES) -I$(GTEST_DIR)/googletest -I$(GTEST_DIR)/googlemock -c $< -o $@ + +# Run all tests +test: all + @failed=0; \ + for t in $(TEST_BINS); do \ + echo "Running $$t..."; \ + ./$$t || failed=1; \ + done; \ + if [ $$failed -eq 0 ]; then \ + echo "βœ… All tests passed."; \ + else \ + echo "❌ Some tests failed."; \ + exit 1; \ + fi + +clean: + rm -f $(TEST_BINS) $(RUN_ISR_BIN) + +distclean: clean + rm -rf $(GTEST_DIR) $(BIN_DIR) + +.PHONY: all clean distclean test \ No newline at end of file diff --git a/wiringPi/gtest/README.md b/wiringPi/gtest/README.md new file mode 100644 index 0000000..e4c277d --- /dev/null +++ b/wiringPi/gtest/README.md @@ -0,0 +1,26 @@ +## Quick Start + +g++ is required to build the test cases. + +Connect wPi pin 31 (BCM 1) and wPi pin 26 (BCM 12) to run ISR tests. +Also, wPi pin 28 (BCM 20) should be unconnected. + +Run `make test` or do following to run the test: + +``` +make googletest-main +make -j 4 +make test +``` + +To clean up the environment: + +``` +make clean +``` + +## Dependencies + +Googletest is downloaded during +the build for the first time. The downloaded items are in directory `googletest-main`. `make clean` keeps this directory. Run `make distclean` +to erase all built images including googletest. diff --git a/wiringPi/gtest/run_isr.cpp b/wiringPi/gtest/run_isr.cpp new file mode 100644 index 0000000..8f4a61b --- /dev/null +++ b/wiringPi/gtest/run_isr.cpp @@ -0,0 +1,31 @@ +/* + * Helper program of test_conflict_between_processes. + * + * The program configures ISR on pin 31 (BCM 1) and polls for a termination request. + */ +#include +#include +#include + +#define LISTENER_PIN 31 // BCM 1 + +static uint8_t ok_to_stop = 0; +static void noop() { + fprintf(stderr, "interrupted\n"); + ok_to_stop = 1; +} + +int main(int, char *[]) { + fprintf(stderr, "start\n"); + wiringPiSetup(); + if (wiringPiISR(LISTENER_PIN, INT_EDGE_RISING, noop)) { + fprintf(stderr, "failed to start listener\n"); + return -1; + } + fprintf(stderr, "start listening\n"); + + while (!ok_to_stop) { + delay(1000); + } + fprintf(stderr, "bye\n"); +} \ No newline at end of file diff --git a/wiringPi/gtest/test_isr_both.cpp b/wiringPi/gtest/test_isr_both.cpp new file mode 100644 index 0000000..09fb58d --- /dev/null +++ b/wiringPi/gtest/test_isr_both.cpp @@ -0,0 +1,51 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 + +/** + * Tests ISR for both edges. + */ +class ISRBoth : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, LOW); + wiringPiISR(LISTENER_PIN, INT_EDGE_BOTH, ISRBoth::TriggerCount); + delay(100); + } + + static uint32_t count; + static void TriggerCount() { ++count; } + + protected: + virtual void SetUp() { count = 0; } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +uint32_t ISRBoth::count = 0; + +TEST_F(ISRBoth, Fundamental) { + EXPECT_EQ(count, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 2u); +} + +TEST_F(ISRBoth, ThreeTriggers) { + for (int i = 0; i < 5; ++i) { + digitalWrite(TRIGGER_PIN, (i + 1) % 2); + delay(10); + } + EXPECT_EQ(count, 5u); +} \ No newline at end of file diff --git a/wiringPi/gtest/test_isr_conflict_between_processes.cpp b/wiringPi/gtest/test_isr_conflict_between_processes.cpp new file mode 100644 index 0000000..31f954b --- /dev/null +++ b/wiringPi/gtest/test_isr_conflict_between_processes.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 +#define ANOTHER_LISTENER_PIN 28 // BCM 20 + +static void *remote_isr(void *) { + std::system("./bin/run_isr"); + return NULL; +} + +/** + * Tests ISR setup conflict between two processes. + * + * Another program 'run_isr' starts first that occupies the pin 31 for an ISR. + * This program should fail to start ISR on the same pin. + */ +class ISRConflict : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + digitalWrite(TRIGGER_PIN, LOW); + + pthread_t tid; + pthread_create(&tid, NULL, remote_isr, NULL); + delay(1000); + } + + static void TearDownTestSuite() { + delay(1000); + } + + static uint32_t count; + + static void TriggerCount() { ++count; } + static void TriggerCount2(WPIWfiStatus, void *userdata) { + ++*(uint32_t *)userdata; + } + + protected: + virtual void SetUp() { count = 0; } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +uint32_t ISRConflict::count = 0; + +TEST_F(ISRConflict, TestConflictBetweenProcesses) { + // The ISRs should fail to start because run_isr is listening on the + // same port + EXPECT_EQ( + wiringPiISR(LISTENER_PIN, INT_EDGE_FALLING, ISRConflict::TriggerCount), + -1); + EXPECT_EQ(wiringPiISR2(LISTENER_PIN, INT_EDGE_FALLING, + ISRConflict::TriggerCount2, 0, &ISRConflict::count), + -1); + + // to exit run_isr + digitalWrite(TRIGGER_PIN, HIGH); +} diff --git a/wiringPi/gtest/test_isr_falling.cpp b/wiringPi/gtest/test_isr_falling.cpp new file mode 100644 index 0000000..bfda8c0 --- /dev/null +++ b/wiringPi/gtest/test_isr_falling.cpp @@ -0,0 +1,57 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 + +/** + * Tests ISR for falling edges. + */ +class ISRFalling : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, HIGH); + wiringPiISR(LISTENER_PIN, INT_EDGE_FALLING, ISRFalling::TriggerCount); + delay(100); + } + + static void TearDownTestSuite() { digitalWrite(TRIGGER_PIN, LOW); } + + static uint32_t count; + static void TriggerCount() { ++count; } + + protected: + virtual void SetUp() { count = 0; } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + } +}; + +uint32_t ISRFalling::count = 0; + +TEST_F(ISRFalling, Fundamental) { + EXPECT_EQ(count, 0u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); +} + +TEST_F(ISRFalling, ThreeTriggers) { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + count = 0; + for (int i = 0; i < 6; ++i) { + delay(10); + digitalWrite(TRIGGER_PIN, (i + 1) % 2); + } + delay(10); + EXPECT_EQ(count, 3u); +} \ No newline at end of file diff --git a/wiringPi/gtest/test_isr_restart.cpp b/wiringPi/gtest/test_isr_restart.cpp new file mode 100644 index 0000000..c7a5c7a --- /dev/null +++ b/wiringPi/gtest/test_isr_restart.cpp @@ -0,0 +1,67 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 +#define ANOTHER_LISTENER_PIN 28 // BCM 20 + +/** + * Tests restarting ISR. + */ +class ISRRestart : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, LOW); + wiringPiISR(LISTENER_PIN, INT_EDGE_RISING, ISRRestart::TriggerCount); + delay(100); + } + + static uint32_t count; + + static void TriggerCount() { ++count; } + + static void TriggerCountDown() { --count; } + + protected: + virtual void SetUp() { count = 0; } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +uint32_t ISRRestart::count = 0; + +TEST_F(ISRRestart, RestartISR) { + // fundamental ISR test + EXPECT_EQ(count, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); + + // stop the ISR + EXPECT_EQ(wiringPiISRStop(LISTENER_PIN), 0); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + + // start another ISR on the same pin + EXPECT_EQ( + wiringPiISR(LISTENER_PIN, INT_EDGE_FALLING, ISRRestart::TriggerCountDown), + 0); + delay(100); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 0u); +} diff --git a/wiringPi/gtest/test_isr_restart2.cpp b/wiringPi/gtest/test_isr_restart2.cpp new file mode 100644 index 0000000..173d3d5 --- /dev/null +++ b/wiringPi/gtest/test_isr_restart2.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 +#define ANOTHER_LISTENER_PIN 28 // BCM 20 + +struct counters { + int32_t *primary; + int32_t *secondary; +}; + +/** + * Tests restarting ISR using function wiringPiISR2(). + */ +class ISRRestart2 : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, LOW); + counters_a.primary = &count; + counters_a.secondary = &count2; + counters_b.primary = &count; + counters_b.secondary = &count3; + wiringPiISR2(LISTENER_PIN, INT_EDGE_RISING, ISRRestart2::TriggerCount, 1000, + &counters_a); + delay(100); + } + + static int32_t count; + static int32_t count2; + static int32_t count3; + + static counters counters_a; + static counters counters_b; + + static void TriggerCount(WPIWfiStatus, void *userdata) { + struct counters *counters = (struct counters *)userdata; + ++*counters->primary; + ++*counters->secondary; + } + + static void TriggerCountDown(WPIWfiStatus, void *userdata) { + struct counters *counters = (struct counters *)userdata; + ++*counters->primary; + --*counters->secondary; + } + + protected: + virtual void SetUp() { + count = 0; + count2 = 0; + count3 = 0; + } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +int32_t ISRRestart2::count = 0; +int32_t ISRRestart2::count2 = 0; +int32_t ISRRestart2::count3 = 0; +struct counters ISRRestart2::counters_a; +struct counters ISRRestart2::counters_b; + +TEST_F(ISRRestart2, RestartISR2) { + // fundamental ISR2 test + EXPECT_EQ(count, 0); + EXPECT_EQ(count2, 0); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1); + EXPECT_EQ(count2, 1); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1); + EXPECT_EQ(count2, 1); + + // stop the ISR + EXPECT_EQ(wiringPiISRStop(LISTENER_PIN), 0); + delay(100); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1); + EXPECT_EQ(count2, 1); + EXPECT_EQ(count3, 0); + digitalWrite(TRIGGER_PIN, LOW); + + // start another ISR2 on the same pin + EXPECT_EQ(wiringPiISR2(LISTENER_PIN, INT_EDGE_FALLING, + ISRRestart2::TriggerCountDown, 0, &counters_b), + 0); + delay(100); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1); + EXPECT_EQ(count2, 1); + EXPECT_EQ(count3, 0); + + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 2); + EXPECT_EQ(count2, 1); + EXPECT_EQ(count3, -1); +} diff --git a/wiringPi/gtest/test_isr_rising.cpp b/wiringPi/gtest/test_isr_rising.cpp new file mode 100644 index 0000000..9a41b14 --- /dev/null +++ b/wiringPi/gtest/test_isr_rising.cpp @@ -0,0 +1,80 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 +#define ANOTHER_LISTENER_PIN 28 // BCM 20 + +/** + * Tests ISR for rising edges. + */ +class ISRRising : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, LOW); + wiringPiISR(LISTENER_PIN, INT_EDGE_RISING, ISRRising::TriggerCount); + delay(100); + } + + static uint32_t count; + + static void TriggerCount() { ++count; } + + static void TriggerCountDown() { --count; } + + protected: + virtual void SetUp() { count = 0; } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +uint32_t ISRRising::count = 0; + +TEST_F(ISRRising, Fundamental) { + EXPECT_EQ(count, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); +} + +TEST_F(ISRRising, ThreeTriggers) { + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + count = 0; + for (int i = 0; i < 6; ++i) { + delay(10); + digitalWrite(TRIGGER_PIN, i % 2); + } + delay(10); + EXPECT_EQ(count, 3u); +} + +TEST_F(ISRRising, ISRInitConflict) { + // this initialization should fail for ISR conflict + EXPECT_EQ( + wiringPiISR(LISTENER_PIN, INT_EDGE_FALLING, ISRRising::TriggerCountDown), + -1); + // ensure the initialization above has released the mutex lock + EXPECT_EQ(wiringPiISR(ANOTHER_LISTENER_PIN, INT_EDGE_RISING, + ISRRising::TriggerCountDown), + 0); + delay(100); + + // ensure the existing ISR has not broken + EXPECT_EQ(count, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); +} diff --git a/wiringPi/gtest/test_isr_rising2.cpp b/wiringPi/gtest/test_isr_rising2.cpp new file mode 100644 index 0000000..b40ea4c --- /dev/null +++ b/wiringPi/gtest/test_isr_rising2.cpp @@ -0,0 +1,135 @@ +#include +#include +#include + +#define TRIGGER_PIN 26 // BCM 12 +#define LISTENER_PIN 31 // BCM 1 +#define ANOTHER_LISTENER_PIN 28 // BCM 20 + +struct counters { + uint32_t *primary; + uint32_t *secondary; +}; + +/** + * Tests ISR for rising edges. + * Function wiringPiISR2 is used for the configuraiton. + */ +class ISRRising2 : public ::testing::Test { + public: + static void SetUpTestSuite() { + wiringPiSetup(); + pinMode(TRIGGER_PIN, OUTPUT); + digitalWrite(TRIGGER_PIN, LOW); + counters_a.primary = &count; + counters_a.secondary = &count2; + counters_b.primary = &count; + counters_b.secondary = &count3; + wiringPiISR2(LISTENER_PIN, INT_EDGE_RISING, ISRRising2::TriggerCount, 1000, + &counters_a); + delay(100); + } + + static uint32_t count; + static uint32_t count2; + static uint32_t count3; + + static counters counters_a; + static counters counters_b; + + static void TriggerCount(WPIWfiStatus, void *userdata) { + struct counters *counters = (struct counters *)userdata; + ++*counters->primary; + ++*counters->secondary; + } + + static void TriggerCountDown(WPIWfiStatus, void *userdata) { + struct counters *counters = (struct counters *)userdata; + ++*counters->primary; + --*counters->secondary; + } + + protected: + virtual void SetUp() { + count = 0; + count2 = 0; + count3 = 0; + } + + virtual void TearDown() { + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + } +}; + +uint32_t ISRRising2::count = 0; +uint32_t ISRRising2::count2 = 0; +uint32_t ISRRising2::count3 = 0; +struct counters ISRRising2::counters_a; +struct counters ISRRising2::counters_b; + +TEST_F(ISRRising2, Fundamental) { + EXPECT_EQ(count, 0u); + EXPECT_EQ(count2, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + EXPECT_EQ(count2, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); + EXPECT_EQ(count2, 1u); +} + +TEST_F(ISRRising2, ThreeTriggers) { + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + count = 0; + for (int i = 0; i < 6; ++i) { + delay(10); + digitalWrite(TRIGGER_PIN, i % 2); + } + delay(10); + EXPECT_EQ(count, 3u); +} + +TEST_F(ISRRising2, Debounce) { + delay(10); + for (int i = 0; i < 7; ++i) { + digitalWrite(TRIGGER_PIN, (i + 1) % 2); + } + delay(10); + EXPECT_EQ(count, 1u); +} + +TEST_F(ISRRising2, ISRInitConflict) { + // this initialization should fail for ISR conflict + EXPECT_EQ(wiringPiISR2(LISTENER_PIN, INT_EDGE_FALLING, + ISRRising2::TriggerCountDown, 0, &counters_b), + -1); + // ensure the initialization above has released the mutex lock + EXPECT_EQ(wiringPiISR2(ANOTHER_LISTENER_PIN, INT_EDGE_BOTH, + ISRRising2::TriggerCountDown, 0, &counters_b), + 0); + delay(100); + + // ensure the existing ISR has not broken + EXPECT_EQ(count, 0u); + EXPECT_EQ(count2, 0u); + digitalWrite(TRIGGER_PIN, HIGH); + delay(10); + EXPECT_EQ(count, 1u); + EXPECT_EQ(count2, 1u); + digitalWrite(TRIGGER_PIN, LOW); + delay(10); + EXPECT_EQ(count, 1u); + EXPECT_EQ(count2, 1u); + + delay(10); + count = 0; + for (int i = 0; i < 7; ++i) { + digitalWrite(TRIGGER_PIN, (i + 1) % 2); + } + delay(10); + EXPECT_EQ(count, 1u); +} From b54a60a59838107c0cecf730bf3e6cedae85e456 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 13 Sep 2025 15:48:34 +0200 Subject: [PATCH 08/22] #396 change pins to default unit test hardware (Pi1 comp.) --- wiringPi/gtest/Makefile | 2 +- wiringPi/gtest/README.md | 4 ++-- wiringPi/gtest/run_isr.cpp | 4 ++-- wiringPi/gtest/test_isr_both.cpp | 4 ++-- wiringPi/gtest/test_isr_conflict_between_processes.cpp | 6 +++--- wiringPi/gtest/test_isr_falling.cpp | 4 ++-- wiringPi/gtest/test_isr_restart.cpp | 6 +++--- wiringPi/gtest/test_isr_restart2.cpp | 6 +++--- wiringPi/gtest/test_isr_rising.cpp | 6 +++--- wiringPi/gtest/test_isr_rising2.cpp | 6 +++--- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/wiringPi/gtest/Makefile b/wiringPi/gtest/Makefile index 87e679c..16ce2f8 100644 --- a/wiringPi/gtest/Makefile +++ b/wiringPi/gtest/Makefile @@ -16,7 +16,7 @@ BIN_DIR := bin RUN_ISR_SRC := run_isr.cpp RUN_ISR_BIN := $(BIN_DIR)/run_isr -# Need BCM1 <-> BCM12 connection +# Need BCM17 <-> BCM18 connection TEST_SRCS := \ test_isr_both.cpp \ test_isr_conflict_between_processes.cpp \ diff --git a/wiringPi/gtest/README.md b/wiringPi/gtest/README.md index e4c277d..b061c05 100644 --- a/wiringPi/gtest/README.md +++ b/wiringPi/gtest/README.md @@ -2,8 +2,8 @@ g++ is required to build the test cases. -Connect wPi pin 31 (BCM 1) and wPi pin 26 (BCM 12) to run ISR tests. -Also, wPi pin 28 (BCM 20) should be unconnected. +Connect wPi pin 1 (BCM 18) and wPi pin 0 (BCM 17) to run ISR tests. +Also, wPi pin 6 (BCM 25) should be unconnected. Run `make test` or do following to run the test: diff --git a/wiringPi/gtest/run_isr.cpp b/wiringPi/gtest/run_isr.cpp index 8f4a61b..9937946 100644 --- a/wiringPi/gtest/run_isr.cpp +++ b/wiringPi/gtest/run_isr.cpp @@ -1,13 +1,13 @@ /* * Helper program of test_conflict_between_processes. * - * The program configures ISR on pin 31 (BCM 1) and polls for a termination request. + * The program configures ISR on pin 1 (BCM 18) and polls for a termination request. */ #include #include #include -#define LISTENER_PIN 31 // BCM 1 +#define LISTENER_PIN 1 // BCM 18 static uint8_t ok_to_stop = 0; static void noop() { diff --git a/wiringPi/gtest/test_isr_both.cpp b/wiringPi/gtest/test_isr_both.cpp index 09fb58d..a404e73 100644 --- a/wiringPi/gtest/test_isr_both.cpp +++ b/wiringPi/gtest/test_isr_both.cpp @@ -2,8 +2,8 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 /** * Tests ISR for both edges. diff --git a/wiringPi/gtest/test_isr_conflict_between_processes.cpp b/wiringPi/gtest/test_isr_conflict_between_processes.cpp index 31f954b..2ac955c 100644 --- a/wiringPi/gtest/test_isr_conflict_between_processes.cpp +++ b/wiringPi/gtest/test_isr_conflict_between_processes.cpp @@ -5,9 +5,9 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 -#define ANOTHER_LISTENER_PIN 28 // BCM 20 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 +#define ANOTHER_LISTENER_PIN 6 // BCM 25 static void *remote_isr(void *) { std::system("./bin/run_isr"); diff --git a/wiringPi/gtest/test_isr_falling.cpp b/wiringPi/gtest/test_isr_falling.cpp index bfda8c0..ee52e6a 100644 --- a/wiringPi/gtest/test_isr_falling.cpp +++ b/wiringPi/gtest/test_isr_falling.cpp @@ -2,8 +2,8 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 /** * Tests ISR for falling edges. diff --git a/wiringPi/gtest/test_isr_restart.cpp b/wiringPi/gtest/test_isr_restart.cpp index c7a5c7a..0930bab 100644 --- a/wiringPi/gtest/test_isr_restart.cpp +++ b/wiringPi/gtest/test_isr_restart.cpp @@ -2,9 +2,9 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 -#define ANOTHER_LISTENER_PIN 28 // BCM 20 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 +#define ANOTHER_LISTENER_PIN 6 // BCM 25 /** * Tests restarting ISR. diff --git a/wiringPi/gtest/test_isr_restart2.cpp b/wiringPi/gtest/test_isr_restart2.cpp index 173d3d5..c7225c0 100644 --- a/wiringPi/gtest/test_isr_restart2.cpp +++ b/wiringPi/gtest/test_isr_restart2.cpp @@ -2,9 +2,9 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 -#define ANOTHER_LISTENER_PIN 28 // BCM 20 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 +#define ANOTHER_LISTENER_PIN 6 // BCM 25 struct counters { int32_t *primary; diff --git a/wiringPi/gtest/test_isr_rising.cpp b/wiringPi/gtest/test_isr_rising.cpp index 9a41b14..1ad7369 100644 --- a/wiringPi/gtest/test_isr_rising.cpp +++ b/wiringPi/gtest/test_isr_rising.cpp @@ -2,9 +2,9 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 -#define ANOTHER_LISTENER_PIN 28 // BCM 20 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 +#define ANOTHER_LISTENER_PIN 6 // BCM 25 /** * Tests ISR for rising edges. diff --git a/wiringPi/gtest/test_isr_rising2.cpp b/wiringPi/gtest/test_isr_rising2.cpp index b40ea4c..4e1e6fe 100644 --- a/wiringPi/gtest/test_isr_rising2.cpp +++ b/wiringPi/gtest/test_isr_rising2.cpp @@ -2,9 +2,9 @@ #include #include -#define TRIGGER_PIN 26 // BCM 12 -#define LISTENER_PIN 31 // BCM 1 -#define ANOTHER_LISTENER_PIN 28 // BCM 20 +#define TRIGGER_PIN 0 // BCM 17 +#define LISTENER_PIN 1 // BCM 18 +#define ANOTHER_LISTENER_PIN 6 // BCM 25 struct counters { uint32_t *primary; From a687840a872e0fe89da12fef6245777a63c907fd Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Fri, 19 Sep 2025 20:11:27 +0200 Subject: [PATCH 09/22] #396 longer delay for Pi1 comp. --- wiringPi/gtest/test_isr_restart2.cpp | 10 +++++----- wiringPi/gtest/test_isr_rising2.cpp | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/wiringPi/gtest/test_isr_restart2.cpp b/wiringPi/gtest/test_isr_restart2.cpp index c7225c0..be0d14b 100644 --- a/wiringPi/gtest/test_isr_restart2.cpp +++ b/wiringPi/gtest/test_isr_restart2.cpp @@ -72,11 +72,11 @@ TEST_F(ISRRestart2, RestartISR2) { EXPECT_EQ(count, 0); EXPECT_EQ(count2, 0); digitalWrite(TRIGGER_PIN, HIGH); - delay(10); + delay(20); EXPECT_EQ(count, 1); EXPECT_EQ(count2, 1); digitalWrite(TRIGGER_PIN, LOW); - delay(10); + delay(20); EXPECT_EQ(count, 1); EXPECT_EQ(count2, 1); @@ -84,7 +84,7 @@ TEST_F(ISRRestart2, RestartISR2) { EXPECT_EQ(wiringPiISRStop(LISTENER_PIN), 0); delay(100); digitalWrite(TRIGGER_PIN, HIGH); - delay(10); + delay(20); EXPECT_EQ(count, 1); EXPECT_EQ(count2, 1); EXPECT_EQ(count3, 0); @@ -96,13 +96,13 @@ TEST_F(ISRRestart2, RestartISR2) { 0); delay(100); digitalWrite(TRIGGER_PIN, HIGH); - delay(10); + delay(20); EXPECT_EQ(count, 1); EXPECT_EQ(count2, 1); EXPECT_EQ(count3, 0); digitalWrite(TRIGGER_PIN, LOW); - delay(10); + delay(20); EXPECT_EQ(count, 2); EXPECT_EQ(count2, 1); EXPECT_EQ(count3, -1); diff --git a/wiringPi/gtest/test_isr_rising2.cpp b/wiringPi/gtest/test_isr_rising2.cpp index 4e1e6fe..d23b5dd 100644 --- a/wiringPi/gtest/test_isr_rising2.cpp +++ b/wiringPi/gtest/test_isr_rising2.cpp @@ -72,11 +72,11 @@ TEST_F(ISRRising2, Fundamental) { EXPECT_EQ(count, 0u); EXPECT_EQ(count2, 0u); digitalWrite(TRIGGER_PIN, HIGH); - delay(10); + delay(20); EXPECT_EQ(count, 1u); EXPECT_EQ(count2, 1u); digitalWrite(TRIGGER_PIN, LOW); - delay(10); + delay(20); EXPECT_EQ(count, 1u); EXPECT_EQ(count2, 1u); } @@ -86,19 +86,19 @@ TEST_F(ISRRising2, ThreeTriggers) { delay(10); count = 0; for (int i = 0; i < 6; ++i) { - delay(10); + delay(20); digitalWrite(TRIGGER_PIN, i % 2); } - delay(10); + delay(20); EXPECT_EQ(count, 3u); } TEST_F(ISRRising2, Debounce) { - delay(10); + delay(20); for (int i = 0; i < 7; ++i) { digitalWrite(TRIGGER_PIN, (i + 1) % 2); } - delay(10); + delay(20); EXPECT_EQ(count, 1u); } @@ -117,19 +117,20 @@ TEST_F(ISRRising2, ISRInitConflict) { EXPECT_EQ(count, 0u); EXPECT_EQ(count2, 0u); digitalWrite(TRIGGER_PIN, HIGH); - delay(10); + delay(20); EXPECT_EQ(count, 1u); EXPECT_EQ(count2, 1u); digitalWrite(TRIGGER_PIN, LOW); - delay(10); + delay(20); EXPECT_EQ(count, 1u); EXPECT_EQ(count2, 1u); - delay(10); + delay(20); count = 0; for (int i = 0; i < 7; ++i) { + delay(1); digitalWrite(TRIGGER_PIN, (i + 1) % 2); } - delay(10); + delay(20); EXPECT_EQ(count, 1u); } From b3394383eb732f2b5e204f176254b428df2cc18f Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 28 Sep 2025 19:19:26 +0200 Subject: [PATCH 10/22] #396 fix unit test problems --- wiringPi/gtest/test_isr_restart.cpp | 1 + wiringPi/gtest/test_isr_rising.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/wiringPi/gtest/test_isr_restart.cpp b/wiringPi/gtest/test_isr_restart.cpp index 0930bab..29c2f79 100644 --- a/wiringPi/gtest/test_isr_restart.cpp +++ b/wiringPi/gtest/test_isr_restart.cpp @@ -57,6 +57,7 @@ TEST_F(ISRRestart, RestartISR) { EXPECT_EQ( wiringPiISR(LISTENER_PIN, INT_EDGE_FALLING, ISRRestart::TriggerCountDown), 0); + count=1; delay(100); digitalWrite(TRIGGER_PIN, HIGH); delay(10); diff --git a/wiringPi/gtest/test_isr_rising.cpp b/wiringPi/gtest/test_isr_rising.cpp index 1ad7369..ea5473c 100644 --- a/wiringPi/gtest/test_isr_rising.cpp +++ b/wiringPi/gtest/test_isr_rising.cpp @@ -4,7 +4,7 @@ #define TRIGGER_PIN 0 // BCM 17 #define LISTENER_PIN 1 // BCM 18 -#define ANOTHER_LISTENER_PIN 6 // BCM 25 +#define ANOTHER_LISTENER_PIN 26 // BCM 12 /** * Tests ISR for rising edges. From 4ef1f91cbb44f0d9266aee29e058bc453438d6e5 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 28 Sep 2025 19:43:52 +0200 Subject: [PATCH 11/22] #396 fix unit test problems --- wiringPi/gtest/test_isr_restart2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiringPi/gtest/test_isr_restart2.cpp b/wiringPi/gtest/test_isr_restart2.cpp index be0d14b..df2ca5e 100644 --- a/wiringPi/gtest/test_isr_restart2.cpp +++ b/wiringPi/gtest/test_isr_restart2.cpp @@ -4,7 +4,7 @@ #define TRIGGER_PIN 0 // BCM 17 #define LISTENER_PIN 1 // BCM 18 -#define ANOTHER_LISTENER_PIN 6 // BCM 25 +#define ANOTHER_LISTENER_PIN 26 // BCM 12 struct counters { int32_t *primary; From c9f08c9e7b937f2cde8a9eeabb573071ec42b4ca Mon Sep 17 00:00:00 2001 From: mstroh Date: Sun, 2 Nov 2025 18:36:57 +0100 Subject: [PATCH 12/22] #407 de fix ISR example --- documentation/deutsch/functions.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentation/deutsch/functions.md b/documentation/deutsch/functions.md index 0c86b55..8b78d56 100644 --- a/documentation/deutsch/functions.md +++ b/documentation/deutsch/functions.md @@ -473,7 +473,7 @@ static void wfi(struct WPIWfiStatus wfiStatus, void* userdata) { edgeType = "falling"; else edgeType = "none"; - printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.gpioPin, edgeType, wfiStatus.timeStamp_us, timenow, diff); + printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.pinBCM, edgeType, wfiStatus.timeStamp_us, timenow, diff); if (toggle == 0) { digitalWrite (OUTpin, HIGH); toggle = 1; @@ -500,19 +500,19 @@ int main (void) printf("Testing waitForInterrupt on both edges IRQ @ GPIO%d, timeout is %d\n", IRQpin, TIMEOUT); struct WPIWfiStatus wfiStatus = waitForInterrupt2(IRQpin, INT_EDGE_BOTH, TIMEOUT, BOUNCETIME_WFI); - if (wfiStatus.status < 0) { + if (wfiStatus.statusOK < 0) { printf("waitForInterrupt returned error\n"); pinMode(OUTpin, INPUT); return 0; } - else if (wfiStatus.status == 0) { + else if (wfiStatus.statusOK == 0) { printf("waitForInterrupt timed out\n\n"); } else { if (wfiStatus.edge == INT_EDGE_FALLING) - printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us); + printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.pinBCM, wfiStatus.timeStamp_us); else - printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us); + printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.pinBCM, wfiStatus.timeStamp_us); } printf("Testing IRQ @ GPIO%d on both edges and bouncetime %d microseconds. Toggle LED @ GPIO%d on IRQ.\n\n", IRQpin, BOUNCETIME, OUTpin); From 08cf61daff6e3947c9f34655b5e25ce3ba601574 Mon Sep 17 00:00:00 2001 From: mstroh Date: Sun, 2 Nov 2025 18:39:14 +0100 Subject: [PATCH 13/22] #407 en fix ISR example --- documentation/english/functions.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/english/functions.md b/documentation/english/functions.md index f13874a..739f9ab 100644 --- a/documentation/english/functions.md +++ b/documentation/english/functions.md @@ -497,19 +497,19 @@ int main (void) printf("Testing waitForInterrupt on both edges IRQ @ GPIO%d, timeout is %d\n", IRQpin, TIMEOUT); struct WPIWfiStatus wfiStatus = waitForInterrupt2(IRQpin, INT_EDGE_BOTH, TIMEOUT, BOUNCETIME_WFI); - if (wfiStatus.status < 0) { + if (wfiStatus.statusOK < 0) { printf("waitForInterrupt returned error\n"); pinMode(OUTpin, INPUT); return 0; } - else if (wfiStatus.status == 0) { + else if (wfiStatus.statusOK == 0) { printf("waitForInterrupt timed out\n\n"); } else { if (wfiStatus.edge == INT_EDGE_FALLING) - printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us); + printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.pinBCM, wfiStatus.timeStamp_us); else - printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us); + printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.pinBCM, wfiStatus.timeStamp_us); } printf("Testing IRQ @ GPIO%d on both edges and bouncetime %d microseconds. Toggle LED @ GPIO%d on IRQ.\n\n", IRQpin, BOUNCETIME, OUTpin); From 0f76f5e116a01f1c775b07308133c6f68b9f29f7 Mon Sep 17 00:00:00 2001 From: mstroh Date: Sun, 2 Nov 2025 18:45:03 +0100 Subject: [PATCH 14/22] #407 en fix ISR example --- documentation/english/functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/english/functions.md b/documentation/english/functions.md index 739f9ab..6875205 100644 --- a/documentation/english/functions.md +++ b/documentation/english/functions.md @@ -470,7 +470,7 @@ static void wfi(struct WPIWfiStatus wfiStatus, void* userdata) { edgeType = "falling"; else edgeType = "none"; - printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.gpioPin, edgeType, wfiStatus.timeStamp_us, timenow, diff); + printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.pinBCM, edgeType, wfiStatus.timeStamp_us, timenow, diff); if (toggle == 0) { digitalWrite (OUTpin, HIGH); toggle = 1; From 22a96cb61f23ededcd273bfaae5162fd9d16ecfd Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 2 Nov 2025 21:23:46 +0100 Subject: [PATCH 15/22] #408 gpio -x unit test --- gpio/test/gpio_test1_piface1.sh | 90 +++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100755 gpio/test/gpio_test1_piface1.sh diff --git a/gpio/test/gpio_test1_piface1.sh b/gpio/test/gpio_test1_piface1.sh new file mode 100755 index 0000000..5840830 --- /dev/null +++ b/gpio/test/gpio_test1_piface1.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +echo -e "πŸ”§ Starting relay unit test for MCP23S17@Piface unit test hw\n\n" + +# set pin 200–207 as output +for i in {200..207}; do + gpio -x mcp23s17:200:0:0 mode $i out +done + +# set pin 208–215 as input +for i in {208..215}; do + gpio -x mcp23s17:200:0:0 mode $i in + gpio -x mcp23s17:200:0:0 mode $i up +done + + +# Define relay output addresses and corresponding feedback input addresses +relay_addresses=(200 201 207 206) +feedback_addresses=(214 215 212 213) + +for round in {1..3}; do +echo -e "πŸ”„ Round $round / 3\n" + +# Loop through each relay +for i in "${!relay_addresses[@]}"; do + out=${relay_addresses[$i]} + in=${feedback_addresses[$i]} + + echo "➑️ Relay/IO write test $((i+1)): Address $out β†’ Feedback at $in" + + # Turn ON + gpio -x mcp23s17:200:0:0 write "$out" 1 + sleep 0.5 + feedback_on=$(gpio -x mcp23s17:200:0:0 read "$in") + + if [ "$feedback_on" -eq 0 ]; then + echo "βœ… ON Test passed: Feedback is LOW as expected." + else + echo "❌ ON Test failed: Feedback is HIGH." + fi + + # Turn OFF + gpio -x mcp23s17:200:0:0 write "$out" 0 + sleep 0.5 + feedback_off=$(gpio -x mcp23s17:200:0:0 read "$in") + + if [ "$feedback_off" -eq 1 ]; then + echo "βœ… OFF Test passed: Feedback is HIGH as expected." + else + echo "❌ OFF Test failed: Feedback is LOW." + fi + + echo -e "\n" + sleep 0.5 + +done + for addr in {208..211}; do + + echo "πŸ”ƒ Pullup resistor test address $addr: " + gpio -x mcp23s17:200:0:0 mode "$addr" up + sleep 0.5 + feedback_on=$(gpio -x mcp23s17:200:0:0 read "$addr") + + if [ "$feedback_on" -eq 1 ]; then + echo "βœ… PULLUP Test passed: Feedback is HIGH as expected." + else + echo "❌ PULLUP Test failed: Feedback is LOW." + fi + sleep 0.5 + + gpio -x mcp23s17:200:0:0 mode "$addr" down + sleep 0.5 + feedback_on=$(gpio -x mcp23s17:200:0:0 read "$addr") + + if [ "$feedback_on" -eq 1 ]; then + echo "βœ… PULLDOWN Test passed: Feedback is LOW as expected." + else + echo "❌ PULLDOW Test failed: Feedback is HIGH." + fi + + echo -e "\n" + sleep 0.5 + + +done + +done + +#echo "🧹 Cleanup complete. All relays turned OFF." + From 2d22070aa37b66e11f37baf6d15ad59ffc5a4e3e Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 10 Jan 2026 17:06:26 +0100 Subject: [PATCH 16/22] #411 support CS0-4 --- documentation/deutsch/functions.md | 4 ++-- documentation/english/functions.md | 4 ++-- wiringPi/wiringPiSPI.c | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/documentation/deutsch/functions.md b/documentation/deutsch/functions.md index 8b78d56..f0c87b3 100644 --- a/documentation/deutsch/functions.md +++ b/documentation/deutsch/functions.md @@ -809,8 +809,8 @@ int wiringPiSPISetupMode(int channel, int speed, int mode) int wiringPiSPIxSetupMode(const int number, const int channel, const int speed, const int mode) ``` -``number``: SPI Nummer (typisch 0, bei Compute Modul 0-7). -``channel``: SPI Kanal (typisch 0 oder 1, bei Compute Modul 0-3). +``number``: SPI Nummer (typisch 0, bei Compute Modul 0-6). +``channel``: SPI Kanal (typisch 0 oder 1, bei Compute Modul oder entsprechenden overlay 0-4). ``speed``: SPI Taktrate. ``mode``: SPI Modus (https://www.kernel.org/doc/Documentation/spi/spidev). ``RΓΌckgabewert``: Datei Handle zum SPI-Bus diff --git a/documentation/english/functions.md b/documentation/english/functions.md index 6875205..f1ec746 100644 --- a/documentation/english/functions.md +++ b/documentation/english/functions.md @@ -798,8 +798,8 @@ int wiringPiSPISetupMode(int channel, int speed, int mode); int wiringPiSPIxSetupMode(const int number, const int channel, const int speed, const int mode); ``` -``number``: SPI number (typically 0, on Compute Module 0-7). -``channel``: SPI channel (typically 0 or 1, on Compute Module 0-3). +``number``: SPI number (typically 0, on Compute Module 0-6). +``channel``: SPI channel (typically 0 or 1, on Compute Module or the corresponding overlay 0-4). ``speed``: SPI clock speed in Hz (500,000 to 32,000,000). ``mode``: SPI mode ([www.kernel.org/doc/Documentation/spi/spidev](https://www.kernel.org/doc/Documentation/spi/spidev)). ``Return Value``: File handle to the SPI bus, or -1 on error. diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c index 581a079..e182523 100644 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringPiSPI.c @@ -44,9 +44,11 @@ //static const char *spiDev1 = "/dev/spidev0.1" ; static const uint8_t spiBPW = 8 ; static const uint16_t spiDelay = 0 ; -//https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf +//https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf SPI0-6, CS0-2 +//cm5-datasheet.pdf SPI0-5, CS depend on SPInumber, can be up to 4 +//spi0-4cs.dts extention for supporting CS0-4 const uint8_t WPI_MaxSPINumbers = 7 ; -const uint8_t WPI_MaxSPIChannels = 3 ; +const uint8_t WPI_MaxSPIChannels = 5 ; static uint32_t spiSpeeds [7][3] = From c8c6790926b6e6c5c51b485ab703c27771c8cdb6 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 10 Jan 2026 17:15:10 +0100 Subject: [PATCH 17/22] adjust Pi4 speed, Kernel 6.12.47, Bookwork, 2026 --- wiringPi/test/wiringpi_test7_bench.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 9c0f221..ffdf367 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -83,7 +83,8 @@ int main (void) { case PI_MODEL_400: case PI_MODEL_CM4: case PI_MODEL_CM4S: - fExpectTimedigitalWrite = 0.020; //us + //fExpectTimedigitalWrite = 0.020; //us - with kernel <6.12.47 + fExpectTimedigitalWrite = 0.016; //us fExpectTimedigitalRead = 0.038; //us fExpectTimepinMode = 0.121; //us fWriteReadDelayFactor = 1.86; From cd882f6cf3271ed29a578d7b0471161e7ef8e169 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 10 Jan 2026 17:35:57 +0100 Subject: [PATCH 18/22] #412 Update Version und date to 2026 --- VERSION | 2 +- gpio/gpio.1 | 2 +- gpio/gpio.c | 6 +++--- gpio/readall.c | 2 +- version.h | 4 ++-- wiringPi/wiringPi.c | 2 +- wiringPi/wiringPi.h | 2 +- wiringPi/wiringPiI2C.c | 2 +- wiringPi/wiringPiI2C.h | 2 +- wiringPi/wiringPiSPI.c | 2 +- wiringPi/wiringPiSPI.h | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/VERSION b/VERSION index 5174c53..b2fb78a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.16 +3.18 diff --git a/gpio/gpio.1 b/gpio/gpio.1 index 4d76671..e99b66a 100644 --- a/gpio/gpio.1 +++ b/gpio/gpio.1 @@ -282,7 +282,7 @@ Please report bugs to https://github.com/WiringPi/WiringPi/issues .SH COPYRIGHT -Copyright (c) 2012-2025 Gordon Henderson and contributors +Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/gpio/gpio.c b/gpio/gpio.c index 8eae4d1..bf7d23d 100644 --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -2,7 +2,7 @@ * gpio.c: * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry * Pi's GPIO. - * Copyright (c) 2012-2025 Gordon Henderson and contributors + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ @@ -916,7 +916,7 @@ static void doVersion (char *argv []) wiringPiVersion (&vMaj, &vMin) ; printf ("gpio version: %d.%d\n", vMaj, vMin) ; - printf ("Copyright (c) 2012-2025 Gordon Henderson and contributors\n") ; + printf ("Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors\n") ; printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; printf ("For details type: %s -warranty\n", argv [0]) ; printf ("\n") ; @@ -1033,7 +1033,7 @@ int main (int argc, char *argv []) if (strcasecmp (argv [1], "-warranty") == 0) { printf ("gpio version: %s\n", VERSION) ; - printf ("Copyright (c) 2012-2025 Gordon Henderson and contributors\n") ; + printf ("Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors\n") ; printf ("\n") ; printf (" This program is free software; you can redistribute it and/or modify\n") ; printf (" it under the terms of the GNU Leser General Public License as published\n") ; diff --git a/gpio/readall.c b/gpio/readall.c index 3812e53..d75c414 100644 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -1,7 +1,7 @@ /* * readall.c: * The readall functions - getting a bit big, so split them out. - * Copyright (c) 2012-2024 Gordon Henderson and contributors + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/version.h b/version.h index 5ea1e8c..5d9ebc5 100644 --- a/version.h +++ b/version.h @@ -1,3 +1,3 @@ -#define VERSION "3.16" +#define VERSION "3.18" #define VERSION_MAJOR 3 -#define VERSION_MINOR 16 +#define VERSION_MINOR 18 diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 0cc75a5..d387d1a 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -1,7 +1,7 @@ /* * wiringPi: * Arduino look-a-like Wiring library for the Raspberry Pi - * Copyright (c) 2012-2025 Gordon Henderson and contributors + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors * Additional code for pwmSetClock by Chris Hall * * Thanks to code samples from Gert Jan van Loo and the diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 819a58f..07cd258 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -1,7 +1,7 @@ /* * wiringPi.h: * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2025 Gordon Henderson + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringPiI2C.c index 95131c3..6ec1789 100644 --- a/wiringPi/wiringPiI2C.c +++ b/wiringPi/wiringPiI2C.c @@ -1,7 +1,7 @@ /* * wiringPiI2C.c: * Simplified I2C access routines - * Copyright (c) 2013-2024 Gordon Henderson and contributors + * Copyright (c) 2013–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h index 112257a..22df490 100644 --- a/wiringPi/wiringPiI2C.h +++ b/wiringPi/wiringPiI2C.h @@ -1,7 +1,7 @@ /* * wiringPiI2C.h: * Simplified I2C access routines - * Copyright (c) 2013-2024 Gordon Henderson and contributors + * Copyright (c) 2013–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c index e182523..840f175 100644 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringPiSPI.c @@ -1,7 +1,7 @@ /* * wiringPiSPI.c: * Simplified SPI access routines - * Copyright (c) 2012-2025 Gordon Henderson and contributors + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h index d60b064..aa15aa6 100644 --- a/wiringPi/wiringPiSPI.h +++ b/wiringPi/wiringPiSPI.h @@ -1,7 +1,7 @@ /* * wiringPiSPI.h: * Simplified SPI access routines - * Copyright (c) 2012-2025 Gordon Henderson and contributors + * Copyright (c) 2012–2019 Gordon Henderson; 2019–2026 Contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ From 960b11200094ef653fcb2294917cbe49b6fcc73d Mon Sep 17 00:00:00 2001 From: mstroh Date: Sat, 17 Jan 2026 15:00:49 +0100 Subject: [PATCH 19/22] Adjust for Pi1/Zero test hardware --- wiringPi/gtest/test_isr_rising2.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/wiringPi/gtest/test_isr_rising2.cpp b/wiringPi/gtest/test_isr_rising2.cpp index d23b5dd..1ac98db 100644 --- a/wiringPi/gtest/test_isr_rising2.cpp +++ b/wiringPi/gtest/test_isr_rising2.cpp @@ -4,7 +4,7 @@ #define TRIGGER_PIN 0 // BCM 17 #define LISTENER_PIN 1 // BCM 18 -#define ANOTHER_LISTENER_PIN 6 // BCM 25 +#define ANOTHER_LISTENER_PIN 11 // BCM 7 struct counters { uint32_t *primary; @@ -86,10 +86,9 @@ TEST_F(ISRRising2, ThreeTriggers) { delay(10); count = 0; for (int i = 0; i < 6; ++i) { - delay(20); digitalWrite(TRIGGER_PIN, i % 2); + delay(20); } - delay(20); EXPECT_EQ(count, 3u); } From ece0ffe62a9b178f1fdd4596ec7917f4429654b1 Mon Sep 17 00:00:00 2001 From: mstroh Date: Sat, 17 Jan 2026 16:27:49 +0100 Subject: [PATCH 20/22] Change ANOTHER_LISTENER_PIN to BCM 12 old has conflict with SPI CE1 --- wiringPi/gtest/test_isr_rising2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiringPi/gtest/test_isr_rising2.cpp b/wiringPi/gtest/test_isr_rising2.cpp index 1ac98db..19261ad 100644 --- a/wiringPi/gtest/test_isr_rising2.cpp +++ b/wiringPi/gtest/test_isr_rising2.cpp @@ -4,7 +4,7 @@ #define TRIGGER_PIN 0 // BCM 17 #define LISTENER_PIN 1 // BCM 18 -#define ANOTHER_LISTENER_PIN 11 // BCM 7 +#define ANOTHER_LISTENER_PIN 26 // BCM 12 struct counters { uint32_t *primary; From 111f4f36d180d53a189ad77d6cf3d911b5fbe9a6 Mon Sep 17 00:00:00 2001 From: mstroh Date: Sat, 17 Jan 2026 19:45:30 +0100 Subject: [PATCH 21/22] Unit test supporting 5 SPI CS channels --- wiringPi/test/wiringpi_xotest_test1_spi.c | 28 +++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/wiringPi/test/wiringpi_xotest_test1_spi.c b/wiringPi/test/wiringpi_xotest_test1_spi.c index 5c11f67..c570864 100644 --- a/wiringPi/test/wiringpi_xotest_test1_spi.c +++ b/wiringPi/test/wiringpi_xotest_test1_spi.c @@ -1,4 +1,4 @@ -ο»Ώ// WiringPi test program: SPI functions (need XO hardware) +// WiringPi test program: SPI functions (need XO hardware) // Compile: gcc -Wall wiringpi_xotest_test1_spi.c -o wiringpi_xotest_test1_spi -lwiringPi #include @@ -65,17 +65,19 @@ int main(int argc, char *argv []){ wiringPiSetup(); - if ((hSPI = wiringPiSPISetup (spiChannel, spiSpeed)) < 0) { + printf("wiringPiSPISetup (spiChannel=%d, spiSpeed=%d)\n",spiChannel, spiSpeed); + if ((hSPI = wiringPiSPISetup(spiChannel, spiSpeed)) < 0) { FailAndExitWithErrno("wiringPiSPISetup", hSPI); } int hSPIOld=hSPI; - //printf("\nSPI fd = %d\n call close now\n", hSPI); + printf("wiringPiSPIClose(spiChannel=%d)\n",spiChannel); int ret = wiringPiSPIClose(spiChannel); if (ret!=0) { FailAndExitWithErrno("wiringPiSPIClose", ret); } + printf("wiringPiSPIxSetupMode(0, spiChannel=%d, spiSpeed=%d, 0)\n",spiChannel, spiSpeed); if ((hSPI = wiringPiSPIxSetupMode(0, spiChannel, spiSpeed, 0)) < 0) { FailAndExitWithErrno("wiringPiSPIxSetup", hSPI); } @@ -150,12 +152,18 @@ int main(int argc, char *argv []){ digitalWriteEx(24, GPIOIn, HIGH); checkVoltage(3.3f, "Analog value 6xHigh"); - CH1 = AnalogRead(3, 1, &returnvalue); - CheckSame("\nReading Wrong channel 3 result ", CH1, 0); - CheckSame("\nReading Wrong channel 3 ioctl result ", returnvalue, -EINVAL); - CH1 = AnalogRead(2, 1, &returnvalue); - CheckSame("\nReading Wrong channel 2 result ", CH1, 0); - CheckSame("\nReading Wrong channel 3 ioctl result ", returnvalue, -EBADF); + + int unsupportedSPICh = 5; + printf("\nCheck error for unsupported channel %d\n", unsupportedSPICh); + CH1 = AnalogRead(unsupportedSPICh, 1, &returnvalue); + CheckSame("\nReading unsupported channel result ", CH1, 0); + CheckSame("Reading unsupported channel ioctl result ", returnvalue, -EINVAL); + + int uninitSPICh = 2; + printf("\nCheck error for uninitialized channel %d\n", uninitSPICh); + CH1 = AnalogRead(uninitSPICh, 1, &returnvalue); + CheckSame("\nReading uninitialized channel result ", CH1, 0); + CheckSame("Reading uninitialized channel ioctl result ", returnvalue, -EBADF); pinMode(22, INPUT); pinMode(21, INPUT); @@ -164,6 +172,7 @@ int main(int argc, char *argv []){ pinMode(27, INPUT); pinMode(28, INPUT); +printf("\nwiringPiSPIxClose(0, spiChannel=%d)\n",spiChannel); ret = wiringPiSPIxClose(0, spiChannel); CheckSame("wiringPiSPIxClose result", ret, 0); if (ret!=0) { @@ -174,4 +183,3 @@ int main(int argc, char *argv []){ return UnitTestState(); } - From 3025af515e01e76b1409f5126d24301f4d09091c Mon Sep 17 00:00:00 2001 From: mstroh Date: Sun, 18 Jan 2026 11:10:55 +0100 Subject: [PATCH 22/22] Adjust MaxFreq for Raspberry Pi 1 models Updated maximum frequency settings for Raspberry Pi models. --- wiringPi/test/wiringpi_test9_pwm.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/wiringPi/test/wiringpi_test9_pwm.c b/wiringPi/test/wiringpi_test9_pwm.c index 88775fc..ee6da97 100644 --- a/wiringPi/test/wiringpi_test9_pwm.c +++ b/wiringPi/test/wiringpi_test9_pwm.c @@ -77,15 +77,18 @@ int main (void) { int Pi5 = 0; double MaxFreq = 100.0; switch(RaspberryPiModel) { - case PI_MODEL_A: + case PI_MODEL_A: case PI_MODEL_B: case PI_MODEL_BP: case PI_MODEL_AP: + case PI_MODEL_CM: + MaxFreq = 5.0; // 4.8 kHz -> ~26% CPU@800 MHz + printf(" - Pi1/BCM2835 detected, will skip tests with frequency above %g kHz\n", MaxFreq); + break; case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: - case PI_MODEL_CM: - MaxFreq = 13.0; // 12.5 kHz -> ~40% CPU@800 MHz - printf(" - Pi1/BCM2835 detected, will skip tests with frequency above %g kHz\n", MaxFreq); + MaxFreq = 13.0; // 12.5 kHz -> ~42% CPU@1000 MHz + printf(" - PiZero/BCM2835 detected, will skip tests with frequency above %g kHz\n", MaxFreq); break; case PI_MODEL_2: MaxFreq = 20.0;