pigpio 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|