-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwiring_add_userdata.diff
86 lines (72 loc) · 2.44 KB
/
wiring_add_userdata.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
diff --git a/wiringPi/ds18b20.c b/wiringPi/ds18b20.c
index c4ec4fd..98d68a7 100644
--- a/wiringPi/ds18b20.c
+++ b/wiringPi/ds18b20.c
@@ -136,11 +136,19 @@ int ds18b20Setup (const int pinBase, const char *deviceId)
// We'll keep the file open, to make access a little faster
// although it's very slow reading these things anyway )-:
-
- node = wiringPiNewNode (pinBase, 1) ;
+ node = wiringPiFindNode(pinBase);
+ if( node == NULL )
+ {
+ node = wiringPiNewNode (pinBase, 1) ;
+ }
+ else
+ {
+ close(node->fd);
+ }
node->fd = fd ;
node->analogRead = myAnalogRead ;
return TRUE ;
}
+
diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
index 28dfe61..d869b86 100644
--- a/wiringPi/wiringPi.c
+++ b/wiringPi/wiringPi.c
@@ -406,7 +406,8 @@ static int sysFds [64] =
// ISR Data
-static void (*isrFunctions [64])(void) ;
+static void (*isrFunctions [64])(void*) ;
+static void* isrData[64] ;
// Doing it the Arduino way with lookup tables...
@@ -2160,7 +2161,7 @@ static void *interruptHandler (UNU void *arg)
for (;;)
if (waitForInterrupt (myPin, -1) > 0)
- isrFunctions [myPin] () ;
+ isrFunctions [myPin] (isrData[myPin]) ;
return NULL ;
}
@@ -2173,8 +2174,15 @@ static void *interruptHandler (UNU void *arg)
* back to the user supplied function.
*********************************************************************************
*/
-
+static void wiringPiISR_helper(void* func) {
+ void (*function)(void) = (void(*)(void))func;
+ function();
+}
int wiringPiISR (int pin, int mode, void (*function)(void))
+{
+ return wiringPiISR_data(pin, mode, wiringPiISR_helper, (void*)function);
+}
+int wiringPiISR_data(int pin, int mode, void (*function)(void*), void* user_data)
{
pthread_t threadId ;
const char *modeS ;
@@ -2255,6 +2263,7 @@ int wiringPiISR (int pin, int mode, void (*function)(void))
read (sysFds [bcmGpioPin], &c, 1) ;
isrFunctions [pin] = function ;
+ isrData [pin] = user_data;
pthread_mutex_lock (&pinMutex) ;
pinPass = pin ;
diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h
index 0212016..54e443d 100644
--- a/wiringPi/wiringPi.h
+++ b/wiringPi/wiringPi.h
@@ -256,6 +256,7 @@ extern void digitalWriteByte2 (int value) ;
extern int waitForInterrupt (int pin, int mS) ;
extern int wiringPiISR (int pin, int mode, void (*function)(void)) ;
+extern int wiringPiISR_data (int pin, int mode, void (*function)(void*), void*) ;
// Threads