diff --git a/WiringPi/wiringPi/wiringPi.c b/WiringPi/wiringPi/wiringPi.c index b8e381a..b54ad29 100644 --- a/WiringPi/wiringPi/wiringPi.c +++ b/WiringPi/wiringPi/wiringPi.c @@ -88,7 +88,7 @@ #define PI_GPIO_MASK (0xFFFFFFC0) -static struct wiringPiNodeStruct *wiringPiNodes = NULL ; +struct wiringPiNodeStruct *wiringPiNodes = NULL ; // BCM Magic @@ -118,7 +118,6 @@ static struct wiringPiNodeStruct *wiringPiNodes = NULL ; #define FSEL_INPT 0b000 #define FSEL_OUTP 0b001 #define FSEL_ALT0 0b100 -#define FSEL_ALT0 0b100 #define FSEL_ALT1 0b101 #define FSEL_ALT2 0b110 #define FSEL_ALT3 0b111 @@ -213,7 +212,13 @@ int wiringPiReturnCodes = FALSE ; // sysFds: // Map a file descriptor from the /sys/class/gpio/gpioX/value -static int sysFds [64] ; +static int sysFds [64] = +{ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +} ; // ISR Data @@ -833,7 +838,7 @@ void gpioClockSet (int pin, int freq) ********************************************************************************* */ -static struct wiringPiNodeStruct *wiringPiFindNode (int pin) +struct wiringPiNodeStruct *wiringPiFindNode (int pin) { struct wiringPiNodeStruct *node = wiringPiNodes ; @@ -919,6 +924,32 @@ void pinEnableED01Pi (int pin) ********************************************************************************* */ +/* + * pinModeAlt: + * This is an un-documented special to let you set any pin to any mode + ********************************************************************************* + */ + +void pinModeAlt (int pin, int mode) +{ + int fSel, shift ; + + if ((pin & PI_GPIO_MASK) == 0) // On-board pin + { + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + fSel = gpioToGPFSEL [pin] ; + shift = gpioToShift [pin] ; + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; + } +} + /* * pinMode: @@ -1304,7 +1335,8 @@ int wiringPiISR (int pin, int mode, void (*function)(void)) char c ; int bcmGpioPin ; - pin &= 63 ; + if ((pin < 0) || (pin > 63)) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; @@ -1333,26 +1365,26 @@ int wiringPiISR (int pin, int mode, void (*function)(void)) sprintf (pinS, "%d", bcmGpioPin) ; if ((pid = fork ()) < 0) // Fail - return pid ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; if (pid == 0) // Child, exec { execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return -1 ; // Failure ... + return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; } else // Parent, wait wait (NULL) ; } -// Now pre-open the /sys/class node - it may already be open if -// we are in Sys mode or if we call here twice, if-so, we'll close it. - - if (sysFds [bcmGpioPin] != -1) - close (sysFds [bcmGpioPin]) ; +// Now pre-open the /sys/class node - but it may already be open if +// we are in Sys mode... - sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; - if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) - return -1 ; + if (sysFds [bcmGpioPin] == -1) + { + sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; + if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; + } // Clear any initial pending interrupt @@ -1441,6 +1473,8 @@ void delayMicrosecondsHard (unsigned int howLong) void delayMicroseconds (unsigned int howLong) { struct timespec sleeper ; + unsigned int uSecs = howLong % 1000000 ; + unsigned int wSecs = howLong / 1000000 ; /**/ if (howLong == 0) return ; @@ -1448,8 +1482,8 @@ void delayMicroseconds (unsigned int howLong) delayMicrosecondsHard (howLong) ; else { - sleeper.tv_sec = 0 ; - sleeper.tv_nsec = (long)(howLong * 1000) ; + sleeper.tv_sec = wSecs ; + sleeper.tv_nsec = (long)(uSecs * 1000L) ; nanosleep (&sleeper, NULL) ; } } @@ -1532,7 +1566,7 @@ int wiringPiSetup (void) // Open the master /dev/memory device - if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0) + if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; // GPIO: diff --git a/WiringPi/wiringPi/wiringPi.h b/WiringPi/wiringPi/wiringPi.h index 600b318..ce4680a 100644 --- a/WiringPi/wiringPi/wiringPi.h +++ b/WiringPi/wiringPi/wiringPi.h @@ -104,6 +104,8 @@ struct wiringPiNodeStruct struct wiringPiNodeStruct *next ; } ; +extern struct wiringPiNodeStruct *wiringPiNodes ; + // Function prototypes // c++ wrappers thanks to a comment by Nick Lott @@ -119,13 +121,15 @@ extern int wiringPiFailure (int fatal, const char *message, ...) ; // Core wiringPi functions -extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; +extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; +extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; extern int wiringPiSetup (void) ; extern int wiringPiSetupSys (void) ; extern int wiringPiSetupGpio (void) ; extern int wiringPiSetupPhys (void) ; +extern void pinModeAlt (int pin, int mode) ; extern void pinMode (int pin, int mode) ; extern void pullUpDnControl (int pin, int pud) ; extern int digitalRead (int pin) ; diff --git a/setup.py b/setup.py index 17db3f1..ac52a91 100644 --- a/setup.py +++ b/setup.py @@ -7,13 +7,17 @@ _wiringpi2 = Extension( sources=[ 'WiringPi/wiringPi/wiringPi.c', 'WiringPi/wiringPi/wiringPiSPI.c', + 'WiringPi/wiringPi/max31855.c', + 'WiringPi/wiringPi/max5322.c', 'WiringPi/wiringPi/drc.c', + 'WiringPi/wiringPi/sn3218.c', 'WiringPi/wiringPi/mcp23s17.c', 'WiringPi/wiringPi/pcf8591.c', 'WiringPi/wiringPi/softTone.c', 'WiringPi/wiringPi/wiringSerial.c', 'WiringPi/wiringPi/mcp23008.c', 'WiringPi/wiringPi/mcp3002.c', + 'WiringPi/wiringPi/mcp3004.c', 'WiringPi/wiringPi/piHiPri.c', 'WiringPi/wiringPi/sr595.c', 'WiringPi/wiringPi/wiringShift.c', @@ -34,6 +38,7 @@ _wiringpi2 = Extension( 'WiringPi/devLib/lcd.c', 'WiringPi/devLib/piFace.c', 'WiringPi/devLib/piNes.c', + 'WiringPi/devLib/piGlow.c', 'wiringpi_wrap.c' ], ) @@ -54,7 +59,10 @@ setup( headers=[ 'WiringPi/wiringPi/wiringPi.h', 'WiringPi/wiringPi/wiringPiI2C.h', + 'WiringPi/wiringPi/max31855.h', + 'WiringPi/wiringPi/max5322.h', 'WiringPi/wiringPi/drc.h', + 'WiringPi/wiringPi/sn3218.h', 'WiringPi/wiringPi/mcp23s08.h', 'WiringPi/wiringPi/mcp3422.h', 'WiringPi/wiringPi/softServo.h', @@ -74,6 +82,7 @@ setup( 'WiringPi/wiringPi/pcf8591.h', 'WiringPi/wiringPi/mcp23017.h', 'WiringPi/wiringPi/mcp3002.h', + 'WiringPi/wiringPi/mcp3004.h', 'WiringPi/wiringPi/softPwm.h', 'WiringPi/devLib/ds1302.h', 'WiringPi/devLib/gertboard.h', @@ -83,5 +92,6 @@ setup( 'WiringPi/devLib/lcd128x64.h', 'WiringPi/devLib/maxdetect.h', 'WiringPi/devLib/piNes.h' + 'WiringPi/devLib/piGlow.h', ] ) diff --git a/wiringpi.i b/wiringpi.i index 1cf28e1..1780955 100644 --- a/wiringpi.i +++ b/wiringpi.i @@ -6,6 +6,8 @@ #include "WiringPi/wiringPi/wiringPiI2C.h" #include "WiringPi/wiringPi/wiringSerial.h" #include "WiringPi/wiringPi/wiringShift.h" +#include "WiringPi/wiringPi/max31855.h" +#include "WiringPi/wiringPi/max5322.h" #include "WiringPi/wiringPi/mcp23017.h" #include "WiringPi/wiringPi/mcp4802.h" #include "WiringPi/wiringPi/mcp3422.h" @@ -14,7 +16,9 @@ #include "WiringPi/wiringPi/mcp23x08.h" #include "WiringPi/wiringPi/mcp23016.h" #include "WiringPi/wiringPi/mcp3002.h" +#include "WiringPi/wiringPi/mcp3004.h" #include "WiringPi/wiringPi/mcp23016reg.h" +#include "WiringPi/wiringPi/sn3218.h" #include "WiringPi/wiringPi/mcp23x0817.h" #include "WiringPi/wiringPi/mcp23s17.h" #include "WiringPi/wiringPi/pcf8574.h" @@ -32,6 +36,7 @@ #include "WiringPi/devLib/piFace.h" #include "WiringPi/devLib/ds1302.h" #include "WiringPi/devLib/piNes.h" +#include "WiringPi/devLib/piGlow.h" %} %apply unsigned char { uint8_t }; @@ -209,6 +214,9 @@ extern int lcd128x64setup (void) ; extern int setupNesJoystick (int dPin, int cPin, int lPin) ; extern unsigned int readNesJoystick (int joystick) ; - +// PiGlow +extern void piGlow1 (const int leg, const int ring, const int intensity) ; +extern void piGlowLeg (const int leg, const int intensity) ; +extern void piGlowRing (const int ring, const int intensity) ; %include "wiringpi2-class.py" diff --git a/wiringpi2.py b/wiringpi2.py index 5fb5c37..2a3557d 100644 --- a/wiringpi2.py +++ b/wiringpi2.py @@ -503,6 +503,18 @@ setupNesJoystick = _wiringpi2.setupNesJoystick def readNesJoystick(*args): return _wiringpi2.readNesJoystick(*args) readNesJoystick = _wiringpi2.readNesJoystick + +def piGlow1(*args): + return _wiringpi2.piGlow1(*args) +piGlow1 = _wiringpi2.piGlow1 + +def piGlowLeg(*args): + return _wiringpi2.piGlowLeg(*args) +piGlowLeg = _wiringpi2.piGlowLeg + +def piGlowRing(*args): + return _wiringpi2.piGlowRing(*args) +piGlowRing = _wiringpi2.piGlowRing class nes(object): def setupNesJoystick(self,*args): return setupNesJoystick(*args) @@ -658,7 +670,7 @@ class GPIO(object): def softPwmCreate(self,*args): return softPwmCreate(*args) def softPwmWrite(self,*args): - return softPwmWrite(*args) + return sofPwmWrite(*args) def softToneCreate(self,*args): return softToneCreate(*args) diff --git a/wiringpi2.pyc b/wiringpi2.pyc index 9735e5b..0ddd717 100644 Binary files a/wiringpi2.pyc and b/wiringpi2.pyc differ diff --git a/wiringpi_wrap.c b/wiringpi_wrap.c index fefd55e..d53d4c5 100644 --- a/wiringpi_wrap.c +++ b/wiringpi_wrap.c @@ -2972,6 +2972,8 @@ static swig_module_info swig_module = {swig_types, 6, 0, 0, 0, 0}; #include "WiringPi/wiringPi/wiringPiI2C.h" #include "WiringPi/wiringPi/wiringSerial.h" #include "WiringPi/wiringPi/wiringShift.h" +#include "WiringPi/wiringPi/max31855.h" +#include "WiringPi/wiringPi/max5322.h" #include "WiringPi/wiringPi/mcp23017.h" #include "WiringPi/wiringPi/mcp4802.h" #include "WiringPi/wiringPi/mcp3422.h" @@ -2980,6 +2982,7 @@ static swig_module_info swig_module = {swig_types, 6, 0, 0, 0, 0}; #include "WiringPi/wiringPi/mcp23x08.h" #include "WiringPi/wiringPi/mcp23016.h" #include "WiringPi/wiringPi/mcp3002.h" +#include "WiringPi/wiringPi/mcp3004.h" #include "WiringPi/wiringPi/mcp23016reg.h" #include "WiringPi/wiringPi/mcp23x0817.h" #include "WiringPi/wiringPi/mcp23s17.h" @@ -2998,6 +3001,7 @@ static swig_module_info swig_module = {swig_types, 6, 0, 0, 0, 0}; #include "WiringPi/devLib/piFace.h" #include "WiringPi/devLib/ds1302.h" #include "WiringPi/devLib/piNes.h" +#include "WiringPi/devLib/piGlow.h" SWIGINTERNINLINE PyObject* @@ -6774,6 +6778,105 @@ fail: } +SWIGINTERN PyObject *_wrap_piGlow1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int arg2 ; + int arg3 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:piGlow1",&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "piGlow1" "', argument " "1"" of type '" "int""'"); + } + arg1 = (int)(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "piGlow1" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + ecode3 = SWIG_AsVal_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "piGlow1" "', argument " "3"" of type '" "int""'"); + } + arg3 = (int)(val3); + piGlow1(arg1,arg2,arg3); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_piGlowLeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:piGlowLeg",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "piGlowLeg" "', argument " "1"" of type '" "int""'"); + } + arg1 = (int)(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "piGlowLeg" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + piGlowLeg(arg1,arg2); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_piGlowRing(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:piGlowRing",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "piGlowRing" "', argument " "1"" of type '" "int""'"); + } + arg1 = (int)(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "piGlowRing" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + piGlowRing(arg1,arg2); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, { (char *)"wiringPiSetup", _wrap_wiringPiSetup, METH_VARARGS, NULL}, @@ -6885,6 +6988,9 @@ static PyMethodDef SwigMethods[] = { { (char *)"lcd128x64setup", _wrap_lcd128x64setup, METH_VARARGS, NULL}, { (char *)"setupNesJoystick", _wrap_setupNesJoystick, METH_VARARGS, NULL}, { (char *)"readNesJoystick", _wrap_readNesJoystick, METH_VARARGS, NULL}, + { (char *)"piGlow1", _wrap_piGlow1, METH_VARARGS, NULL}, + { (char *)"piGlowLeg", _wrap_piGlowLeg, METH_VARARGS, NULL}, + { (char *)"piGlowRing", _wrap_piGlowRing, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } };