nRF24-ruby 0.0.1

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.
@@ -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: []