LazGem 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +6 -2
- data/lib/LazGem/device.rb +140 -193
- data/lib/LazGem/ioctl.rb +385 -0
- data/lib/LazGem/version.rb +1 -1
- data/lib/LazGem.rb +1 -0
- data/sample/sample_rx.rb +9 -10
- data/sample/sample_tx.rb +34 -8
- metadata +17 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 985405454252520def5e31a7afae9187704aa1c4
|
4
|
+
data.tar.gz: 03699e93b777b3b52de11603b2fa40df4bce8c12
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: feae049a0705ecdac98751f784c75ef733b49d49b5ae3f2e2c180863ed028681b28711b9aa353411e2965bdf34a84f931c59e02b4328f2e23690b3a40b561445
|
7
|
+
data.tar.gz: 7fff6cd541ccb21472487dd82dd9c90db8c97469da5fd0e901b9fc2620e41b283a8321da52e178ed7df06b47198aedf3c9c0c40a072b3d6b33d9e7f30603c3fb
|
data/README.md
CHANGED
@@ -22,13 +22,17 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
please try to execute sample program
|
25
|
+
###please try to execute sample program
|
26
26
|
tx: sample\sample_tx.rb
|
27
|
+
|
27
28
|
rx: sample\sample_rx.rb
|
28
29
|
|
29
|
-
|
30
|
+
|
31
|
+
###document(Japanese only):
|
32
|
+
|
30
33
|
http://www.lapis-semi.com/lazurite-jp/contents/gateway/ruby/LazGem.html
|
31
34
|
|
35
|
+
|
32
36
|
## Development
|
33
37
|
|
34
38
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/LazGem/device.rb
CHANGED
@@ -3,8 +3,12 @@
|
|
3
3
|
# Function:
|
4
4
|
# Lazurite Pi Gateway SubGHz library
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
#################################################################
|
7
|
+
######
|
8
|
+
###### Do not forget to change path of libraries
|
9
|
+
###### require and insmod
|
10
|
+
######
|
11
|
+
################################################################
|
8
12
|
class LazGem::Device
|
9
13
|
##
|
10
14
|
# func : Read the data from the receiving pipe
|
@@ -15,44 +19,20 @@ class LazGem::Device
|
|
15
19
|
@@device_rd=nil
|
16
20
|
@@device_wr=nil
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# parameter
|
22
|
-
# ch: frequency 24-61. 36 is in default
|
23
|
-
# panid: pan id
|
24
|
-
# pwr: tx power
|
25
|
-
# rate: bit rate 50 or 100
|
26
|
-
# pwr: tx power 1 or 20
|
27
|
-
# mode: must be 2
|
28
|
-
# return
|
29
|
-
# none
|
30
|
-
def device_open(ch=36, panid=0xabcd, pwr=20, rate=100, mode=2)
|
31
|
-
if(ch < 24) || (ch > 61) then
|
32
|
-
puts "ch is invalid. it must be 24-61"
|
33
|
-
raise LAZURITE_ERROR
|
34
|
-
return
|
35
|
-
end
|
36
|
-
if(pwr != 1) && (pwr != 20) then
|
37
|
-
puts "pwr is invalid. it must be 1 or 20"
|
38
|
-
raise LAZURITE_ERROR
|
39
|
-
return
|
40
|
-
end
|
41
|
-
if(rate != 50) && (rate != 100) then
|
42
|
-
puts "rate is invalid. it must be 50 or 100"
|
43
|
-
raise LAZURITE_ERROR
|
44
|
-
return
|
45
|
-
end
|
46
|
-
cmd = "sudo insmod /home/pi/driver/LazDriver/DRV_802154.ko ch=" +ch.to_s+" panid=0x"+panid.to_s(16)+ " pwr="+pwr.to_s+" rate="+rate.to_s + " mode="+mode.to_s(16)
|
22
|
+
def init()
|
23
|
+
cmd = "sudo insmod /home/pi/driver/LazDriver/lazdriver.ko"
|
24
|
+
p cmd
|
47
25
|
result = system(cmd)
|
48
|
-
|
26
|
+
lzgw_dev = "/dev/lzgw"
|
49
27
|
sleep(0.1)
|
50
|
-
result = system("sudo chmod 777 "+
|
28
|
+
result = system("sudo chmod 777 "+lzgw_dev)
|
51
29
|
# p result
|
52
30
|
sleep(0.1)
|
53
|
-
@@device_rd = open(
|
54
|
-
@@device_wr = open(
|
55
|
-
|
31
|
+
@@device_rd = open(lzgw_dev,"rb")
|
32
|
+
@@device_wr = open(lzgw_dev,"wb")
|
33
|
+
@@device_wr.sync = true
|
34
|
+
@@device_rd.sync = true
|
35
|
+
result = system("tail -n -4 /var/log/messages")
|
56
36
|
print("\n")
|
57
37
|
# p result
|
58
38
|
print("Success to load SubGHz module\n")
|
@@ -65,180 +45,147 @@ class LazGem::Device
|
|
65
45
|
# none
|
66
46
|
# return
|
67
47
|
# none
|
68
|
-
def
|
69
|
-
|
48
|
+
def remove()
|
49
|
+
begin
|
50
|
+
@@device_rd.close
|
51
|
+
rescue Exception => e
|
52
|
+
p e
|
53
|
+
end
|
54
|
+
begin
|
70
55
|
@@device_wr.close
|
56
|
+
rescue Exception => e
|
57
|
+
p e
|
58
|
+
end
|
71
59
|
@@devie_rd = nil
|
72
60
|
@@device_wr = nil
|
73
|
-
cmd = "sudo rmmod
|
61
|
+
cmd = "sudo rmmod lazdriver"
|
74
62
|
system(cmd)
|
75
63
|
p cmd
|
76
64
|
end
|
77
65
|
|
78
|
-
|
79
|
-
# LAZURITE.read()
|
80
|
-
# function
|
81
|
-
# try to read data from SubGHz module
|
82
|
-
# parameter
|
83
|
-
# none
|
84
|
-
# return
|
85
|
-
# -1: no data
|
86
|
-
# Hash[]: receiving data
|
87
|
-
# key
|
88
|
-
# "command" => command it should be fixed to 0x03
|
89
|
-
# "Time" => Time class of receiving time
|
90
|
-
# "usec" => integer type data of usec for receiving time
|
91
|
-
# "rxPanid" => unsigned long type data of panid for receiving
|
92
|
-
# if packet does not include panid, data is -1.
|
93
|
-
# "rxAddrType" => unsigned char type deta of address type
|
94
|
-
# 0 = packet no rxAddr
|
95
|
-
# 1 = rxAddr = 8 bit integer type
|
96
|
-
# 2 = rxAddr = 16bit include rxAddr
|
97
|
-
# 3 = rxAddr = 64bit rxAddr String type
|
98
|
-
# "rxAddr" => rx address. data type is determined by rxAddrType
|
99
|
-
# "txPanid" => long type data of panid for sending
|
100
|
-
# if packet does not include panid, data is -1.
|
101
|
-
# "txAddrType" => unsigned char type deta of address type
|
102
|
-
# same meaning of data as rxAddrType
|
103
|
-
# "txAddr" => tx Address. data type is determind by txAddrType
|
104
|
-
# "rssi" => RF power, when receiving
|
105
|
-
# "payload" => binary stream type of data. need to unpack for using as strings
|
106
|
-
|
107
66
|
def read()
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
return -1
|
67
|
+
size = 2
|
68
|
+
len = @@device_rd.read(size)
|
69
|
+
if ((len == "") || (len == nil)) then # read result is empty
|
70
|
+
return -1
|
71
|
+
end
|
72
|
+
size = len.unpack("S*")[0]
|
73
|
+
|
74
|
+
# The received data is read
|
75
|
+
raw = @@device_rd.read(size)
|
76
|
+
if ((raw == "") || (raw == nil)) then # read result is empty
|
77
|
+
return -1
|
120
78
|
end
|
121
|
-
return recv_dec(recv_buf,size)
|
122
|
-
end
|
123
|
-
|
124
|
-
def recv_dec(raw,size)
|
125
|
-
# PANID
|
126
|
-
command = raw[0..1].unpack("S*")[0]
|
127
|
-
tv_sec = raw[2..5].unpack("L*")[0]
|
128
|
-
tv_usec = raw[6..9].unpack("L*")[0]/1000
|
129
|
-
t = Time.at(tv_sec,tv_usec)
|
130
|
-
area = raw[10..11].unpack("a2")[0]
|
131
|
-
ch = raw[12..13].unpack("S*")[0]
|
132
|
-
rate = raw[14..15].unpack("S*")[0]
|
133
|
-
pwr = raw[16..17].unpack("S*")[0]
|
134
|
-
header = raw[18..21].unpack("L*")[0]
|
135
|
-
rxPanid = raw[22..25].unpack("L*")[0]
|
136
|
-
rxAddrType = raw[26].unpack("C*")[0]
|
137
|
-
if rxAddrType == 0 then
|
138
|
-
rxAddr = -1
|
139
|
-
elsif rxAddrType == 1 then
|
140
|
-
rxAddr = raw[34].unpack("n*")[0]
|
141
|
-
elsif rxAddrType == 2 then
|
142
|
-
rxAddr = raw[33..34].unpack("n*")[0]
|
143
|
-
elsif rxAddrType == 3 then
|
144
|
-
rxAddr = raw[27..34].unpack("a8*")[0]
|
145
|
-
end
|
146
|
-
txPanid = raw[35..38].unpack("L*")[0]
|
147
|
-
txAddrType = raw[39].unpack("C*")[0]
|
148
|
-
|
149
|
-
if txAddrType == 0 then
|
150
|
-
txAddr = -1
|
151
|
-
elsif txAddrType == 1 then
|
152
|
-
txAddr = raw[47].unpack("n*")[0]
|
153
|
-
elsif txAddrType == 2 then
|
154
|
-
txAddr = raw[46..47].unpack("n*")[0]
|
155
|
-
elsif txAddrType == 3 then
|
156
|
-
txAddr = raw[40..47].unpack("a8*")[0]
|
157
|
-
end
|
158
|
-
|
159
|
-
rssi = raw[48].unpack("C*")[0]
|
160
|
-
payload = raw[49..size-1]
|
161
79
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
# LAZURITE.write()
|
182
|
-
# function
|
183
|
-
# sending data by SubGHz
|
184
|
-
# currently only one format is supported.
|
185
|
-
# parameter
|
186
|
-
# HASH[]
|
187
|
-
# currently two parameter should be included.
|
188
|
-
# "rxAddr" => Integer type of rxAddress
|
189
|
-
# "payload" => binary array of sending data
|
190
|
-
# <option>
|
191
|
-
# "rxPanid" => rxPanid. If it is not included, rxPanid = 0xABCD
|
192
|
-
# return
|
193
|
-
# none
|
194
|
-
# Exception
|
195
|
-
# KeyError : if hash data does not include rxAddr, this error is raisen.
|
196
|
-
# PAYLOAD_SIZE_OVER : payload length is over
|
197
|
-
def write(packet)
|
198
|
-
begin
|
199
|
-
rxAddrType =packet.fetch("header")
|
200
|
-
rescue KeyError
|
201
|
-
header =0xa821
|
80
|
+
len = raw.length
|
81
|
+
header = raw.unpack("S*")[0]
|
82
|
+
|
83
|
+
rx_addr_type = (header>>14) & 0x03
|
84
|
+
frame_ver = (header >> 12) & 0x03
|
85
|
+
tx_addr_type = (header >> 10) & 0x03
|
86
|
+
ielist = (header >> 9) & 0x01
|
87
|
+
seq_comp = (header >> 8) & 0x01
|
88
|
+
panid_comp = (header >> 6) & 0x01
|
89
|
+
ack_req = (header >> 5) & 0x01
|
90
|
+
pending = (header >> 4) & 0x01
|
91
|
+
sec_enb = (header >> 3) & 0x01
|
92
|
+
frame_type = (header >> 0) & 0x07
|
93
|
+
|
94
|
+
offset = 2
|
95
|
+
|
96
|
+
if seq_comp == 0 then
|
97
|
+
seq = raw[offset..offset+1].unpack("C")[0]
|
98
|
+
offset = offset + 1
|
202
99
|
end
|
203
|
-
seq = 0
|
204
100
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
101
|
+
if rx_addr_type == 0 && tx_addr_type == 0 && panid_comp == 0 then
|
102
|
+
addr_type = 0
|
103
|
+
rx_panid = nil
|
104
|
+
tx_panid = nil
|
105
|
+
elsif rx_addr_type == 0 && tx_addr_type == 0 && panid_comp != 0 then
|
106
|
+
addr_type = 1
|
107
|
+
rx_panid = raw[offset..offset+2].unpack("S*")[0]
|
108
|
+
offset = offset + 2
|
109
|
+
tx_panid = nil
|
110
|
+
elsif rx_addr_type == 0 && tx_addr_type != 0 && panid_comp == 0 then
|
111
|
+
addr_type = 2
|
112
|
+
rx_panid = nil
|
113
|
+
tx_panid = raw[offset..offset+2].unpack("S*")[0]
|
114
|
+
offset = offset + 2
|
115
|
+
elsif rx_addr_type == 0 && tx_addr_type != 0 && panid_comp != 0 then
|
116
|
+
addr_type = 3
|
117
|
+
rx_panid = nil
|
118
|
+
tx_panid = nil
|
119
|
+
elsif rx_addr_type != 0 && tx_addr_type == 0 && panid_comp == 0 then
|
120
|
+
addr_type = 4
|
121
|
+
rx_panid = raw[offset..offset+2].unpack("S*")[0]
|
122
|
+
offset = offset + 2
|
123
|
+
tx_panid = nil
|
124
|
+
elsif rx_addr_type != 0 && tx_addr_type == 0 && panid_comp != 0 then
|
125
|
+
addr_type = 5
|
126
|
+
rx_panid = nil
|
127
|
+
tx_panid = nil
|
128
|
+
elsif rx_addr_type != 0 && tx_addr_type != 0 && panid_comp == 0 then
|
129
|
+
addr_type = 6
|
130
|
+
rx_panid = raw[offset..offset+2].unpack("S*")[0]
|
131
|
+
offset = offset + 2
|
132
|
+
tx_panid = nil
|
133
|
+
elsif rx_addr_type != 0 && tx_addr_type != 0 && panid_comp != 0 then
|
134
|
+
addr_type = 7
|
135
|
+
rx_panid = nil
|
136
|
+
tx_panid = nil
|
210
137
|
end
|
211
138
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
puts "Payload size over. maximum length is less than 235"
|
222
|
-
raise LAZURITE_ERROR
|
223
|
-
return
|
139
|
+
if rx_addr_type == 1 then
|
140
|
+
rx_addr = raw[offset..offset+1].unpack("C")[0]
|
141
|
+
offset = offset+1
|
142
|
+
elsif rx_addr_type == 2 then
|
143
|
+
rx_addr = raw[offset..offset+2].unpack("S*")[0]
|
144
|
+
offset = offset+2
|
145
|
+
else
|
146
|
+
rx_addr = raw[offset..offset+8].unpack("H*")[0]
|
147
|
+
offset = offset+8
|
224
148
|
end
|
225
149
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
150
|
+
if tx_addr_type == 1 then
|
151
|
+
tx_addr = raw[offset..offset+1].unpack("C")[0]
|
152
|
+
offset = offset+1
|
153
|
+
elsif tx_addr_type == 2 then
|
154
|
+
tx_addr = raw[offset..offset+2].unpack("S")[0]
|
155
|
+
offset = offset+2
|
156
|
+
else
|
157
|
+
tx_addr = raw[offset..offset+8].unpack("H*")[0]
|
158
|
+
offset = offset+8
|
234
159
|
end
|
235
|
-
|
160
|
+
|
161
|
+
payload = raw[offset..len-1].unpack("Z*")[0]
|
162
|
+
|
163
|
+
rcv = Hash.new()
|
164
|
+
|
165
|
+
rcv["header"] = header
|
166
|
+
rcv["rx_addr_type"] = rx_addr_type
|
167
|
+
rcv["frame_ver"] = frame_ver
|
168
|
+
rcv["tx_addr_type"] = tx_addr_type
|
169
|
+
rcv["ielist"] = ielist
|
170
|
+
rcv["seq_comp"] = seq_comp
|
171
|
+
rcv["panid_comp"] = panid_comp
|
172
|
+
rcv["ack_req"] = ack_req
|
173
|
+
rcv["pending"] = pending
|
174
|
+
rcv["sec_enb"] = sec_enb
|
175
|
+
rcv["frame_type"] = frame_type
|
176
|
+
rcv["addr_type"] = addr_type
|
177
|
+
rcv["rx_panid"] = rx_panid
|
178
|
+
rcv["tx_panid"] = tx_panid
|
179
|
+
rcv["rx_addr"] = rx_addr
|
180
|
+
rcv["tx_addr"] = tx_addr
|
181
|
+
rcv["payload"] = payload
|
182
|
+
|
183
|
+
return rcv
|
236
184
|
end
|
237
|
-
def
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
print("\n")
|
185
|
+
def send(panid,addr,payload)
|
186
|
+
set_tx_panid(panid)
|
187
|
+
set_tx_addr0(addr)
|
188
|
+
@@device_wr.write(payload)
|
189
|
+
sleep 0.001
|
243
190
|
end
|
244
191
|
end
|
data/lib/LazGem/ioctl.rb
ADDED
@@ -0,0 +1,385 @@
|
|
1
|
+
|
2
|
+
# -*- coding: utf-8; mode: ruby -*-
|
3
|
+
#
|
4
|
+
# Function:
|
5
|
+
# Lazurite Pi Gateway SubGHz library
|
6
|
+
|
7
|
+
class LazGem::Device
|
8
|
+
IOCTL_CMD= 0x0000
|
9
|
+
IOCTL_SET_BEGIN= IOCTL_CMD+0x11
|
10
|
+
IOCTL_SET_RXON= IOCTL_CMD+0x13
|
11
|
+
IOCTL_SET_RXOFF= IOCTL_CMD+0x15
|
12
|
+
IOCTL_SET_CLOSE= IOCTL_CMD+0x17
|
13
|
+
IOCTL_GET_SEND_MODE= IOCTL_CMD+0x18
|
14
|
+
IOCTL_SET_SEND_MODE= IOCTL_CMD+0x19
|
15
|
+
IOCTL_PARAM= 0x1000
|
16
|
+
IOCTL_GET_CH= IOCTL_PARAM+0x02
|
17
|
+
IOCTL_SET_CH= IOCTL_PARAM+0x03
|
18
|
+
IOCTL_GET_PWR= IOCTL_PARAM+0x04
|
19
|
+
IOCTL_SET_PWR= IOCTL_PARAM+0x05
|
20
|
+
IOCTL_GET_BPS= IOCTL_PARAM+0x06
|
21
|
+
IOCTL_SET_BPS= IOCTL_PARAM+0x07
|
22
|
+
IOCTL_GET_MY_PANID= IOCTL_PARAM+0x08
|
23
|
+
IOCTL_SET_MY_PANID= IOCTL_PARAM+0x09
|
24
|
+
IOCTL_GET_TX_PANID= IOCTL_PARAM+0x0a
|
25
|
+
IOCTL_SET_TX_PANID= IOCTL_PARAM+0x0b
|
26
|
+
IOCTL_GET_MY_ADDR0= IOCTL_PARAM+0x0c
|
27
|
+
IOCTL_SET_MY_ADDR0= IOCTL_PARAM+0x0d
|
28
|
+
IOCTL_GET_MY_ADDR1= IOCTL_PARAM+0x0e
|
29
|
+
IOCTL_SET_MY_ADDR1= IOCTL_PARAM+0x0f
|
30
|
+
IOCTL_GET_MY_ADDR2= IOCTL_PARAM+0x10
|
31
|
+
IOCTL_SET_MY_ADDR2= IOCTL_PARAM+0x11
|
32
|
+
IOCTL_GET_MY_ADDR3= IOCTL_PARAM+0x12
|
33
|
+
IOCTL_SET_MY_ADDR3= IOCTL_PARAM+0x13
|
34
|
+
IOCTL_GET_TX_ADDR0= IOCTL_PARAM+0x14
|
35
|
+
IOCTL_SET_TX_ADDR0= IOCTL_PARAM+0x15
|
36
|
+
IOCTL_GET_TX_ADDR1= IOCTL_PARAM+0x16
|
37
|
+
IOCTL_SET_TX_ADDR1= IOCTL_PARAM+0x17
|
38
|
+
IOCTL_GET_TX_ADDR2= IOCTL_PARAM+0x18
|
39
|
+
IOCTL_SET_TX_ADDR2= IOCTL_PARAM+0x19
|
40
|
+
IOCTL_GET_TX_ADDR3= IOCTL_PARAM+0x1a
|
41
|
+
IOCTL_SET_TX_ADDR3= IOCTL_PARAM+0x1b
|
42
|
+
IOCTL_GET_ADDR_TYPE= IOCTL_PARAM+0x1c
|
43
|
+
IOCTL_SET_ADDR_TYPE= IOCTL_PARAM+0x1d
|
44
|
+
IOCTL_GET_ADDR_SIZE= IOCTL_PARAM+0x1e
|
45
|
+
IOCTL_SET_ADDR_SIZE= IOCTL_PARAM+0x1f
|
46
|
+
IOCTL_GET_DRV_MODE= IOCTL_PARAM+0x20
|
47
|
+
IOCTL_SET_DRV_MODE= IOCTL_PARAM+0x21
|
48
|
+
IOCTL_GET_SENSE_TIME= IOCTL_PARAM+0x22
|
49
|
+
IOCTL_SET_SENSE_TIME= IOCTL_PARAM+0x23
|
50
|
+
IOCTL_GET_TX_RETRY= IOCTL_PARAM+0x24
|
51
|
+
IOCTL_SET_TX_RETRY= IOCTL_PARAM+0x25
|
52
|
+
IOCTL_GET_TX_INTERVAL= IOCTL_PARAM+0x26
|
53
|
+
IOCTL_SET_TX_INTERVAL= IOCTL_PARAM+0x27
|
54
|
+
IOCTL_GET_CCA_WAIT= IOCTL_PARAM+0x28
|
55
|
+
IOCTL_SET_CCA_WAIT= IOCTL_PARAM+0x29
|
56
|
+
IOCTL_GET_RX_SEC0= IOCTL_PARAM+0x2A
|
57
|
+
IOCTL_GET_RX_SEC1= IOCTL_PARAM+0x2C
|
58
|
+
IOCTL_GET_RX_NSEC0= IOCTL_PARAM+0x2E
|
59
|
+
IOCTL_GET_RX_NSEC1= IOCTL_PARAM+0x30
|
60
|
+
IOCTL_GET_RX_RSSI= IOCTL_PARAM+0x32
|
61
|
+
IOCTL_GET_TX_RSSI= IOCTL_PARAM+0x34
|
62
|
+
IOCTL_RF= 0x2000
|
63
|
+
IOCTL_RF_READ= IOCTL_RF+0x0000
|
64
|
+
IOCTL_RF_WRITE= IOCTL_RF+0x8000
|
65
|
+
IOCTL_EEPROM= 0x3000
|
66
|
+
IOCTL_RX_LED= 0x4000
|
67
|
+
IOCTL_TX_LED= 0x4000
|
68
|
+
|
69
|
+
### API
|
70
|
+
def begin(ch,panid,bps,pwr)
|
71
|
+
set_ch(ch)
|
72
|
+
set_my_panid(panid)
|
73
|
+
set_bps(bps)
|
74
|
+
set_pwr(pwr)
|
75
|
+
return set_begin()
|
76
|
+
end
|
77
|
+
def getMyAddress()
|
78
|
+
return get_my_addr0()
|
79
|
+
end
|
80
|
+
def rxDisable()
|
81
|
+
rxon = 0;
|
82
|
+
ret = @@device_wr.ioctl(IOCTL_SET_RXOFF,rxon)
|
83
|
+
return ret
|
84
|
+
end
|
85
|
+
def rxEnable()
|
86
|
+
rxon = 1
|
87
|
+
ret = @@device_wr.ioctl(IOCTL_SET_RXON,rxon)
|
88
|
+
return ret
|
89
|
+
end
|
90
|
+
def close()
|
91
|
+
data = 0
|
92
|
+
ret = @@device_wr.ioctl(IOCTL_SET_CLOSE,data)
|
93
|
+
return ret
|
94
|
+
end
|
95
|
+
def getSendMode()
|
96
|
+
data = 0
|
97
|
+
ret = @@device_wr.ioctl(IOCTL_GET_SEND_MODE,data)
|
98
|
+
param = Hash.new()
|
99
|
+
param["addr_type"] = get_addr_type()
|
100
|
+
param["sense_time"] = get_sense_time()
|
101
|
+
param["tx_retry"] = get_tx_retry()
|
102
|
+
param["tx_interval"] = get_tx_interval()
|
103
|
+
param["cca_wait"] = get_cca_wait()
|
104
|
+
param["my_address"] = get_my_addr0()
|
105
|
+
return param
|
106
|
+
end
|
107
|
+
def setSendMode(param)
|
108
|
+
ret = @@device_wr.ioctl(IOCTL_GET_SEND_MODE,data)
|
109
|
+
begin
|
110
|
+
data = param.fetch("addr_type")
|
111
|
+
ret = @@device_wr.ioctl(IOCTL_SET_ADDR_TYPE,data)
|
112
|
+
rescue Exception
|
113
|
+
end
|
114
|
+
begin
|
115
|
+
data = param.fetch("sense_time")
|
116
|
+
ret = @@device_wr.ioctl(IOCTL_SET_SENSE_TIME,data)
|
117
|
+
rescue Exception
|
118
|
+
end
|
119
|
+
begin
|
120
|
+
data = param.fetch("tx_retry")
|
121
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_RETRY,data)
|
122
|
+
rescue Exception
|
123
|
+
end
|
124
|
+
begin
|
125
|
+
data = param.fetch("tx_interval")
|
126
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_INTERVAL,data)
|
127
|
+
rescue Exception
|
128
|
+
end
|
129
|
+
begin
|
130
|
+
data = param.fetch("cca_wait")
|
131
|
+
ret = @@device_wr.ioctl(IOCTL_SET_CCA_WAIT,data)
|
132
|
+
rescue Exception
|
133
|
+
end
|
134
|
+
begin
|
135
|
+
data = param.fetch("my_address")
|
136
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_ADDRESS,data)
|
137
|
+
rescue Exception
|
138
|
+
end
|
139
|
+
ret = @@device_wr.ioctl(IOCTL_SET_SEND_MODE,data)
|
140
|
+
return ret
|
141
|
+
end
|
142
|
+
|
143
|
+
### Libraries
|
144
|
+
def set_begin()
|
145
|
+
data = 0;
|
146
|
+
ret = @@device_wr.ioctl(IOCTL_SET_BEGIN,data)
|
147
|
+
return ret
|
148
|
+
end
|
149
|
+
def get_ch()
|
150
|
+
ch = 0;
|
151
|
+
ret = @@device_wr.ioctl(IOCTL_GET_CH,ch)
|
152
|
+
return ret
|
153
|
+
end
|
154
|
+
def set_ch(ch)
|
155
|
+
ret = @@device_wr.ioctl(IOCTL_SET_CH,ch)
|
156
|
+
end
|
157
|
+
def get_pwr()
|
158
|
+
pwr = 0;
|
159
|
+
ret = @@device_wr.ioctl(IOCTL_GET_PWR,pwr)
|
160
|
+
return ret
|
161
|
+
end
|
162
|
+
def set_pwr(pwr)
|
163
|
+
ret = @@device_wr.ioctl(IOCTL_SET_PWR,pwr)
|
164
|
+
return ret
|
165
|
+
end
|
166
|
+
def get_bps()
|
167
|
+
bps = 0;
|
168
|
+
ret = @@device_wr.ioctl(IOCTL_GET_BPS,bps)
|
169
|
+
return ret
|
170
|
+
end
|
171
|
+
def set_bps(bps)
|
172
|
+
ret = @@device_wr.ioctl(IOCTL_SET_BPS,bps)
|
173
|
+
return ret
|
174
|
+
end
|
175
|
+
def get_my_panid()
|
176
|
+
panid = 0;
|
177
|
+
ret = @@device_wr.ioctl(IOCTL_GET_MY_PANID,panid)
|
178
|
+
return ret
|
179
|
+
end
|
180
|
+
def set_my_panid(panid)
|
181
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_PANID,panid)
|
182
|
+
return ret
|
183
|
+
end
|
184
|
+
def get_tx_panid()
|
185
|
+
panid = 0;
|
186
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_PANID,panid)
|
187
|
+
return ret
|
188
|
+
end
|
189
|
+
def set_tx_panid(panid)
|
190
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_PANID,panid)
|
191
|
+
return ret
|
192
|
+
end
|
193
|
+
def get_my_addr0()
|
194
|
+
addr = 0;
|
195
|
+
ret = @@device_wr.ioctl(IOCTL_GET_MY_ADDR0,addr)
|
196
|
+
return ret
|
197
|
+
end
|
198
|
+
def set_my_addr0(addr)
|
199
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_ADDR0,addr)
|
200
|
+
return ret
|
201
|
+
end
|
202
|
+
def get_my_addr1()
|
203
|
+
addr = 0;
|
204
|
+
ret = @@device_wr.ioctl(IOCTL_GET_MY_ADDR1,addr)
|
205
|
+
return ret
|
206
|
+
end
|
207
|
+
def set_my_addr1(addr)
|
208
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_ADDR1,addr)
|
209
|
+
return ret
|
210
|
+
end
|
211
|
+
def get_my_addr2()
|
212
|
+
addr = 0;
|
213
|
+
ret = @@device_wr.ioctl(IOCTL_GET_MY_ADDR2,addr)
|
214
|
+
return ret
|
215
|
+
end
|
216
|
+
def set_my_addr2(addr)
|
217
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_ADDR2,addr)
|
218
|
+
return ret
|
219
|
+
end
|
220
|
+
def get_my_addr3()
|
221
|
+
addr = 0;
|
222
|
+
ret = @@device_wr.ioctl(IOCTL_GET_MY_ADDR3,addr)
|
223
|
+
return ret
|
224
|
+
end
|
225
|
+
def set_my_addr3(addr)
|
226
|
+
ret = @@device_wr.ioctl(IOCTL_SET_MY_ADDR3,addr)
|
227
|
+
return ret
|
228
|
+
end
|
229
|
+
def get_tx_addr0()
|
230
|
+
addr = 0;
|
231
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_ADDR0,addr)
|
232
|
+
return ret
|
233
|
+
end
|
234
|
+
def set_tx_addr0(addr)
|
235
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_ADDR0,addr)
|
236
|
+
return ret
|
237
|
+
end
|
238
|
+
def get_tx_addr1()
|
239
|
+
addr = 0;
|
240
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_ADDR1,addr)
|
241
|
+
return ret
|
242
|
+
end
|
243
|
+
def set_tx_addr1(addr)
|
244
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_ADDR1,addr)
|
245
|
+
return ret
|
246
|
+
end
|
247
|
+
def get_tx_addr2()
|
248
|
+
addr = 0;
|
249
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_ADDR2,addr)
|
250
|
+
return ret
|
251
|
+
end
|
252
|
+
def set_tx_addr2(addr)
|
253
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_ADDR2,addr)
|
254
|
+
return ret
|
255
|
+
end
|
256
|
+
def get_tx_addr3()
|
257
|
+
addr = 0;
|
258
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_ADDR3,addr)
|
259
|
+
return ret
|
260
|
+
end
|
261
|
+
def set_tx_addr3(addr)
|
262
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_ADDR3,addr)
|
263
|
+
return ret
|
264
|
+
end
|
265
|
+
def get_addr_type()
|
266
|
+
type = 0
|
267
|
+
ret = @@device_wr.ioctl(IOCTL_GET_ADDR_TYPE,type)
|
268
|
+
return ret
|
269
|
+
end
|
270
|
+
def set_addr_type(type)
|
271
|
+
ret = @@device_wr.ioctl(IOCTL_SET_ADDR_TYPE,type)
|
272
|
+
return ret
|
273
|
+
end
|
274
|
+
def get_addr_size()
|
275
|
+
size = 0;
|
276
|
+
ret = @@device_wr.ioctl(IOCTL_GET_ADDR_SIZE,size)
|
277
|
+
return ret
|
278
|
+
end
|
279
|
+
def set_addr_size(size)
|
280
|
+
ret = @@device_wr.ioctl(IOCTL_SET_ADDR_SIZE,size)
|
281
|
+
return ret
|
282
|
+
end
|
283
|
+
def get_drv_mode()
|
284
|
+
mode = 0;
|
285
|
+
ret = @@device_wr.ioctl(IOCTL_GET_DRV_MODE,mode)
|
286
|
+
return ret
|
287
|
+
end
|
288
|
+
def set_drv_mode(mode)
|
289
|
+
ret = @@device_wr.ioctl(IOCTL_SET_DRV_MODE,mode)
|
290
|
+
return ret
|
291
|
+
end
|
292
|
+
def get_sense_time()
|
293
|
+
sense_time = 0;
|
294
|
+
ret = @@device_wr.ioctl(IOCTL_GET_SENSE_TIME,sense_time)
|
295
|
+
return ret
|
296
|
+
end
|
297
|
+
def set_sense_time(sense_time)
|
298
|
+
ret = @@device_wr.ioctl(IOCTL_SET_SENSE_TIME,sense_time)
|
299
|
+
return ret
|
300
|
+
end
|
301
|
+
def get_tx_retry()
|
302
|
+
tx_retry = 0;
|
303
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_RETRY,tx_retry)
|
304
|
+
return ret
|
305
|
+
end
|
306
|
+
def set_tx_retry(tx_retry)
|
307
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_RETRY,tx_retry)
|
308
|
+
return ret
|
309
|
+
end
|
310
|
+
def get_tx_interval()
|
311
|
+
tx_interval = 0;
|
312
|
+
ret = @@device_wr.ioctl(IOCTL_GET_TX_INTERVAL,tx_interval)
|
313
|
+
return ret
|
314
|
+
end
|
315
|
+
def set_tx_interval(tx_interval)
|
316
|
+
ret = @@device_wr.ioctl(IOCTL_SET_TX_INTERVAL,tx_interval)
|
317
|
+
return ret
|
318
|
+
end
|
319
|
+
def get_cca_wait()
|
320
|
+
cca_wait = 0;
|
321
|
+
ret = @@device_wr.ioctl(IOCTL_GET_CCA_WAIT,cca_wait)
|
322
|
+
return ret
|
323
|
+
end
|
324
|
+
def set_cca_wait(cca_wait)
|
325
|
+
ret = @@device_wr.ioctl(IOCTL_SET_CCA_WAIT,cca_wait)
|
326
|
+
return ret
|
327
|
+
end
|
328
|
+
def get_rx_time()
|
329
|
+
tmp = 0;
|
330
|
+
rx_sec = @@device_wr.ioctl(IOCTL_GET_RX_SEC1,tmp)
|
331
|
+
rx_sec = rx_sec * 65536 + @@device_wr.ioctl(IOCTL_GET_RX_SEC0,tmp)
|
332
|
+
rx_nsec = @@device_wr.ioctl(IOCTL_GET_RX_NSEC1,tmp)
|
333
|
+
rx_nsec = rx_nsec *65536 + @@device_wr.ioctl(IOCTL_GET_RX_NSEC0,tmp)
|
334
|
+
rx_time = Hash.new()
|
335
|
+
rx_time["sec"] = rx_sec
|
336
|
+
rx_time["nsec"] = rx_nsec
|
337
|
+
return rx_time
|
338
|
+
end
|
339
|
+
def get_rx_rssi()
|
340
|
+
tmp = 0;
|
341
|
+
rssi = @@device_wr.ioctl(IOCTL_GET_RX_RSSI,tmp)
|
342
|
+
return rssi
|
343
|
+
end
|
344
|
+
def get_tx_rssi()
|
345
|
+
tmp = 0;
|
346
|
+
rssi = @@device_wr.ioctl(IOCTL_GET_TX_RSSI,tmp)
|
347
|
+
return rssi
|
348
|
+
end
|
349
|
+
|
350
|
+
def rf_reg_read(addr)
|
351
|
+
data = 0;
|
352
|
+
if addr >= 0 || addr <= 0xff then
|
353
|
+
ret = @@device_wr.ioctl(IOCTL_RF_READ + addr,data)
|
354
|
+
return ret
|
355
|
+
end
|
356
|
+
end
|
357
|
+
def rf_reg_write(addr,data)
|
358
|
+
if addr >= 0 || ch <= 0xff || data >= 0 || data <= 0xff then
|
359
|
+
ret = @@device_wr.ioctl(IOCTL_RF_WRITE+addr ,data)
|
360
|
+
return ret
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
def eeprom_read(addr)
|
365
|
+
data = 0;
|
366
|
+
if addr >= 0 || addr <= 0x0fff then
|
367
|
+
ret = @@device_wr.ioctl(IOCTL_EEPROM + addr,data)
|
368
|
+
return ret
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
def rx_led(time)
|
373
|
+
if time >= 0 || time <= 0xffff then
|
374
|
+
ret = @@device_wr.ioctl(IOCTL_RX_LED,time)
|
375
|
+
return ret
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
def tx_led(time)
|
380
|
+
if time >= 0 || time <= 0xffff then
|
381
|
+
ret = @@device_wr.ioctl(IOCTL_TX_LED,time)
|
382
|
+
return ret
|
383
|
+
end
|
384
|
+
end
|
385
|
+
end
|
data/lib/LazGem/version.rb
CHANGED
data/lib/LazGem.rb
CHANGED
data/sample/sample_rx.rb
CHANGED
@@ -22,7 +22,10 @@ Signal.trap(:INT){
|
|
22
22
|
# rate: bit rate 50 or 100
|
23
23
|
# pwr: tx power 1 or 20
|
24
24
|
# mode: must be 2
|
25
|
-
laz.
|
25
|
+
laz.init()
|
26
|
+
laz.begin(36,0xABCD,100,20)
|
27
|
+
print(sprintf("myAddress=0x%04x\n",laz.getMyAddress()))
|
28
|
+
laz.rxEnable()
|
26
29
|
|
27
30
|
# printing header of receiving log
|
28
31
|
print(sprintf("time\t\t\t\trxPanid\trxAddr\ttxAddr\trssi\tpayload\n"))
|
@@ -35,17 +38,13 @@ while finish_flag == 0 do
|
|
35
38
|
next
|
36
39
|
end
|
37
40
|
# printing data
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
rcv["rxAddr"],
|
43
|
-
rcv["txAddr"],
|
44
|
-
rcv["rssi"],
|
45
|
-
rcv["payload"].unpack("a*")[0]))
|
41
|
+
p rcv
|
42
|
+
rx_time = laz.get_rx_time()
|
43
|
+
rssi = laz.get_rx_rssi()
|
44
|
+
print(sprintf("rx_time= %s\trx_nsec=%d\trssi=%d\n",Time.at(rx_time["sec"]),rx_time["nsec"],rssi));
|
46
45
|
end
|
47
46
|
|
48
47
|
# finishing process
|
49
|
-
laz.
|
48
|
+
laz.remove()
|
50
49
|
|
51
50
|
|
data/sample/sample_tx.rb
CHANGED
@@ -7,22 +7,48 @@ require 'LazGem'
|
|
7
7
|
|
8
8
|
laz = LazGem::Device.new
|
9
9
|
|
10
|
+
# Halt process when CTRL+C is pushed.
|
10
11
|
finish_flag=0
|
11
12
|
Signal.trap(:INT){
|
12
13
|
finish_flag=1
|
13
14
|
}
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
# open device deriver
|
16
|
+
#
|
17
|
+
# LAZURITE.open(ch=36,panid=0xabcd,pwr=20,rate=100),mode=2)
|
18
|
+
# parameter
|
19
|
+
# ch: frequency 24-61. 36 is in default
|
20
|
+
# panid: pan id
|
21
|
+
# pwr: tx power
|
22
|
+
# rate: bit rate 50 or 100
|
23
|
+
# pwr: tx power 1 or 20
|
24
|
+
# mode: must be 2
|
25
|
+
laz.init()
|
26
|
+
print(sprintf("myAddress=0x%04x\n",laz.getMyAddress()))
|
27
|
+
i = 0
|
28
|
+
# main routine
|
17
29
|
while finish_flag == 0 do
|
18
|
-
tx = Hash["rxAddr" => 0x902b]
|
19
|
-
tx["payload"] = "Welcome SubGHz\n"
|
20
30
|
begin
|
21
|
-
|
22
|
-
rescue
|
31
|
+
laz.begin(36,0xABCD,100,20)
|
32
|
+
rescue Exception => e
|
33
|
+
p "file io error!! reset driver"
|
34
|
+
laz.remove()
|
35
|
+
laz.init()
|
36
|
+
end
|
37
|
+
begin
|
38
|
+
payload =sprintf("hello pi gateway %d\n",i)
|
39
|
+
p payload
|
40
|
+
laz.send(0xabcd,0x5fba,payload)
|
41
|
+
p laz.get_tx_rssi()
|
42
|
+
laz.close()
|
43
|
+
rescue Exception => e
|
44
|
+
p e
|
45
|
+
sleep 1
|
23
46
|
end
|
47
|
+
sleep 1.000
|
48
|
+
i = i + 1
|
24
49
|
end
|
25
50
|
|
26
|
-
|
51
|
+
# finishing process
|
52
|
+
laz.remove()
|
27
53
|
|
28
54
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: LazGem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- NaotakaSaito
|
@@ -10,57 +9,51 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: exe
|
12
11
|
cert_chain: []
|
13
|
-
date: 2016-
|
12
|
+
date: 2016-09-01 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: bundler
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- - ~>
|
18
|
+
- - "~>"
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '1.11'
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- - ~>
|
25
|
+
- - "~>"
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '1.11'
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rake
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- - ~>
|
32
|
+
- - "~>"
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '10.0'
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- - ~>
|
39
|
+
- - "~>"
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '10.0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: minitest
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- - ~>
|
46
|
+
- - "~>"
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '5.0'
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- - ~>
|
53
|
+
- - "~>"
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '5.0'
|
63
|
-
description:
|
56
|
+
description: 'low power IoT device '
|
64
57
|
email:
|
65
58
|
- saitou088@dsn.lapis-semi.com
|
66
59
|
- saito253@dsn.lapis-semi.com
|
@@ -68,8 +61,8 @@ executables: []
|
|
68
61
|
extensions: []
|
69
62
|
extra_rdoc_files: []
|
70
63
|
files:
|
71
|
-
- .gitignore
|
72
|
-
- .travis.yml
|
64
|
+
- ".gitignore"
|
65
|
+
- ".travis.yml"
|
73
66
|
- CODE_OF_CONDUCT.md
|
74
67
|
- Gemfile
|
75
68
|
- LICENSE.txt
|
@@ -80,6 +73,7 @@ files:
|
|
80
73
|
- bin/setup
|
81
74
|
- lib/LazGem.rb
|
82
75
|
- lib/LazGem/device.rb
|
76
|
+
- lib/LazGem/ioctl.rb
|
83
77
|
- lib/LazGem/version.rb
|
84
78
|
- release.log
|
85
79
|
- sample/sample_rx.rb
|
@@ -87,26 +81,25 @@ files:
|
|
87
81
|
homepage: https://github.com/LAPIS-Lazurite/LazGem
|
88
82
|
licenses:
|
89
83
|
- MIT
|
84
|
+
metadata: {}
|
90
85
|
post_install_message:
|
91
86
|
rdoc_options: []
|
92
87
|
require_paths:
|
93
88
|
- lib
|
94
89
|
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
90
|
requirements:
|
97
|
-
- -
|
91
|
+
- - ">="
|
98
92
|
- !ruby/object:Gem::Version
|
99
93
|
version: '0'
|
100
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
95
|
requirements:
|
103
|
-
- -
|
96
|
+
- - ">="
|
104
97
|
- !ruby/object:Gem::Version
|
105
98
|
version: '0'
|
106
99
|
requirements: []
|
107
100
|
rubyforge_project:
|
108
|
-
rubygems_version:
|
101
|
+
rubygems_version: 2.2.2
|
109
102
|
signing_key:
|
110
|
-
specification_version:
|
103
|
+
specification_version: 4
|
111
104
|
summary: Lazurite ruby gem
|
112
105
|
test_files: []
|