-
Notifications
You must be signed in to change notification settings - Fork 28
/
universalbridge.html
442 lines (442 loc) · 140 KB
/
universalbridge.html
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by LibreOffice - see http://cgit.freedesktop.org/libreoffice/core/tree/filter/source/xslt for the code.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xml:lang="en-US">- no title specified</title><meta name="DCTERMS.title" content="" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.creator" content="Erik Slagter"/><meta name="DCTERMS.issued" content="2016-02-29T14:40:51.615450449" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2016-06-04T09:20:23.805355080" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="" xml:lang="en-US"/><meta name="DCTERMS.subject" content="," xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
@page { }
table { border-collapse:collapse; border-spacing:0; empty-cells:show }
td, th { vertical-align:top; font-size:12pt;}
h1, h2, h3, h4, h5, h6 { clear:both }
ol, ul { margin:0; padding:0;}
li { list-style: none; margin:0; padding:0;}
<!-- "li span.odfLiEnd" - IE 7 issue-->
li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
span.footnodeNumber { padding-right:1em; }
span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; }
* { margin:0;}
.Heading_20_3 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P1_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P1 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P1_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P10_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P10 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P10_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P100 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P101 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P102 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P103 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P104 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P105 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P106 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-style:normal; font-weight:bold; }
.P107 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-style:normal; font-weight:bold; }
.P108 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-style:normal; font-weight:bold; }
.P109 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P11_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P11 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P11_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P110 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P111 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P112 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P113 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:normal; }
.P114 { font-size:10pt; font-family:Courier; writing-mode:page; font-weight:bold; }
.P115 { font-size:10pt; font-family:Courier; writing-mode:page; font-weight:bold; }
.P116 { font-size:10pt; font-family:Courier; writing-mode:page; font-style:italic; font-weight:bold; }
.P117_borderStart { background-color:transparent; font-size:16pt; font-style:normal; font-weight:bold; margin-top:0.353cm; font-family:FreeSans; writing-mode:page; padding-bottom:0.212cm; border-bottom-style:none; }
.P117 { background-color:transparent; font-size:16pt; font-style:normal; font-weight:bold; font-family:FreeSans; writing-mode:page; padding-bottom:0.212cm; padding-top:0.353cm; border-top-style:none; border-bottom-style:none; }
.P117_borderEnd { background-color:transparent; font-size:16pt; font-style:normal; font-weight:bold; margin-bottom:0.212cm; font-family:FreeSans; writing-mode:page; padding-top:0.353cm; border-top-style:none;}
.P118_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P118 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P118_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P119_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P119 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P119_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P12_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P12 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P12_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P120_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P120 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P120_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P121_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P121 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P121_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P122_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P122 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P122_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P123_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P123 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P123_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P124_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; text-decoration:none ! important; padding-bottom:0cm; border-bottom-style:none; }
.P124 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; text-decoration:none ! important; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P124_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; text-decoration:none ! important; padding-top:0cm; border-top-style:none;}
.P125_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P125 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P125_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P126_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P126 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P126_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P127_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P127 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P127_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P128_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P128 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P128_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P129_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P129 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P129_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P13_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P13 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P13_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P130_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P130 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P130_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P131_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-bottom:0cm; border-bottom-style:none; }
.P131 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P131_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-top:0cm; border-top-style:none;}
.P132_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-bottom:0cm; border-bottom-style:none; }
.P132 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P132_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; font-weight:normal; padding-top:0cm; border-top-style:none;}
.P133 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P134 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P135 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P136 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P137 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P138 { font-size:10pt; font-family:Courier; writing-mode:page; font-weight:bold; }
.P14_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P14 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P14_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P15_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P15 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P15_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P16_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P16 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P16_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P17_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P17 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P17_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P18_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P18 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P18_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P19_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P19 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P19_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P2_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P2 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P2_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P20_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P20 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P20_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P21_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P21 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P21_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P22_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P22 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P22_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P23_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P23 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P23_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P24_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P24 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P24_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P25_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P25 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P25_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P26_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P26 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P26_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P27_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P27 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P27_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P28_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P28 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P28_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P29_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P29 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P29_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P3_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P3 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P3_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P30_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P30 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P30_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P31_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P31 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P31_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P32_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P32 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P32_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P33_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P33 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P33_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P34_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P34 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P34_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P35_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P35 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P35_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P36_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P36 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P36_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P37_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P37 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P37_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P38 { font-size:10pt; font-weight:bold; text-align:left ! important; font-family:FreeSans; writing-mode:page; font-style:normal; }
.P39 { font-size:10pt; font-weight:bold; text-align:left ! important; font-family:FreeSans; writing-mode:page; }
.P4_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P4 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P4_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P40 { font-size:20pt; font-weight:bold; margin-bottom:0.212cm; margin-top:0.423cm; font-family:FreeSans; writing-mode:page; }
.P41 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P42 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P43 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P44 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P45 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P46 { font-size:12pt; font-weight:bold; margin-bottom:0.3cm; margin-top:0.499cm; font-family:FreeSans; writing-mode:page; }
.P47 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P48 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P49 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P5_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P5 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P5_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P50 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P51 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P52 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P53 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P54 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P55 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P56 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P57 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P58 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P59 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P6_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P6 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P6_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P60 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P61 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P62 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P63 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P64 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P65 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P66 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P67 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P68 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P69 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P7_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P7 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P7_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P70 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P71 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:normal; font-weight:bold; }
.P72 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:normal; font-weight:bold; }
.P73 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:normal; font-weight:bold; }
.P74 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:normal; font-weight:bold; }
.P75 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P76 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P77 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-weight:bold; }
.P78 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P79 { font-size:10pt; font-family:Nimbus Mono L; writing-mode:page; font-style:italic; font-weight:bold; }
.P8_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P8 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P8_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P80 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P81 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P82 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P83 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P84 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P85 { font-size:10pt; font-family:FreeSans; writing-mode:page; font-weight:bold; }
.P86 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P87 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P88 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P89 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P9_borderStart { background-color:transparent; font-size:10pt; line-height:120%; margin-top:0cm; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; border-bottom-style:none; }
.P9 { background-color:transparent; font-size:10pt; line-height:120%; font-family:FreeSans; writing-mode:page; padding-bottom:0cm; padding-top:0cm; border-top-style:none; border-bottom-style:none; }
.P9_borderEnd { background-color:transparent; font-size:10pt; line-height:120%; margin-bottom:0cm; font-family:FreeSans; writing-mode:page; padding-top:0cm; border-top-style:none;}
.P90 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P91 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P92 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P93 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P94 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P95 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P96 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P97 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P98 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.P99 { font-size:10pt; font-family:FreeSans; writing-mode:page; }
.Text_20_body_borderStart { font-size:10pt; font-family:FreeSans; writing-mode:page; margin-top:0cm; line-height:120%; background-color:transparent; padding-bottom:0cm; border-bottom-style:none; }
.Text_20_body { font-size:10pt; font-family:FreeSans; writing-mode:page; line-height:120%; background-color:transparent; padding-top:0cm; padding-bottom:0cm; border-top-style:none; border-bottom-style:none; }
.Text_20_body_borderEnd { font-size:10pt; font-family:FreeSans; writing-mode:page; margin-bottom:0cm; line-height:120%; background-color:transparent; padding-top:0cm; border-top-style:none;}
.Sect1 { margin-left:0cm; margin-right:0cm; }
.Table1 { width:19.001cm; float:none; }
.Table10 { width:19.001cm; float:none; }
.Table11 { width:19.001cm; float:none; }
.Table12 { width:19.001cm; float:none; }
.Table2 { width:19.001cm; float:none; }
.Table3 { width:19.001cm; float:none; }
.Table4 { width:19.001cm; float:none; }
.Table5 { width:19.001cm; float:none; }
.Table6 { width:19.001cm; float:none; }
.Table7 { width:19.001cm; float:none; }
.Table9 { width:19.001cm; float:none; }
.Table1_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table1_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table1_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table1_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table10_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table10_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table10_C1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table10_C2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table11_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table11_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table11_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table11_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_C2 { background-color:#eeeeee; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_C3 { background-color:#dddddd; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_C4 { background-color:#cccccc; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table12_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table12_D7 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_A2 { background-color:#eeeeee; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_A25 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_A34 { background-color:#dddddd; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_B25 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_C25 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table2_D2 { background-color:#eeeeee; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_D25 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table2_D34 { background-color:#dddddd; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table3_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table3_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table3_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table3_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table4_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table4_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table4_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table4_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table5_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table5_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table5_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table5_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table6_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table6_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table6_D1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table6_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_A1 { background-color:#ffffcc; padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_A4 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_A5 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_A6 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_B4 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_B5 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_B6 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_C2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_C3 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_C4 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_C5 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_C6 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_D1 { background-color:#ffffcc; padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table7_D2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_D3 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_D4 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_D5 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table7_D6 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table9_A1 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:thin; border-top-style:solid; border-top-color:#000000; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table9_A2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table9_E1 { padding:0.097cm; border-width:thin; border-style:solid; border-color:#000000; }
.Table9_E2 { padding:0.097cm; border-left-width:thin; border-left-style:solid; border-left-color:#000000; border-right-width:thin; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:thin; border-bottom-style:solid; border-bottom-color:#000000; }
.Table1_A { width:1.896cm; }
.Table1_B { width:4.609cm; }
.Table1_C { width:4.695cm; }
.Table1_D { width:7.8cm; }
.Table10_A { width:4.498cm; }
.Table10_B { width:9.592cm; }
.Table10_C { width:4.911cm; }
.Table11_A { width:2.293cm; }
.Table11_B { width:5.8cm; }
.Table11_C { width:6.503cm; }
.Table11_D { width:4.404cm; }
.Table12_A { width:3.992cm; }
.Table12_B { width:5.115cm; }
.Table12_C { width:6.283cm; }
.Table12_D { width:3.611cm; }
.Table2_A { width:1.896cm; }
.Table2_B { width:4.697cm; }
.Table2_C { width:6.703cm; }
.Table2_D { width:5.704cm; }
.Table3_A { width:1.894cm; }
.Table3_B { width:4.611cm; }
.Table3_C { width:4.101cm; }
.Table3_D { width:8.394cm; }
.Table4_A { width:2.096cm; }
.Table4_B { width:2.999cm; }
.Table4_C { width:5.401cm; }
.Table4_D { width:8.505cm; }
.Table5_A { width:1.896cm; }
.Table5_B { width:4.807cm; }
.Table5_C { width:5.292cm; }
.Table5_D { width:7.006cm; }
.Table6_A { width:1.896cm; }
.Table6_B { width:2.801cm; }
.Table6_C { width:4.101cm; }
.Table6_D { width:10.202cm; }
.Table7_A { width:2.007cm; }
.Table7_B { width:4.695cm; }
.Table7_C { width:4.697cm; }
.Table7_D { width:7.601cm; }
.Table9_A { width:1.39cm; }
.Table9_B { width:3.417cm; }
.Table9_C { width:5.203cm; }
.Table9_D { width:4.586cm; }
.Table9_E { width:4.404cm; }
.Table1_1 { background-color:#ffffcc; }
.Table10_1 { background-color:#ffffcc; }
.Table11_1 { background-color:#ffffcc; }
.Table12_1 { background-color:#ffffcc; }
.Table2_1 { background-color:#ffffcc; }
.Table3_1 { background-color:#ffffcc; }
.Table4_1 { background-color:#ffffcc; }
.Table5_1 { background-color:#ffffcc; }
.Table6_1 { background-color:#ffffcc; }
.Table9_1 { background-color:#ffffcc; }
.Bullet_20_Symbols { font-family:OpenSymbol; }
.Emphasis { font-style:italic; }
.Internet_20_link { color:#000080; text-decoration:underline; }
.Source_20_Text { font-family:Liberation Mono; }
.T1 { font-family:FreeSans; }
.T10 { font-family:FreeSans; text-decoration:none ! important; }
.T11 { font-family:FreeSans; }
.T12 { font-family:FreeSans; }
.T13 { font-family:FreeSans; font-weight:bold; }
.T14 { font-family:FreeSans; font-weight:normal; }
.T15 { font-family:FreeSans; font-weight:normal; }
.T16 { font-family:FreeSans; font-style:normal; font-weight:normal; }
.T17 { font-family:FreeSans; }
.T18 { font-family:FreeSans; }
.T19 { font-family:FreeSans; }
.T2 { font-family:FreeSans; font-size:10pt; background-color:transparent; }
.T20 { font-family:FreeSans; }
.T21 { font-family:FreeSans; }
.T22 { font-family:FreeSans; font-style:normal; }
.T23 { font-family:FreeSans; }
.T24 { font-family:FreeSans; font-weight:bold; }
.T25 { font-family:FreeSans; }
.T26 { font-family:FreeSans; font-style:italic; }
.T3 { font-family:FreeSans; font-size:10pt; background-color:transparent; }
.T32 { font-style:italic; }
.T34 { font-weight:bold; }
.T39 { font-family:Nimbus Mono L; }
.T4 { font-family:FreeSans; font-size:10pt; background-color:transparent; }
.T40 { font-family:Nimbus Mono L; font-weight:bold; }
.T41 { font-family:Nimbus Mono L; font-weight:bold; }
.T42 { font-family:Nimbus Mono L; font-weight:bold; }
.T43 { font-family:Nimbus Mono L; font-style:italic; font-weight:bold; }
.T44 { font-family:Nimbus Mono L; font-style:normal; font-weight:bold; }
.T45 { font-family:Nimbus Mono L; }
.T46 { font-family:Nimbus Mono L; font-weight:bold; }
.T47 { font-family:Nimbus Mono L; font-weight:bold; }
.T48 { font-family:Nimbus Mono L; font-weight:bold; }
.T49 { font-family:Nimbus Mono L; font-weight:bold; }
.T5 { font-family:FreeSans; font-size:10pt; }
.T6 { font-family:FreeSans; font-size:10pt; }
.T65 { font-weight:normal; }
.T7 { font-family:FreeSans; font-size:10pt; font-style:normal; }
.T70 { font-style:normal; }
.T8 { font-family:FreeSans; text-decoration:none ! important; }
.T9 { font-family:FreeSans; text-decoration:none ! important; }
<!-- ODF styles with no properties representable as CSS -->
.T27 .T28 .T29 .T30 .T31 .T33 .T35 .T36 .T37 .T38 .T50 .T51 .T52 .T53 .T54 .T55 .T56 .T57 .T58 .T59 .T60 .T61 .T62 .T63 .T64 .T66 .T67 .T68 .T69 .T71 .T72 .T73 .T74 .T75 .T76 .T77 .T78 .T79 .T80 .T81 { }
</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:1cm; margin-bottom:1cm; margin-left:1cm; margin-right:1cm; "><h1 class="P40"><a id="a__ESP8266_universal_I_O_bridge"><span/></a><a id="user-content-esp8266-universal-io-bridge"/>ESP8266 universal I/O bridge</h1><h2 class="P117"><a id="a__Preface"><span/></a>Preface</h2><h3 class="P41"><a id="a__General"><span/></a>General</h3><p class="P5_borderStart"><span class="T27">The ESP8266 universal I/O bridge is a project that </span>attempts to make all of the I/O on the ESP8266 available over the <span class="T27">(wireless) </span>network.<span class="T62"> This more or less assumes the use of an (possibly always-on) server that frequently contacts the ESP8266 to fetch the current data or to send control commands. It is not intended to program automated actions or to automatically upload results "to the cloud".</span></p><p class="P5"/><p class="P6">Currently <span class="T63">the available I/O's are: all of the built-in </span>GPIO's (<span class="T29">such </span>as <span class="T28">digital input, digital output </span>or PWM), I2C <span class="T36">(emulated by software bit-banging), the ADC (analog input) and </span>the UART. <span class="T36">E</span>xternal <span class="T28">GPIO's (well-known I2C I/O expanders) are currently being implemented. It also features external </span>display<span class="T28">s, using SAA1064 or Hitachi HD44780 type LCD displays (4x20).</span></p><p class="P26"/><p class="P36"><span class="T2">The </span><span class="T3">software </span><span class="T2">listens at tcp port 24, and that is where the configuration and commands </span><span class="T4">should be entered</span><span class="T2">. Type </span><span class="Source_20_Text"><span class="T2">telnet <ip_address> 24</span></span><span class="T2"> and type </span><span class="Source_20_Text"><span class="T2">?</span></span><span class="T2"> for help.</span><span class="T4"> No need for flashing when the configuration changes, </span><span class="T3">just change the config and write it.</span></p><p class="P27"/><p class="P37"><span class="T3">T</span><span class="T2">here is also an very bare bones http server on board, which currently only shows the I/O status, but may be extended quite easily in the future. Use the http interface simply by pointing your browser to your ESP's IP address and add the port number 24 to it.</span></p><p class="P27"/><p class="P28_borderEnd">If the requirements are met, the OTA-version can be used, which means that updates can be programmed over the network instead of using the UART.</p><h3 class="P42"><a id="a__IO"><span/></a>IO</h3><p class="P7_borderStart"><span class="T60">All I/O pins can be configured to work as plain digital </span>input, <span class="T28">plain digital</span> output, "timer" mode (this means trigger once, either manually or at startup, or <span class="T29">toggle</span> continuously) or "pwm" mode (16 bits PWM mode, running at 330 Hz, suitable for driving lighting, <span class="T28">maybe servo motors as well, not tested). The ADC input and the RTC GPIO are also supported.</span></p><p class="P29"/><p class="P8"><span class="T60">Pins </span>are organised in <span class="T55">devices</span> of at most 16 pins. Each pin must be configured <span class="T58">to a mode it will be used in</span>. That goes even for pins that can only have one function (e.g. the adc input). If a pin is not configured (i.e. set to mode “disabled”), it won't be used and not even initialised, <span class="T58">thereby keeping it's original function (e.g. UART) or remaining floating (HiZ).</span></p><p class="P8"/><p class="P10_borderEnd">Two devices are always present, device 0 = the internal GPIO's 0-15 and device 1 = the other I/O pins: <span class="T59">the </span>RTC GPIO and the ADC input. Other devices can be added using I2C I/O expanders. Currently supported are MCP23017 and PCF8574.</p><h3 class="P41"><a id="a__UART_bridge"><span/></a>UART bridge</h3><p class="P7_borderStart">The UART <span class="T36">pins </span>(TXD/RXD) are available and are bridged to the ESP8266's ip address at port 2<span class="T28">3, </span>unless <span class="T36">they </span>are re-assigned as GPIO <span class="T60">pins.</span></p><p class="P31"/><p class="Text_20_body"><span class="T5">The UART bridge accepts connections on tcp port 23, gets all data from it, sends it to the UART (serial port) and the other way around. This is the way to go to make your non-networking microcontroller </span><span class="Emphasis"><span class="T7">WiFi</span></span><span class="T7">-ready</span><span class="T5">. If you add an RS-232C buffer (something like a </span><span class="Emphasis"><span class="T7">MAX232</span></span><span class="T5"> or similar), you can even make your non-networking peripherals like printers etc. available over the wireless lan.</span></p><p class="P30"/><p class="P4_borderEnd">The UART driver is heavily optimised and is completely interrupt driven, which makes it very efficient.<a id="user-content-about-i2c"/></p><h3 class="P41"><a id="a__I2C"><span/></a><span class="T31">I</span>2<span class="T31">C</span></h3><p class="P11_borderStart"><span class="T17">The ESP8266 does not have a hardware I2C </span><span class="T18">module</span><span class="T17"> (</span><span class="T12">as opposed to most</span><span class="T17"> microcontrollers), so the protocol needs to be </span><span class="T17">implemented using a bit-banging software emulation. Espressif supplies code that does exactly that, but it's rubbish. So I wrote my own protocol handler from scratch and it already proved to be quite robust.</span></p><p class="P7"/><p class="P7_borderEnd"><span class="T60">All off the internal </span>GPIO <span class="T60">pins</span> can be selected to work as <span class="T28">I2C/SMBus</span> <span class="T36">pins </span>(<span class="T60">SDA+SCL</span>). You can use the "raw" <span class="T60">I2C</span> send and receive commands to send/receive arbitrary commands/data to arbitrary slaves. For a number of <span class="T28">I2C</span> sensors there is built-in support, which allows you to read them out directly, where a temperature etc. is given as result.</p><h3 class="P41"><a id="a__External_displays"><span/></a><span class="T33">E</span>xternal displays</h3><p class="P25_borderStart">Currently the SAA1064 is supported, it's a 4x7 led display multiplexer, controlled over <span class="T33">I2C</span>. <span class="T77">Recently added is </span>LCD text displays using the well-known Hitachi <span class="T77">HD44780 </span>LCD controller. <span class="T78">See the command reference, display section, on how to connect these display and how to configure them.</span></p><p class="P25"/><p class="P25"><span class="T77">Support for </span>Orbital Matrix <span class="T33">I2C</span>-controlled VFD/LCD screens <span class="T77">is planned.</span></p><p class="P4"/><p class="P4_borderEnd">The system consists of multiple "slots" of messages that will be shown <span class="T33">in succession</span>. You can set a timeout on a message and it will be deleted automatically after that time. If no slots are left, it <span class="T33">will </span>show the current time (<span class="T33">from RTC</span>). Use 0 as timeout to not auto-expire slots.</p><h2 class="P117"><a id="a__Getting_started"><span/></a>Get<span class="T35">ting</span> started</h2><h3 class="P41"><a id="a__General"><span/></a>General</h3><p class="P12">You can either download the software and flash it (“precompiled image”) from Git<span class="T38">H</span>ub or compile the software yourself. In both cases you will need <span class="T64">to use </span>a suitable flashing device (CP210x or similar USB to UART <span class="T37">converter</span>) and a tool for flashing. I am using esptool.py for that <span class="T59">and </span>the Makefile also expects it to be present. It's not required though, you can use any flashing tool and do the flashing manually. The flashing process itself has been described at numerous places, I am not going to repeat it here.</p><h3 class="P44"><a id="a__Image_types"><span/></a>Image types</h3><p class="P13_borderStart">There are two types of images:</p><p class="P13_borderEnd"/><table border="0" cellspacing="0" cellpadding="0" class="Table9"><colgroup><col width="61"/><col width="149"/><col width="227"/><col width="200"/><col width="192"/></colgroup><tr class="Table91"><td style="text-align:left;width:1.39cm; " class="Table9_A1"><p class="P80">name</p></td><td style="text-align:left;width:3.417cm; " class="Table9_A1"><p class="P80">type</p></td><td style="text-align:left;width:5.203cm; " class="Table9_A1"><p class="P80">update using</p></td><td style="text-align:left;width:4.586cm; " class="Table9_A1"><p class="P80">files</p></td><td style="text-align:left;width:4.404cm; " class="Table9_E1"><p class="P80">flash size requirements</p></td></tr><tr><td style="text-align:left;width:1.39cm; " class="Table9_A2"><p class="P87">PLAIN</p></td><td style="text-align:left;width:3.417cm; " class="Table9_A2"><p class="P88">plain / normal</p></td><td style="text-align:left;width:5.203cm; " class="Table9_A2"><p class="P88">UART flash mechanism</p></td><td style="text-align:left;width:4.586cm; " class="Table9_A2"><p class="P88">IROM image, IRAM image</p></td><td style="text-align:left;width:4.404cm; " class="Table9_E2"><p class="P88">4 Mbit</p></td></tr><tr><td style="text-align:left;width:1.39cm; " class="Table9_A2"><p class="P87">OTA</p></td><td style="text-align:left;width:3.417cm; " class="Table9_A2"><p class="P88">over the air updating</p></td><td style="text-align:left;width:5.203cm; " class="Table9_A2"><p class="P88">OTA flash mechanism (network)</p></td><td style="text-align:left;width:4.586cm; " class="Table9_A2"><p class="P88">rboot, rboot config, image</p></td><td style="text-align:left;width:4.404cm; " class="Table9_E2"><p class="P88">16 Mbit</p></td></tr></table><p class="P13_borderStart"/><p class="P13">The plain images have very little requirements. They will run in less than <span class="T64">256</span> kbytes, so a 4 Mbit flash chip that's found on most “simple” ESP8266 break-out-boards will suffice.</p><p class="P13"/><p class="P13">The over-the-air (“<span class="T79">OTA</span>”) <span class="T79">upgradable </span>image need<span class="T38">s</span> 1 Mbyte each because of the <span class="T64">address </span>mapping/<span class="T64">banking </span>mechanism of the ESP8266 used. This means the usual 4 Mbit flash chip won't be sufficient, you will need <span class="T64">a </span>16 Mbit <span class="T64">flash chip</span> at least. Some break-out-boards already have this amount of flash memory, others can be upgraded. I have had success with the Winbond W25Q16DVSSIG and W25Q16DVSNIG. They're almost the same, the first is 208 mil, the second is 150 mil. That is important, because they need to fit on the pads of the PCB. The ESP-201 for instance, require<span class="T64">s</span> a 150 mil flash chip, the ESP-01 as well, but newer issues of the ESP-01, which come with 8 Mbits of flash instead of 4 Mbits, actually require a 208 mil IC.</p><p class="P14"/><p class="P15">The default image for the Makefile is always OTA. So if you're going to flash, config, etc, a plain image, always include <span class="T40">IMAGE=plain</span> on the make command line or add it in the Makefile. Also, always <span class="T40">make clean</span> if you switch from plain to ota image and v.v.</p><p class="P12"/><p class="P12_borderEnd">If you're going to use the pre-compiled images, <span class="T79">you can </span>skip the next section “building the software”.</p><h3 class="P41"><a id="a__Building_the_software"><span/></a>Building the software</h3><p class="P2_borderStart"><span class="T72">For building the software you'll need to get and install the opensdk building environment. </span><span class="T73">Get </span><span class="T72">it here: </span><a href="http://github.com/pfalcon/esp-open-sdk" class="Internet_20_link">http://github.com/pfalcon/esp-open-sdk</a><span class="T72">. You can use the latest version and you can also make it install the latest sdk from Espressif, there are no known issues </span><span class="T74">there</span><span class="T72">. Change the Makefile to point SDKROOT to the root of the opendsk directory.</span></p><p class="P12"/><p class="P16">The build process also uses the ESPTOOL2 tool from Richard Burton. <span class="T64">The Makefile will </span>fetch and build it automatically in a make session if you do <span class="T40">git submodule init</span><span class="T1"> </span>and <span class="T40">git submodule update</span><span class="T14"> </span><span class="T15">first.</span></p><p class="P12"/><p class="P12">Now you can start build the “plain” (as opposed to “ota”, “over the air” flash) version. Type <span class="T40">make IMAGE=plain</span> and wait <span class="T64">for completion.</span> The process will yield <span class="T37">two files: espiobridge-plain-iram-0x000000.bin and espiobridge-plain-irom-0x010000.bin, just like the precompiled images. They can be flashed as usual.</span></p><p class="P12"/><p class="P18"><span class="T38">If you're going to build the OTA image, use </span><span class="T41">make IMAGE=ota</span><span class="T38"> (or leave out the </span><span class="T41">IMAGE=ota</span><span class="T38"> part, it's default). The build process uses part of RBOOT by Richard Burton in addition to the ESPTOOL2 tool. If you properly typed the above </span><span class="T41">git</span><span class="T11"> </span><span class="T38">commands, the submodule will be present and RBOOT will be built automatically during the build process. After the build has finished, you will have (a.o.) these files: espiobridge-rboot-boot.bin: the rboot binary, rboot-config.bin: the rboot configuration (no need to make one yourself), espiobridge-rboot-image: the actual Universal I/O bridge firmware. These files can be flashed like the precompiled OTA images. See further down the page for more detailed description.</span></p><p class="P18"/><p class="P17_borderEnd">There will also be a binary called “otapush” which is compiled with your host compiler. It's the program that needs to be run to push new firmware to the ESP8266. It's tested on Linux, but it's quite simple, so I guess it will work on any more-or-less POSIX-compliant operating system. The protocol is very simple anyway, <span class="T64">but uses CRC and MD5 for data protection. There is no risk that any “flipped bit” during transfer or flashing will give erroneous flash images.</span></p><h3 class="P41"><a id="a__Flashing_precompiled_images_or_self_built_images"><span/></a>Flashing precompiled images or self built images</h3><p class="P13_borderStart">The “plain” image consists of two files: espiobridge-plain-iram-0x000000.bin and espiobridge-plain-irom-0x010000.bin. These can be flashed to address 0x000000 and address 0x010000 respectively, using your flash tool of choice. </p><p class="P19"/><p class="P20">The “ota” image consists of three files:</p><p class="P20_borderEnd"/><table border="0" cellspacing="0" cellpadding="0" class="Table10"><colgroup><col width="197"/><col width="419"/><col width="215"/></colgroup><tr class="Table101"><td style="text-align:left;width:4.498cm; " class="Table10_A1"><p class="P81">file</p></td><td style="text-align:left;width:9.592cm; " class="Table10_A1"><p class="P81">use</p></td><td style="text-align:left;width:4.911cm; " class="Table10_C1"><p class="P81">flash to address</p></td></tr><tr><td style="text-align:left;width:4.498cm; " class="Table10_A2"><p class="P32">espiobridge-rboot-boot.bin</p></td><td style="text-align:left;width:9.592cm; " class="Table10_A2"><p class="P32"><span class="T60">t</span>he rboot binary</p></td><td style="text-align:left;width:4.911cm; " class="Table10_C2"><p class="P32">0x000000</p></td></tr><tr><td style="text-align:left;width:4.498cm; " class="Table10_A2"><p class="P32">rboot-config.bin</p></td><td style="text-align:left;width:9.592cm; " class="Table10_A2"><p class="P32">the rboot configuration (no need to make one yourself)</p></td><td style="text-align:left;width:4.911cm; " class="Table10_C2"><p class="P32">0x001000</p></td></tr><tr><td style="text-align:left;width:4.498cm; " class="Table10_A2"><p class="P32">espiobridge-rboot-image</p></td><td style="text-align:left;width:9.592cm; " class="Table10_A2"><p class="P32">the actual Universal I/O bridge firmware</p></td><td style="text-align:left;width:4.911cm; " class="Table10_C2"><p class="P33">0x002000</p></td></tr></table><p class="P18_borderStart"/><p class="P4_borderEnd">Or use <span class="T40">make flash</span> but for that you'll need to have esptool.py installed and you need to <span class="T60">adjust</span> ESPTOOL in the Makefile. <span class="T50">The </span><span class="T42">make flash</span><span class="T50"> command will also flash default and blank configuration sectors. They're not used by the I/O bridge though, it's just to make the SDK code happy.</span></p><h3 class="P41"><a id="a__Configuring_WLAN"><span/></a>Configuring WLAN</h3><p class="P122_borderStart">Obviously, the I/O bridge needs to know the WLAN SSID and password to connect. You could configure them using the telnet connection to port 24, but for that you'd need the I/O bridge already connected. Chicken-and-egg… </p><p class="P122"/><p class="P123">In the past there have been different methods to configure WLAN parameters from scratch (typing them from the UART at startup, creating a default config and flash it), but none of these were satisfactory.</p><p class="P123"/><p class="P123">The current method of "booting up" is using the access point mode, see below for details.</p><p class="P124"/><p class="P131"><span class="T9">W</span><span class="T8">hen the software boots, it will first check if there is a valid configuration present. If there is no valid configuration, several configuration options are initialised to their default. For the WLAN SSID and password, they are "esp" and "espespesp" respectively, for both client and access point mode.</span></p><p class="P131"><span class="T8"/></p><p class="P131"><span class="T10">Step 2. If no valid configuration is present, assume client mode. Otherwise start up in the mode configured.</span></p><p class="P131"><span class="T10"/></p><p class="P132"><span class="T8">Step 3. If in client mode, try to connect. If no connection+IP is obtained within 30 seconds, switch to access point mode.</span></p><p class="P132"><span class="T8"/></p><p class="P132_borderEnd"><span class="T8">Summarised this means that if your config is empty or invalid, so it can't connect, just wait half a minute until the default "esp" SSID shows up, connect to it using passwd "espespesp", telnet to address 192.168.4.1 at port 24 and setup the config. Don't forget to write the config!</span></p><h3 class="Heading_20_3"><a id="a__How_to_switch_between_client_and_access_point_mode"><span/></a>How to switch between client and access point mode</h3><p class="P125_borderStart">The default is to start in client mode. Use the "wlan-mode" (wm) command to switch to access point mode or v.v. Use "ap" for access point mode or "client" for client mode. After you entered the wm command, the switch will be made immediately but it will not be written to flash yet, for safety.</p><p class="P125"/><p class="P125">After switching to access point mode, wait for the SSID (default: esp) to show up and connect using the passwd (default: espespesp). Your current connection will not be disconnected, you need to do so yourself. You will get an IP address of 192.168.4.2. Use telnet to connect to the ESP8266 at port 24, at ip address 192.168.4.1. The first time you try, you will get a "connection refused" error. That is normal (unfortunately). Just try again and it will work. Now write the config to make the change permanent or e.g. reset to return to client mode (or use the wlan-mode command for that).</p><p class="P125"/><p class="P125_borderEnd">After switching to client mode, disconnect, wait for the connection to the access point to establish and then you can use telnet again to log in. If you want to make this mode permanent, write the config.</p><h2 class="P117"><a id="a__Using_the_I_O_Bridge"><span/></a><span class="T9">U</span><span class="T8">sing the I/O Bridge</span></h2><h3 class="P41"><a id="a__Configuring_and_using_the_UART_bridge"><span/></a>Configuring <span class="T51">and using </span>the UART <span class="T51">bridge</span></h3><ul><li><p class="P126" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0,635cm;">•</span>Attach your microcontroller's UART lines or RS232C's line driver lines to the ESP8266, I think enough has been written about how to do that. <span class="odfLiEnd"/> </p></li><li><p class="P120" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0,635cm;">•</span><span class="T5">Start a </span><span class="Source_20_Text"><span class="T5">telnet</span></span><span class="T5"> session to port 24 of the ip address, type </span><span class="Source_20_Text"><span class="T5">help</span></span><span class="T5"> and </span><span class="Source_20_Text"><span class="T5"><enter></span></span><span class="T5">. </span><span class="odfLiEnd"/> </p></li><li><p class="P121" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0,635cm;">•</span>You will now see all commands. <span class="odfLiEnd"/> </p></li><li><p class="P120" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0,635cm;">•</span><span class="T5">Use the commands starting with </span><span class="T6">uart </span><span class="T5">to setup the UART. After that, issue the </span><span class="Source_20_Text"><span class="T5">config-write</span></span><span class="T5"> command to save and use the </span><span class="Source_20_Text"><span class="T5">reset</span></span><span class="T5"> command to restart. </span><span class="odfLiEnd"/> </p></li><li><p class="P121" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0,635cm;">•</span>After restart you will have a transparent connection between tcp port 23 and the UART<span class="T30">;</span> tcp port 24 always <span class="T51">remains </span>available for control. <span class="odfLiEnd"/> </p></li></ul><h3 class="P43"><a id="a__Configuring_and_using_IO_pins"><span/></a><span class="T58">Configuring and using </span>IO <span class="T58">pins</span></h3><p class="P9_borderStart">The I/O pins are organised in <span class="T55">devices</span> of at most 16 pins. Each pin <span class="T66">of each device </span>must be configured <span class="T58">to a mode it will be used in</span>. That goes even for pins that can only have one function (e.g. the <span class="T58">ADC </span>input). If a pin is not configured (i.e. set to mode “disabled”), it won't be used and not even initialised, <span class="T58">thereby keeping it's original function (e.g. UART) or remaining floating (HiZ).</span></p><p class="P9"/><p class="P9"><span class="T55">Device </span>0 <span class="T67">always </span>consists of the 16 “normal” built-in GPIO's. All can be used, except for 6 <span class="T66">to </span>11, which is used for the flash memory interface, they aren't allowed to be configured for GPIO. <span class="T67">In total e</span>ight pins can be configured for PWM operation, which is <span class="T67">generically </span>called “analog output” mode, because using a simple RC filter, it can be used as analog output.</p><p class="P9"/><p class="P9"><span class="T55">Device </span>1 <span class="T67">always </span>consists of <span class="T67">the </span>two “special” pins. Pin 0 is the “extra” GPIO, also known as the RTC GPIO. This is a simple I/O pin that can only do digital input and digital output, so PWM is not supported, but timer mode is supported. Pin 1 is the ADC input (analog input). The returned value <span class="T67">is </span>normalised to a 16 bit value (0-65535), but the precision won't be 16 bits, expect about <span class="T67">9-10</span> bits.</p><p class="P9"/><p class="P9">Higher <span class="T55">numbered devices </span>will represent externally connected I2C I/O expanders, like <span class="T67">the </span>MCP23017 <span class="T54">(16 I/O pins) </span>and PCF8574 <span class="T54">(8 I/O pins)</span>. <span class="T54">Each pin of these needs to be configured in the same way as the GPIO's from device 0 and device 1 </span><span class="T54">(internal). These devices support digital input, digital output, counter and timer operation (using software emulation on the ESP8266 itself). PWM is not supported.</span></p><p class="P9"/><p class="P21">The following I/O pin modes are supported (depending on <span class="T58">each device</span> and pin), <span class="T57">using the io-mode command:</span></p><p class="P21_borderEnd"/><table border="0" cellspacing="0" cellpadding="0" class="Table11"><colgroup><col width="100"/><col width="253"/><col width="284"/><col width="192"/></colgroup><tr class="Table111"><td style="text-align:left;width:2.293cm; " class="Table11_A1"><p class="P82">I/O function</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A1"><p class="P82">mode name for im command <span class="T56">etc.</span></p></td><td style="text-align:left;width:6.503cm; " class="Table11_A1"><p class="P82">function</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D1"><p class="P82">available on device</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">disabled</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">disabled</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">pin isn't touched</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">all devices</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">digital input</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">inputd</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">digital two state input</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">most devices</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">counter</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">counter</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">count <span class="T67">(downward) </span>edges on digital input</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">most devices</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">digital output</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">outputd</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">digital two state output</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">most devices</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">timer</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">timer</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">trigger digital output once or repeatedly</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">most devices</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">analog input</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">inputa</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">analog input, <span class="T67">value 0 – 65535</span></p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">ADC <span class="T67">pin </span>on device 1 only</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">analog output</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">outputa</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">analog output (or PWM), value 0 – 65535</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89"><span class="T67">GPIO pins</span> on device 0 only</p></td></tr><tr><td style="text-align:left;width:2.293cm; " class="Table11_A2"><p class="P89">i2c</p></td><td style="text-align:left;width:5.8cm; " class="Table11_A2"><p class="P89">i2c</p></td><td style="text-align:left;width:6.503cm; " class="Table11_A2"><p class="P89">set pin to i2c sda or scl mode</p></td><td style="text-align:left;width:4.404cm; " class="Table11_D2"><p class="P89">GPIO <span class="T77">pins </span>on device 0 only</p></td></tr></table><p class="P21_borderStart"/><p class="P22">For each pin some flags can be (indepently) set or cleared, <span class="T57">using the io-set-flag and io-clear-flag commands:</span></p><p class="P22_borderEnd"/><table border="0" cellspacing="0" cellpadding="0" class="Table12"><colgroup><col width="174"/><col width="224"/><col width="275"/><col width="158"/></colgroup><tr class="Table121"><td style="text-align:left;width:3.992cm; " class="Table12_A1"><p class="P83">I/O additional feature</p></td><td style="text-align:left;width:5.115cm; " class="Table12_A1"><p class="P83">flags name for isf and icf etc.</p></td><td style="text-align:left;width:6.283cm; " class="Table12_A1"><p class="P83">function</p></td><td style="text-align:left;width:3.611cm; " class="Table12_D1"><p class="P83">available on mode</p></td></tr><tr><td rowspan="3" style="text-align:left;width:3.992cm; " class="Table12_A2"><p class="P90">autostart</p></td><td rowspan="3" style="text-align:left;width:5.115cm; " class="Table12_A2"><p class="P90">autostart</p></td><td style="text-align:left;width:6.283cm; " class="Table12_C2"><p class="P90"><span class="T34">digital output</span>: set the output to on after start (otherwise it's set to off)</p></td><td rowspan="3" style="text-align:left;width:3.611cm; " class="Table12_D7"><p class="P90">digital output, timer,</p><p class="P90">analog output</p></td></tr><tr><td style="text-align:left;width:6.283cm; " class="Table12_C3"><p class="P90"><span class="T34">timer</span>: trigger automatically after start, otherwise wait for explicit trigger</p></td></tr><tr><td style="text-align:left;width:6.283cm; " class="Table12_C4"><p class="P90"><span class="T34">analog output</span>: trigger the modulation feature, otherwise wait for explicit trigger.</p></td></tr><tr><td style="text-align:left;width:3.992cm; " class="Table12_A2"><p class="P90">repeat</p></td><td style="text-align:left;width:5.115cm; " class="Table12_A2"><p class="P90">repeat</p></td><td style="text-align:left;width:6.283cm; " class="Table12_A2"><p class="P91">repeat the trigger after one cycle</p></td><td style="text-align:left;width:3.611cm; " class="Table12_D7"><p class="P91">timer, analog output</p></td></tr><tr><td style="text-align:left;width:3.992cm; " class="Table12_A2"><p class="P90">pull-up</p></td><td style="text-align:left;width:5.115cm; " class="Table12_A2"><p class="P90">pullup</p></td><td style="text-align:left;width:6.283cm; " class="Table12_A2"><p class="P91">activate internal (weak) pull-up resistors</p></td><td style="text-align:left;width:3.611cm; " class="Table12_D7"><p class="P91">digital input, counter</p></td></tr><tr><td style="text-align:left;width:3.992cm; " class="Table12_A2"><p class="P90">reset on read</p></td><td style="text-align:left;width:5.115cm; " class="Table12_A2"><p class="P90">reset-on-read</p></td><td style="text-align:left;width:6.283cm; " class="Table12_A2"><p class="P91">reset the counter when it's read</p></td><td style="text-align:left;width:3.611cm; " class="Table12_D7"><p class="P91">counter</p></td></tr></table><h3 class="P45"><a id="a__Configuring_and_using_I2C"><span/></a>Configuring and using I2C</h3><p class="P3_borderStart"><span class="T19">To </span><span class="T20">use</span><span class="T19"> </span><span class="T20">I2C</span><span class="T19">, first </span><span class="T21">configure </span><span class="T19">two GPIO's as </span><span class="Emphasis"><span class="T22">sda</span></span><span class="T22"> </span><span class="T19">and </span><span class="Emphasis"><span class="T22">scl</span></span><span class="T19"> lines using the </span><span class="T47">im</span><span class="Source_20_Text"><span class="T46"> .. mode </span></span><span class="Source_20_Text"><span class="T48">i2c </span></span><span class="Source_20_Text"><span class="T46">sda</span></span><span class="T19"> and </span><span class="T47">im</span><span class="Source_20_Text"><span class="T46"> .. mode </span></span><span class="Source_20_Text"><span class="T48">i2c scl </span></span><span class="Source_20_Text"><span class="T49"><delay></span></span><span class="Source_20_Text"><span class="T21"> </span></span><span class="T19">commands. </span><span class="T23">The <delay> needs to </span><span class="T24">5</span><span class="T23"> to able to communicate with generic I2C devices, it makes the bus run at just below 100 kHz. If you double the speed of the CPU, increase this value accordingly. Some devices can run at much higher speeds (Fastmode, Fastmode+, etc.), in that case, the delay can be lower and the </span><span class="T25">bus </span><span class="T23">speed </span><span class="T25">will in</span><span class="T23">creas, </span><span class="T25">b</span><span class="T23">ut make sure it's never faster than the slowest device on the bus. Some devices may proof difficult to </span><span class="T25">communicate with</span><span class="T23">. In that case, an additional delay might help.</span></p><p class="P34"/><p class="P34">Now use the raw I2C read and write commands to communicate. Don't forget to set the target slave address first. Most devices accept a register pointer as first data byte and then the values to write to this register. Similarly for a read from a certain register, write one byte (the register pointer) and then read one or more bytes.</p><p class="P34"/><p class="P34">The repeated-<span class="T61">start-condition</span> feature is not implemented. It has never been proven to be a real requirement, so I left it out.</p><p class="P34"/><p class="P3"><span class="T19">Besides the </span><span class="T20">well-known</span><span class="T19"> GPIOs, </span><span class="T23">it's </span><span class="T19">possible to use </span><span class="Emphasis"><span class="T22">GPIO0</span></span><span class="T22"> and </span><span class="Emphasis"><span class="T22">GPIO2</span></span><span class="T22"> (boot selection) </span><span class="T19">for </span><a href="mailto:I@C" class="Internet_20_link"><span class="T72">I</span></a><span class="T23">2C pins</span><span class="T19">, just as </span><span class="Emphasis"><span class="T22">GPIO1</span></span><span class="T22"> and </span><span class="Emphasis"><span class="T22">GPIO3</span></span><span class="T22"> </span><span class="T19">(normally connected to the UART) using a proper pull-up resistor. </span><span class="T23">This will come handy if you only have access to an ESP-01, that only has these GPIO's available.</span></p><p class="P34"/><p class="P1"><span class="T19">The selected GPIO's are set to </span><span class="Emphasis"><span class="T22">open drain</span></span><span class="T26"> </span><span class="T19">mode without </span><span class="T23">any </span><span class="Emphasis"><span class="T22">pull-up</span></span><span class="T19">, so you will have to add them yourself. The proper value of the resistors should be calculated but </span><span class="Emphasis"><span class="T22">4.7 kOhm</span></span><span class="T19"> usually works just fine. </span></p><p class="P118"/><p class="P23">Currently supported <span class="T53">I2C</span> sensors are:</p><p class="P119_borderEnd"/><ul><li><p class="P127" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">digipicco</span></span><span class="T26"> </span><span class="T19">(temperature and humidity) </span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">lm75</span></span><span class="T19"> (and compatible sensors, </span><span class="T21">at two different addresses</span><span class="T19">) (temperature) </span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">ds1621/ds1631/ds1731</span></span><span class="T19"> (temperature) </span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">bmp085</span></span><span class="T19"> (temperature and pressure) (untested for now) </span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">htu21</span></span><span class="T19"> (temperature and humdity)</span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">am2321</span></span><span class="T19"> (temperature and humidity) </span><span class="odfLiEnd"/> </p></li><li><p class="P129" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span>tsl2550 (light intensity)<span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">tsl2560</span></span><span class="T19"> (light intensity) </span><span class="odfLiEnd"/> </p></li><li><p class="P128" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.499cm;">•.</span><span class="Emphasis"><span class="T22">bh1750</span></span><span class="T19"> (light intensity). </span><span class="odfLiEnd"/> </p></li></ul><h3 class="P41"><a id="a__Configuring_and_using_displays"><span/></a>Configuring and using displays</h3><p class="P24_borderStart">During startup, available displays are probed. There is no need to configure them manually. For the SAA1064, It does need a properly functioning I2C bus, though, so make sure it works.<span class="T81"> Hitaci-type LCD's are controlled over I2C I/O expanders, so they can't be detected automatically, make sure the configuration is active and correct and it will be detected as such.</span></p><p class="P19"/><p class="P19">All displays have 8 slots for messages that can be set using the <span class="T40">ds</span> (display-set) command: Use <span class="T40">dd</span> (display-dump) to show all detected displays, <span class="T52">you may want to </span>add a verbosity value (<span class="T40">0-2</span>) to see more detail. Finally the <span class="T40">db</span> (display-bright) command controls the brightness of the display. Valid values are <span class="T13">0</span> (off), <span class="T40">1, 2, 3, 4</span> (max).</p><p class="P19"/><p class="P19_borderEnd"><span class="T52">Note </span>the <span class="T33">SAA</span>1064 runs at 5V or higher. It cannot be connected to the <span class="T33">ESP</span>8266 directly, <span class="T52">i</span>t must have it's own 5V power supply and may or may not need <span class="T33">I2C</span> level shifters. I am using level shifters, but it may not be necessary<span class="T33">,</span> YMMV.</p><h2 class="P117"><a id="a__Command_reference"><span/></a>Command reference</h2><h3 class="P41"><a id="a__General__status_and_informational_commands"><span/></a><span class="T68">General, s</span>tatus and informational commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table1"><colgroup><col width="83"/><col width="201"/><col width="205"/><col width="341"/></colgroup><tr class="Table11"><td style="text-align:left;width:1.896cm; " class="Table1_A1"><p class="P38">command</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A1"><p class="P38">alternate (long) command</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A1"><p class="P38">parameters</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D1"><p class="P38">description</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">ccd</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">current-config-dump</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P86"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Show currently used config (not saved to flash).</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">cd</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">config-dump</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Show config from flash (active after next restart).</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P56">ctp</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P56">command-tcp-port</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P69">tcp_port</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P103">Set / show the tcp port the command interface listens to.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P56">ctt</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P56">command-tcp-timeout</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P69">timeout_in_seconds</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P103">Set / show the disconnect timeout on the command interface tcp port (0 = no timeout).</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">cw</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">config-write</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Write current config to flash.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">gss</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">gpio-status-set</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P60">io pin</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Select the io device and pin to trigger when general status changes (currently on reception of a command). Set io and pin to -1 to disable this feature. On trigger, a value of -1 is written to this pin, so generally you'd want to use a timer “down” mode pin for this purpose (so the pin is reset after some time).</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">nd</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">ntp-dump</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Show current ntp status (if configured).</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">ns</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">ntp-set</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P48"><span class="T32">ntp-server-ip</span> <span class="T32">timezone-hours</span></p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Setup ntp server. Allow it to run for a few minutes before the correct time is acquired.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P47">?</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">help</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Show all commands and usage in brief.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">q</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">quit</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Close the current command connection. If idle for over 30 seconds, the connection is closed anyway.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P48">r</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P48">reset</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P92">Reset/reboot the device. Necessary to activate some change (like PWM), after having written the config using cw.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P49">rs</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P49">rtc-set</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P49"><span class="T32">hh</span>:<span class="T32">mm</span></p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P93">Set internal clock, works even without NTP but may run out of sync on the long term. If NTP is used, the internal clock is synchronised every minute.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P49">s or u</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P49">set or unset</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P61">flag_name</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P93">Set or unset generic operation flags. Use set or unset without arguments to get a list of currently supported flags. </p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P49">S</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P49">stats</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P93">Retrieve running statistics.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P57">w<span class="T80">a</span>c</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P57">wlan-<span class="T80">ap-</span>configure</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P70">ssid passwd<span class="T80"> channel</span></p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P104">Reconfigure WLAN identification<span class="T80"> for access point mode</span>. Write config and reboot to effectuate.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P133">wcc</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P133">wlan-client-configure</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P135">ssid passwd</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P136">Reconfigure WLAN identification<span class="T80"> for client mode</span>. Write config and reboot to effectuate.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P49">ws</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P49">wlan-scan</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P47"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P93">Scan for SSID's. Issue this command first, then wait a few seconds and then issue wlan-list.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P49">wl</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P49">wlan-list</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P86"> </p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P93">List SSID's found with wlan-scan.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table1_A2"><p class="P134">wm</p></td><td style="text-align:left;width:4.609cm; " class="Table1_A2"><p class="P134">wlan-mode</p></td><td style="text-align:left;width:4.695cm; " class="Table1_A2"><p class="P138">client|ap</p></td><td style="text-align:left;width:7.8cm; " class="Table1_D2"><p class="P137">Set wlan mode. This command will be effective immediately. See text for details.</p></td></tr></table><h3 class="P41"><a id="a__I_O_configuration_and_related_commands"><span/></a>I/O configuration and related commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table2"><colgroup><col width="83"/><col width="205"/><col width="293"/><col width="249"/></colgroup><tr class="Table21"><td style="text-align:left;width:1.896cm; " class="Table2_A1"><p class="P84">command</p></td><td style="text-align:left;width:4.697cm; " class="Table2_A1"><p class="P38">alternate (long) command / <span class="T69">submode</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A1"><p class="P38">parameters</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D1"><p class="P38">description</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table2_A2"><p class="P49">im</p></td><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P49"><span class="T69">io-</span>mode</p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P61">io_device io_pin mode mode_parameters</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P93">Configure pin mode.</p></td></tr><tr><td rowspan="22" style="text-align:left;width:1.896cm; " class="Table2_A2"><p class="P86"> </p></td><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">inputd</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P50">inputd</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Set pin to digital input <span class="T71">mode</span>.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">counter</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P94"><span class="T40">counter</span> <span class="T43">debounce</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Set pin to digital input <span class="T71">mode</span>, count downward transitions. Set debounce in milliseconds.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">outputd</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P50">outputd</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Set pin to digital output <span class="T71">mode.</span></p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">timer</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P50">timer <span class="T32">direction</span> <span class="T32">delay</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Set <span class="T71">pin </span>to timer <span class="T71">mode</span>. Direction is up or down and specifies the default state and triggered state (down: default up, triggered down, up: default down, triggerend up). Delay is time before state is set to default after trigger.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P95">mode=<span class="T44">inputa</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P86"> </p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P95">Set pin to analog input mode.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">outputa (1)</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P86"> </p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Select analog output (or PWM). Default value is 0.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">outputa (2)</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P62">default_value</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Select analog output (or PWM). Default value set to argument (0-65535).</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P94">mode=<span class="T40">outputa (3)</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P62">lower_bound upper_bound delay</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Select analog output (or PWM). After (auto-)trigger start to modulate between lower_bound and upper_bound at specified speed (ms / 10000).</p></td></tr><tr><td rowspan="2" style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P62"><span class="T16">mode=</span><span class="T70">i2c</span></p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P50">sda</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Configure built-in GPIO for I2C/sda use.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P50">scl <span class="T32">bus_delay</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P94">Configure built-in GPIO for I2C/scl use. Set bus_delay to 5 for standard 100 khz bus, lower value is higher bus speed and v.v.</p></td></tr><tr><td rowspan="12" style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P74">mode=lcd</p></td><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">rs <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for R/S signaling. Can be any digital capable pin. Required.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">rw <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for R/W signaling. Can be any digital capable pin. Not required, is only always set to low (write).</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">e <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for E signaling. Can be any digital capable pin. Required.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d0 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D0 data line. Can be any digital capable pin. Required for 8 bit operation, not required for 4 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d1 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D1 data line. Can be any digital capable pin. Required for 8 bit operation, not required for 4 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d2 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D2 data line. Can be any digital capable pin. Required for 8 bit operation, not required for 4 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d3 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D3 data line. Can be any digital capable pin. Required for 8 bit operation, not required for 4 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d4 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D4 data line. Can be any digital capable pin. Required for both 4 bit and 8 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d5 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D5 data line. Can be any digital capable pin. Required for both 4 bit and 8 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d6 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D6 data line. Can be any digital capable pin. Required for both 4 bit and 8 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">d7 <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for the D7 data line. Can be any digital capable pin. Required for both 4 bit and 8 bit operation.</p></td></tr><tr><td style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P58">bl <span class="T32">io pin</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P105">Set I/O and pin for controlling the backlight. Can be an analog output for dimming or a digital output (on/off only). Optional.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table2_A25"><p class="P51">ir</p></td><td style="text-align:left;width:4.697cm; " class="Table2_B25"><p class="P71">io-read</p></td><td style="text-align:left;width:6.703cm; " class="Table2_C25"><p class="P64">io_device io_pin</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D25"><p class="P96">Read pin. Source of the value depends on the mode of the pin. Counter e.g. returns the current counter value. Outputs can also be read, they return the actual pin state, not that of the output latch.</p></td></tr><tr><td rowspan="8" style="text-align:left;width:1.896cm; " class="Table2_A2"><p class="P52">iw</p></td><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P72">io-write</p></td><td rowspan="8" style="text-align:left;width:6.703cm; " class="Table2_A2"><p class="P65">io_device io_pin <span class="T71">value</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P95">Write pin. Semantics differ for various pin modes.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T65">mode=</span><span class="T39">inputd</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P95">Not implemented.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T65">mode=</span><span class="T39">counter</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P95">Write counter value directly.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T65">mode=</span><span class="T39">outputd</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P95">Write value. 0 is off, any other value is on</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T14">mode=</span><span class="T39">timer</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P97">Control counter output. 0 is set pin to default, other value is trigger timer (set to active and start timer).</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T14">mode=</span><span class="T45">in</span><span class="T39">puta</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P97">Not implemented.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P106"><span class="T14">mode=</span><span class="T39">outputa</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P97">Write analog output. If -1 is given and the this is a auto-modulating analog output (see mode=outputa (3)), start modulating. Otherwise just set the current value of the output.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A2"><p class="P63"><span class="T16">mode=</span><span class="T70">i2c</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D2"><p class="P97">Not implemented.</p></td></tr><tr><td rowspan="5" style="text-align:left;width:1.896cm; " class="Table2_A34"><p class="P53">isf <span class="T14">or</span><span class="T1"> </span>icf</p></td><td style="text-align:left;width:4.697cm; " class="Table2_A34"><p class="P73">io-set-flag or io-clear_flag</p></td><td rowspan="5" style="text-align:left;width:6.703cm; " class="Table2_A34"><p class="P66">io_device io_pin flag</p></td><td style="text-align:left;width:5.704cm; " class="Table2_D34"><p class="P98">Set or clear flags for a pin.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A34"><p class="P107"><span class="T65">flag=</span><span class="T39">autostart</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D34"><p class="P99">Automatically start this pin at start.</p><p class="P99"> </p><p class="P99">For a digital output pin this means set to “on” instead of default “off”. </p><p class="P99"> </p><p class="P99">For a timer or a modulated analog output this means trigger automatically at start. Otherwise these types of pins need to be triggered automatically by writing to them.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A34"><p class="P107"><span class="T65">flag=</span><span class="T39">repeat</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D34"><p class="P99">For a timer or a modulated analog output this mean repeat after the first cycle. Otherwise stop after one cycle.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A34"><p class="P107"><span class="T65">flag=</span><span class="T39">pullup</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D34"><p class="P99">For a digital input or counter, activate the built-in weak pull-up.</p></td></tr><tr><td style="text-align:left;width:4.697cm; " class="Table2_A34"><p class="P107"><span class="T65">flag=</span><span class="T39">reset_on_read</span></p></td><td style="text-align:left;width:5.704cm; " class="Table2_D34"><p class="P99">For a timer, when it's read, also reset it automatically.</p></td></tr></table><h3 class="P41"><a id="a__UART_configuration_and_related_commands"><span/></a>UART configuration and related commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table3"><colgroup><col width="83"/><col width="202"/><col width="179"/><col width="367"/></colgroup><tr class="Table31"><td style="text-align:left;width:1.894cm; " class="Table3_A1"><p class="P85">command</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A1"><p class="P38">alternate (long) command</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A1"><p class="P85">parameters</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D1"><p class="P85">description</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P56">btp</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P56">bridge-tcp-port</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P69">tcp_port</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P103">Set / show the tcp port the UART is listening to.</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P56">btt</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P56">bridge-tcp-timeout</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P69">timeout_in_seconds</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P103">Set / show the UART tcp port disconnect timeout (0 = no timeout)</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P54">ub</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P54">uart-baud</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P67">baud_rate</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P100">Set baud rate.</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P54">ud</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P54">uart-data</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P67">data_bits</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P100">Set data bits (6, 7 or 8).</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P54">us</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P54">uart-stop</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P67">stop_bits</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P100">Set stop bits (1 or 2).</p></td></tr><tr><td style="text-align:left;width:1.894cm; " class="Table3_A2"><p class="P54">up</p></td><td style="text-align:left;width:4.611cm; " class="Table3_A2"><p class="P54">uart-parity</p></td><td style="text-align:left;width:4.101cm; " class="Table3_A2"><p class="P67">parity</p></td><td style="text-align:left;width:8.394cm; " class="Table3_D2"><p class="P100">Set parity (none/even/odd).</p></td></tr></table><h3 class="P41"><a id="a__I2C_related_commands"><span/></a>I2C related commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table4"><colgroup><col width="92"/><col width="131"/><col width="236"/><col width="372"/></colgroup><tr class="Table41"><td style="text-align:left;width:2.096cm; " class="Table4_A1"><p class="P108">command</p></td><td style="text-align:left;width:2.999cm; " class="Table4_A1"><p class="P108">alternate (long) command</p></td><td style="text-align:left;width:5.401cm; " class="Table4_A1"><p class="P108">parameters</p></td><td style="text-align:left;width:8.505cm; " class="Table4_D1"><p class="P108">description</p></td></tr><tr><td style="text-align:left;width:2.096cm; " class="Table4_A2"><p class="P55">i2a</p></td><td style="text-align:left;width:2.999cm; " class="Table4_A2"><p class="P55">i2c-address</p></td><td style="text-align:left;width:5.401cm; " class="Table4_A2"><p class="P68">address</p></td><td style="text-align:left;width:8.505cm; " class="Table4_D2"><p class="P101">Set I2C slave's address to use for other commands. Specify hex number from 0 to 7a. Don't include the r/w bit and don't include 0x.</p></td></tr><tr><td style="text-align:left;width:2.096cm; " class="Table4_A2"><p class="P55">i2r</p></td><td style="text-align:left;width:2.999cm; " class="Table4_A2"><p class="P55">i2c-read</p></td><td style="text-align:left;width:5.401cm; " class="Table4_A2"><p class="P68">number_of_bytes_to_read</p></td><td style="text-align:left;width:8.505cm; " class="Table4_D2"><p class="P101">Read this amount of bytes from the current I2C slave.</p></td></tr><tr><td style="text-align:left;width:2.096cm; " class="Table4_A2"><p class="P55">i2w</p></td><td style="text-align:left;width:2.999cm; " class="Table4_A2"><p class="P55">i2c-write</p></td><td style="text-align:left;width:5.401cm; " class="Table4_A2"><p class="P68">byte_to_write, ...</p></td><td style="text-align:left;width:8.505cm; " class="Table4_D2"><p class="P101">Write these bytes to the current I2C slave. <span class="T75">Bytes</span> can be specified in either decimal or hexadecimal, in which case they should be prefixed with 0x.</p></td></tr><tr><td style="text-align:left;width:2.096cm; " class="Table4_A2"><p class="P55">i2rst</p></td><td style="text-align:left;width:2.999cm; " class="Table4_A2"><p class="P55">i2c-reset</p></td><td style="text-align:left;width:5.401cm; " class="Table4_A2"><p class="P59"> </p></td><td style="text-align:left;width:8.505cm; " class="Table4_D2"><p class="P102">Reset the I2C bus. This also attempts to convince “stuck” slaves to release the bus, it may or may not work.</p></td></tr></table><h3 class="Heading_20_3"><a id="a__I2C_sensor_related_commands"><span/></a>I2C sensor related commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table5"><colgroup><col width="83"/><col width="210"/><col width="231"/><col width="306"/></colgroup><tr class="Table51"><td style="text-align:left;width:1.896cm; " class="Table5_A1"><p class="P111">command</p></td><td style="text-align:left;width:4.807cm; " class="Table5_A1"><p class="P111">alternate (long) command</p></td><td style="text-align:left;width:5.292cm; " class="Table5_A1"><p class="P111">parameters</p></td><td style="text-align:left;width:7.006cm; " class="Table5_D1"><p class="P111">description</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table5_A2"><p class="P76">isd</p></td><td style="text-align:left;width:4.807cm; " class="Table5_A2"><p class="P76">i2c-sensor-dump</p></td><td style="text-align:left;width:5.292cm; " class="Table5_A2"><p class="P78">verbosity</p></td><td style="text-align:left;width:7.006cm; " class="Table5_D2"><p class="P109">List all detected sensors. Use the id's from this list to query the value (using isr). If verbosity is 0 or missing, only show found sensors. If it's 1, show all known sensors. If it's 2, show all known sensors including verbose error reporting.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table5_A2"><p class="P76">isr</p></td><td style="text-align:left;width:4.807cm; " class="Table5_A2"><p class="P76">i2c-sensor-read</p></td><td style="text-align:left;width:5.292cm; " class="Table5_A2"><p class="P78">sensor_id</p></td><td style="text-align:left;width:7.006cm; " class="Table5_D2"><p class="P109">Read a sensor.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table5_A2"><p class="P76">isc</p></td><td style="text-align:left;width:4.807cm; " class="Table5_A2"><p class="P76">i2c-sensor-calibrate</p></td><td style="text-align:left;width:5.292cm; " class="Table5_A2"><p class="P78">sensor_id factor offset</p></td><td style="text-align:left;width:7.006cm; " class="Table5_D2"><p class="P109">Calibrate a sensor. Specify a value (float) to multiply the value by (<span class="T40">factor</span>) and a value to be added (or subtracted…) from the value (<span class="T40">offset</span>). The calibration is saved in flash together with the config using config-write. If the parameters are left out, list all current calibrations.</p></td></tr></table><h3 class="P46"><a id="a__Display_control_related_commands"><span/></a>Display control related commands</h3><table border="0" cellspacing="0" cellpadding="0" class="Table7"><colgroup><col width="88"/><col width="205"/><col width="205"/><col width="332"/></colgroup><tr><td style="text-align:left;width:2.007cm; " class="Table7_A1"><p class="P39">command</p></td><td style="text-align:left;width:4.695cm; " class="Table7_A1"><p class="P39">alternate (long) command</p></td><td style="text-align:left;width:4.697cm; " class="Table7_A1"><p class="P39">parameters</p></td><td style="text-align:left;width:7.601cm; " class="Table7_D1"><p class="P39">description</p></td></tr><tr><td style="text-align:left;width:2.007cm; " class="Table7_A4"><p class="P115">db</p></td><td style="text-align:left;width:4.695cm; " class="Table7_B4"><p class="P115">display-brightness</p></td><td style="text-align:left;width:4.697cm; " class="Table7_C2"><p class="P116">brightness_value</p></td><td style="text-align:left;width:7.601cm; " class="Table7_D2"><p class="P113">Set / show display brightness. 0 = off, 1 = 25%, 2 = 50%, 3 = 75%, 4 = 100%.</p></td></tr><tr><td style="text-align:left;width:2.007cm; " class="Table7_A4"><p class="P115">dd</p></td><td style="text-align:left;width:4.695cm; " class="Table7_B4"><p class="P115">display-dump</p></td><td style="text-align:left;width:4.697cm; " class="Table7_C3"><p class="P114"> </p></td><td style="text-align:left;width:7.601cm; " class="Table7_D3"><p class="P113">Show all available information on the connected display.</p></td></tr><tr><td style="text-align:left;width:2.007cm; " class="Table7_A4"><p class="P115">ddm</p></td><td style="text-align:left;width:4.695cm; " class="Table7_B4"><p class="P115">display-default-message</p></td><td style="text-align:left;width:4.697cm; " class="Table7_C4"><p class="P116">message</p></td><td style="text-align:left;width:7.601cm; " class="Table7_D4"><p class="P113">Set the default message, i.e. the message that is shown when the user hasn't set any slots (yet).</p></td></tr><tr><td style="text-align:left;width:2.007cm; " class="Table7_A5"><p class="P115">dft</p></td><td style="text-align:left;width:4.695cm; " class="Table7_B5"><p class="P115">display-flip-timeout</p></td><td style="text-align:left;width:4.697cm; " class="Table7_C5"><p class="P116">timeout</p></td><td style="text-align:left;width:7.601cm; " class="Table7_D5"><p class="P113">Set / show the timeout in seconds between slot “flips”, i.e. how long each message slot is shown.</p></td></tr><tr><td style="text-align:left;width:2.007cm; " class="Table7_A6"><p class="P115">ds</p></td><td style="text-align:left;width:4.695cm; " class="Table7_B6"><p class="P115">display-set</p></td><td style="text-align:left;width:4.697cm; " class="Table7_C6"><p class="P116">slot timeout tag text</p></td><td style="text-align:left;width:7.601cm; " class="Table7_D6"><p class="P113">Set a message in a slot. After timeout seconds, the slot is released or use 0 to have a message linger forever. The tag is show on row 0 of the display, along with the current time. Use “-” as the tag to skip the tag completely and use all four rows for your message. Then finally the message which can have spaces and newlines inside. Use %%%% as message content to have the default message (= display type + time).</p></td></tr></table><h3 class="Heading_20_3"><a id="a__OTA_commands"><span/></a>OTA commands</h3><p class="P35_borderStart">Note: these commands are not meant to be used directly. They're meant to be used in concerto with a host-side application that uploads a new image. See otapush.c for an example.</p><p class="P35_borderEnd"/><table border="0" cellspacing="0" cellpadding="0" class="Table6"><colgroup><col width="83"/><col width="122"/><col width="179"/><col width="446"/></colgroup><tr class="Table61"><td style="text-align:left;width:1.896cm; " class="Table6_A1"><p class="P112">command</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A1"><p class="P111">alternate (long) command</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A1"><p class="P112">parameters</p></td><td style="text-align:left;width:10.202cm; " class="Table6_D1"><p class="P112">description</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table6_A2"><p class="P77">ow</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A2"><p class="P77">ota-write</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A2"><p class="P79">image_length</p></td><td style="text-align:left;width:10.202cm; " class="Table6_D2"><p class="P110">Start a firmware upload cycle. Specify the total amount of bytes that will be sent.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table6_A2"><p class="P77">ov</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A2"><p class="P77">ota-verify</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A2"><p class="P79">image_length</p></td><td style="text-align:left;width:10.202cm; " class="Table6_D2"><p class="P110">Start a firmware verify cycle. Specify the total amount of bytes that will be sent.</p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table6_A2"><p class="P77">os</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A2"><p class="P77">ota-send</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A2"><p class="P79">chunk_length crc bytes...</p></td><td style="text-align:left;width:10.202cm; " class="Table6_D2"><p class="P110">Send the next chunk. A chunk should be 256, 512 or 1024 bytes in size. If a transer using 1024 bytes doesn't succeed, try lower values. Also send the CRC32 of the chunk and then the data as raw binary content. Don't add newlines. Repeat until all data is sent or call ota-finish to either finish (when done) or cancel (when not complete). Every time a complete flash sector has been received, it will be written to flash and verified to both the received data and the received CRC32. <span class="T76">If the chunk went well, the word “ACK” followed by the chunk ordinal will be replied.</span></p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table6_A2"><p class="P77">of</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A2"><p class="P77">ota-finish</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A2"><p class="P79">md5_sum</p></td><td style="text-align:left;width:10.202cm; " class="Table6_D2"><p class="P110">Finish up. Send the md5_sum over the complete file as hex string. <span class="T76">If everything went well, the string “VERIFY_OK” or “WRITE_OK” will be replied (depending on the requested operation).</span></p></td></tr><tr><td style="text-align:left;width:1.896cm; " class="Table6_A2"><p class="P77">oc</p></td><td style="text-align:left;width:2.801cm; " class="Table6_A2"><p class="P77">ota-commit</p></td><td style="text-align:left;width:4.101cm; " class="Table6_A2"><p class="P75"> </p></td><td style="text-align:left;width:10.202cm; " class="Table6_D2"><p class="P110">If everything went well, toggle the current boot bank and reset. <span class="T76">Replies “OTA commit slot” + the new slot number if all went well.</span></p></td></tr></table><p class="P35"> </p><!--Next 'div' was a 'text:section'.--><div class="Sect1" id="js-repo-pjax-container"><!--Next 'div' was a 'text:section'.--><div class="Sect1" id="readme"><p class="Text_20_body"><span class="T19">See here for latest news and join the discussion: </span><a href="http://www.esp8266.com/viewtopic.php?t=3959" class="Internet_20_link"><span class="T72">http://www.esp8266.com/viewtopic.php?t=3959</span></a><span class="T19">, old topic: </span><a href="http://www.esp8266.com/viewtopic.php?&t=3212" class="Internet_20_link"><span class="T72">http://www.esp8266.com/viewtopic.php?&t=3212</span></a><span class="T19">.</span></p></div></div><ul><li><p class="P130"> </p></li></ul></body></html>