LazGem 0.0.4 → 0.0.6
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 +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: []
|