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 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
- document(Japanese only):
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
- class LAZURITE_ERROR < StandardError; end
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
- # LAZURITE.open(ch=36,panid=0xabcd,pwr=20,rate=100),mode=2)
19
- # function
20
- # open device deriver
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
- bp3596_dev = "/dev/bp3596"
26
+ lzgw_dev = "/dev/lzgw"
49
27
  sleep(0.1)
50
- result = system("sudo chmod 777 "+bp3596_dev)
28
+ result = system("sudo chmod 777 "+lzgw_dev)
51
29
  # p result
52
30
  sleep(0.1)
53
- @@device_rd = open(bp3596_dev,"rb")
54
- @@device_wr = open(bp3596_dev,"wb")
55
- result = system("tail -n -2 /var/log/messages")
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 device_close()
69
- @@device_rd.close
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 DRV_802154"
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
- # Data reception wait (timeout = 100ms)
109
- ret = select([@@device_rd], nil, nil, 0.1)
110
- # Reads the size of the received data
111
- len = @@device_rd.read(2)
112
- if ((len == "") || (len == nil)) then # read result is empty
113
- return -1
114
- end
115
- size = len.unpack("S*")[0]
116
- # The received data is read
117
- recv_buf = @@device_rd.read(size)
118
- if ((recv_buf == "") || (recv_buf == nil)) then # read result is empty
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
- out = Hash["Command" => command,
163
- "Time" => t,
164
- "usec" => tv_usec,
165
- "Area" => area,
166
- "ch" => ch,
167
- "rate" => rate,
168
- "pwr" => pwr,
169
- "header" => header,
170
- "rxPanid" => rxPanid,
171
- "rxAddrType" => rxAddrType,
172
- "rxAddr" => rxAddr,
173
- "txPanid" => txPanid,
174
- "txAddrType" => txAddrType,
175
- "txAddr" => txAddr,
176
- "rssi" => rssi,
177
- "payload" => payload,
178
- ]
179
- end
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
- # panid
206
- begin
207
- rxPanid =packet.fetch("rxPanid")
208
- rescue KeyError
209
- rxPanid = 0xABCD
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
- # rxAddr
213
- rxAddr =packet.fetch("rxAddr")
214
-
215
- # txAddr
216
- txAddr = 0
217
-
218
- #payload
219
- payload =packet["payload"]
220
- if payload.length > 235 then
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
- raw = [header,seq,rxPanid,rxAddr,txAddr,payload].pack("scsssa*")
227
-
228
- ret = select(nil, [@@device_wr], nil, 0.1)
229
- begin
230
- len = @@device_wr.write(raw)
231
- rescue
232
- puts "Doesn't receive ACK"
233
- raise LAZURITE_ERROR
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
- return len
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 print_bin(data)
238
- out = ""
239
- for i in 0..data.length-1 do
240
- print(data[i].unpack("H*")[0]," ")
241
- end
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module LazGem
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/LazGem.rb CHANGED
@@ -2,4 +2,5 @@ module LazGem; end
2
2
 
3
3
  require_relative "LazGem/version"
4
4
  require_relative "LazGem/device"
5
+ require_relative "LazGem/ioctl"
5
6
 
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.device_open()
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
- print(sprintf("%s.%06d\t0x%04X\t0x%04X\t0x%04X\t%03d\t%s",
39
- rcv["Time"].strftime("%Y-%m-%d %H:%M:%S"),
40
- rcv["usec"],
41
- rcv["rxPanid"],
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.device_close()
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
- laz.device_open()
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
- laz.write(tx)
22
- rescue LAZURITE_ERROR
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
- laz.device_close()
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.4
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-03-17 00:00:00.000000000 Z
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: ! 'low power IoT device '
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: 1.8.23
101
+ rubygems_version: 2.2.2
109
102
  signing_key:
110
- specification_version: 3
103
+ specification_version: 4
111
104
  summary: Lazurite ruby gem
112
105
  test_files: []