-
Notifications
You must be signed in to change notification settings - Fork 0
/
solarbeacon2lora.sb
202 lines (154 loc) · 6.5 KB
/
solarbeacon2lora.sb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//*****************************************************************************
// Copyright (C) 2016 Jose Marcelino - Metavurt Ltd
//
// Project: RM186 LoRa/TTN gateway for Cypress solar beacons
//*****************************************************************************/
//******************************************************************************
// Definitions
//******************************************************************************
#include "RM1xx-defs.h"
#include "lib/ble.sblib"
//******************************************************************************
// Register Error Handler as early as possible
//******************************************************************************
sub HandlerOnErr()
print "\n OnErr - ";GetLastError();"\n"
endsub
onerror next HandlerOnErr
//******************************************************************************
// Global Variable Declarations
//******************************************************************************
dim ok$,er$,pr$
dim urts //will be <0 if uart parser suspended
dim uuid_hex$, uuid$
dim status
dim linkCheckLoop
//******************************************************************************
// Initialisse Global Variable
//******************************************************************************
ok$ = "\nOK"
er$ = "\nERROR "
pr$ = "\r\n>"
// Set this to the "beacon" UUID we're looking for. Here we use the default from Cypress
uuid_hex$ = "0005000100001000800000805F9B0131"
uuid$ = StrDehexize$(uuid_hex$)
#define LORA_CONNECTED ((1)<<1)
#define LORA_WAITING_FOR_ACK ((1)<<2)
//==============================================================================
function HndlrAdvRpt()
dim periphAddr$, advData$, nDiscarded, nRssi, result, lorarc
//Read all cached advert reports
do
result = BleScanGetAdvReport(periphAddr$, advData$, nDiscarded, nRssi)
// Does UUID field (from byte #9) match what we're looking for?
dim uuidfound$ : uuidfound$ = MID$(advData$,9,strlen(uuid$))
if (strcmp(uuid$,uuidfound$) == 0) then
print "\n\nPeer Address: "; StrHexize$(periphAddr$)
print "\nAdvert Data: ";StrHexize$(advData$)
// Beacon ID is stored as 16 bit number after the UUID (position 9 + 16 byte UUID)
dim beaconId
beaconId = (strgetchr(advData$,9 + 16) * 256) + strgetchr(advData$,9 + 16 + 1)
print "\nBeacon major ID: "; beaconId
// Humidity is stored as byte after UUID and beacon, here we approximate formula from Cypress to integer for display
// humidity = 125 * (humidity_byte * 256) / 65536 - 6;
dim humidity
humidity = strgetchr(advData$, 9 + 16 + 2) / 2 - 6
print "\nHumidity: "; humidity
// Temperature is coded in byte after humidity
// Approximation from Cypress's formula: 175.72 * (bytes[2] * 256) / 65536 - 46.85
dim temperature
temperature = (88 * strgetchr(advData$, 9 + 16 + 3) / 128) - 47
print "\nTemperature: "; temperature
print "\nNo. Discarded Adverts: ";nDiscarded
print "\nRSSI: ";nRssi
// Here we grab grab raw data bytes (ID + Humidity + Temperature) to send over LoRa
// In TTN we use a server side function to convert these to JSON fields
dim data$
data$ = MID$(advData$, 9 + 16 + 1, 9 + 16 + 3)
// Send without ACK
lorarc = LORAMACTxData(1, data$ , 0)
endif
until result != 0
endfunc 1
'//==============================================================================
'// This handler is called when there is a LoRa TX Complete event
'//==============================================================================
function HandlerLoRaTxComp() as integer
dim result
print "LoRa TX Complete Event\n"
if linkCheckLoop>0 then
result = LORAMACLinkCheck()
endif
status = status&(!LORA_WAITING_FOR_ACK)
endfunc 1
'//==============================================================================
'// This handler is called when there is a LoRa RX Complete event
'//==============================================================================
function HandlerLoRaRxComp() as integer
print "LoRa RX Complete Event\n"
endfunc 1
'//==============================================================================
'// This handler is called when the LoRa Join procedure starts
'//==============================================================================
function HandlerLoRaJoining() as integer
print "Attempting to join the LoRa network\n"
endfunc 1
'//==============================================================================
'// This handler is called when the LoRa Join Process completes successfully
'//==============================================================================
function HandlerLoRaJoined() as integer
print "Joined the LoRa network\n"
status = status+LORA_CONNECTED
//if status == (LORA_CONNECTED + BLE_CONNECTED) then
// rc=startDemo()
// endif
endfunc 1
//==============================================================================
sub UartRsp(rsp as integer)
if rsp == 0 then
print ok$;pr$
elseif rsp > 0 then
print er$;integer.h' rsp;pr$
endif
urts = rsp
endsub
//==============================================================================
function Startup() as INTEGER
dim result
status = 0
linkCheckLoop = 0
// Reset the LoRa radio
result = LORAMACReset()
// Set scan type to passive
result = BleScanConfig(2, 0)
// Start scanning for BLE devices
result=BleScanStart(0,0)
if status != (LORA_CONNECTED) then
// Join the LoRa network
result = LORAMACJoin(LORAMAC_JOIN_BY_REQUEST)
endif
endfunc result
//==============================================================================
// Event handlers
//==============================================================================
OnEvent EVBLE_ADV_REPORT CALL HndlrAdvRpt
OnEvent EVLORAMACTXCOMPLETE call HandlerLoRaTxComp
OnEvent EVLORAMACRXCOMPLETE call HandlerLoRaRxComp
OnEvent EVLORAMACJOINING call HandlerLoRaJoining
OnEvent EVLORAMACJOINED call HandlerLoRaJoined
//==============================================================================
// Main block
//==============================================================================
dim result
result = Startup()
//Send an OK response
if result == 0 then
UartRsp(0)
else
UartRsp(1)
endif
//------------------------------------------------------------------------------
// Wait for a synchronous event.
// An application can have multiple <WaitEvent> statements
//------------------------------------------------------------------------------
WaitEvent