nRF24-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: UTF-8
3
+
4
+ if File.file? './lib/nRF24-ruby.rb'
5
+ require './lib/nRF24-ruby.rb'
6
+ puts "using local lib"
7
+ else
8
+ require 'nRF24-ruby'
9
+ end
10
+
11
+ puts "\nPure Ruby nRF24L01 Driver Starting..."
12
+
13
+ http=true
14
+
15
+ if http
16
+ puts "Loading Http-server.. hold on.."
17
+ require 'minimal-http-ruby'
18
+ minimal_http_server http_port: 8088, http_path: "./http/"
19
+ puts "\n"
20
+ end
21
+
22
+
23
+ r0=NRF24.new id: :eka, ce: 22,cs: 27, irq: 17, chan:3, ack: true
24
+ r1=NRF24.new id: :toka, ce: 24,cs: 23, irq: 22, chan: 3, ack: true
25
+
26
+ puts "Main Loop Starts:"
27
+
28
+ loopc=0;
29
+ sc=0;
30
+
31
+ loop do
32
+ if (loopc%4)==0
33
+ msg=[]
34
+ str=sprintf "testing %5.5d -- testing?",sc%10000
35
+ sc+=1
36
+ str.each_byte do |b|
37
+ msg<<b
38
+ end
39
+ if sc&1==0
40
+ r0.send_q << msg
41
+ else
42
+ r1.send_q << msg
43
+ end
44
+ NRF24::note "sent '#{str}' to #{sc&1}"
45
+ end
46
+ loopc+=1
47
+ while not r1.recv_q.empty?
48
+ got=r1.recv_q.pop
49
+ #puts "got 1 #{got}"
50
+ msg=""
51
+ len=0
52
+ got.each_with_index do |b,i|
53
+ msg[i]=b.chr
54
+ end
55
+ NRF24::note "got #{msg} from 1!"
56
+ end
57
+ while not r0.recv_q.empty?
58
+ got=r0.recv_q.pop
59
+ #puts "got 0 #{got}"
60
+ msg=""
61
+ len=0
62
+ got.each_with_index do |b,i|
63
+ msg[i]=b.chr
64
+ end
65
+ NRF24::note "got #{msg} from 0!"
66
+ end
67
+ if not http
68
+ pp r0.json
69
+ pp r1.json
70
+ end
71
+ sleep 0.1
72
+ end
73
+
@@ -0,0 +1,118 @@
1
+ regs={}
2
+ stat_vars= ['rcnt','rfull','scnt','sarc','sfail']
3
+ logger = (data) ->
4
+ #console.log "log>",data
5
+ if data.event==0
6
+ $(".log").html("alku\n")
7
+ for l in data.loglines
8
+ #console.log l
9
+ $(".log").prepend(l.text+"\n")
10
+
11
+
12
+ dev = (d,obj) ->
13
+ #ret+="<td>#{obj.scnt}<td>"
14
+ for k in stat_vars
15
+ $("#d#{d}r#{k}").html obj[k]
16
+ for k,v of obj.regs
17
+ if (v instanceof Array)
18
+ str=""
19
+ for a in v
20
+ str+=((0x100+a).toString(16).substring(1,3).toUpperCase())
21
+ $("#d#{d}r#{k}").html str
22
+ else
23
+ if regs[k].format =="hex"
24
+ $("#d#{d}r#{k}").html "0x"+((0x100+v).toString(16).substring(1,3).toUpperCase())
25
+ else if regs[k].format =="dec"
26
+ $("#d#{d}r#{k}").html (v).toString(10)
27
+ else
28
+ if regs[k].len
29
+ $("#d#{d}r#{k}").html (0x100+v).toString(2).substring(1+8-regs[k].len,9)
30
+ else
31
+ $("#d#{d}r#{k}").html (0x100+v).toString(2).substring(1,9)
32
+
33
+ update_status = (data) ->
34
+ #console.log data
35
+ $(".info").html(data.now)
36
+ dev(0,data.devs[0])
37
+ dev(1,data.devs[1])
38
+
39
+ @build_regs = (regs) ->
40
+ ret="<table>"
41
+ for k,v of regs
42
+ ret+="<tr>"
43
+ ret+="<td >#{v.name}<td>"
44
+ ret+="<td id='d0r#{k}'>d0r#{k}<td>"
45
+ ret+="<td id='d1r#{k}'>d1r#{k}<td>"
46
+ ret+="</tr>"
47
+ ret+="</table>"
48
+ $(".regs").html(ret)
49
+ ret="<table>"
50
+ for k in stat_vars
51
+ ret+="<tr>"
52
+ ret+="<td >#{k}<td>"
53
+ ret+="<td id='d0r#{k}'>d0r#{k}<td>"
54
+ ret+="<td id='d1r#{k}'>d1r#{k}<td>"
55
+ ret+="</tr>"
56
+ ret+="</table>"
57
+ $(".stats").html(ret)
58
+
59
+ @process_data = (obj) ->
60
+ #console.log "process",obj,obj.type
61
+ if obj.type == "register_table"
62
+ raw_regs=[]
63
+ for k,v of obj.data
64
+ regs[v.address]=v
65
+ regs[v.address].name=k
66
+ console.log regs
67
+ build_regs regs
68
+
69
+ @ajaxform = (obj) ->
70
+ console.log "doin ajaxform"
71
+ form=$(obj).closest("form")
72
+ key=form.attr('id')
73
+ q=$( form ).serialize()
74
+ console.log q
75
+ $.ajax
76
+ url: "/action.json?#{q}"
77
+ type: "GET"
78
+ processData: false
79
+ contentType: false
80
+ success: (data) ->
81
+ console.log "ajax returns: ", data
82
+
83
+ return
84
+ error: (xhr, ajaxOptions, thrownError) ->
85
+ alert thrownError
86
+ return
87
+
88
+ @ajax = (url,obj) ->
89
+ console.log "doin ajax"
90
+ $.ajax
91
+ url: url
92
+ type: "GET"
93
+ processData: false
94
+ contentType: false
95
+ success: (data) ->
96
+ console.log "ajax returns: ", data
97
+ process_data(data)
98
+ return
99
+ error: (xhr, ajaxOptions, thrownError) ->
100
+ alert thrownError
101
+ return
102
+
103
+ $ ->
104
+ console.log "nRF24 Starts"
105
+ #update_gw()
106
+ #setInterval(->
107
+ # update_gw()
108
+ # return
109
+ #, 200000)
110
+ ajax("/init.json",[])
111
+ stream = new EventSource("/nRF24.json")
112
+ stream.addEventListener "message", (event) ->
113
+ update_status($.parseJSON(event.data))
114
+ return
115
+ stream = new EventSource("/logger.json")
116
+ stream.addEventListener "message", (event) ->
117
+ logger($.parseJSON(event.data))
118
+ return
@@ -0,0 +1,14 @@
1
+ table.vt, th.vt, td.vt {
2
+ text-align: right;
3
+ font-size: 100%;
4
+ font-family: 'VT323' ;
5
+ color: #80ff80;
6
+ background-color: black;
7
+ vertical-align: top;
8
+ }
9
+
10
+ .log {
11
+ height: 400px;
12
+ width: 100%;
13
+ overflow: scroll;
14
+ }
@@ -0,0 +1,50 @@
1
+ !!!
2
+ %html{lang: "fi"}
3
+ %head
4
+ %title nRF24 Pure Ruby Driver
5
+ %meta{:charset => "utf-8"}/
6
+ %link{:href => "/css/nRF24.css", :rel => "stylesheet", :type => "text/css"}
7
+ %link{:href => "http://fonts.googleapis.com/css?family=VT323", :rel => "stylesheet", :type => "text/css"}
8
+ %script{:src => "https://code.jquery.com/jquery-2.1.1.min.js"}
9
+ %script{:src => "/nRF24.js"}
10
+ %body
11
+ %h1 nRF24 Pure Ruby Driver
12
+ %p.info ?
13
+ %form{ onsubmit: "ajaxform(this); return(false);"}
14
+ Channel:
15
+ %input{name: "chan", size: 10}
16
+ Rf_Dr:
17
+ %select{name: "rf_dr"}
18
+ %option{value: "1"} 2Mbps
19
+ %option{value: "0"} 1Mbps
20
+ Rf_Pwr:
21
+ %select{name: "rf_pwr"}
22
+ %option{value: "0"} -18dBm
23
+ %option{value: "1"} -12dBm
24
+ %option{value: "2"} -6dBm
25
+ %option{value: "3"} 0dBm
26
+ Lna_gain:
27
+ %select{name: "lna_hcurr"}
28
+ %option{value: "1"} Normal
29
+ %option{value: "0"} Low
30
+ Auto_Ack:
31
+ %input{type: :checkbox,name: "aa", value: "true"}
32
+ %button{value: "Exec", onclick: "ajaxform(this); return(false);"}
33
+ ReConfig&Reset
34
+ %hr
35
+ %table
36
+ %tr
37
+ %td{width: "20%"}
38
+ %table.vt
39
+ %tr
40
+ %td.regs
41
+ %td.stats
42
+ %td{width: "80%"}
43
+ %pre.log
44
+ %hr
45
+ %p
46
+ %font{size: "-1"}
47
+ Written by
48
+ %a{href: "mailto:jalopuuverstas@gmail.com"}
49
+ Ari Siitonen
50
+ 2014
@@ -0,0 +1 @@
1
+ Okei
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # encode: UTF-8
3
+
4
+ def json_action request,args,session,event
5
+ pp args
6
+ devs=NRF24::all_devices
7
+ chan=(args['chan']||2).to_i
8
+ chan&=0x7f
9
+ if args['aa']=="true"
10
+ aa=true
11
+ else
12
+ aa=nil
13
+ end
14
+
15
+ devs.each do |d|
16
+ if false
17
+ d.wreg :RF_CH,chan
18
+ d.cmd :FLUSH_TX
19
+ d.cmd :FLUSH_RX
20
+ d.get_regs true
21
+ else
22
+ puts "initing #{d}"
23
+ d.hw_init chan: chan, ack: aa, rf_dr: args['rf_dr'], rf_pwr: args['rf_pwr'], lna_hcurr: args['lna_hcurr']
24
+ d.get_regs true
25
+ end
26
+ end
27
+ data={jee: 123}
28
+ return ["text/json",data]
29
+ end
data/http/json/init.rb ADDED
@@ -0,0 +1,6 @@
1
+ # encode: UTF-8
2
+
3
+ def json_init request,args,session,event
4
+ data={type: :register_table, data: NRF24::register_table }
5
+ return ["application/json",data]
6
+ end
@@ -0,0 +1,25 @@
1
+ # encode: UTF-8
2
+
3
+ def json_logger request,args,session,event
4
+ if not session or session==0
5
+ return ["text/event-stream",{}]
6
+ end
7
+ @http_sessions[session][:log_pos]=0 if not @http_sessions[session][:log_pos]
8
+ size=NRF24::get_log.size
9
+ if @http_sessions[session][:log_pos]!=size
10
+ if size-@http_sessions[session][:log_pos]>30
11
+ @http_sessions[session][:log_pos]=size-30
12
+ end
13
+ loglines=NRF24::get_log[@http_sessions[session][:log_pos],size-@http_sessions[session][:log_pos]]
14
+ @http_sessions[session][:log_pos]=size
15
+ else
16
+ loglines=[]
17
+ end
18
+
19
+ data={
20
+ loglines: loglines,
21
+ session: session,
22
+ event: event,
23
+ }
24
+ return ["text/event-stream",data]
25
+ end
@@ -0,0 +1,10 @@
1
+ # encode: UTF-8
2
+
3
+ def json_nRF24 request,args,session,event
4
+ if not session or session==0
5
+ return ["text/event-stream",{}]
6
+ end
7
+ #sleep 3
8
+ data=NRF24::json
9
+ return ["text/event-stream",data]
10
+ end
data/lib/nRF24-ruby.rb ADDED
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: UTF-8
3
+
4
+ require 'pp'
5
+ require 'thread'
6
+ require 'pi_piper'
7
+ include PiPiper
8
+
9
+ class NRF24
10
+ @@all=[]
11
+ @@PAYLOAD_SIZE=32
12
+ @@SPI_CLOCK=250000
13
+
14
+ @@regs={
15
+ CONFIG: {address: 0x00,len:7},
16
+ EN_AA: {address: 0x01,len:5},
17
+ EN_RXADDR: {address: 0x02,len:5},
18
+ SETUP_AW: {address: 0x03},
19
+ SETUP_RETR: {address: 0x04},
20
+ RF_CH: {address: 0x05,format: :dec},
21
+ RF_SETUP: {address: 0x06,len:4},
22
+ STATUS: {address: 0x07, poll: 1,len: 7},
23
+ OBSERVE_TX: {address: 0x08, poll: 1},
24
+ CD: {address: 0x09, poll: 1, len: 1},
25
+ RX_ADDR_P0: {address: 0x0A, bytes: 5, format: :hex },
26
+ RX_ADDR_P1: {address: 0x0B, bytes: 5, format: :hex },
27
+ RX_ADDR_P2: {address: 0x0C, format: :hex},
28
+ RX_ADDR_P3: {address: 0x0D, format: :hex},
29
+ RX_ADDR_P4: {address: 0x0E, format: :hex},
30
+ RX_ADDR_P5: {address: 0x0F, format: :hex},
31
+ TX_ADDR: {address: 0x10, bytes: 5 , format: :hex},
32
+ RX_PW_P0: {address: 0x11, format: :dec},
33
+ RX_PW_P1: {address: 0x12, format: :dec},
34
+ FIFO_STATUS: {address: 0x17, poll: 1, len:7},
35
+ DYNPD: {address: 0x1C,len:5},
36
+ FEATURE: {address: 0x1D,len:3},
37
+ }
38
+
39
+ @@cmds={
40
+ R_REGISTER: 0x00,
41
+ W_REGISTER: 0x20,
42
+ ACTIVATE: 0x50,
43
+ R_RX_PL_WID: 0x60,
44
+ R_RX_PAYLOAD: 0x61,
45
+ W_TX_PAYLOAD: 0xA0,
46
+ FLUSH_TX: 0xe1,
47
+ FLUSH_RX: 0xe2,
48
+ W_TX_PAYLOAD_NOACK: 0xB0,
49
+ ACTIVATE2: 0x73,
50
+ }
51
+
52
+ @@sem=Mutex.new
53
+ @@log=[]
54
+
55
+ def self.note str,*args
56
+ begin
57
+ s=sprintf(str,*args)
58
+ text=sprintf("%s: %s",Time.now.iso8601,s)
59
+ @@log << {stamp: Time.now.to_i, text: text.encode("UTF-8", :invalid=>:replace, :replace=>"?")}
60
+ rescue => e
61
+ pp e.backtrace
62
+ puts "note dies: #{e} '#{str}'"
63
+ end
64
+ end
65
+
66
+ def get_ccode c
67
+ ccode=@@cmds[c]
68
+ if not ccode
69
+ printf("Error: Unkown Command %s\n",c);
70
+ raise "Command Error"
71
+ end
72
+ ccode
73
+ end
74
+
75
+ def get_address reg
76
+ rdata=@@regs[reg]
77
+ if not rdata
78
+ raise "Unknown Register : #{reg}"
79
+ end
80
+ [rdata[:address],rdata[:bytes]||1]
81
+ end
82
+
83
+ def cmd c,data=[]
84
+ ret=[]
85
+ status=0
86
+ cc=get_ccode(c)
87
+ @@sem.synchronize do
88
+ @cs.off
89
+ PiPiper::Spi.begin do
90
+ clock(@@SPI_CLOCK)
91
+ status=write cc
92
+ data.each do |byte|
93
+ ret << write(byte)
94
+ end
95
+ end
96
+ @cs.on
97
+ @s[:status]=status
98
+ end
99
+ ret
100
+ end
101
+
102
+
103
+ def rreg reg
104
+ status=data=0
105
+ i,bytes =get_address reg
106
+ cc=get_ccode(:R_REGISTER) +i
107
+ @@sem.synchronize do
108
+ @cs.off
109
+ PiPiper::Spi.begin do
110
+ clock(@@SPI_CLOCK)
111
+ status=write cc
112
+ if bytes==1
113
+ data=write(0xff)
114
+ else
115
+ data=[]
116
+ bytes.times do
117
+ data << write(0xff)
118
+ end
119
+ end
120
+ end
121
+ @s[:status]=status
122
+ @cs.on
123
+ end
124
+ [@s[:status],data,bytes,cc]
125
+ end
126
+
127
+ def wreg reg,data
128
+ i,bytes=get_address reg
129
+ cc=get_ccode(:W_REGISTER)+i
130
+ @@sem.synchronize do
131
+ status=0xff
132
+ @cs.off
133
+ PiPiper::Spi.begin do
134
+ clock(@@SPI_CLOCK)
135
+ status=write cc
136
+ if bytes==1
137
+ write(data)
138
+ else
139
+ data.each do |byte|
140
+ write(byte)
141
+ end
142
+ end
143
+ end
144
+ @cs.on
145
+ @s[:status]=status
146
+ end
147
+ [@s[:status]]
148
+ end
149
+
150
+ def send packet
151
+ pac=Array.new(@@PAYLOAD_SIZE, 0)
152
+ packet.each_with_index do |byte,i|
153
+ pac[i]=packet[i] if i<@@PAYLOAD_SIZE
154
+ end
155
+ @ce.off
156
+ wreg :CONFIG,0x0a
157
+ if @s[:params]
158
+ cmd :W_TX_PAYLOAD,pac
159
+ else
160
+ cmd :W_TX_PAYLOAD_NOACK,pac
161
+ end
162
+ @ce.on
163
+ sleep 0.0005
164
+ @ce.off
165
+ wreg :CONFIG,0x0b
166
+ @ce.on
167
+ end
168
+
169
+ def recv
170
+ fifo_status,_=rreg :FIFO_STATUS
171
+ if (fifo_status & 0x01) == 0x01
172
+ puts "on dataa"
173
+ end
174
+ end
175
+
176
+ def get_regs all
177
+ @@regs.each do |k,r|
178
+ next if not r[:poll] and not all
179
+ s,d,bytes,code =rreg k
180
+ @s[:regs][code]=d
181
+ end
182
+ end
183
+
184
+ def rf_server
185
+ Thread.new do
186
+ begin
187
+ loop do
188
+ donesome=false
189
+
190
+ s,d,b=rreg :FIFO_STATUS
191
+ if (s&0x40) == 0x40
192
+ NRF24::note "got RX_DR --received something"
193
+ wreg :STATUS,0x40
194
+ end
195
+ if (s&0x20) == 0x20
196
+ NRF24::note "got TX_DS --sent something"
197
+ wreg :STATUS,0x20
198
+ end
199
+ if (s&0x10) == 0x10
200
+ NRF24::note "****************** got MAX_RT --send fails..."
201
+ wreg :STATUS,0x10
202
+ @s[:sfail]+=1
203
+ end
204
+ if (d&0x01)==0x00
205
+ ret=cmd :R_RX_PAYLOAD,Array.new(@@PAYLOAD_SIZE, 0xff)
206
+ @recv_q<<ret
207
+ @s[:rcnt]+=1
208
+ donesome=true
209
+ end
210
+ if (d&0x02)==0x02
211
+ ret=cmd :R_RX_PAYLOAD,Array.new(@@PAYLOAD_SIZE, 0xff)
212
+ @recv_q<<ret
213
+ @s[:rcnt]+=1
214
+ @s[:rfull]+=1
215
+ donesome=true
216
+ end
217
+
218
+ #send rate limiter here :)
219
+ if not @send_q.empty?
220
+ if (d&0x20)==0x00
221
+
222
+
223
+ s,d,b=rreg :OBSERVE_TX
224
+ if (d&0x0f)!=0x00
225
+ NRF24::note "got ARC_CNT:#{d&0x0f}******************"
226
+ @s[:sarc]+=d&0x0f
227
+ end
228
+
229
+ msg=@send_q.pop
230
+ send msg
231
+ @s[:scnt]+=1
232
+ end
233
+ end
234
+ sleep 0.01 if not donesome
235
+ end
236
+ rescue Exception =>e
237
+ puts "do_send fails #{e}"
238
+ pp e.backtrace
239
+ end
240
+ end
241
+ end
242
+
243
+ def do_monitor
244
+ Thread.new do
245
+ begin
246
+ lc=0
247
+ loop do
248
+ get_regs(lc%10 == 0)
249
+ sleep 1
250
+ lc+=1
251
+ end
252
+ rescue Exception =>e
253
+ puts "do_monitor fails #{e}"
254
+ pp e.backtrace
255
+ end
256
+ end
257
+ end
258
+
259
+ attr_accessor :rcnt,:scnt,:rfull
260
+ attr_accessor :send_q,:recv_q,:log
261
+
262
+ def self.all_devices
263
+ @@all
264
+ end
265
+
266
+ def self.json
267
+ devs=[]
268
+ NRF24::all_devices.each do |data|
269
+ devs<<data.json
270
+ end
271
+ json ={
272
+ now:Time.now.to_i,
273
+ devs: devs,
274
+ }
275
+ return json
276
+ end
277
+
278
+ def self.register_table
279
+ @@regs
280
+ end
281
+
282
+ def json
283
+ @s
284
+ end
285
+
286
+ def self.get_log
287
+ @@log
288
+ end
289
+
290
+ def hw_init hash
291
+ @s={
292
+ stamp: 0,
293
+ params: hash,
294
+ status: 0,
295
+ regs: {},
296
+ rcnt: 0,
297
+ rfull: 0,
298
+ scnt: 0,
299
+ sarc: 0,
300
+ sfail: 0,
301
+ }
302
+ @id=hash[:id]
303
+ wreg :CONFIG,0x0b
304
+ rf_dr=(hash[:rf_dr]||1).to_i&0x01
305
+ rf_pwr=(hash[:rf_pwr]||3).to_i&0x03
306
+ lna_hcurr=(hash[:lna_hcurr]||1).to_i&0x01
307
+ wreg :RF_SETUP,(rf_dr<<3)+(rf_pwr<<1)+lna_hcurr
308
+ wreg :RF_CH,hash[:chan]||2
309
+ if hash[:ack]
310
+ wreg :SETUP_RETR,0x8f
311
+ wreg :EN_AA,0x7f
312
+ wreg :DYNPD,0x03
313
+ wreg :FEATURE,0x00
314
+ else
315
+ wreg :SETUP_RETR,0x00
316
+ wreg :EN_AA,0x00
317
+ wreg :DYNPD,0x00
318
+ wreg :FEATURE,0x01
319
+ end
320
+ wreg :SETUP_AW,0x03
321
+ wreg :STATUS,0x70
322
+ wreg :RX_PW_P0,@@PAYLOAD_SIZE
323
+ wreg :RX_PW_P1,@@PAYLOAD_SIZE
324
+ wreg :TX_ADDR,[0x12,0x34,0x56,0x78,0x9a]
325
+ wreg :RX_ADDR_P0,[0x12,0x34,0x56,0x78,0x9a]
326
+
327
+ if hash[:ack]
328
+ cmd :ACTIVATE,[ 0]
329
+ else
330
+ cmd :ACTIVATE,[ get_ccode(:ACTIVATE2)]
331
+ end
332
+
333
+ cmd :FLUSH_TX
334
+ cmd :FLUSH_RX
335
+ end
336
+
337
+ def initialize(hash={})
338
+ @semh=Mutex.new
339
+
340
+
341
+ @ce=PiPiper::Pin.new(:pin => hash[:ce], :direction => :out)
342
+ @cs=PiPiper::Pin.new(:pin => hash[:cs], :direction => :out)
343
+
344
+ @ce.on
345
+ @cs.on
346
+ @@all<<self
347
+
348
+ @recv_q=Queue.new
349
+ @send_q=Queue.new
350
+
351
+ hw_init hash
352
+
353
+ @server_t=rf_server
354
+ @monitor_t=do_monitor
355
+ end
356
+ end
357
+
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nRF24-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ari Siitonen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-28 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! 'Pure Ruby Driver and Utilitity with Http-server for the Ultra Cheap
15
+ Radio Chip nRF24 '
16
+ email: jalopuuverstas@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/nRF24-ruby.rb
22
+ - examples/nRF24-demo.rb
23
+ - http/json/logger.rb
24
+ - http/json/nRF24.rb
25
+ - http/json/action.rb
26
+ - http/json/init.rb
27
+ - http/coffee/nRF24.coffee
28
+ - http/css/nRF24.css
29
+ - http/haml/index.html
30
+ - http/haml/index.haml
31
+ homepage: https://github.com/arisi/nRF24-ruby
32
+ licenses:
33
+ - MIT
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project:
52
+ rubygems_version: 1.8.23
53
+ signing_key:
54
+ specification_version: 3
55
+ summary: Pure Ruby Driver and web-utilitity for Radio Chip nRF24
56
+ test_files: []