-
Notifications
You must be signed in to change notification settings - Fork 2
/
SLAVinterfaceLoRa.txt
214 lines (179 loc) · 4.34 KB
/
SLAVinterfaceLoRa.txt
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
\ *********************************************************************
\ Interface LoRa with other ESP32Forth application
\ Filename: SLAVinterfaceLoRa.txt
\ Date: 07 feb 2022
\ Updated: 08 feb 2022
\ File Version: 1.0
\ MCU: ESP32-WROOM-32
\ Forth: ESP32forth all versions 7.x++
\ with Serial2 extension
\ Copyright: Marc PETREMANN
\ Author: Marc PETREMANN
\ GNU General Public License
\ *********************************************************************
DEFINED? string 0<> [if]
\ include strings.txt
[then]
\ ( n -- n | n n )
DEFINED? ?dup 0= [if] : ?dup dup 0<> if dup then ; [then]
DEFINED? --TRdecod [if] forget --TRdecod [then]
create --TRdecod
256 string LoRaRX
\ *** decode content of LoRaRX ****************************************
2 string $crlf
$0d $crlf c+$!
$0a $crlf c+$!
\ delete crlf at end of string
: normalize$ ( addr len -- )
2dup + 2 - 2
$crlf $= if \ if end string = crlf
2 - swap
cell - ! \ substract 2 at length of string
else
2drop
then
;
\ test if string begin with "+RCV="
: RCV? ( addr len -- fl )
dup 0 > if
drop 5
s" +RCV=" $=
else
2drop 0
then
;
\ RCV analyse
12 string RCVhead \ head transmission
6 string RCVaddr \ master LoRa address
4 string RCVlength \ length transmitted datas
256 string RCVdata \ transmitted datas
5 string RCVrssi \ Received Signal Strength Indicator
5 string RCVsnr \ Signal-to-noise ratio
\ set length of a string to zero
: 0$! ( addr len -- )
drop 0 swap cell - !
;
\ set length of all strings to 0
: initStrings ( -- )
RCVhead 0$!
RCVaddr 0$!
RCVlength 0$!
RCVdata 0$!
RCVrssi 0$!
RCVsnr 0$!
;
: scan$ { char addr len -- addr len' }
0 \ start index
begin
dup addr + c@
char <>
over len <
and
while
1+ \ increment index
repeat
addr swap
dup len = if
drop 0
then
;
variable strPos
: calcNewPosition ( -- addr len )
0 strPos !
RCVhead nip ?dup
if strPos +! then
RCVaddr nip ?dup
if 1+ strPos +! then
RCVlength nip ?dup
if 1+ strPos +! then
RCVdata nip ?dup
if 1+ strPos +! then
RCVrssi nip ?dup
if 1+ strPos +! then
LoraRX swap strPos @ +
swap strPos @ -
;
: eval$ ( addr len -- n )
S>NUMBER? ?dup
if drop then
;
\ extract RCVhead
: getRCVhead ( -- )
s" +RCV=" RCVhead $!
;
\ extract RCVaddr
: getRCVaddr ( -- )
[char] , calcNewPosition scan$
RCVaddr $!
;
\ extract RCVlength
: getRCVlength ( -- )
[char] , calcNewPosition scan$
RCVlength $!
;
\ extract RCVdata
: getRCVdata ( -- )
calcNewPosition drop
RCVlength eval$
RCVdata $!
;
\ extract RCVrssi
: getRCVrssi ( -- )
[char] , calcNewPosition scan$
RCVrssi $!
;
\ extract RCVrssi
: getRCVsnr ( -- )
calcNewPosition
RCVsnr $!
;
: RXdecode ( -- )
LoRaRX normalize$
\ extract RCVhead
LoRaRX RCV? if \ test if LoRaRX begin with "+RCV="
initStrings \ empty all strings
getRCVhead
getRCVaddr
getRCVlength
getRCVdata
getRCVrssi
getRCVsnr
then
;
\ interface LoRa with any embedded program
: RXinterface ( -- )
RCVdata ?dup if
evaluate
else
2drop
then
;
\ *** LoRa reception loop *********************************
Serial \ Select Serial vocabulary
\ final loop
: LoRaLoop ( -- )
begin
Serial2.available \ not 0 if chars availalble
if
100 ms \ ensures that the entire transmission is received
LoRaRX maxlen$ nip
Serial2.readBytes
LoRaRX drop cell - !
RXdecode \ analyse content of LoRa message
RXinterface \ interpret content or RCVdata
then
pause \ skip to next task
again
;
' LoRaLoop 100 100 task my-loop
\ *** Main initialisation *********************************
\ 115200 speed communication for LoRa REYAX
115200 value #SERIAL2_RATE
Serial
: mainInit ( -- )
cr ." Starting SLAV1 LoRa" cr
LEDinit
#SERIAL2_RATE Serial2.begin \ initialise Serial2
my-loop start-task
;
startup: mainInit