blob: 20e02ed6d82efd3bb5fd46530751255d87fa996e [file] [log] [blame]
Yang Deokgyudd194672019-09-04 11:29:11 +09001%module odroid_wiringpi
Philip Howard567ee002013-03-27 22:22:00 +00002
3%{
Phil Howard2fb6b492016-02-28 11:10:55 +00004#if PY_MAJOR_VERSION >= 3
5#define PyInt_AS_LONG PyLong_AsLong
6#define PyString_FromStringAndSize PyBytes_FromStringAndSize
7#endif
8
Philip Howard6ae3e5b2013-05-21 22:48:41 +01009#include "WiringPi/wiringPi/wiringPi.h"
Philip Howard6ae3e5b2013-05-21 22:48:41 +010010#include "WiringPi/wiringPi/wiringPiI2C.h"
Phil Howard22041762014-07-18 11:48:01 +000011#include "WiringPi/wiringPi/wiringPiSPI.h"
Philip Howard6ae3e5b2013-05-21 22:48:41 +010012#include "WiringPi/wiringPi/wiringSerial.h"
13#include "WiringPi/wiringPi/wiringShift.h"
Philip Howard2215ad32013-03-27 23:04:22 +000014#include "WiringPi/wiringPi/softPwm.h"
15#include "WiringPi/wiringPi/softServo.h"
16#include "WiringPi/wiringPi/softTone.h"
Deokgyu Yanga5de1bc2020-04-28 11:40:44 +090017#include "WiringPi/wiringPi/drcSerial.h"
18#include "WiringPi/wiringPi/ads1115.h"
19#include "WiringPi/wiringPi/max31855.h"
20#include "WiringPi/wiringPi/max5322.h"
21#include "WiringPi/wiringPi/mcp23008.h"
22#include "WiringPi/wiringPi/mcp23016.h"
23#include "WiringPi/wiringPi/mcp23016reg.h"
24#include "WiringPi/wiringPi/mcp23017.h"
25#include "WiringPi/wiringPi/mcp23s08.h"
26#include "WiringPi/wiringPi/mcp23s17.h"
27#include "WiringPi/wiringPi/mcp23x0817.h"
28#include "WiringPi/wiringPi/mcp23x08.h"
29#include "WiringPi/wiringPi/mcp3002.h"
30#include "WiringPi/wiringPi/mcp3004.h"
31#include "WiringPi/wiringPi/mcp3422.h"
32#include "WiringPi/wiringPi/mcp4802.h"
33#include "WiringPi/wiringPi/pcf8574.h"
34#include "WiringPi/wiringPi/pcf8591.h"
35#include "WiringPi/wiringPi/sn3218.h"
36#include "WiringPi/wiringPi/sr595.h"
37#include "WiringPi/wiringPi/bmp180.h"
38#include "WiringPi/wiringPi/drcNet.h"
39#include "WiringPi/wiringPi/ds18b20.h"
40#include "WiringPi/wiringPi/htu21d.h"
41#include "WiringPi/wiringPi/pseudoPins.h"
42#include "WiringPi/wiringPi/rht03.h"
43#include "WiringPi/wiringPi/wpiExtensions.h"
44#include "WiringPi/devLib/ds1302.h"
Phil Howard22041762014-07-18 11:48:01 +000045#include "WiringPi/devLib/font.h"
Deokgyu Yanga5de1bc2020-04-28 11:40:44 +090046#include "WiringPi/devLib/gertboard.h"
Philip Howard6ae3e5b2013-05-21 22:48:41 +010047#include "WiringPi/devLib/lcd128x64.h"
Philip Howard6ae3e5b2013-05-21 22:48:41 +010048#include "WiringPi/devLib/lcd.h"
Deokgyu Yanga5de1bc2020-04-28 11:40:44 +090049#include "WiringPi/devLib/maxdetect.h"
50#include "WiringPi/devLib/piGlow.h"
51#include "WiringPi/devLib/piNes.h"
52#include "WiringPi/devLib/scrollPhat.h"
53#include "WiringPi/devLib/piFace.h"
steve.jeong6d863ce2022-06-02 12:14:44 +090054#include <gpiod.h>
Philip Howard567ee002013-03-27 22:22:00 +000055%}
56
57%apply unsigned char { uint8_t };
Phil Howard22041762014-07-18 11:48:01 +000058%typemap(in) (unsigned char *data, int len) {
59 $1 = (unsigned char *) PyString_AsString($input);
60 $2 = PyString_Size($input);
61};
62
White Moustache96d5dcd2016-02-13 14:16:40 +000063// Grab a Python function object as a Python object.
Mark Liffiton8de6c992018-04-29 09:10:02 -050064%typemap(in) PyObject *PyFunc {
65 if (!PyCallable_Check($input)) {
White Moustache96d5dcd2016-02-13 14:16:40 +000066 PyErr_SetString(PyExc_TypeError, "Need a callable object!");
67 return NULL;
68 }
Mark Liffiton8de6c992018-04-29 09:10:02 -050069 $1 = $input;
White Moustache96d5dcd2016-02-13 14:16:40 +000070}
71
72%{
73
74// we need to have our own callbacks array
75PyObject* event_callback[64] = {0,};
76
77void _wiringPiISR_callback(int pinNumber) {
78 PyObject *result;
79
80 if (event_callback[pinNumber]) {
81 // this will acquire the GIL
82 SWIG_PYTHON_THREAD_BEGIN_BLOCK;
83
84 result = PyObject_CallFunction(event_callback[pinNumber], NULL);
85 if (result == NULL && PyErr_Occurred()) {
86 PyErr_Print();
87 PyErr_Clear();
88 }
89 Py_XDECREF(result);
90
91 // release the GIL
92 SWIG_PYTHON_THREAD_END_BLOCK;
93 }
94}
95
96
97/* This is embarrasing, WiringPi does not support supplying args to the callback
98... so we have to create callback function for each of the pins :( */
99void _wiringPiISR_callback_pin0(void) { _wiringPiISR_callback(0); }
100void _wiringPiISR_callback_pin1(void) { _wiringPiISR_callback(1); }
101void _wiringPiISR_callback_pin2(void) { _wiringPiISR_callback(2); }
102void _wiringPiISR_callback_pin3(void) { _wiringPiISR_callback(3); }
103void _wiringPiISR_callback_pin4(void) { _wiringPiISR_callback(4); }
104void _wiringPiISR_callback_pin5(void) { _wiringPiISR_callback(5); }
105void _wiringPiISR_callback_pin6(void) { _wiringPiISR_callback(6); }
106void _wiringPiISR_callback_pin7(void) { _wiringPiISR_callback(7); }
107void _wiringPiISR_callback_pin8(void) { _wiringPiISR_callback(8); }
108void _wiringPiISR_callback_pin9(void) { _wiringPiISR_callback(9); }
109void _wiringPiISR_callback_pin10(void) { _wiringPiISR_callback(10); }
110void _wiringPiISR_callback_pin11(void) { _wiringPiISR_callback(11); }
111void _wiringPiISR_callback_pin12(void) { _wiringPiISR_callback(12); }
112void _wiringPiISR_callback_pin13(void) { _wiringPiISR_callback(13); }
113void _wiringPiISR_callback_pin14(void) { _wiringPiISR_callback(14); }
114void _wiringPiISR_callback_pin15(void) { _wiringPiISR_callback(15); }
115void _wiringPiISR_callback_pin16(void) { _wiringPiISR_callback(16); }
116void _wiringPiISR_callback_pin17(void) { _wiringPiISR_callback(17); }
117void _wiringPiISR_callback_pin18(void) { _wiringPiISR_callback(18); }
118void _wiringPiISR_callback_pin19(void) { _wiringPiISR_callback(19); }
119void _wiringPiISR_callback_pin20(void) { _wiringPiISR_callback(20); }
120void _wiringPiISR_callback_pin21(void) { _wiringPiISR_callback(21); }
121void _wiringPiISR_callback_pin22(void) { _wiringPiISR_callback(22); }
122void _wiringPiISR_callback_pin23(void) { _wiringPiISR_callback(23); }
123void _wiringPiISR_callback_pin24(void) { _wiringPiISR_callback(24); }
124void _wiringPiISR_callback_pin25(void) { _wiringPiISR_callback(25); }
125void _wiringPiISR_callback_pin26(void) { _wiringPiISR_callback(26); }
126void _wiringPiISR_callback_pin27(void) { _wiringPiISR_callback(27); }
127void _wiringPiISR_callback_pin28(void) { _wiringPiISR_callback(28); }
128void _wiringPiISR_callback_pin29(void) { _wiringPiISR_callback(29); }
129void _wiringPiISR_callback_pin30(void) { _wiringPiISR_callback(30); }
130void _wiringPiISR_callback_pin31(void) { _wiringPiISR_callback(31); }
131void _wiringPiISR_callback_pin32(void) { _wiringPiISR_callback(32); }
132void _wiringPiISR_callback_pin33(void) { _wiringPiISR_callback(33); }
133void _wiringPiISR_callback_pin34(void) { _wiringPiISR_callback(34); }
134void _wiringPiISR_callback_pin35(void) { _wiringPiISR_callback(35); }
135void _wiringPiISR_callback_pin36(void) { _wiringPiISR_callback(36); }
136void _wiringPiISR_callback_pin37(void) { _wiringPiISR_callback(37); }
137void _wiringPiISR_callback_pin38(void) { _wiringPiISR_callback(38); }
138void _wiringPiISR_callback_pin39(void) { _wiringPiISR_callback(39); }
139void _wiringPiISR_callback_pin40(void) { _wiringPiISR_callback(40); }
140void _wiringPiISR_callback_pin41(void) { _wiringPiISR_callback(41); }
141void _wiringPiISR_callback_pin42(void) { _wiringPiISR_callback(42); }
142void _wiringPiISR_callback_pin43(void) { _wiringPiISR_callback(43); }
143void _wiringPiISR_callback_pin44(void) { _wiringPiISR_callback(44); }
144void _wiringPiISR_callback_pin45(void) { _wiringPiISR_callback(45); }
145void _wiringPiISR_callback_pin46(void) { _wiringPiISR_callback(46); }
146void _wiringPiISR_callback_pin47(void) { _wiringPiISR_callback(47); }
147void _wiringPiISR_callback_pin48(void) { _wiringPiISR_callback(48); }
148void _wiringPiISR_callback_pin49(void) { _wiringPiISR_callback(49); }
149void _wiringPiISR_callback_pin50(void) { _wiringPiISR_callback(50); }
150void _wiringPiISR_callback_pin51(void) { _wiringPiISR_callback(51); }
151void _wiringPiISR_callback_pin52(void) { _wiringPiISR_callback(52); }
152void _wiringPiISR_callback_pin53(void) { _wiringPiISR_callback(53); }
153void _wiringPiISR_callback_pin54(void) { _wiringPiISR_callback(54); }
154void _wiringPiISR_callback_pin55(void) { _wiringPiISR_callback(55); }
155void _wiringPiISR_callback_pin56(void) { _wiringPiISR_callback(56); }
156void _wiringPiISR_callback_pin57(void) { _wiringPiISR_callback(57); }
157void _wiringPiISR_callback_pin58(void) { _wiringPiISR_callback(58); }
158void _wiringPiISR_callback_pin59(void) { _wiringPiISR_callback(59); }
159void _wiringPiISR_callback_pin60(void) { _wiringPiISR_callback(60); }
160void _wiringPiISR_callback_pin61(void) { _wiringPiISR_callback(61); }
161void _wiringPiISR_callback_pin62(void) { _wiringPiISR_callback(62); }
162void _wiringPiISR_callback_pin63(void) { _wiringPiISR_callback(63); }
163
164/* This function adds a new Python function object as a callback object */
165
166static void wiringPiISRWrapper(int pin, int mode, PyObject *PyFunc) {
167
168 // remove the old callback if any
169 if (event_callback[pin]) {
170 Py_XDECREF(event_callback[pin]);
171 }
172
173 // put new callback function
174 event_callback[pin] = PyFunc;
175 Py_INCREF(PyFunc);
176
177 // and now the ugly switch
178 void (*func)(void);
179 switch(pin) {
180 case 0: func = &_wiringPiISR_callback_pin0; break;
181 case 1: func = &_wiringPiISR_callback_pin1; break;
182 case 2: func = &_wiringPiISR_callback_pin2; break;
183 case 3: func = &_wiringPiISR_callback_pin3; break;
184 case 4: func = &_wiringPiISR_callback_pin4; break;
185 case 5: func = &_wiringPiISR_callback_pin5; break;
186 case 6: func = &_wiringPiISR_callback_pin6; break;
187 case 7: func = &_wiringPiISR_callback_pin7; break;
188 case 8: func = &_wiringPiISR_callback_pin8; break;
189 case 9: func = &_wiringPiISR_callback_pin9; break;
190 case 10: func = &_wiringPiISR_callback_pin10; break;
191 case 11: func = &_wiringPiISR_callback_pin11; break;
192 case 12: func = &_wiringPiISR_callback_pin12; break;
193 case 13: func = &_wiringPiISR_callback_pin13; break;
194 case 14: func = &_wiringPiISR_callback_pin14; break;
195 case 15: func = &_wiringPiISR_callback_pin15; break;
196 case 16: func = &_wiringPiISR_callback_pin16; break;
197 case 17: func = &_wiringPiISR_callback_pin17; break;
198 case 18: func = &_wiringPiISR_callback_pin18; break;
199 case 19: func = &_wiringPiISR_callback_pin19; break;
200 case 20: func = &_wiringPiISR_callback_pin20; break;
201 case 21: func = &_wiringPiISR_callback_pin21; break;
202 case 22: func = &_wiringPiISR_callback_pin22; break;
203 case 23: func = &_wiringPiISR_callback_pin23; break;
204 case 24: func = &_wiringPiISR_callback_pin24; break;
205 case 25: func = &_wiringPiISR_callback_pin25; break;
206 case 26: func = &_wiringPiISR_callback_pin26; break;
207 case 27: func = &_wiringPiISR_callback_pin27; break;
208 case 28: func = &_wiringPiISR_callback_pin28; break;
209 case 29: func = &_wiringPiISR_callback_pin29; break;
210 case 30: func = &_wiringPiISR_callback_pin30; break;
211 case 31: func = &_wiringPiISR_callback_pin31; break;
212 case 32: func = &_wiringPiISR_callback_pin32; break;
213 case 33: func = &_wiringPiISR_callback_pin33; break;
214 case 34: func = &_wiringPiISR_callback_pin34; break;
215 case 35: func = &_wiringPiISR_callback_pin35; break;
216 case 36: func = &_wiringPiISR_callback_pin36; break;
217 case 37: func = &_wiringPiISR_callback_pin37; break;
218 case 38: func = &_wiringPiISR_callback_pin38; break;
219 case 39: func = &_wiringPiISR_callback_pin39; break;
220 case 40: func = &_wiringPiISR_callback_pin40; break;
221 case 41: func = &_wiringPiISR_callback_pin41; break;
222 case 42: func = &_wiringPiISR_callback_pin42; break;
223 case 43: func = &_wiringPiISR_callback_pin43; break;
224 case 44: func = &_wiringPiISR_callback_pin44; break;
225 case 45: func = &_wiringPiISR_callback_pin45; break;
226 case 46: func = &_wiringPiISR_callback_pin46; break;
227 case 47: func = &_wiringPiISR_callback_pin47; break;
228 case 48: func = &_wiringPiISR_callback_pin48; break;
229 case 49: func = &_wiringPiISR_callback_pin49; break;
230 case 50: func = &_wiringPiISR_callback_pin50; break;
231 case 51: func = &_wiringPiISR_callback_pin51; break;
232 case 52: func = &_wiringPiISR_callback_pin52; break;
233 case 53: func = &_wiringPiISR_callback_pin53; break;
234 case 54: func = &_wiringPiISR_callback_pin54; break;
235 case 55: func = &_wiringPiISR_callback_pin55; break;
236 case 56: func = &_wiringPiISR_callback_pin56; break;
237 case 57: func = &_wiringPiISR_callback_pin57; break;
238 case 58: func = &_wiringPiISR_callback_pin58; break;
239 case 59: func = &_wiringPiISR_callback_pin59; break;
240 case 60: func = &_wiringPiISR_callback_pin60; break;
241 case 61: func = &_wiringPiISR_callback_pin61; break;
242 case 62: func = &_wiringPiISR_callback_pin62; break;
243 case 63: func = &_wiringPiISR_callback_pin63; break;
244 }
245
246 // register our dedicated function in WiringPi
247 wiringPiISR(pin, mode, func);
248}
249
250%}
251
White Moustache96d5dcd2016-02-13 14:16:40 +0000252// overlay normal function with our wrapper
253%rename("wiringPiISR") wiringPiISRWrapper (int pin, int mode, PyObject *PyFunc);
254static void wiringPiISRWrapper(int pin, int mode, PyObject *PyFunc);
255
Phil Howard8e29d402016-02-28 10:50:21 +0000256%typemap(in) unsigned char data [8] {
257 /* Check if is a list */
258 if (PyList_Check($input)) {
259 if(PyList_Size($input) != 8){
260 PyErr_SetString(PyExc_TypeError,"must contain 8 items");
261 return NULL;
262 }
263 int i = 0;
264 $1 = (unsigned char *) malloc(8);
265 for (i = 0; i < 8; i++) {
266 PyObject *o = PyList_GetItem($input,i);
267 if (PyInt_Check(o) && PyInt_AsLong(PyList_GetItem($input,i)) <= 255 && PyInt_AsLong(PyList_GetItem($input,i)) >= 0)
268 $1[i] = PyInt_AsLong(PyList_GetItem($input,i));
269 else {
270 PyErr_SetString(PyExc_TypeError,"list must contain integers 0-255");
271 return NULL;
272 }
273 }
274 } else {
275 PyErr_SetString(PyExc_TypeError,"not a list");
276 return NULL;
277 }
278};
279
280%typemap(freearg) unsigned char data [8] {
281 free((unsigned char *) $1);
282}
Philip Howard06423352016-02-27 17:59:29 +0000283
284%typemap(in) (unsigned char *data, int len) {
285 $1 = (unsigned char *) PyString_AsString($input);
286 $2 = PyString_Size($input);
287};
288
289%typemap(argout) (unsigned char *data) {
290 $result = SWIG_Python_AppendOutput($result, PyString_FromStringAndSize((char *) $1, result));
291};
292
Phil Howardaee4f5d2016-02-28 09:54:53 +0000293%include "bindings.i"
Philip Howard4552e6c2016-02-27 17:31:59 +0000294%include "constants.py"
Phil Howard77ce6cd2016-03-09 11:49:38 +0000295%include "wiringpi-class.py"