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.
- data/examples/nRF24-demo.rb +73 -0
- data/http/coffee/nRF24.coffee +118 -0
- data/http/css/nRF24.css +14 -0
- data/http/haml/index.haml +50 -0
- data/http/haml/index.html +1 -0
- data/http/json/action.rb +29 -0
- data/http/json/init.rb +6 -0
- data/http/json/logger.rb +25 -0
- data/http/json/nRF24.rb +10 -0
- data/lib/nRF24-ruby.rb +357 -0
- metadata +56 -0
@@ -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
|
data/http/css/nRF24.css
ADDED
@@ -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
|
data/http/json/action.rb
ADDED
@@ -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
data/http/json/logger.rb
ADDED
@@ -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
|
data/http/json/nRF24.rb
ADDED
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: []
|