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