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