commit 1a7244f81ecd9166f6e9bb41a8efc072e13d8450
Author: Qubot <1445788683@qq.com>
Date: Tue Oct 17 15:22:32 2023 +0800
New build
diff --git a/CHANGES.txt b/CHANGES.txt
new file mode 100644
index 0000000..b0c0be5
--- /dev/null
+++ b/CHANGES.txt
@@ -0,0 +1,14 @@
+v1.0.0 -- Branched from original WiringPi to deliver new WiringPi 2 functionality
+v1.0.1 -- Fixed build problems involving missing header files
+v1.0.2 -- Fixed build issue with piNes.c
+v1.0.3 -- Fixed bug in physical pin assignment mode
+v1.0.4 -- Added class wrapper, plus analogRead/Write functions
+v1.0.5 -- Second attempt at pretty Pypi page
+v1.0.6 -- Fixed spelling error in softToneCreate - Thanks oevsegneev
+v1.0.7 -- Added LCD functionality
+v1.0.8 -- Updated manifest to include .rst and fix build error
+v1.0.9 -- Erroneous non-fix due to stupidity
+v1.0.10 -- Added I2CSetup and new I2C class
+v1.1.0 -- Synced to WiringPi as of 8th March 2015
+v1.1.1 -- Included devLib folder for headers
+v1.2.1 -- Synced to WIringPi as of 27th February 2016
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..65c5ca8
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..f8cf309
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,7 @@
+graft wiringOP/wiringPi
+graft wiringOP/devLib
+include README.rst
+include LICENSE.txt
+include setup.cfg
+include wiringpi.py
+include wiringpi_wrap.c
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..bb37efe
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+all: bindings
+ python3 setup.py build
+
+bindings:
+ python3 generate-bindings.py > bindings.i
+
+clean:
+ rm -rf build dist wiringpi.egg-info
+ rm -rf wiringpi.py wiringpi_wrap.c
+
+install: bindings
+ sudo python3 setup.py install
+
+test:
+ pytest tests
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..b037f55
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,64 @@
+Note
+~~~~
+
+wiringOP for Python
+===================
+
+wiringOP: An implementation of most of the Arduino Wiring functions for
+the Orange Pi.
+
+Supported boards
+===================
+tested on:
+``Orange Pi Zero2``
+``Orange Pi 3 LTS``
+``Orange Pi 4 LTS``
+
+Manual Build
+============
+
+Get/setup repo
+--------------
+
+.. code:: bash
+
+ git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python.git
+ cd wiringOP-Python
+
+Don't forget the --recursive; it is required to also pull in the WiringPi C code from its own repository.
+
+Prerequisites
+-------------
+
+To rebuild the bindings you **must** first have installed ``swig``,
+``python3-dev``, and ``python3-setuptools``. wiringOP should also be installed system-wide for access
+to the ``gpio`` tool.
+
+.. code:: bash
+
+ sudo apt-get install swig python3-dev python3-setuptools
+
+Build & install with
+--------------------
+
+``python3 generate-bindings.py > bindings.i``
+
+``sudo python3 setup.py install``
+
+Usage
+=====
+
+.. code:: python
+
+ import wiringpi
+
+ # One of the following MUST be called before using IO functions:
+ wiringpi.wiringPiSetup() # For sequential pin numbering
+
+**General IO:**
+
+.. code:: python
+
+ wiringpi.pinMode(6, 1) # Set pin 6 to 1 ( OUTPUT )
+ wiringpi.digitalWrite(6, 1) # Write 1 ( HIGH ) to pin 6
+ wiringpi.digitalRead(6) # Read pin 6
diff --git a/constants.py b/constants.py
new file mode 100644
index 0000000..f501698
--- /dev/null
+++ b/constants.py
@@ -0,0 +1,47 @@
+%pythoncode %{
+# wiringPi modes
+
+WPI_MODE_PINS = 0;
+WPI_MODE_GPIO = 1;
+WPI_MODE_GPIO_SYS = 2;
+WPI_MODE_PHYS = 3;
+WPI_MODE_PIFACE = 4;
+WPI_MODE_UNINITIALISED = -1;
+
+# Pin modes
+
+INPUT = 0;
+OUTPUT = 1;
+PWM_OUTPUT = 2;
+GPIO_CLOCK = 3;
+SOFT_PWM_OUTPUT = 4;
+SOFT_TONE_OUTPUT = 5;
+PWM_TONE_OUTPUT = 6;
+
+LOW = 0;
+HIGH = 1;
+
+# Pull up/down/none
+
+PUD_OFF = 0;
+PUD_DOWN = 1;
+PUD_UP = 2;
+
+# PWM
+
+PWM_MODE_MS = 0;
+PWM_MODE_BAL = 1;
+
+# Interrupt levels
+
+INT_EDGE_SETUP = 0;
+INT_EDGE_FALLING = 1;
+INT_EDGE_RISING = 2;
+INT_EDGE_BOTH = 3;
+
+# Shifting (from wiringShift.h)
+
+LSBFIRST = 0;
+MSBFIRST = 1;
+
+%}
diff --git a/examples/RUN_THESE_WITH_SUDO b/examples/RUN_THESE_WITH_SUDO
new file mode 100644
index 0000000..e69de29
diff --git a/examples/blink.py b/examples/blink.py
new file mode 100644
index 0000000..1d4c373
--- /dev/null
+++ b/examples/blink.py
@@ -0,0 +1,22 @@
+import wiringpi
+import time
+import sys
+from wiringpi import GPIO
+
+wiringpi.wiringPiSetup()
+NUM = wiringpi.getGpioNum()
+
+for i in range(0, NUM):
+ wiringpi.pinMode(i, GPIO.OUTPUT) ;
+
+while True:
+ try:
+ for i in range(0, NUM):
+ wiringpi.digitalWrite(i, GPIO.HIGH)
+ time.sleep(1)
+ for i in range(0, NUM):
+ wiringpi.digitalWrite(i, GPIO.LOW)
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
diff --git a/examples/callback.py b/examples/callback.py
new file mode 100644
index 0000000..175482a
--- /dev/null
+++ b/examples/callback.py
@@ -0,0 +1,14 @@
+import wiringpi
+PIN_TO_SENSE = 23
+
+def gpio_callback():
+ print "GPIO_CALLBACK!"
+
+wiringpi.wiringPiSetupGpio()
+wiringpi.pinMode(PIN_TO_SENSE, wiringpi.GPIO.INPUT)
+wiringpi.pullUpDnControl(PIN_TO_SENSE, wiringpi.GPIO.PUD_UP)
+
+wiringpi.wiringPiISR(PIN_TO_SENSE, wiringpi.GPIO.INT_EDGE_BOTH, gpio_callback)
+
+while True:
+ wiringpi.delay(2000)
diff --git a/examples/delay.py b/examples/delay.py
new file mode 100644
index 0000000..be899bf
--- /dev/null
+++ b/examples/delay.py
@@ -0,0 +1,5 @@
+# Demonstrates use of Arduino-like delay function
+import wiringpi
+print 'Hello World'
+wiringpi.delay(1500) # Delay for 1.5 seconds
+print 'Hi again!'
diff --git a/examples/ds1307.py b/examples/ds1307.py
new file mode 100644
index 0000000..6e77f0e
--- /dev/null
+++ b/examples/ds1307.py
@@ -0,0 +1,133 @@
+import sys
+import time
+import wiringpi
+from datetime import datetime
+import operator
+import argparse
+
+parser = argparse.ArgumentParser(description='i2c')
+parser.add_argument("--device", type=str, default="/dev/i2c-0", help='specify the i2c node')
+args = parser.parse_args()
+
+i2caddr = 0x68
+
+def b2s(bcd, mask):
+ bcd &= mask
+ b1 = bcd & 0x0F
+ b2 = ((bcd >> 4) & 0x0F)*10
+ return b1 + b2
+
+def decCompensation(units):
+ unitsU = units%10
+ if units >= 50:
+ units = 0x50 + unitsU
+ elif units >= 40:
+ units = 0x40 + unitsU
+ elif units >= 30:
+ units = 0x30 + unitsU
+ elif units >= 20:
+ units = 0x20 + unitsU
+ elif units >= 10:
+ units = 0x10 + unitsU
+ return units
+
+def getHours():
+ HH = time.strftime("%H")
+ return decCompensation(int(HH))
+
+def getMins():
+ MM = time.strftime("%M")
+ return decCompensation(int(MM))
+
+def getSecs():
+ SS = time.strftime("%S")
+ return decCompensation(int(SS))
+
+def getWeeks():
+ WW = time.strftime("%w")
+ return decCompensation(int(WW))
+
+def getDays():
+ DD = time.strftime("%d")
+ return decCompensation(int(DD))
+
+def getMons():
+ MON = time.strftime("%m")
+ return decCompensation(int(MON))
+
+def getYear():
+ YY = time.strftime("%Y")
+ return decCompensation(int(YY))
+
+def ds1307_write_byte(fd, reg, byte):
+ if wiringpi.wiringPiI2CWriteReg8(fd, reg, byte) < 0:
+ print("Error write byte to ds1307")
+ return -1
+ return 0
+
+def ds1307_read_byte(fd, reg):
+ byte = wiringpi.wiringPiI2CReadReg8(fd, reg)
+ if byte < 0:
+ print("Error read byte from ds1307")
+ return -1
+ return byte
+
+def sys2rtcSet(fd):
+ ds1307_write_byte(fd, 0x02, getHours())
+ ds1307_write_byte(fd, 0x01, getMins())
+ ds1307_write_byte(fd, 0x00, getSecs())
+ ds1307_write_byte(fd, 0x03, getWeeks())
+ ds1307_write_byte(fd, 0x04, getDays())
+ ds1307_write_byte(fd, 0x05, getMons())
+ ds1307_write_byte(fd, 0x06, getYear())
+
+def read_register(fd):
+ byte = ds1307_read_byte(fd, 0x0)
+ if byte >> 7:
+ ds1307_write_byte(fd, 0x0, 0x0)
+ second = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10
+
+ byte = ds1307_read_byte(fd, 0x01)
+ minute = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10
+
+ byte = ds1307_read_byte(fd, 0x02)
+ hour = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10
+
+ week = ds1307_read_byte(fd, 0x03)
+
+ byte = ds1307_read_byte(fd, 0x04)
+ day = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10
+
+ byte = ds1307_read_byte(fd, 0x05)
+ month = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10
+
+ byte = ds1307_read_byte(fd, 0x06)
+ year = operator.mod(byte, 16) + operator.floordiv(byte, 16) * 10 + 1970
+
+ if year == 2000 or month > 12 or month<1 or day < 1 or day > 31:
+ return False
+
+ if second > 59:
+ return False
+ return datetime(year,month,day,hour,minute,second)
+
+def main():
+ wiringpi.wiringPiSetup()
+ fd = wiringpi.wiringPiI2CSetupInterface(args.device, i2caddr)
+ try:
+ sys2rtcSet(fd)
+ while True:
+ time.sleep(1)
+ dt = read_register(fd)
+ if not dt:
+ continue
+ else:
+ str_time = dt.strftime("%a %Y-%m-%d %H:%M:%S")
+ print("%s"%(str_time))
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
+
diff --git a/examples/ladder-board.py b/examples/ladder-board.py
new file mode 100644
index 0000000..35b5df6
--- /dev/null
+++ b/examples/ladder-board.py
@@ -0,0 +1,27 @@
+import wiringpi
+INPUT = 0
+OUTPUT = 1
+LOW = 0
+HIGH = 1
+BUTTONS = [13,12,10,11]
+LEDS = [0,1,2,3,4,5,6,7,8,9]
+PUD_UP = 2
+
+wiringpi.wiringPiSetup()
+
+for button in BUTTONS:
+ wiringpi.pinMode(button,INPUT)
+ wiringpi.pullUpDnControl(button,PUD_UP)
+
+for led in LEDS:
+ wiringpi.pinMode(led,OUTPUT)
+
+while 1:
+ for index,button in enumerate(BUTTONS):
+ button_state = wiringpi.digitalRead(button)
+ first_led = LEDS[index*2]
+ second_led = LEDS[(index*2)+1]
+ #print str(button) + ' ' + str(button_state)
+ wiringpi.digitalWrite(first_led,1-button_state)
+ wiringpi.digitalWrite(second_led,1-button_state)
+ wiringpi.delay(20)
diff --git a/examples/n5510-mcp23017.py b/examples/n5510-mcp23017.py
new file mode 100644
index 0000000..4251a80
--- /dev/null
+++ b/examples/n5510-mcp23017.py
@@ -0,0 +1,95 @@
+# Turns on each pin of an mcp23017 on address 0x20 ( quick2wire IO expander )
+import wiringpi
+
+PIN_BACKLIGHT = 67 # LED
+PIN_SCLK = 68 # Clock SCLK
+PIN_SDIN = 69 # DN(MOSI)
+PIN_DC = 70 # D/C
+PIN_RESET = 71 # RST Reset
+PIN_SCE = 72 # SCE
+
+#PIN_BACKLIGHT = 5
+#PIN_SCLK = 4
+#PIN_SDIN = 3
+#PIN_DC = 2
+#PIN_RESET = 1
+#PIN_SCE = 0
+
+OUTPUT = 1
+INPUT = 0
+HIGH = 1
+LOW = 0
+
+LCD_C = 0
+LCD_D = 1
+
+LCD_X = 84
+LCD_Y = 48
+LCD_SEGS = 504
+
+MSBFIRST = 1
+LSBFIRST = 0
+
+SLOW_DOWN = 400
+
+pin_base = 65
+i2c_addr = 0x21
+
+wiringpi.wiringPiSetup()
+wiringpi.mcp23017Setup(pin_base,i2c_addr)
+
+def slow_shift_out(data_pin, clock_pin, data):
+ for bit in bin(data).replace('0b','').rjust(8,'0'):
+ wiringpi.digitalWrite(clock_pin,LOW)
+ wiringpi.delay(SLOW_DOWN)
+ wiringpi.digitalWrite(data_pin,int(bit))
+ wiringpi.delay(SLOW_DOWN)
+ wiringpi.digitalWrite(clock_pin,HIGH)
+ wiringpi.delay(SLOW_DOWN)
+
+def lcd_write(dc, data):
+ wiringpi.digitalWrite(PIN_DC, dc)
+ wiringpi.digitalWrite(PIN_SCE, LOW)
+ wiringpi.delay(SLOW_DOWN)
+ #wiringpi.shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data)
+ slow_shift_out(PIN_SDIN, PIN_SCLK, data)
+ wiringpi.digitalWrite(PIN_SCE, HIGH)
+ wiringpi.delay(SLOW_DOWN)
+ #wiringpi.delay(2)
+
+def lcd_initialise():
+ wiringpi.pinMode(PIN_BACKLIGHT,OUTPUT)
+ wiringpi.digitalWrite(PIN_BACKLIGHT, HIGH)
+ wiringpi.pinMode(PIN_SCE, OUTPUT)
+ wiringpi.pinMode(PIN_RESET, OUTPUT)
+ wiringpi.pinMode(PIN_DC, OUTPUT)
+ wiringpi.pinMode(PIN_SDIN, OUTPUT)
+ wiringpi.pinMode(PIN_SCLK, OUTPUT)
+ wiringpi.digitalWrite(PIN_RESET, LOW)
+ wiringpi.delay(SLOW_DOWN)
+ wiringpi.digitalWrite(PIN_RESET, HIGH)
+ wiringpi.delay(SLOW_DOWN)
+ lcd_write(LCD_C, 0x21 ) # LCD Extended Commands.
+ lcd_write(LCD_C, 0xCC ) # Set LCD Vop (Contrast).
+ lcd_write(LCD_C, 0x04 ) # Set Temp coefficent. //0x04
+ lcd_write(LCD_C, 0x14 ) # LCD bias mode 1:48. //0x13
+ lcd_write(LCD_C, 0x0C ) # LCD in normal mode.
+ lcd_write(LCD_C, 0x20 )
+ lcd_write(LCD_C, 0x0C )
+
+def lcd_clear():
+ for time in range(0, LCD_SEGS):
+ lcd_write(LCD_D, 0x00)
+
+def lcd_fill():
+ for time in range(0, LCD_SEGS):
+ lcd_write(LCD_D, 0xFF)
+
+
+lcd_initialise()
+
+for time in range(0,4):
+ lcd_clear()
+ wiringpi.delay(1000)
+ lcd_fill()
+ wiringpi.delay(1000)
diff --git a/examples/orangepi-sensors/IO-expand.py b/examples/orangepi-sensors/IO-expand.py
new file mode 100644
index 0000000..151100d
--- /dev/null
+++ b/examples/orangepi-sensors/IO-expand.py
@@ -0,0 +1,28 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+I2C_ADDR = 0x38
+BASE = 100
+
+wiringpi.wiringPiSetup()
+wiringpi.pcf8574Setup(BASE, I2C_ADDR)
+
+i = 0
+while i < 8:
+ wiringpi.pinMode(BASE + i, GPIO.OUTPUT)
+ i += 1
+
+wiringpi.pinMode(BASE + 0, GPIO.OUTPUT)
+
+while True:
+ try:
+ wiringpi.digitalWrite(BASE + 0, GPIO.HIGH)
+ time.sleep(1)
+ wiringpi.digitalWrite(BASE + 0, GPIO.LOW)
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print('\nExit')
+ sys.exit(0)
+
diff --git a/examples/orangepi-sensors/Light_Sensor.py b/examples/orangepi-sensors/Light_Sensor.py
new file mode 100644
index 0000000..70e5c0f
--- /dev/null
+++ b/examples/orangepi-sensors/Light_Sensor.py
@@ -0,0 +1,19 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+I2C_ADDR = 0x48
+BASE = 64
+A0 = BASE+0
+
+wiringpi.wiringPiSetup()
+wiringpi.pcf8591Setup(BASE, I2C_ADDR)
+while True:
+ try:
+ value = wiringpi.analogRead(A0)
+ print("value: %d"%value)
+ time.sleep(2)
+ except KeyboardInterrupt:
+ print('\nExit')
+ sys.exit(0)
diff --git a/examples/orangepi-sensors/dht11.py b/examples/orangepi-sensors/dht11.py
new file mode 100644
index 0000000..dc4729d
--- /dev/null
+++ b/examples/orangepi-sensors/dht11.py
@@ -0,0 +1,67 @@
+import wiringpi
+from wiringpi import GPIO
+
+pin = 6
+
+def getval(pin):
+ tl=[]
+ tb=[]
+ wiringpi.wiringPiSetup()
+ wiringpi.pinMode(pin, GPIO.OUTPUT)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.delay(1)
+ wiringpi.digitalWrite(pin, GPIO.LOW)
+ wiringpi.delay(25)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.delayMicroseconds(20)
+ wiringpi.pinMode(pin, GPIO.INPUT)
+ while(wiringpi.digitalRead(pin)==1): pass
+
+ for i in range(45):
+ tc=wiringpi.micros()
+ '''
+ '''
+ while(wiringpi.digitalRead(pin)==0): pass
+ while(wiringpi.digitalRead(pin)==1):
+ if wiringpi.micros()-tc>500:
+ break
+ if wiringpi.micros()-tc>500:
+ break
+ tl.append(wiringpi.micros()-tc)
+
+ tl=tl[1:]
+ for i in tl:
+ if i>100:
+ tb.append(1)
+ else:
+ tb.append(0)
+
+ return tb
+
+def GetResult(pin):
+ for i in range(10):
+ SH=0;SL=0;TH=0;TL=0;C=0
+ result=getval(pin)
+
+ if len(result)==40:
+ for i in range(8):
+ SH*=2;SH+=result[i] # humi Integer
+ SL*=2;SL+=result[i+8] # humi decimal
+ TH*=2;TH+=result[i+16] # temp Integer
+ TL*=2;TL+=result[i+24] # temp decimal
+ C*=2;C+=result[i+32] # Checksum
+ if ((SH+SL+TH+TL)%256)==C and C!=0:
+ break
+ else:
+ print("Read Sucess,But checksum error! retrying")
+
+ else:
+ print("Read failer! Retrying")
+ break
+ wiringpi.delay(200)
+ return SH,SL,TH,TL
+
+SH,SL,TH,TL=GetResult(pin)
+print("humi:",SH,SL,"temp:",TH,TL)
+
+
diff --git a/examples/orangepi-sensors/ds18b20.py b/examples/orangepi-sensors/ds18b20.py
new file mode 100644
index 0000000..8ca8c28
--- /dev/null
+++ b/examples/orangepi-sensors/ds18b20.py
@@ -0,0 +1,88 @@
+#import sys
+import wiringpi
+from wiringpi import GPIO
+
+PIN = 6
+
+def oneWireReset(pin):
+ wiringpi.pinMode(pin, GPIO.OUTPUT)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.digitalWrite(pin, GPIO.LOW)
+ wiringpi.delayMicroseconds(500)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.delayMicroseconds(60)
+ wiringpi.pinMode(pin, GPIO.INPUT)
+ if not wiringpi.digitalRead(pin):
+ ack = 1
+ else:
+ ack = 0
+ wiringpi.delayMicroseconds(500)
+ return ack
+
+def writeBit(pin, bit):
+ wiringpi.pinMode(pin, GPIO.OUTPUT)
+ wiringpi.digitalWrite(pin, GPIO.LOW)
+ wiringpi.delayMicroseconds(2)
+ wiringpi.digitalWrite(pin, bit)
+ wiringpi.delayMicroseconds(80)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.delayMicroseconds(1)
+
+def oneWireSendComm(pin, byte):
+ i = 0
+ while i < 8:
+ sta = byte & 0x01
+ writeBit(pin, sta)
+ byte >>= 1
+ i += 1
+
+def readBit(pin):
+ wiringpi.pinMode(pin, GPIO.OUTPUT)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+ wiringpi.digitalWrite(pin, GPIO.LOW)
+ wiringpi.delayMicroseconds(2)
+ wiringpi.digitalWrite(pin, GPIO.HIGH)
+
+ wiringpi.pinMode(pin, GPIO.INPUT)
+ wiringpi.delayMicroseconds(2)
+
+ tmp = wiringpi.digitalRead(pin)
+ wiringpi.delayMicroseconds(40)
+ return tmp
+
+def oneWireReceive(pin):
+ i = 0
+ k = 0
+ while i < 8:
+ j = readBit(pin)
+ k = (j << 7) | (k >> 1)
+ i += 1
+ k = k & 0x00FF
+ return k
+
+def tempchange(lsb, msb):
+ if (msb >= 0xF0):
+ msb = 255 - msb
+ lsb = 256 - lsb
+ tem = -(msb*16*16 + lsb)
+ else:
+ tem = (msb*16*16 + lsb)
+ temp = tem*0.0625
+ print("Current Temp: %.2f"%(temp))
+
+def main():
+ wiringpi.wiringPiSetup()
+ if oneWireReset(PIN):
+ oneWireSendComm(PIN, 0xcc)
+ oneWireSendComm(PIN, 0x44)
+ if oneWireReset(PIN):
+ oneWireSendComm(PIN, 0xcc)
+ oneWireSendComm(PIN, 0xbe)
+ lsb = oneWireReceive(PIN)
+ msb = oneWireReceive(PIN)
+ tempchange(lsb, msb)
+
+if __name__ == '__main__':
+ main()
+
+
diff --git a/examples/orangepi-sensors/joystick.py b/examples/orangepi-sensors/joystick.py
new file mode 100644
index 0000000..1c8291e
--- /dev/null
+++ b/examples/orangepi-sensors/joystick.py
@@ -0,0 +1,27 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+I2C_ADDR = 0x48
+BASE = 64
+A0 = BASE+0
+A1 = BASE+1
+
+wiringpi.wiringPiSetup()
+wiringpi.pcf8591Setup(BASE, I2C_ADDR)
+
+while True:
+ try:
+ i = 0
+ while i < 2:
+ if 0 == i:
+ x = wiringpi.analogRead(A0)
+ if 1 == i:
+ y = wiringpi.analogRead(A1)
+ i += 1
+ print("X=%d Y=%d"%(x,y))
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print('\nExit')
+ sys.exit(0)
diff --git a/examples/orangepi-sensors/light.py b/examples/orangepi-sensors/light.py
new file mode 100644
index 0000000..4e9c0c3
--- /dev/null
+++ b/examples/orangepi-sensors/light.py
@@ -0,0 +1,22 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+PIN = 6
+
+wiringpi.wiringPiSetup()
+wiringpi.pinMode(PIN, GPIO.OUTPUT)
+
+while True:
+ try:
+ wiringpi.digitalWrite(PIN, GPIO.HIGH)
+ print(wiringpi.digitalRead(PIN))
+ time.sleep(1)
+ wiringpi.digitalWrite(PIN, GPIO.LOW)
+ print(wiringpi.digitalRead(PIN))
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
diff --git a/examples/orangepi-sensors/oled_ssd1306.py b/examples/orangepi-sensors/oled_ssd1306.py
new file mode 100644
index 0000000..d3437c0
--- /dev/null
+++ b/examples/orangepi-sensors/oled_ssd1306.py
@@ -0,0 +1,320 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+I2C_ADDR = 0x3c
+fd = 0
+yi = [' ',' ',' ',' ']
+zi = [
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//0
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//1
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//2
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//3
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//4
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//5
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//6
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//7
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//8
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//9
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//10
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//11
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//12
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//13
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//14
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//15
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//16
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//17
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//18
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//19
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//20
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//21
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//22
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//23
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//24
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//25
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//26
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//27
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//28
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//29
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//30
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//31
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//32
+
+0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,#//33
+
+0x00,0x10,0x0C,0x02,0x10,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//34
+
+0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x00,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x00,#//35
+
+0x00,0x70,0x88,0x88,0xFC,0x08,0x30,0x00,0x00,0x18,0x20,0x20,0xFF,0x21,0x1E,0x00,#//36
+
+0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00,#//37
+
+0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10,#//38
+
+0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//39
+
+0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,#//40
+
+0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,#//41
+
+0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,#//42
+
+0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01,#//43
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00,#//44
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,#//45
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,#//46
+
+0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00,#//47
+
+0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,#//48
+
+0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,#//49
+
+0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,#//50
+
+0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,#//51
+
+0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,#//52
+
+0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,#//53
+
+0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,#//54
+
+0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,#//55
+
+0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,#//56
+
+0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,#//57
+
+0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,#//58
+
+0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,#//59
+
+0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,#//60
+
+0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,#//61
+
+0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,#//62
+
+0x00,0x70,0x48,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x30,0x37,0x00,0x00,0x00,#//63
+
+0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x28,0x2F,0x28,0x17,0x00,#//64
+
+0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,#//65
+
+0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,#//66
+
+0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,#//67
+
+0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,#//68
+
+0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,#//69
+
+0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,#//70
+
+0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,#//71
+
+0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,#//72
+
+0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#//73
+
+0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,#//74
+
+0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,#//75
+
+0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,#//76
+
+0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x01,0x3E,0x01,0x3F,0x20,0x00,#//77
+
+0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,#//78
+
+0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,#//79
+
+0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,#//80
+
+0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x28,0x28,0x30,0x50,0x4F,0x00,#//81
+
+0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,#//82
+
+0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,#//83
+
+0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,#//84
+
+0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,#//85
+
+0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,#//86
+
+0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,#//87
+
+0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,#//88
+
+0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,#//89
+
+0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,#//90
+
+0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,#//91
+
+0x00,0x04,0x38,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,#//92
+
+0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,#//93
+
+0x00,0x00,0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//94
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,#//95
+
+0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//96
+
+0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,#//97
+
+0x10,0xF0,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,#//98
+
+0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,#//99
+
+0x00,0x00,0x80,0x80,0x80,0x90,0xF0,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,#//100
+
+0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00,#//101
+
+0x00,0x80,0x80,0xE0,0x90,0x90,0x20,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#//102
+
+0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,#//103
+
+0x10,0xF0,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,#//104
+
+0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#//105
+
+0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,#//106
+
+0x10,0xF0,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x06,0x29,0x30,0x20,0x00,#//107
+
+0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#//108
+
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,#//109
+
+0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,#//110
+
+0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,#//111
+
+0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0x91,0x20,0x20,0x11,0x0E,0x00,#//112
+
+0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0x91,0xFF,0x80,#//113
+
+0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,#//114
+
+0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,#//115
+
+0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00,#//116
+
+0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,#//117
+
+0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x03,0x0C,0x30,0x0C,0x03,0x00,0x00,#//118
+
+0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,0x01,0x0E,0x30,0x0C,0x07,0x38,0x06,0x01,#//119
+
+0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x20,0x31,0x0E,0x2E,0x31,0x20,0x00,#//120
+
+0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x81,0x86,0x78,0x18,0x06,0x01,0x00,#//121
+
+0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,#//122
+
+0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x02,0x00,0x00,0x00,0x00,0x01,0x3E,0x40,0x40,#//122
+
+0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,#//124
+
+0x02,0x02,0xFC,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x3E,0x01,0x00,0x00,0x00,0x00,#//125
+
+0x00,0x02,0x01,0x02,0x02,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//126
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#//127
+]
+
+def full_string(s):
+ while len(s) < 16:
+ s += ' '
+ return s
+
+def main():
+ #init
+ wiringpi.wiringPiSetup()
+ fd = wiringpi.wiringPiI2CSetup(I2C_ADDR)
+ if not fd:
+ return False;
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xa1)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xc8)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0x8d)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0x14)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xa6)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0x21)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0x00)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0x7f)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xaf)
+
+ #clear oled
+ for a in range(8):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xb0 + a)
+ for b in range(128):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x40, 0x00)
+
+ while True:
+ try:
+ #get time
+ yi[0] = full_string("++++OrangePi++++")
+ #yi[1] = full_string(time.strftime("%m/%d %w"))
+ yi[1] = full_string(time.strftime("%m/%d %a"))
+ yi[2] = full_string(time.strftime("%H:%M"))
+ yi[3] = full_string("SSD1306 I2C OLED")
+
+ #write
+ for zt3 in range(4):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xb0+(zt3*2))
+ for zt4 in range(16):
+ for zt in range(8):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x40, zi[ord(yi[zt3][zt4])*16+zt])
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0xb0+(zt3*2)+1)
+ for zt4 in range(16):
+ for zt in range(8):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x40, zi[ord(yi[zt3][zt4])*16+zt+8])
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
+
diff --git a/examples/orangepi-sensors/rotary_encoder.py b/examples/orangepi-sensors/rotary_encoder.py
new file mode 100644
index 0000000..53db937
--- /dev/null
+++ b/examples/orangepi-sensors/rotary_encoder.py
@@ -0,0 +1,46 @@
+import sys
+import time
+import wiringpi
+from wiringpi import GPIO
+
+SIA = 9
+SIB= 10
+SW = 6
+
+wiringpi.wiringPiSetup()
+wiringpi.pinMode(SW, GPIO.INPUT)
+wiringpi.pinMode(SIA, GPIO.INPUT)
+wiringpi.pinMode(SIB, GPIO.INPUT)
+
+flag = 0
+resetflag = 0
+globalCount = 0
+
+while True:
+ try:
+ lastSib = wiringpi.digitalRead(SIB)
+ while not wiringpi.digitalRead(SW):
+ resetflag = 1
+ while not wiringpi.digitalRead(SIA):
+ currentSib = wiringpi.digitalRead(SIB)
+ flag =1
+
+ if resetflag:
+ globalCount = 0
+ resetflag = 0
+ print ('Count reset\ncurrent = 0')
+ continue
+ if flag:
+ if lastSib == 0 and currentSib == 1:
+ print ('Anticlockwise rotation')
+ globalCount += 1
+ if lastSib == 1 and currentSib == 0:
+ print ('clockwise rotation')
+ globalCount -=1
+
+ flag =0
+ print ('current = %s' % globalCount)
+ except KeyboardInterrupt:
+ print('\nExit')
+ sys.exit(0)
+
diff --git a/examples/orangepi-sensors/rtc.py b/examples/orangepi-sensors/rtc.py
new file mode 100644
index 0000000..9a94a0d
--- /dev/null
+++ b/examples/orangepi-sensors/rtc.py
@@ -0,0 +1,103 @@
+import sys
+import time
+import wiringpi
+#from wiringpi import GPIO
+
+I2C_ADDR = 0x68
+
+def b2s(bcd, mask):
+ bcd &= mask
+ b1 = bcd & 0x0F
+ b2 = ((bcd >> 4) & 0x0F)*10
+ return b1 + b2
+
+def decCompensation(units):
+ unitsU = units%10
+ if units >= 50:
+ units = 0x50 + unitsU
+ elif units >= 40:
+ units = 0x40 + unitsU
+ elif units >= 30:
+ units = 0x30 + unitsU
+ elif units >= 20:
+ units = 0x20 + unitsU
+ elif units >= 10:
+ units = 0x10 + unitsU
+ return units
+
+def getHours():
+ HH = time.strftime("%H")
+ return decCompensation(int(HH))
+
+def getMins():
+ MM = time.strftime("%M")
+ return decCompensation(int(MM))
+
+def getSecs():
+ SS = time.strftime("%S")
+ return decCompensation(int(SS))
+
+def getWeeks():
+ WW = time.strftime("%w")
+ return decCompensation(int(WW))
+
+def getDays():
+ DD = time.strftime("%d")
+ return decCompensation(int(DD))
+
+def getMons():
+ MON = time.strftime("%m")
+ return decCompensation(int(MON))
+
+def getYear():
+ YY = time.strftime("%Y")
+ return decCompensation(int(YY))
+
+def clear_register(fd):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x02, 0b0) # hours
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x01, 0b0) # mins
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, 0b10000000) # secs
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x03, 0b0) # weeks
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x04, 0b0) # days
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x05, 0b0) # mons
+
+def sys2rtcSet(fd):
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x02, getHours())
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x01, getMins())
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x00, getSecs()+0b10000000)
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x03, getWeeks())
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x04, getDays())
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x05, getMons())
+ wiringpi.wiringPiI2CWriteReg8(fd, 0x06, getYear())
+
+def read_register(fd):
+ secs = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x00), 0x7F)
+ mins = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x01), 0x7F)
+ hours = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x02) - 0b10000000, 0x3F)
+ week = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x03), 0x3F)
+ day = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x04), 0x1F)
+ mon = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x05), 0x07)
+ year = b2s(wiringpi.wiringPiI2CReadReg8(fd, 0x06), 0xFF) + 1970
+ print("week:%d mon:%d day:%d hours:%d mins:%d secs:%d year:%d"%(week,mon,day,hours,mins,secs,year))
+
+def main():
+ wiringpi.wiringPiSetup()
+ fd = wiringpi.wiringPiI2CSetup(I2C_ADDR)
+ if not fd:
+ return False;
+ while True:
+ try:
+ # clear RTC Register
+ clear_register(fd)
+ # set sys time to RTC Register
+ sys2rtcSet(fd)
+ # read RTC Register
+ read_register(fd)
+ time.sleep(1)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
+
diff --git a/examples/orangepi-sensors/sensor_control_led.py b/examples/orangepi-sensors/sensor_control_led.py
new file mode 100644
index 0000000..38be250
--- /dev/null
+++ b/examples/orangepi-sensors/sensor_control_led.py
@@ -0,0 +1,21 @@
+import sys
+import wiringpi
+from wiringpi import GPIO
+
+LED = 6
+PIN = 16
+
+wiringpi.wiringPiSetup()
+wiringpi.pinMode(LED, GPIO.OUTPUT)
+wiringpi.pinMode(PIN, GPIO.INPUT)
+
+while True:
+ try:
+ if wiringpi.digitalRead(PIN):
+ wiringpi.digitalWrite(LED, GPIO.LOW)
+ else:
+ wiringpi.digitalWrite(LED, GPIO.HIGH)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
diff --git a/examples/quick2wire-io.py b/examples/quick2wire-io.py
new file mode 100644
index 0000000..3bb816b
--- /dev/null
+++ b/examples/quick2wire-io.py
@@ -0,0 +1,15 @@
+# Turns on each pin of an mcp23017 on address 0x20 ( quick2wire IO expander )
+import wiringpi
+
+pin_base = 65
+i2c_addr = 0x20
+pins = [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80]
+
+wiringpi.wiringPiSetup()
+wiringpi.mcp23017Setup(pin_base,i2c_addr)
+
+for pin in pins:
+ wiringpi.pinMode(pin,1)
+ wiringpi.digitalWrite(pin,1)
+# wiringpi.delay(1000)
+# wiringpi.digitalWrite(pin,0)
diff --git a/examples/serialTest.py b/examples/serialTest.py
new file mode 100644
index 0000000..8802b25
--- /dev/null
+++ b/examples/serialTest.py
@@ -0,0 +1,29 @@
+import wiringpi
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description='')
+parser.add_argument("--device", type=str, default="/dev/ttyS4", help='specify the serial node')
+args = parser.parse_args()
+
+wiringpi.wiringPiSetup()
+serial = wiringpi.serialOpen(args.device, 115200)
+if serial < 0:
+ print("Unable to open serial device: %s"% args.device)
+ sys.exit(-1)
+
+for count in range(0, 256):
+ try:
+ print("\nOut: %3d:" % count, end="")
+ wiringpi.serialFlush(serial)
+ wiringpi.serialPutchar(serial, count)
+ wiringpi.delayMicroseconds(300000)
+
+ while wiringpi.serialDataAvail(serial):
+ print(" -> %3d" % wiringpi.serialGetchar(serial), end="")
+ wiringpi.serialFlush(serial)
+ except KeyboardInterrupt:
+ print("\nexit")
+ sys.exit(0)
+
+wiringpi.serialClose(serial) # Pass in ID
diff --git a/examples/softpwm.py b/examples/softpwm.py
new file mode 100644
index 0000000..e4bf0b3
--- /dev/null
+++ b/examples/softpwm.py
@@ -0,0 +1,19 @@
+# Pulsates an LED connected to GPIO pin 1 with a suitable resistor 4 times using softPwm
+# softPwm uses a fixed frequency
+import wiringpi
+
+OUTPUT = 1
+
+PIN_TO_PWM = 1
+
+wiringpi.wiringPiSetup()
+wiringpi.pinMode(PIN_TO_PWM,OUTPUT)
+wiringpi.softPwmCreate(PIN_TO_PWM,0,100) # Setup PWM using Pin, Initial Value and Range parameters
+
+for time in range(0,4):
+ for brightness in range(0,100): # Going from 0 to 100 will give us full off to full on
+ wiringpi.softPwmWrite(PIN_TO_PWM,brightness) # Change PWM duty cycle
+ wiringpi.delay(10) # Delay for 0.2 seconds
+ for brightness in reversed(range(0,100)):
+ wiringpi.softPwmWrite(PIN_TO_PWM,brightness)
+ wiringpi.delay(10)
diff --git a/examples/softtone.py b/examples/softtone.py
new file mode 100644
index 0000000..4a90ce7
--- /dev/null
+++ b/examples/softtone.py
@@ -0,0 +1,16 @@
+# Test of the softTone module in wiringPi
+# Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v
+import wiringpi
+
+PIN = 3
+
+SCALE = [262, 294, 330, 349, 392, 440, 494, 525]
+
+wiringpi.wiringPiSetup()
+wiringpi.softToneCreate(PIN)
+
+while True:
+ for idx in range(8):
+ print(idx)
+ wiringpi.softToneWrite(PIN, SCALE[idx])
+ wiringpi.delay(500)
diff --git a/examples/spidev_test.py b/examples/spidev_test.py
new file mode 100644
index 0000000..85fe42d
--- /dev/null
+++ b/examples/spidev_test.py
@@ -0,0 +1,39 @@
+import wiringpi
+import argparse
+
+parser = argparse.ArgumentParser(description='')
+parser.add_argument("--channel", type=int, default=1, help='specify the spi channel')
+parser.add_argument("--port", type=int, default=0, help='specify the spi port')
+parser.add_argument("--speed", type=int, default=500000, help='specify the spi speed')
+parser.add_argument("--mode", type=int, default=0, help='specify the spi mode')
+args = parser.parse_args()
+
+default_tx = [
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0x0D,
+]
+
+def hexdump(src, line_size, prefix):
+ result = []
+ digits = 4 if isinstance(src, str) else 2
+
+ for i in range(0, len(src), line_size):
+ s = src[i:i + line_size]
+ hexa = ' '.join([hex(x)[2:].upper().zfill(digits) for x in s])
+ text = ''.join([chr(x) if 0x20 <= x < 0x7F else '.' for x in s])
+ result.append(prefix + ' | ' + hexa.ljust(line_size * (digits + 1)) + ' |' + "{0}".format(text) + '|')
+
+ return '\n'.join(result)
+
+print("spi mode: 0x%x" % args.mode);
+print("max speed: %d Hz (%d KHz)\n" %(args.speed, args.speed / 1000), end='');
+
+wiringpi.wiringPiSPISetupMode(args.channel, args.port, args.speed, args.mode)
+revlen, recvData = wiringpi.wiringPiSPIDataRW(args.channel, bytes(default_tx))
+
+print(hexdump(bytes(default_tx), 32, "TX"))
+print(hexdump(bytes(recvData), 32, "RX"))
diff --git a/examples/two-mcp23017.py b/examples/two-mcp23017.py
new file mode 100644
index 0000000..c7318d8
--- /dev/null
+++ b/examples/two-mcp23017.py
@@ -0,0 +1,18 @@
+# Turns on each pin of an mcp23017 on address 0x20 ( quick2wire IO expander )
+import wiringpi
+
+pin_base = 65
+i2c_addr = 0x20
+i2c_addr_2 = 0x21
+#pins = [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80]
+
+wiringpi.wiringPiSetup()
+wiringpi.mcp23017Setup(pin_base,i2c_addr)
+wiringpi.mcp23017Setup(pin_base+16,i2c_addr_2)
+
+#for pin in pins:
+for pin in range(65,96):
+ wiringpi.pinMode(pin,1)
+ wiringpi.digitalWrite(pin,1)
+# wiringpi.delay(1000)
+# wiringpi.digitalWrite(pin,0)
diff --git a/fixUndefFunc.c b/fixUndefFunc.c
new file mode 100644
index 0000000..6b681a1
--- /dev/null
+++ b/fixUndefFunc.c
@@ -0,0 +1,3 @@
+#include
+unsigned int digitalRead8 (int pin) { return 0;}
+void digitalWrite8 (int pin, int value) {}
\ No newline at end of file
diff --git a/generate-bindings.py b/generate-bindings.py
new file mode 100644
index 0000000..3ca6b21
--- /dev/null
+++ b/generate-bindings.py
@@ -0,0 +1,42 @@
+HEADERS = []
+
+src = open("wiringpi.i").read().split('\n')
+
+print("extern unsigned char getGpioNum(void);")
+
+for line in src:
+ line = line.strip()
+ if line.startswith('#include') and line.endswith('.h"'):
+ HEADERS.append(line.replace('#include','').replace('"','').strip())
+
+def is_c_decl(line):
+ for fn in ['wiringPiISR','wiringPiSetupPiFace','wiringPiSetupPiFaceForGpioProg']:
+ if fn in line:
+ return False
+ for prefix in ['extern','void','int','uint8_t']:
+ if line.startswith(prefix):
+ return True
+
+print("// Generated by generate-bindings.py - do not edit manually!")
+
+for file in HEADERS:
+ print("\n// Header file {}".format(file))
+ if file == "wiringOP/devLib/font.h":
+ continue # continue here
+ h = open(file).read().split('\n')
+ extern = False
+ cont = False
+ if 'extern "C" {' not in h:
+ extern = True
+ for line in h:
+ line = line.strip()
+ if cont:
+ print("\t{}".format(line))
+ cont = ";" not in line
+ continue
+ if line.startswith('extern "C"'):
+ extern = True
+ continue
+ if is_c_decl(line) and extern:
+ print(line)
+ cont = ";" not in line
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..360d7aa
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,7 @@
+[metadata]
+author = Philip Howard
+author_email = phil@gadgetoid.com
+url = https://github.com/WiringPi/WiringPi-Python/
+description = A python interface to WiringPi 2.0 library which allows for easily interfacing with the GPIO pins of the Raspberry Pi. Also supports i2c and SPI.
+long_description = file:README.rst
+license = LGPL
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..3cd50f1
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+import os
+import sys
+from setuptools import setup, Extension
+from setuptools.command.build_py import build_py
+from setuptools.command.sdist import sdist
+from distutils.spawn import find_executable
+from glob import glob
+from subprocess import Popen, PIPE
+import re
+
+sources = glob('wiringOP/devLib/*.c')
+sources += ['wiringOP/examples/blink.c']
+sources += glob('wiringOP/wiringPi/*.c')
+sources += ['wiringpi.i']
+sources += ['fixUndefFunc.c']
+try:
+ sources.remove('wiringOP/devLib/piFaceOld.c')
+except ValueError:
+ # the file is already excluded in the source distribution
+ pass
+
+# Fix so that build_ext runs before build_py
+# Without this, wiringpi.py is generated too late and doesn't
+# end up in the distribution when running setup.py bdist or bdist_wheel.
+# Based on:
+# https://stackoverflow.com/a/29551581/7938656
+# and
+# https://blog.niteoweb.com/setuptools-run-custom-code-in-setup-py/
+
+
+class build_py_ext_first(build_py):
+ def run(self):
+ self.run_command("build_ext")
+ return build_py.run(self)
+
+# Make sure wiringpi_wrap.c is available for the source dist, also.
+
+
+class sdist_ext_first(sdist):
+ def run(self):
+ self.run_command("build_ext")
+ return sdist.run(self)
+
+_wiringpi = Extension(
+ '_wiringpi',
+ include_dirs=['wiringOP', 'wiringOP/wiringPi', 'wiringOP/devLib'],
+ swig_opts=['-threads'],
+ extra_link_args=['-lcrypt', '-lrt'],
+ sources=sources
+)
+
+setup(
+ name='wiringpi',
+ version='2.60.1',
+ ext_modules=[_wiringpi],
+ py_modules=["wiringpi"],
+ install_requires=[],
+ cmdclass={'build_py': build_py_ext_first, 'sdist': sdist_ext_first}
+)
diff --git a/tests/piglow.py b/tests/piglow.py
new file mode 100644
index 0000000..3902893
--- /dev/null
+++ b/tests/piglow.py
@@ -0,0 +1,4 @@
+import wiringpi
+io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_PINS)
+io.piGlowSetup()
+io.piGlowLeg(1,100)
diff --git a/tests/test.py b/tests/test.py
new file mode 100644
index 0000000..0b25c73
--- /dev/null
+++ b/tests/test.py
@@ -0,0 +1,4 @@
+import wiringpi
+io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_PINS)
+print io.digitalRead(1)
+print io.analogRead(1)
diff --git a/tests/test_wiringPi_GPIO.py b/tests/test_wiringPi_GPIO.py
new file mode 100644
index 0000000..c109d43
--- /dev/null
+++ b/tests/test_wiringPi_GPIO.py
@@ -0,0 +1,9 @@
+import wiringpi
+
+def test_wiringPiSetup():
+ assert wiringpi.wiringPiSetup() == 0
+
+def test_digitalRead():
+ assert wiringpi.digitalRead(1) != None
+def test_digitalWrite():
+ assert wiringpi.digitalWrite(1,0) == None
\ No newline at end of file
diff --git a/wiringpi-class.py b/wiringpi-class.py
new file mode 100644
index 0000000..8728f1a
--- /dev/null
+++ b/wiringpi-class.py
@@ -0,0 +1,188 @@
+%pythoncode %{
+class nes(object):
+ def setupNesJoystick(self,*args):
+ return setupNesJoystick(*args)
+ def readNesJoystick(self,*args):
+ return readNesJoystick(*args)
+
+class Serial(object):
+ device = '/dev/ttyAMA0'
+ baud = 9600
+ serial_id = 0
+ def printf(self,*args):
+ return serialPrintf(self.serial_id,*args)
+ def dataAvail(self,*args):
+ return serialDataAvail(self.serial_id,*args)
+ def getchar(self,*args):
+ return serialGetchar(self.serial_id,*args)
+ def putchar(self,*args):
+ return serialPutchar(self.serial_id,*args)
+ def puts(self,*args):
+ return serialPuts(self.serial_id,*args)
+ def __init__(self,device,baud):
+ self.device = device
+ self.baud = baud
+ self.serial_id = serialOpen(self.device,self.baud)
+ def __del__(self):
+ serialClose(self.serial_id)
+
+class I2C(object):
+ def setupInterface(self,*args):
+ return wiringPiI2CSetupInterface(*args)
+ def setup(self,*args):
+ return wiringPiI2CSetup(*args)
+ def read(self,*args):
+ return wiringPiI2CRead(*args)
+ def readReg8(self,*args):
+ return wiringPiI2CReadReg8(*args)
+ def readReg16(self,*args):
+ return wiringPiI2CReadReg16(*args)
+ def write(self,*args):
+ return wiringPiI2CWrite(*args)
+ def writeReg8(self,*args):
+ return wiringPiI2CWriteReg8(*args)
+ def writeReg16(self,*args):
+ return wiringPiI2CWriteReg16(*args)
+
+class GPIO(object):
+ WPI_MODE_PINS = 0
+ WPI_MODE_GPIO = 1
+ WPI_MODE_GPIO_SYS = 2
+ WPI_MODE_PHYS = 3
+ WPI_MODE_PIFACE = 4
+ WPI_MODE_UNINITIALISED = -1
+
+ INPUT = 0
+ OUTPUT = 1
+ PWM_OUTPUT = 2
+ GPIO_CLOCK = 3
+
+ LOW = 0
+ HIGH = 1
+
+ PUD_OFF = 0
+ PUD_DOWN = 1
+ PUD_UP = 2
+
+ PWM_MODE_MS = 0
+ PWM_MODE_BAL = 1
+
+ INT_EDGE_SETUP = 0
+ INT_EDGE_FALLING = 1
+ INT_EDGE_RISING = 2
+ INT_EDGE_BOTH = 3
+
+ LSBFIRST = 0
+ MSBFIRST = 1
+
+ MODE = 0
+ def __init__(self,pinmode=0):
+ self.MODE=pinmode
+ if pinmode==self.WPI_MODE_PINS:
+ wiringPiSetup()
+ if pinmode==self.WPI_MODE_GPIO:
+ wiringPiSetupGpio()
+ if pinmode==self.WPI_MODE_GPIO_SYS:
+ wiringPiSetupSys()
+ if pinmode==self.WPI_MODE_PHYS:
+ wiringPiSetupPhys()
+ if pinmode==self.WPI_MODE_PIFACE:
+ wiringPiSetupPiFace()
+
+ def delay(self,*args):
+ delay(*args)
+ def delayMicroseconds(self,*args):
+ delayMicroseconds(*args)
+ def millis(self):
+ return millis()
+ def micros(self):
+ return micros()
+
+ def piHiPri(self,*args):
+ return piHiPri(*args)
+
+ def wpiPinToGpio(self,*args):
+ return wpiPinToGpio(*args)
+ def setPadDrive(self,*args):
+ return setPadDrive(*args)
+ def getAlt(self,*args):
+ return getAlt(*args)
+ def digitalWriteByte(self,*args):
+ return digitalWriteByte(*args)
+
+ def pwmSetMode(self,*args):
+ pwmSetMode(*args)
+ def pwmSetRange(self,*args):
+ pwmSetRange(*args)
+ def pwmSetClock(self,*args):
+ pwmSetClock(*args)
+ def gpioClockSet(self,*args):
+ gpioClockSet(*args)
+ def pwmWrite(self,*args):
+ pwmWrite(*args)
+
+ def pinMode(self,*args):
+ pinMode(*args)
+
+ def digitalWrite(self,*args):
+ digitalWrite(*args)
+ def digitalRead(self,*args):
+ return digitalRead(*args)
+ def digitalWriteByte(self,*args):
+ digitalWriteByte(*args)
+
+ def analogWrite(self,*args):
+ analogWrite(*args)
+ def analogRead(self,*args):
+ return analogRead(*args)
+
+ def shiftOut(self,*args):
+ shiftOut(*args)
+ def shiftIn(self,*args):
+ return shiftIn(*args)
+
+ def pullUpDnControl(self,*args):
+ return pullUpDnControl(*args)
+
+ def waitForInterrupt(self,*args):
+ return waitForInterrupt(*args)
+ def wiringPiISR(self,*args):
+ return wiringPiISR(*args)
+
+ def softPwmCreate(self,*args):
+ return softPwmCreate(*args)
+ def softPwmWrite(self,*args):
+ return softPwmWrite(*args)
+
+ def softToneCreate(self,*args):
+ return softToneCreate(*args)
+ def softToneWrite(self,*args):
+ return softToneWrite(*args)
+
+ def lcdHome(self,*args):
+ return lcdHome(self,*args)
+ def lcdCLear(self,*args):
+ return lcdClear(self,*args)
+ def lcdSendCommand(self,*args):
+ return lcdSendCommand(self,*args)
+ def lcdPosition(self,*args):
+ return lcdPosition(self,*args)
+ def lcdPutchar(self,*args):
+ return lcdPutchar(self,*args)
+ def lcdPuts(self,*args):
+ return lcdPuts(self,*args)
+ def lcdPrintf(self,*args):
+ return lcdPrintf(self,*args)
+ def lcdInit(self,*args):
+ return lcdInit(self,*args)
+ def piGlowSetup(self,*args):
+ return piGlowSetup(self,*args)
+ def piGlow1(self,*args):
+ return piGlow1(self,*args)
+ def piGlowLeg(self,*args):
+ return piGlowLeg(self,*args)
+ def piGlowRing(self,*args):
+ return piGlowRing(self,*args)
+ def getGpioNum(self):
+ return getGpioNum()
+%}
diff --git a/wiringpi.i b/wiringpi.i
new file mode 100644
index 0000000..11fd609
--- /dev/null
+++ b/wiringpi.i
@@ -0,0 +1,294 @@
+%module wiringpi
+
+%{
+#if PY_MAJOR_VERSION >= 3
+#define PyInt_AS_LONG PyLong_AsLong
+#define PyString_FromStringAndSize PyBytes_FromStringAndSize
+#endif
+
+#include "wiringOP/wiringPi/wiringPi.h"
+#include "wiringOP/wiringPi/wiringPiI2C.h"
+#include "wiringOP/wiringPi/wiringPiSPI.h"
+#include "wiringOP/wiringPi/wiringSerial.h"
+#include "wiringOP/wiringPi/wiringShift.h"
+#include "wiringOP/wiringPi/drcSerial.h"
+#include "wiringOP/wiringPi/ads1115.h"
+#include "wiringOP/wiringPi/max31855.h"
+#include "wiringOP/wiringPi/max5322.h"
+#include "wiringOP/wiringPi/mcp23008.h"
+#include "wiringOP/wiringPi/mcp23016.h"
+#include "wiringOP/wiringPi/mcp23016reg.h"
+#include "wiringOP/wiringPi/mcp23017.h"
+#include "wiringOP/wiringPi/mcp23s08.h"
+#include "wiringOP/wiringPi/mcp23s17.h"
+#include "wiringOP/wiringPi/mcp23x0817.h"
+#include "wiringOP/wiringPi/mcp23x08.h"
+#include "wiringOP/wiringPi/mcp3002.h"
+#include "wiringOP/wiringPi/mcp3004.h"
+#include "wiringOP/wiringPi/mcp3422.h"
+#include "wiringOP/wiringPi/mcp4802.h"
+#include "wiringOP/wiringPi/pcf8574.h"
+#include "wiringOP/wiringPi/pcf8591.h"
+#include "wiringOP/wiringPi/sn3218.h"
+#include "wiringOP/wiringPi/softPwm.h"
+#include "wiringOP/wiringPi/softServo.h"
+#include "wiringOP/wiringPi/softTone.h"
+#include "wiringOP/wiringPi/sr595.h"
+#include "wiringOP/wiringPi/bmp180.h"
+#include "wiringOP/wiringPi/drcNet.h"
+#include "wiringOP/wiringPi/ds18b20.h"
+#include "wiringOP/wiringPi/htu21d.h"
+#include "wiringOP/wiringPi/pseudoPins.h"
+#include "wiringOP/wiringPi/rht03.h"
+#include "wiringOP/wiringPi/wpiExtensions.h"
+#include "wiringOP/devLib/ds1302.h"
+#include "wiringOP/devLib/font.h"
+#include "wiringOP/devLib/gertboard.h"
+#include "wiringOP/devLib/lcd128x64.h"
+#include "wiringOP/devLib/lcd.h"
+#include "wiringOP/devLib/maxdetect.h"
+#include "wiringOP/devLib/piGlow.h"
+#include "wiringOP/devLib/piNes.h"
+#include "wiringOP/devLib/scrollPhat.h"
+#include "wiringOP/devLib/piFace.h"
+%}
+
+%apply unsigned char { uint8_t };
+%typemap(in) (unsigned char *data, int len) {
+ $1 = (unsigned char *) PyString_AsString($input);
+ $2 = PyString_Size($input);
+};
+
+// Grab a Python function object as a Python object.
+%typemap(in) PyObject *PyFunc {
+ if (!PyCallable_Check($input)) {
+ PyErr_SetString(PyExc_TypeError, "Need a callable object!");
+ return NULL;
+ }
+ $1 = $input;
+}
+
+%{
+
+// we need to have our own callbacks array
+PyObject* event_callback[64] = {0,};
+
+void _wiringPiISR_callback(int pinNumber) {
+ PyObject *result;
+
+ if (event_callback[pinNumber]) {
+ // this will acquire the GIL
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+
+ result = PyObject_CallFunction(event_callback[pinNumber], NULL);
+ if (result == NULL && PyErr_Occurred()) {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+ Py_XDECREF(result);
+
+ // release the GIL
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ }
+}
+
+
+/* This is embarrasing, WiringPi does not support supplying args to the callback
+... so we have to create callback function for each of the pins :( */
+void _wiringPiISR_callback_pin0(void) { _wiringPiISR_callback(0); }
+void _wiringPiISR_callback_pin1(void) { _wiringPiISR_callback(1); }
+void _wiringPiISR_callback_pin2(void) { _wiringPiISR_callback(2); }
+void _wiringPiISR_callback_pin3(void) { _wiringPiISR_callback(3); }
+void _wiringPiISR_callback_pin4(void) { _wiringPiISR_callback(4); }
+void _wiringPiISR_callback_pin5(void) { _wiringPiISR_callback(5); }
+void _wiringPiISR_callback_pin6(void) { _wiringPiISR_callback(6); }
+void _wiringPiISR_callback_pin7(void) { _wiringPiISR_callback(7); }
+void _wiringPiISR_callback_pin8(void) { _wiringPiISR_callback(8); }
+void _wiringPiISR_callback_pin9(void) { _wiringPiISR_callback(9); }
+void _wiringPiISR_callback_pin10(void) { _wiringPiISR_callback(10); }
+void _wiringPiISR_callback_pin11(void) { _wiringPiISR_callback(11); }
+void _wiringPiISR_callback_pin12(void) { _wiringPiISR_callback(12); }
+void _wiringPiISR_callback_pin13(void) { _wiringPiISR_callback(13); }
+void _wiringPiISR_callback_pin14(void) { _wiringPiISR_callback(14); }
+void _wiringPiISR_callback_pin15(void) { _wiringPiISR_callback(15); }
+void _wiringPiISR_callback_pin16(void) { _wiringPiISR_callback(16); }
+void _wiringPiISR_callback_pin17(void) { _wiringPiISR_callback(17); }
+void _wiringPiISR_callback_pin18(void) { _wiringPiISR_callback(18); }
+void _wiringPiISR_callback_pin19(void) { _wiringPiISR_callback(19); }
+void _wiringPiISR_callback_pin20(void) { _wiringPiISR_callback(20); }
+void _wiringPiISR_callback_pin21(void) { _wiringPiISR_callback(21); }
+void _wiringPiISR_callback_pin22(void) { _wiringPiISR_callback(22); }
+void _wiringPiISR_callback_pin23(void) { _wiringPiISR_callback(23); }
+void _wiringPiISR_callback_pin24(void) { _wiringPiISR_callback(24); }
+void _wiringPiISR_callback_pin25(void) { _wiringPiISR_callback(25); }
+void _wiringPiISR_callback_pin26(void) { _wiringPiISR_callback(26); }
+void _wiringPiISR_callback_pin27(void) { _wiringPiISR_callback(27); }
+void _wiringPiISR_callback_pin28(void) { _wiringPiISR_callback(28); }
+void _wiringPiISR_callback_pin29(void) { _wiringPiISR_callback(29); }
+void _wiringPiISR_callback_pin30(void) { _wiringPiISR_callback(30); }
+void _wiringPiISR_callback_pin31(void) { _wiringPiISR_callback(31); }
+void _wiringPiISR_callback_pin32(void) { _wiringPiISR_callback(32); }
+void _wiringPiISR_callback_pin33(void) { _wiringPiISR_callback(33); }
+void _wiringPiISR_callback_pin34(void) { _wiringPiISR_callback(34); }
+void _wiringPiISR_callback_pin35(void) { _wiringPiISR_callback(35); }
+void _wiringPiISR_callback_pin36(void) { _wiringPiISR_callback(36); }
+void _wiringPiISR_callback_pin37(void) { _wiringPiISR_callback(37); }
+void _wiringPiISR_callback_pin38(void) { _wiringPiISR_callback(38); }
+void _wiringPiISR_callback_pin39(void) { _wiringPiISR_callback(39); }
+void _wiringPiISR_callback_pin40(void) { _wiringPiISR_callback(40); }
+void _wiringPiISR_callback_pin41(void) { _wiringPiISR_callback(41); }
+void _wiringPiISR_callback_pin42(void) { _wiringPiISR_callback(42); }
+void _wiringPiISR_callback_pin43(void) { _wiringPiISR_callback(43); }
+void _wiringPiISR_callback_pin44(void) { _wiringPiISR_callback(44); }
+void _wiringPiISR_callback_pin45(void) { _wiringPiISR_callback(45); }
+void _wiringPiISR_callback_pin46(void) { _wiringPiISR_callback(46); }
+void _wiringPiISR_callback_pin47(void) { _wiringPiISR_callback(47); }
+void _wiringPiISR_callback_pin48(void) { _wiringPiISR_callback(48); }
+void _wiringPiISR_callback_pin49(void) { _wiringPiISR_callback(49); }
+void _wiringPiISR_callback_pin50(void) { _wiringPiISR_callback(50); }
+void _wiringPiISR_callback_pin51(void) { _wiringPiISR_callback(51); }
+void _wiringPiISR_callback_pin52(void) { _wiringPiISR_callback(52); }
+void _wiringPiISR_callback_pin53(void) { _wiringPiISR_callback(53); }
+void _wiringPiISR_callback_pin54(void) { _wiringPiISR_callback(54); }
+void _wiringPiISR_callback_pin55(void) { _wiringPiISR_callback(55); }
+void _wiringPiISR_callback_pin56(void) { _wiringPiISR_callback(56); }
+void _wiringPiISR_callback_pin57(void) { _wiringPiISR_callback(57); }
+void _wiringPiISR_callback_pin58(void) { _wiringPiISR_callback(58); }
+void _wiringPiISR_callback_pin59(void) { _wiringPiISR_callback(59); }
+void _wiringPiISR_callback_pin60(void) { _wiringPiISR_callback(60); }
+void _wiringPiISR_callback_pin61(void) { _wiringPiISR_callback(61); }
+void _wiringPiISR_callback_pin62(void) { _wiringPiISR_callback(62); }
+void _wiringPiISR_callback_pin63(void) { _wiringPiISR_callback(63); }
+
+/* This function adds a new Python function object as a callback object */
+
+static void wiringPiISRWrapper(int pin, int mode, PyObject *PyFunc) {
+
+ // remove the old callback if any
+ if (event_callback[pin]) {
+ Py_XDECREF(event_callback[pin]);
+ }
+
+ // put new callback function
+ event_callback[pin] = PyFunc;
+ Py_INCREF(PyFunc);
+
+ // and now the ugly switch
+ void (*func)(void);
+ switch(pin) {
+ case 0: func = &_wiringPiISR_callback_pin0; break;
+ case 1: func = &_wiringPiISR_callback_pin1; break;
+ case 2: func = &_wiringPiISR_callback_pin2; break;
+ case 3: func = &_wiringPiISR_callback_pin3; break;
+ case 4: func = &_wiringPiISR_callback_pin4; break;
+ case 5: func = &_wiringPiISR_callback_pin5; break;
+ case 6: func = &_wiringPiISR_callback_pin6; break;
+ case 7: func = &_wiringPiISR_callback_pin7; break;
+ case 8: func = &_wiringPiISR_callback_pin8; break;
+ case 9: func = &_wiringPiISR_callback_pin9; break;
+ case 10: func = &_wiringPiISR_callback_pin10; break;
+ case 11: func = &_wiringPiISR_callback_pin11; break;
+ case 12: func = &_wiringPiISR_callback_pin12; break;
+ case 13: func = &_wiringPiISR_callback_pin13; break;
+ case 14: func = &_wiringPiISR_callback_pin14; break;
+ case 15: func = &_wiringPiISR_callback_pin15; break;
+ case 16: func = &_wiringPiISR_callback_pin16; break;
+ case 17: func = &_wiringPiISR_callback_pin17; break;
+ case 18: func = &_wiringPiISR_callback_pin18; break;
+ case 19: func = &_wiringPiISR_callback_pin19; break;
+ case 20: func = &_wiringPiISR_callback_pin20; break;
+ case 21: func = &_wiringPiISR_callback_pin21; break;
+ case 22: func = &_wiringPiISR_callback_pin22; break;
+ case 23: func = &_wiringPiISR_callback_pin23; break;
+ case 24: func = &_wiringPiISR_callback_pin24; break;
+ case 25: func = &_wiringPiISR_callback_pin25; break;
+ case 26: func = &_wiringPiISR_callback_pin26; break;
+ case 27: func = &_wiringPiISR_callback_pin27; break;
+ case 28: func = &_wiringPiISR_callback_pin28; break;
+ case 29: func = &_wiringPiISR_callback_pin29; break;
+ case 30: func = &_wiringPiISR_callback_pin30; break;
+ case 31: func = &_wiringPiISR_callback_pin31; break;
+ case 32: func = &_wiringPiISR_callback_pin32; break;
+ case 33: func = &_wiringPiISR_callback_pin33; break;
+ case 34: func = &_wiringPiISR_callback_pin34; break;
+ case 35: func = &_wiringPiISR_callback_pin35; break;
+ case 36: func = &_wiringPiISR_callback_pin36; break;
+ case 37: func = &_wiringPiISR_callback_pin37; break;
+ case 38: func = &_wiringPiISR_callback_pin38; break;
+ case 39: func = &_wiringPiISR_callback_pin39; break;
+ case 40: func = &_wiringPiISR_callback_pin40; break;
+ case 41: func = &_wiringPiISR_callback_pin41; break;
+ case 42: func = &_wiringPiISR_callback_pin42; break;
+ case 43: func = &_wiringPiISR_callback_pin43; break;
+ case 44: func = &_wiringPiISR_callback_pin44; break;
+ case 45: func = &_wiringPiISR_callback_pin45; break;
+ case 46: func = &_wiringPiISR_callback_pin46; break;
+ case 47: func = &_wiringPiISR_callback_pin47; break;
+ case 48: func = &_wiringPiISR_callback_pin48; break;
+ case 49: func = &_wiringPiISR_callback_pin49; break;
+ case 50: func = &_wiringPiISR_callback_pin50; break;
+ case 51: func = &_wiringPiISR_callback_pin51; break;
+ case 52: func = &_wiringPiISR_callback_pin52; break;
+ case 53: func = &_wiringPiISR_callback_pin53; break;
+ case 54: func = &_wiringPiISR_callback_pin54; break;
+ case 55: func = &_wiringPiISR_callback_pin55; break;
+ case 56: func = &_wiringPiISR_callback_pin56; break;
+ case 57: func = &_wiringPiISR_callback_pin57; break;
+ case 58: func = &_wiringPiISR_callback_pin58; break;
+ case 59: func = &_wiringPiISR_callback_pin59; break;
+ case 60: func = &_wiringPiISR_callback_pin60; break;
+ case 61: func = &_wiringPiISR_callback_pin61; break;
+ case 62: func = &_wiringPiISR_callback_pin62; break;
+ case 63: func = &_wiringPiISR_callback_pin63; break;
+ }
+
+ // register our dedicated function in WiringPi
+ wiringPiISR(pin, mode, func);
+}
+
+%}
+
+// overlay normal function with our wrapper
+%rename("wiringPiISR") wiringPiISRWrapper (int pin, int mode, PyObject *PyFunc);
+static void wiringPiISRWrapper(int pin, int mode, PyObject *PyFunc);
+
+%typemap(in) unsigned char data [8] {
+ /* Check if is a list */
+ if (PyList_Check($input)) {
+ if(PyList_Size($input) != 8){
+ PyErr_SetString(PyExc_TypeError,"must contain 8 items");
+ return NULL;
+ }
+ int i = 0;
+ $1 = (unsigned char *) malloc(8);
+ for (i = 0; i < 8; i++) {
+ PyObject *o = PyList_GetItem($input,i);
+ if (PyInt_Check(o) && PyInt_AsLong(PyList_GetItem($input,i)) <= 255 && PyInt_AsLong(PyList_GetItem($input,i)) >= 0)
+ $1[i] = PyInt_AsLong(PyList_GetItem($input,i));
+ else {
+ PyErr_SetString(PyExc_TypeError,"list must contain integers 0-255");
+ return NULL;
+ }
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError,"not a list");
+ return NULL;
+ }
+};
+
+%typemap(freearg) unsigned char data [8] {
+ free((unsigned char *) $1);
+}
+
+%typemap(in) (unsigned char *data, int len) {
+ $1 = (unsigned char *) PyString_AsString($input);
+ $2 = PyString_Size($input);
+};
+
+%typemap(argout) (unsigned char *data) {
+ $result = SWIG_Python_AppendOutput($result, PyString_FromStringAndSize((char *) $1, result));
+};
+
+%include "bindings.i"
+%include "constants.py"
+%include "wiringpi-class.py"