pigpio 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/example/simple/callback.rb +6 -2
- data/example/simple/led.rb +18 -0
- data/example/simple/pwm.rb +2 -1
- data/example/simple/readme.md +3 -3
- data/ext/pigpio/pigpio.c +82 -48
- data/lib/pigpio/user_gpio.rb +1 -8
- data/lib/pigpio/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01a1c4e0c688be24b237155ef8958a86515efae4
|
4
|
+
data.tar.gz: 31044e1d6f588ea3f45edb2fb3dc575508caa9da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5be365ff9e98fad14a67ba8922f3450cf23093a27d1443b9e09547e20a8cc7d4cc28c2259f03c1ea6762559fd2ae896388d821641e6cab7ed9085cdcd17fb53
|
7
|
+
data.tar.gz: 1eaff222417c95031107ee21b7723a6caf2655b7f6f9275ff6483c58b27046b6e516fdf9535146062b4d73907ae7588095a027c1b1f3bf38f6aa1c0e2523952a
|
data/README.md
CHANGED
data/example/simple/callback.rb
CHANGED
@@ -13,11 +13,15 @@ button=pi.gpio(17)
|
|
13
13
|
button.mode=PI_INPUT
|
14
14
|
button.pud=PI_PUD_UP
|
15
15
|
button.glitch_filter(30)
|
16
|
-
button.callback(EITHER_EDGE){|tick,level|
|
16
|
+
cb=button.callback(EITHER_EDGE){|tick,level|
|
17
17
|
led.write level
|
18
18
|
counter+=1
|
19
19
|
}
|
20
20
|
|
21
|
+
led.write 1
|
21
22
|
while(counter<10)do
|
23
|
+
sleep(1)
|
22
24
|
end
|
23
|
-
|
25
|
+
cb.cancel
|
26
|
+
led.write 0
|
27
|
+
pi.stop
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "pigpio"
|
2
|
+
include Pigpio::Constant
|
3
|
+
|
4
|
+
pi=Pigpio.new
|
5
|
+
unless pi.connect
|
6
|
+
exit -1
|
7
|
+
end
|
8
|
+
|
9
|
+
led = pi.gpio(4)
|
10
|
+
led.mode = PI_OUTPUT
|
11
|
+
led.pud = PI_PUD_OFF
|
12
|
+
3.times do |i|
|
13
|
+
led.write 1
|
14
|
+
sleep 1
|
15
|
+
led.write 0
|
16
|
+
sleep 1
|
17
|
+
end
|
18
|
+
pi.stop
|
data/example/simple/pwm.rb
CHANGED
data/example/simple/readme.md
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
LED brightness will increase while you press the button.
|
12
12
|
|
13
13
|
```sh
|
14
|
+
$ sudo pigpiod
|
14
15
|
$ ruby pwm.rb
|
15
16
|
```
|
16
17
|
|
@@ -18,10 +19,9 @@ $ ruby pwm.rb
|
|
18
19
|
|
19
20
|
[Script is here.](./callback.rb)
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
LED will light, while you press the button.
|
22
|
+
LED will light, while you release the button.
|
24
23
|
|
25
24
|
```sh
|
25
|
+
$ sudo pigpiod
|
26
26
|
$ ruby callback.rb
|
27
27
|
```
|
data/ext/pigpio/pigpio.c
CHANGED
@@ -4,81 +4,87 @@
|
|
4
4
|
#define TypedData_Get_Struct2(obj, type, data_type) ((type*)rb_check_typeddata((obj), (data_type)))
|
5
5
|
|
6
6
|
static VALUE cCallbackID;
|
7
|
+
static VALUE cNativeQueue;
|
7
8
|
static VALUE cCallbackError;
|
8
9
|
|
9
10
|
typedef struct{
|
10
|
-
unsigned level;
|
11
11
|
uint32_t tick;
|
12
|
+
unsigned char level;
|
13
|
+
unsigned char dummy;
|
14
|
+
unsigned char gpio;
|
15
|
+
unsigned char pi;
|
12
16
|
} callback_item_t;
|
13
17
|
|
14
18
|
#define PG_EXT_CALLBACK_BUF_SIZE (128)
|
15
19
|
typedef struct{
|
16
20
|
volatile callback_item_t buf[ PG_EXT_CALLBACK_BUF_SIZE ];
|
17
|
-
volatile
|
18
|
-
volatile
|
19
|
-
volatile
|
21
|
+
volatile unsigned short read;
|
22
|
+
volatile unsigned short write;
|
23
|
+
volatile unsigned short size;
|
24
|
+
volatile char flag_overflow;
|
20
25
|
} callback_queue_t;
|
21
26
|
|
22
27
|
|
23
28
|
|
24
29
|
typedef struct{
|
25
30
|
callback_queue_t*queue;
|
31
|
+
VALUE callback;
|
32
|
+
struct timeval t;
|
26
33
|
} callback_pqueue_t;
|
27
|
-
void
|
34
|
+
void pigpio_rbst_callback_pqueue_dmark(void* _self){
|
35
|
+
callback_pqueue_t *self=(callback_pqueue_t *)_self;
|
36
|
+
rb_gc_mark(self->callback);
|
37
|
+
}
|
38
|
+
void pigpio_rbst_callback_pqueue_dfree(void* _self){
|
28
39
|
callback_pqueue_t *self=(callback_pqueue_t *)_self;
|
29
40
|
if(self->queue!=NULL)free(self->queue);
|
30
41
|
xfree(self);
|
31
42
|
return;
|
32
43
|
}
|
33
|
-
size_t
|
44
|
+
size_t pigpio_rbst_callback_pqueue_dsize(const void *_self){
|
34
45
|
return sizeof(callback_pqueue_t)+sizeof(callback_queue_t);
|
35
46
|
}
|
36
47
|
const rb_data_type_t callback_pqueue_type = { //https://gist.github.com/yugui/87ef6964d8a76794be6f
|
37
|
-
"struct@callback_pqueue",{
|
48
|
+
"struct@callback_pqueue",{
|
49
|
+
pigpio_rbst_callback_pqueue_dmark,
|
50
|
+
pigpio_rbst_callback_pqueue_dfree,
|
51
|
+
pigpio_rbst_callback_pqueue_dsize,{0,0}},0,NULL,0
|
38
52
|
};
|
39
53
|
/*
|
40
54
|
Constructor of Pigpio::NativeQueue class
|
41
55
|
*/
|
42
|
-
VALUE
|
56
|
+
VALUE pigpio_rbst_callback_pqueue_make_inner(VALUE callback,time_t sec,long usec){
|
43
57
|
VALUE obj;
|
44
58
|
callback_pqueue_t *st;
|
45
59
|
callback_queue_t *queue;
|
46
|
-
obj = TypedData_Make_Struct(
|
60
|
+
obj = TypedData_Make_Struct(cNativeQueue, callback_pqueue_t, &callback_pqueue_type, st);
|
61
|
+
st->t.tv_sec=sec;
|
62
|
+
st->t.tv_usec=usec;
|
63
|
+
st->callback=callback;
|
47
64
|
st->queue=queue=malloc(sizeof(callback_queue_t));
|
48
|
-
queue->read=
|
49
|
-
queue->write=
|
65
|
+
queue->read=0;
|
66
|
+
queue->write=0;
|
50
67
|
queue->flag_overflow=0;
|
51
|
-
|
52
|
-
}
|
53
|
-
/*
|
54
|
-
Get a data from FIFO Queue.
|
55
|
-
*/
|
56
|
-
VALUE pigpio_rbst_callback_pqueue_pop(VALUE self){
|
57
|
-
callback_pqueue_t *st=TypedData_Get_Struct2(self,callback_pqueue_t,&callback_pqueue_type);
|
58
|
-
callback_queue_t *queue=st->queue;
|
59
|
-
volatile callback_item_t *cur=queue->read;
|
60
|
-
VALUE ret;
|
61
|
-
struct timeval t;
|
62
|
-
t.tv_sec=0;
|
63
|
-
t.tv_usec=100000;
|
64
|
-
if(queue->flag_overflow!=0){
|
65
|
-
rb_raise(cCallbackError,"Overflow NativeQueue.\n");
|
66
|
-
}
|
67
|
-
while(cur==queue->write){
|
68
|
-
rb_thread_wait_for(t);
|
69
|
-
}
|
70
|
-
ret=rb_ary_new_from_args(2,ULONG2NUM(cur->tick),UINT2NUM(cur->level));
|
71
|
-
queue->read=(cur==queue->buf+(PG_EXT_CALLBACK_BUF_SIZE-1)) ? queue->buf : (cur+1) ;
|
72
|
-
return(ret);
|
68
|
+
return obj;
|
73
69
|
}
|
74
70
|
/*
|
75
71
|
Set a data to FIFO Queue.
|
76
72
|
*/
|
77
|
-
void
|
78
|
-
|
73
|
+
void pigpio_rbbk_CBFuncEx(int pi, unsigned user_gpio, unsigned level, uint32_t tick, void *_queue){
|
74
|
+
callback_queue_t *queue=(callback_queue_t *)_queue;
|
75
|
+
unsigned short cur=queue->write;
|
76
|
+
queue->buf[cur].tick=tick;
|
77
|
+
queue->buf[cur].level=level;
|
78
|
+
queue->buf[cur].gpio=user_gpio;
|
79
|
+
queue->buf[cur].pi=pi;
|
80
|
+
cur=(cur>=(PG_EXT_CALLBACK_BUF_SIZE-1)) ? 0 : (cur+1) ;
|
81
|
+
/*
|
79
82
|
cur->tick=tick;
|
80
83
|
cur->level=level;
|
84
|
+
cur->gpio=user_gpio;
|
85
|
+
cur->pi=pi;
|
81
86
|
cur=(cur==queue->buf+(PG_EXT_CALLBACK_BUF_SIZE-1)) ? queue->buf : (cur+1) ;
|
87
|
+
*/
|
82
88
|
if(cur==queue->read){
|
83
89
|
queue->flag_overflow=1;
|
84
90
|
}else{
|
@@ -86,6 +92,28 @@ void pigpio_rbstn_callback_pqueue_push(callback_queue_t *queue,unsigned level, u
|
|
86
92
|
}
|
87
93
|
return;
|
88
94
|
}
|
95
|
+
static VALUE callback_receive(void*_self){
|
96
|
+
callback_pqueue_t *st=TypedData_Get_Struct2((VALUE)_self,callback_pqueue_t,&callback_pqueue_type);
|
97
|
+
VALUE callee_proc =st->callback;
|
98
|
+
struct timeval t =st->t;
|
99
|
+
callback_queue_t *queue=st->queue;
|
100
|
+
unsigned short cur=queue->read;
|
101
|
+
|
102
|
+
while(1){
|
103
|
+
if(queue->flag_overflow!=0){
|
104
|
+
rb_raise(cCallbackError,"Overflow NativeQueue.\n");
|
105
|
+
}
|
106
|
+
while(cur==queue->write){
|
107
|
+
rb_thread_wait_for(t);
|
108
|
+
}
|
109
|
+
rb_funcall((VALUE)callee_proc, rb_intern("call"), 4,
|
110
|
+
ULONG2NUM(queue->buf[cur].tick),CHR2FIX(queue->buf[cur].level),CHR2FIX(queue->buf[cur].gpio),CHR2FIX(queue->buf[cur].pi));
|
111
|
+
queue->read=cur=(cur==(PG_EXT_CALLBACK_BUF_SIZE-1)) ? 0 : (cur+1) ;
|
112
|
+
}
|
113
|
+
return Qnil;
|
114
|
+
}
|
115
|
+
|
116
|
+
|
89
117
|
|
90
118
|
typedef int (*cancel_t)(unsigned);
|
91
119
|
typedef struct{
|
@@ -124,7 +152,6 @@ VALUE pigpio_rbst_callback_id_make_inner(int id,cancel_t cancel,VALUE queue,VALU
|
|
124
152
|
st->queue=queue;
|
125
153
|
st->thread=thread;
|
126
154
|
st->cancel=cancel;
|
127
|
-
|
128
155
|
return obj;
|
129
156
|
}
|
130
157
|
/*
|
@@ -150,18 +177,16 @@ VALUE pigpio_rbst_callback_id_cancel(VALUE self){
|
|
150
177
|
callback_id_t *st=TypedData_Get_Struct2(self,callback_id_t,&callback_id_data_type);
|
151
178
|
id=st->id;
|
152
179
|
if(id<0){return INT2NUM(pigif_callback_not_found);}
|
180
|
+
id=(*(st->cancel))(st->id);
|
153
181
|
if(st->thread!=Qnil){
|
154
182
|
rb_funcall((VALUE)st->thread, rb_intern("kill"), 0);
|
155
183
|
}
|
156
184
|
st->id=-1;
|
157
185
|
st->thread=Qnil;
|
158
186
|
st->queue=Qnil;
|
159
|
-
return INT2NUM(
|
160
|
-
}
|
161
|
-
void pigpio_rbbk_CBFuncEx(int pi, unsigned user_gpio, unsigned level, uint32_t tick, void *queue){
|
162
|
-
pigpio_rbstn_callback_pqueue_push((callback_queue_t *)queue,level,tick);
|
163
|
-
return;
|
187
|
+
return INT2NUM(id);
|
164
188
|
}
|
189
|
+
|
165
190
|
void pigpio_rbbk_evtCBFuncEx(int pi, unsigned event, uint32_t tick, void *callee_proc){
|
166
191
|
(rb_funcall((VALUE)callee_proc, rb_intern("call"), 2,ULONG2NUM(tick),UINT2NUM(event)));
|
167
192
|
return;
|
@@ -1987,15 +2012,25 @@ GPIO has the identified edge.
|
|
1987
2012
|
. .
|
1988
2013
|
|
1989
2014
|
:call-seq:
|
1990
|
-
callback(Integer pi,Integer user_gpio, Integer edge){|tick,level,
|
2015
|
+
callback(Integer pi,Integer user_gpio, Integer edge){|tick,level,gpio,pi| ... } -> Pigpio::Callback
|
1991
2016
|
|
1992
2017
|
If you call this method without a block, this method raises an Pigpio::CallbackError exception.
|
1993
2018
|
|
1994
2019
|
See also: {pigpio site}[http://abyz.me.uk/rpi/pigpio/pdif2.html#callback_ex]
|
1995
2020
|
*/
|
1996
|
-
VALUE pigpio_rbfn_callback(
|
2021
|
+
VALUE pigpio_rbfn_callback(int argc, VALUE *argv, VALUE self){
|
1997
2022
|
int id;
|
1998
|
-
|
2023
|
+
VALUE queue;
|
2024
|
+
VALUE thread;
|
2025
|
+
callback_pqueue_t *st;
|
2026
|
+
VALUE pi; VALUE user_gpio; VALUE edge; VALUE block;
|
2027
|
+
rb_scan_args(argc,argv,"3&",&pi,&user_gpio,&edge,&block);
|
2028
|
+
if(block==Qnil){
|
2029
|
+
return Qnil;
|
2030
|
+
}
|
2031
|
+
queue=pigpio_rbst_callback_pqueue_make_inner(block,0,100000);
|
2032
|
+
thread=rb_thread_create(callback_receive,(void*)queue);
|
2033
|
+
st=TypedData_Get_Struct2(queue,callback_pqueue_t,&callback_pqueue_type);
|
1999
2034
|
|
2000
2035
|
//if(NIL_P(callee_proc)){rb_raise(cCallbackError,"No callback block.\n");}
|
2001
2036
|
id=callback_ex(NUM2INT(pi), NUM2UINT(user_gpio), NUM2UINT(edge), pigpio_rbbk_CBFuncEx, (void*)st->queue);
|
@@ -3676,7 +3711,7 @@ This class has some constances for pigpio library.
|
|
3676
3711
|
rb_define_singleton_method(cAPI, "wave_add_generic", pigpio_rbfn_wave_add_generic, 2);
|
3677
3712
|
rb_define_singleton_method(cAPI, "wave_add_serial", pigpio_rbfn_wave_add_serial, 7);
|
3678
3713
|
rb_define_singleton_method(cAPI, "wave_chain", pigpio_rbfn_wave_chain, 2);
|
3679
|
-
rb_define_singleton_method(cAPI, "callback", pigpio_rbfn_callback,
|
3714
|
+
rb_define_singleton_method(cAPI, "callback", pigpio_rbfn_callback, -1);
|
3680
3715
|
rb_define_singleton_method(cAPI, "callback_cancel", pigpio_rbfn_callback_cancel, 1);
|
3681
3716
|
rb_define_singleton_method(cAPI, "wait_for_edge", pigpio_rbfn_wait_for_edge, 4);
|
3682
3717
|
rb_define_singleton_method(cAPI, "event_callback", pigpio_rbfn_event_callback, -1);
|
@@ -3751,9 +3786,8 @@ This class has some constances for pigpio library.
|
|
3751
3786
|
/*
|
3752
3787
|
The class of native queue.
|
3753
3788
|
*/
|
3754
|
-
cNativeQueue = rb_define_class_under(
|
3755
|
-
|
3756
|
-
rb_define_method(cNativeQueue, "pop", pigpio_rbst_callback_pqueue_pop, 0);
|
3789
|
+
cNativeQueue = rb_define_class_under(cAPI,"NativeQueue", rb_cData);
|
3790
|
+
rb_gc_register_address(&cNativeQueue);
|
3757
3791
|
|
3758
3792
|
/*
|
3759
3793
|
The class of callback.
|
data/lib/pigpio/user_gpio.rb
CHANGED
@@ -12,14 +12,7 @@ class Pigpio
|
|
12
12
|
end
|
13
13
|
def callback(edge,&blk)
|
14
14
|
return nil unless blk
|
15
|
-
|
16
|
-
th=Thread.start do
|
17
|
-
while true
|
18
|
-
resource = q.pop
|
19
|
-
blk.call(*resource)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
IF.callback(@pi,@gpio,edge,q,th)
|
15
|
+
IF.callback(@pi,@gpio,edge,&blk)
|
23
16
|
end
|
24
17
|
def wait_for_edge(edge,timeout)
|
25
18
|
ret=IF.wait_for_edge(@pi,@gpio,edge,timeout)
|
data/lib/pigpio/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pigpio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nak1114
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- check.txt
|
91
91
|
- example/simple/board.svg
|
92
92
|
- example/simple/callback.rb
|
93
|
+
- example/simple/led.rb
|
93
94
|
- example/simple/pwm.rb
|
94
95
|
- example/simple/readme.md
|
95
96
|
- ext/pigpio/extconf.rb
|