From 6d87ef5aa934b0571466985d1f72d49773964d95 Mon Sep 17 00:00:00 2001 From: xsyp Date: Sun, 27 Dec 2015 17:15:49 +0800 Subject: [PATCH 01/38] Add espduino board ESPDuino boards from doit.am (arduino uno look like board for esp8266) --- boards.txt | 67 ++++++++++++++++++ doc/filesystem.md | 1 + .../package_esp8266com_index.template.json | 3 + variants/ESPDuino/pins_arduino.h | 68 +++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 variants/ESPDuino/pins_arduino.h diff --git a/boards.txt b/boards.txt index c8ac253e6..0efa452dc 100644 --- a/boards.txt +++ b/boards.txt @@ -180,6 +180,73 @@ generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu # generic.menu.FlashSize.16M.build.spiffs_end=0x1000000 # generic.menu.FlashSize.16M.build.spiffs_blocksize=8192 +############################################################## +espduino.name=ESPDuino (ESP-13 Module) + +espduino.upload.tool=esptool +espduino.upload.speed=115200 +espduino.upload.resetmethod=ck +espduino.upload.maximum_size=1044464 +espduino.upload.maximum_data_size=81920 +espduino.upload.wait_for_upload_port=true +espduino.serial.disableDTR=true +espduino.serial.disableRTS=true + +espduino.build.mcu=esp8266 +espduino.build.f_cpu=80000000L +espduino.build.board=ESP8266_ESP13 +espduino.build.core=esp8266 +espduino.build.variant=espduino +espduino.build.flash_mode=dio +espduino.build.flash_size=4M +espduino.build.flash_freq=40 + +espduino.menu.CpuFrequency.80=80 MHz +espduino.menu.CpuFrequency.80.build.f_cpu=80000000L +espduino.menu.CpuFrequency.160=160 MHz +espduino.menu.CpuFrequency.160.build.f_cpu=160000000L + +espduino.menu.UploadTool.esptool=Serial +espduino.menu.UploadTool.esptool.upload.tool=esptool +espduino.menu.UploadTool.esptool.upload.verbose=-vv +espduino.menu.UploadTool.espota=OTA +espduino.menu.UploadTool.espota.upload.tool=espota + +espduino.menu.UploadSpeed.115200=115200 +espduino.menu.UploadSpeed.115200.upload.speed=115200 +espduino.menu.UploadSpeed.9600=9600 +espduino.menu.UploadSpeed.9600.upload.speed=9600 +espduino.menu.UploadSpeed.57600=57600 +espduino.menu.UploadSpeed.57600.upload.speed=57600 +espduino.menu.UploadSpeed.256000.windows=256000 +espduino.menu.UploadSpeed.256000.upload.speed=256000 +espduino.menu.UploadSpeed.230400.linux=230400 +espduino.menu.UploadSpeed.230400.macosx=230400 +espduino.menu.UploadSpeed.230400.macosx=230400 +espduino.menu.UploadSpeed.230400.upload.speed=230400 +espduino.menu.UploadSpeed.460800.linux=460800 +espduino.menu.UploadSpeed.460800.macosx=460800 +espduino.menu.UploadSpeed.460800.upload.speed=460800 +espduino.menu.UploadSpeed.512000.windows=512000 +espduino.menu.UploadSpeed.512000.upload.speed=512000 +espduino.menu.UploadSpeed.921600=921600 +espduino.menu.UploadSpeed.921600.upload.speed=921600 + +espduino.menu.FlashSize.4M3M=4M (3M SPIFFS) +espduino.menu.FlashSize.4M3M.build.flash_size=4M +espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +espduino.menu.FlashSize.4M1M=4M (1M SPIFFS) +espduino.menu.FlashSize.4M1M.build.flash_size=4M +espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256 ############################################################## huzzah.name=Adafruit HUZZAH ESP8266 diff --git a/doc/filesystem.md b/doc/filesystem.md index d903bcede..3952ad688 100644 --- a/doc/filesystem.md +++ b/doc/filesystem.md @@ -49,6 +49,7 @@ Olimex MOD-WIFI-ESP8266(-DEV)| 2M | 1M SparkFun Thing | 512k | 64k SweetPea ESP-210 | 4M | 1M, 3M WeMos D1 & D1 mini | 4M | 1M, 3M +ESPDuino | 4M | 1M, 3M **Note:** to use any of file system functions in the sketch, add the following include to the sketch: diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index eaa364e77..3384cd061 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -54,6 +54,9 @@ }, { "name": "WifInfo" + }, + { + "name": "ESPDuino" } ], "toolsDependencies": [ diff --git a/variants/ESPDuino/pins_arduino.h b/variants/ESPDuino/pins_arduino.h new file mode 100644 index 000000000..ca32bcef7 --- /dev/null +++ b/variants/ESPDuino/pins_arduino.h @@ -0,0 +1,68 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + Copyright (c) 2007 David A. Mellis + Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ +/* + Modified by Doit.am team + www.doit.am +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#define EXTERNAL_NUM_INTERRUPTS 16 +#define NUM_DIGITAL_PINS 17 +#define NUM_ANALOG_INPUTS 1 + +#define analogInputToDigitalPin(p) ((p > 0)?NOT_A_PIN:0) +#define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)?p:NOT_A_PIN) +#define digitalPinHasPWM(p) (((p) < NUM_DIGITAL_PINS)?p:NOT_A_PIN) + +static const uint8_t SDA = 4; +static const uint8_t SCL = 5; + +static const uint8_t SS = 15; +static const uint8_t MOSI = 13; +static const uint8_t MISO = 12; +static const uint8_t SCK = 14; + +static const uint8_t BUILTIN_LED = 16; + +static const uint8_t A0 = 17; + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE_OPEN Serial + +#endif /* Pins_Arduino_h */ \ No newline at end of file From 9fc5ac4ba111f5f896183576a0f6a032c25c979b Mon Sep 17 00:00:00 2001 From: krzychb Date: Mon, 28 Dec 2015 16:02:37 +0100 Subject: [PATCH 02/38] IDE 1.6.7 support for ArduinoOTA - addedd step by step ArdinoOTA - updated package versions - moved Trubleshooting section --- .../a-ota-external-serial-terminal-output.png | Bin 0 -> 61048 bytes doc/ota_updates/a-ota-ota-port-selection.png | Bin 0 -> 102536 bytes doc/ota_updates/a-ota-ota-upload-complete.png | Bin 0 -> 69852 bytes .../a-ota-ota-upload-configuration.png | Bin 0 -> 95520 bytes .../a-ota-serial-upload-configuration.png | Bin 0 -> 93685 bytes doc/ota_updates/a-ota-sketch-selection.png | Bin 0 -> 65429 bytes doc/ota_updates/a-ota-ssid-pass-entry.png | Bin 0 -> 20849 bytes .../a-ota-upload-complete-and-joined-wifi.png | Bin 0 -> 123048 bytes doc/ota_updates/ota_updates.md | 136 +++++++++++------- .../selection-of-package-version.png | Bin 0 -> 97396 bytes 10 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 doc/ota_updates/a-ota-external-serial-terminal-output.png create mode 100644 doc/ota_updates/a-ota-ota-port-selection.png create mode 100644 doc/ota_updates/a-ota-ota-upload-complete.png create mode 100644 doc/ota_updates/a-ota-ota-upload-configuration.png create mode 100644 doc/ota_updates/a-ota-serial-upload-configuration.png create mode 100644 doc/ota_updates/a-ota-sketch-selection.png create mode 100644 doc/ota_updates/a-ota-ssid-pass-entry.png create mode 100644 doc/ota_updates/a-ota-upload-complete-and-joined-wifi.png create mode 100644 doc/ota_updates/selection-of-package-version.png diff --git a/doc/ota_updates/a-ota-external-serial-terminal-output.png b/doc/ota_updates/a-ota-external-serial-terminal-output.png new file mode 100644 index 0000000000000000000000000000000000000000..cc36c7d05447e509e646223f247107a7d3f9aff7 GIT binary patch literal 61048 zcmXV%Wl$Vl*RF#@uo>K8h5>@R`!Kk>1h)XeB{;zuf=h6Da0~A4?(R;41`iS>AMdI2 zV^>>sS6A2GYu)QwcSowJ$YQ@Id;jj;J8XG5n8v$z2=Q+t1ReG549bhlmY3nYDiA~@9^WWzG zd+ct#R<^5=1s>ciQv0u^UC|j=1qyFZ0>ImS-?qY%!R=D5pD@z>P8uhy^fN&hOmPwqVvIpTmP+2>*>_Gjx~ zT60l@50guc50g$!)x%CH>^=X;XQ)}*-TSGe@CgjNBeN=&GY1SK*X~~2m-x~JCz$6n z%r`Hvt9)Zp`L#NVd&Ac=o={E?HLbtUF4?hsPM~9F^j}MRq&My=wjTOfAxGR1ew$Gt zH$SAPo519S!bqmHWa&Z4u45vDS6?1WyzrwpZ0xU6GKqyqB` ze3`ZQvDt>LYT_616qmE}y1#sba5K6-IxOb*Ou~1E<8^i7yV#mBJhGfv>K(^_bya`p zEZ9IEM=jRV-|l%S7ZOK)IVx=4f6B#s@wBsLWN%VS(0bcU&gqXTcC>=gP0CHttzR3D zZ21%XJlqqY*J6*-cSJXnYA;hy2b8i+Iyd?_5)INi8JWB$8`Z< z`SX4VZyLaI^}g49+LQ&%c8iW@xC4Ygo(HALX8DS}bDKgj<#S2N6t~X#)89Nm+8`E^ zGH>XAh3!%vg_`@E0yIXL- z{j^zW40$*JO+S0^ouck-y}P7%6!(!u0BYw%*39?6~;|GP|W&-Z0}+sq~r>C(_`!B)${J_`d5X??(=!tll^MnKbNVU3|Fb5 z3|GB5_#PYn6knGPsw^IERQA{w@6g&+;cl-o%MX`5j4t9T!-ulU(n5lrm4eh+)RhfH zimyg$2dj7v4G(o?WsFd&a&w@aGixg$K`FrVY&y!*mL*}k_G$nlmg@H0drtT$a`YBQ#pSNpbAfz& z##d-^5pDiB+v>VqWPUPk%R$^{_+_wNEMn`?8}Cs#z8muwIL`E{lZ9wI=Hy9VW_tng zp2mw<+jL^jYNWC=GVs|vR82C7v^>lZj(*tpj+p6Ny4KDNR4fAO)ZKpX9ZmpChSJL7Lu3;prjJZQ#W|US7$q2BzZ0vBaJg@!yF-3z2poCkHZX z+kKDIP%H%D(Hd-!a0pb{%frW`#k$tvs&U$H+WBCQ8>_?l0ae(hl^a6T4)^Wbt6^uM zdg|YI;ow4u0OPv|Faaa-*>;@W{i*PtOoow<-qSB7R27kfSOjYAsLZx`dV-s0(i^(%?w$lSm!OExG3ma!>c_K6e^I zcXM}C2IutW`G>X4BC#n0GhSy{KdmUf%-one7JTYv6+r!XEO-L9iZ)o_ zV+UzLrcUMl(}E86!SWCA!@skrHCVdf<--)ebA-J&!=ongw~rDzh1nwbN8cPvWqRg> z%1dSanu!>vX2(nhF#b*Z)RHKWP3PizMJH(vx*qV_BSG^7@!3nP#A7vyDT4REArL{h zh?o+NnG*(!|=|@4$K9%S9Wxr#N7g=x`b%|-N(drBR?D53? ze6s|DDEMb5cWqLRU}eQh`W$3Q9!qGpZKc@5_zO@G55rtnD10?$CA(@-a~rP{>&Hw) z=svTB@NG%=tf|{4EV^A1GdCUhpbe8DdIF6L08tVJpRG`-xNmG3#@3-k7a)a_ZVMq` z0dVuc%=tP$G9_H5B15&+%=fGDB4~U(%S@#&&NU*(BMmP#2>Y~9xPIAziIO^(>c}V9TF`Do_S-Wa4|O~PFpw~#+Q*Yor?i-N`75%9>@QCqOi~Xg@fRE<5#F4_ki^TuB3M&c06{us2&_O<>26<0Sp3VICIs-Lxo* zuH5G7ME~=Kz$aR-#YwWohVGP<4*zVg^ngzY3DXt`W*~C}#(dv{s3!nr<#E@NTz#{I zqYYq*Ee-SE7_*-8^csgCd5Ht%WoDc>7~%23X~n??s}u7$X21dyQ^Cfb))90P586-& zcP1wt`fbVKIiDyU5+i^)q|VhaJo1netsHJ_$aTA~iHwb>aZ2*fI!A-M2>9nQgY3Z9 zrr^OyOxB;(K*2UX6&1raxWk`Gy)n0pJ!xt-$*T^i=^Xqa#l3rfz@nBIB~IftZthwx z8uc{tJ47u}00RNMYj#eTr^TudKO)5s190m5K@ira5FwE`QPV_w)_CB%9IZb57;Lh= z`q;sUmXv`AQHbQIlmVSO9Te|T%8C>0dh7`DpSU?L_=UIIZ24}5#_#u;6m(D8I9fq2 zTpr974=e0GDDtC=icr!Qftw^cbA$!Tfx+b3tN(GGl4|nh;DrU+z~KOZGB5!pbVSBj z6SjZ|wTI9+;Q?d({cv)pm-l@=ERm*AUmLI^-$f!|2Fv86{Rx{huE`0!Oq7OAao0vA zI}rf|FS19Yj+MMGV2?zI;G}s8=w%oHCo-Au?nBpqbk!9$<;J=gkqWT1&0{iAJ=n<8 zk%f&E*gOs)5ssDDed_#|Jg%^t_uu4j{BW=FkFoj7WRaM^&^~bAmW-%s$OmE#Jy^>- zT3^z-_!@XkL@yK^g-#r;N23LWhB3&)LgVGYeHTBdF-H=Aj&%7TA$Uup|C;N9DdPr? z8VAw$zfafDE<$}=X;9Ry$+iDEwjQr z#-9I~0Q~dBL+|v5q@$Jqp7L$Hy)B%8S*q|OIXEe;zkw5mPz%?Cve4=P*jLH=yw-78 zKDJ>f5;+BK6<3b%&i7AgXVxY+EwgM#-?TlstWL>g^&b+gljOyxsZN*~kb|Pq9IZmN z%Yn{;e9o1S;{)v>Pqo=+vD!*tA7u(v#Oo(ivTYhP#Dmc`6H zDq+$a)sJ?JXk~v&pO^?nF-e-!7(Vk^C(1~U<^NBZ<@g{x zYH(ECe*l{A_x;B408k_p4&l_m#Pd#dC8XBfuSKt9=+&2|{_wRWN>1$oDOaBQmFHT4 zUf9<{0qL(dx7c#Ip`1)q+#graCnEd#1;e$dn6Hys~*1Jd2%%fCGG>${FKy`I7#@L6svyt z{e!QeYuEpq|Cn+N@)9eUX28ebi%Ll%93miyq7DuaPIPuJv|{ifGU2cSo%Z5?;*D z71Cj#FQ*4vLDIp9EFVkhv|J?zYHKIPv&<9V$-_=UA%=MIOwmRiS!WwoS&HMqvNCKU zyy^O~)iM(y{M;2{j~xSbOlJ%H0BsAZ<5lx+T<#LUourvubsJ>O>ZWRw##ojr5~=#o zur*vsA*%8#AUg?n`j$e{Q{kiGqLto{kKt#4uLD%uaiN+K3344a&LoT_xU|`6(i5Ox z*i_d$v2@z zSV?C9)HW}|WBD#%l}J)%!!!Vw)}@0ELF8DVP`F;8Tr?Irdi-Vb2>zS}0=Vv-t&bE_ z96TkFzmOrqj?)Q4mex2 zL4*<*!}$Hgg|kjb4bZc&UKa-voFNW-sW2$Ou9G;v(;?q68F4N=9{a z`U)XR1*M2!-X95g4GrPr5BRtnBd{gw^eoIrR7o$#b$_r?T}IF6A!E-Bai_)&JzonQ zK@tWiM~k)~U7`fCqIXwX-M&9OG6+cDsWju z!hB*C6L^dNM>Tg#a@XS(3UhkS>@Gcn$bao@nR*|e-IkO zG?65eaEG>t(c7dz%OnN6_akj-mdLDn`Pv_hhpFKuZ{eaPJt41Nfqr&`ZD_SaqlH+z zr@n?_3&rY^#^cL$UPO7=A$cv}u%1^x@TOJzlAbuB+D+x}i=mV?A$r?YVw1PGShEsO z@niB#>jBes>*2yZW4LSpW5iAlJ!M6~%x31PBoQeJw_4iE#y2Jrh?P_MeT8bkoXHz7kc zgMvqyZ|ft*B1bc6YnzzJ_{t~aUM25}s-l<^XYE0$`@0r^!3hSITX03@f1H*1}Qjl8v-62Qbo)5zJc1bbmDYIvs*74P@hC3NfD% z>>8Pc%~YSq>0baJL4+ow9C#R`H;18vW(ffK2LFr6b4>sM*d$`zV8H>DET&R_2_^d$ z4qIKHBLFnQZAP0%+Kb^e&T{wx7v*!(>5{8#xD!cxgF6o@rJ^#74+oV zPV`G*q34_HBRD4M0{?Y~GxUMEvR;=qc7ri-3#>q(I2cd<+Y%z5)uxKv5Ci+t^^qr3 zH0dcVP(>Ox(qTl(Ji*UmMjRk@@EX~^?nfeB)3bal_y?9S{lfCUgBhg;#(^Gwcvtxu zO%RSha^~j45G3|_zB@$dXso@69~Lq5XH&v#bYCKbe5AdC9RS$rlqG$?4ln^W}mb za<(2?_>vh9RT8ej&>yfjp9-2B+3Y5jZu{u`W%Kv4d zJ&mu#VeH0<3HNZ1!I`Q4TA_}2udBy3ietcT?}Qq!y1djQ&@6XzeCRIMt$X|4K2h%8 z*MB$6EF4kc#GOieB3;%#BCWpboHd8AETytQr=XL79Hm!L&UXcTN!)AZivy=t-X;Mye#!#;84)saFlyO4rMu+Uh_@vft4p)PjSa$31TPEo&?OI4F;k~ zgulgfxWQZ82NIEpg^QAQv2DlA)2u;1#AG=(s@dc{XBzNCX8fl1>$>b1K>|ElBLE+( z*uhYd1#jI*xPgEiKnoEZiT*S5P1s;y!j+VPpgR6O2ii?Nn2P?MqJk7P2&{5oBxC{b z1{oTSE~YR6)&J~h>V9^i6^=yLbfh-pv$I()U7NF~P9R_9m4?+P7&XMnf%D6kG$Kc! z(=;F&3nI2KPSPt<8J#pINA{MUKB}l6l$^f(#y|AxZyF7o?1X=v34JU2@~LKFOx?LQ zjPe$#pVO+Js3kt4u4e*gyfPa(bydJ@(pFPo7}CQM*ioQKucvTtVCNV?S2Ae|+lqAC zK>5MPF=Vdj%aZq*HE)|J!(d;{6!{MKD43&DisN(>*d*oC7j&c~BHSRn5#bRrT~mcl zvPCFK+XfCMk&XtQg@*!-cKF(;t^GxbTOY%`ZjTT|{El0rvx8^UMS;V^F=yd6LVUp~ zc>^^0><+%z7pV8U?zv{7J3P0FEBKX9oq9mPWgc_6WG!9Vh=;^yRWbH zU#?8qXc9pD^8W=Ja&d83A26-POYYlcyA>@1b@$@x;dqJ~h@`&s@AP{Rq| zhT*T>ufM!$_WtrdB-Y|~xMKrTt7-F3@Sd-&t{8(%%;=+$G=LsYY*Uok;a_tb5Mo!| zP1>4Gj(JyBl%(Q}DQCj>x(WzGv~I$5yLYf;pEFsQnv|QhxFS zTz(4mjWNpyj_rK>5_T>H?b}knqI=NH2&m z-O^jNdeAWj=_DQ1976MT^}=u5v8S)eve-WaYVvtYTk#6WI#wImQB4ud^4^TQRE19E zxv!NZ=*@di-3p6)l3(*tF#e9Elh<4MrTI60Oim(%^FI%UiF)*bG2YKJZm-?~bM>CZ z-C=azw8f)>H6^zKiK#y&5N#x%loI9AT*pjR@9PvM@u*^?WjKE`2iaP)5hA~L83+(u ztKJG~M2O56=DQEnKcNivK1WECERwAn+ml(`l(6|yVrE>A2gkl~2uRfr9 zD+PE_U{e39UVrGuNGGGfh~8w^Tn$r28RA>5NZEgQ_2)s%&q*ceEDYXJBRBH+xkm;O z>RrhI&iYggp(z*n3DvYNF6Icrds(T#2 zj4c3>Cg^~9!F_5(cF)Q;O+ZWq$ zvm=ZXbIB~{JJPT8HGl(WMCehP69;|eCNkQ!P#15_02B}S3lXn`uq4`y7>McCcIfyS z?X2FT&-kP4SzS{|?N^Sog1s8U3!YyYdS+}!pV>+VdnkNIRxW<813|KP{iUBV_5Qpd zHktS%pzWmxQ0^{ui;6rohg<}HK_^+jF&jWPC*brk6>h;g4nmnHrr9+YI^S#$sTuJS z`Fe*O`>C_mZvujhbIcMOMX``G{H^~ZkeG({l}pcTxx&S+*Z!7L2+^cc1bzN&{1U^nKl-~*TH_h{nX6D7>$r;f zOK;JUsGkUqG-2=H>4(3uX*fpJJP%ew=G&2*95~`}2~r<-n{#gmmOsYz?vD{tWQ(D6 zM&L+oPnMXb_UGVWyo-8Ay6}!`sn(Oa=Xl2w%fOew(fd1utLT#X1Jra-Ig~!Tcfy<2 z`PrN>c;wG5t?pbZRicUfdp_**I3!z0cv;iK!-a3n-xa;v{99asbBz0B^fRFjgz#gC z2t@8L8w2MwS4uQrwnKlKPB!g2L4p(!OVf4k``ntl*g5BN3ahLRq%O;ZZAz3 zmcJ_p5m|;=;}p*=B`+Z+cHItM6F!nmOutq=q=ne1r;YH|KDJ6W4kR^WkwB$VLa@Wr zn#TM^xF6CFVPBtlK0aG?=nMK-(FmC^jn@b!F zhUHTx&5sv$a4(uePg%G&bn?rmG$Q42kv{v`+C+&#z%O#JzxD9=z{?f@6?5U8jGkPJ z18j4~n1TL!<*oAe^^ZFsFI%r}tIb}Qvy6k4ua)z&73Rr84_>wgf08shld2>*WV((a za>v+nL{knH|sa#PVhDKnd9L|Vxs+kT=a3$1FIq#1yoV$+$?8MlIC6RpiEij?51HkAfk8@ zR*ok6HFVJG1$nIKixBN?A)AtKbHw6~V-1}U_A%;m-lnsojjmS$+MX&FgdGws5(`f- z0`S&xo6EWnT(6ENB&NrFQl;)2=mTQX2VidRpm%t^lAL$tt#Ac^*=Af4XpareIlQS} zVNQ2q;T|F6v*{fave#eiBitjTyV*yORs(JQeV>sK@rYzeIo_2s1?`#l3?N_rL7B=z zxVu36_D$<4{lI(YSaYo#_m>N?G~qV~yI25VIZGqdItw4sH5nO_CW3_4>BM388-WDv z(d;HVA+2+hitUr<{=X+pG(QVUtP25M_s4&)!N%==|9$Nc7kfC8awoSB#V^*JbuC~s z-0S2#Je^v>|M*RFxO)f9V3j|o0KXq<-z(5%*j>Z19JQ99!heCA5`7VOf;j8w1}S{ zt8?@A5k9v3&Dg)t>ND|VL#+74+Ov|Kcgd(YoRa>#Myw`lif(sIdH5SEH|L%WONXMO zG-0YuGh;_|((u!Ne;WD)RHmPHW(93lZy;yfelsP*U-Kz3P7yjOkDi~pce{%#2Z%I{ zqJQ&{m2hct<_(rSj6X;TkR62A8VQ?@0CkV3w!+N%?|XTgDP(YlXRG(gNOTTNNijzJ z@Z#N$#UASR5r5pk`%_p=_W6Iynqv6(aDVa(q-qZy36bwd(DghLO3%~%mq6k>gZt6l zcOR3|;;7Ag2jX4m8~Ypjl-FMKvx9-?2W13bg`qPSKfYqgmp(5G@uSe8_XxY?NauUZ znCPh-t;l1)X*RN( zcF($m9+72e>t~7G(ZD{UYmODrH~wtS37mN}QsuWtDtlA9Jah=aEwm)jcnhX0KwmEy zi~;`!A;VjDZHu%63YtSgVQ}>9;mv@-9%!2hu7V=Ff-W^a8Xk}V1V&<|1A2w`N7Y*uU-}G)`+e@MshqrjML##mqfegqc z%~39VEm{O)&ySm{Mn}upuo<6O7k~L|W~_+0*=%ZxR?qr0yvSX|Eg>EM7KxU_qhF^5 zQf$^$CYtiGy|i_0f@poxzNUXeXYx1KakImKHiSZvC98H}L){r@wC`-nbBA*h>s)|e zLo$o`1s}C9$SeFv<~EJzopI7rZ!XERhj^&+aRl7yFX$TycO(0kiL9{2(|gm^6Uvq6 z$>z&6E)wQLmR{F2W2wi5Ts|O%yWs)<3s43tdyP6s^KbwC>FXspCzl8P69Y~kX+G_& zkCMp)^-3h^i_bqK#6AZaDOrSB^&aYf=mSHDE-pRU!ad>Ge?;SPC<8ey2HLz0>yDVl z|J=kNA3zbn%=IWNjfmB|7&0o&Z1l?|Q>bru%}=MXy{czC2`AJ?dvR zkp!Hv_`M$sy$8viN~SXH)_4M6Pv;3a6xgNZY_Wso=^#WBekQX2(C^)$lm zSHO#J%H8?*x`jv`u!Y2}^3Vffz-QK}>P>YsGS$?GMjG~*ajij_xbfr6GeYxInEw6s z-^zRZ`?mRQPNMNIcm3|7x>>QUa5~I?_}%}0h>F>6qEa`Vz#Z|G@-h|g)7Hr>V*E1M zXf{xx;l;)m%;^w{lN>$lnDTJR?%Y$?CWK){>WZHLz+RDV`l1_0jH;7K_P5xVkK zd>IG~m4N$+nWSFO>RQ$A9yW}F^V6rp9|^sQ9K_2{+Jz86a~_uLFrzSOMUQ|Yk#X=` z4l?W@9VK*73S1I5YOc;eQJ!#Q{=$(YTU0RsTNLYa0RK8tGDeS6xsW_QmbU#(>kUFG zji-r1k3-q(?mUZGz=&Ls$uF`~bfn!)IPn038{^^wN1$N-y5)+c#C6#tN=v8EVI~)} zoZ4}nUV1Lz&7@K7z_-vqkv*%W!6gn$8#N$7c*^EyoyG7DQSSCUUd5ZL4=UK=DYX*9C82)aTDc96= zF3b6;h_6U6cAUjs&#R^Q=WR9`3P(!^7#OPi1BGiYh*mZb4YzPj0%}cPO7c-wSC)N@`|z$ zTb8N1UZ7}%$Bbhg9iNg@hzeRK(7E}2RM#WwzQ@u1om++h-X&s{2LgSvkJb#Ya73xeW^O_-kM8!g;A5L@#q$TQMgJ!CK@OES388i-KO8c&BWWl<&Wj>#6zrnkYRHndvD5Q@3f|(zq8HI#h*5+~1o-Jy} zdS#_$segc~JTzRglh~Jp$8Yh+u^TqLWCoSVHg?XCqDmnXTTQq*$0&M-M=`8b2*E;5 z`BCETN6)Ny{GXjWllZX;=KmA^@?kH_VYlw!W7bDe+;i9kuiI|>7q;i+Ny(#dLHLRQ z`D~^&t>d`;06xBl^GRnK>1L{F(afV#tjI?(wn|dM`O<)UPD3OYDN)j z;yajBf~x)DwMU1~u+e<>?_aojOY)rPyp70g6>UMh7@xAtpmf^jVOH5$bUrwOpT5%w zOrqra)gYqnyY1>4#_Yhz-T!@5Y&cm$`rVF0zZer%e?#Rrv-R#ALK7r^JNI&dMMAs< zvoA+^ed=!N$v=DF2aely+W*o+b4FpUd;-s|<-KgRiRk+37$td%yQd`J&+_kvbj|%V z_Di;`X_6vh$7sA8t*3;s$S-VC_}ykVtYW&&Y;X6*Sv6+h$eVhHeA-T6O$9m}o4cp_ z^)Ig9LKpW^u4=d^$QNz!l4+v9>G5|h+clmy&D}%pzq3%B{kH$y4yR|W?tpqli7Q$< z`?o_u56whTW*PE(k~!f=OPNN<%^UUqM~&aWchCJX3PpXh~KvnW&u3 z%hm06^SN1@7W%b<{ev*Q(`+gDR0NPIR7Q#a*T@si5S!KKUZ6wNV7n6yXJX> z(|#UW90qwjc>M>A^(8Tb>H6?xukCFA>lQa#ab&j_7Rj1hN2^3t>aom}IP%Rb@ICw& zfh+uF_;B;@4)Z<-$zWUl%MNSWArV{Oj~|e$owiS{#6({oDE2}Xb3IO00-;Bc<>A4H&?GIslO;Oq6d924q+TF%(sum1dwBV}x8fbSbRljs1|@wV`ci z&VzkHU~!FCGL4S`R=BV!Cn*G=F&qLe=K~P(N{7zp-ATy7LhmIBa?ne@%Rdq&H%BsY zf>cBAxTW`njG|=QJZGC>p0iX?6p)2>){g)Pn1VTKy;FcJ=u$>b4%SGNu#Hi?A;zVF zhwt%(u6`${m8VYD6z5g3E*r`ZUX#%>Q-?XRg6M<#kapoX){;tSUQV67MAD;7+q#>m=Tctjtr>^HYCfx9%5BrE*oFnu7eC@xFDgmyaK*7tGB@TV8N) zNpQKFU>;a~fUM9J_hyS=FNb30vp0IUgQp6A_KJSwRT;>ha*37?)YhWlB>nUlmgoOT zLu04Uf=7c5F1FiLD_>J=k;SO&my=22se$Ex>TpyyO2}sE{u}Ru)72G66r5Oe(vXpo z3PQu+9&WZ{tSB(oxQK*{f+;8GW=cjGGM_igLBpTXezj(G(8tAx`nNY>22(y%+kg$j zDZ?w=T3%#Nj57Q-dgU^cuBeZLK5~Ewy}&?q&^1DW0yDNJGR-n=rv4W~L`lB6^NKhY zL#b9FbpS#*@tiYLRuy$>_&i2=P=u1G4<7?KagYWk>O()=mt-n;FQh`fg3zsYG`IZ^ z=KfwK{N@YC9opb70i`b!h;&%0zjj!dq`gC`hM9{pQ^haj{Nuf;gG2{vWEq3N8m|rNQ}rX&BlS$xt^q$gmb9&G(c#Iu9)v`iZ?adZ5iYma zYip?x4AOK*oiWXhcitEF1+#z;!e%<#bDJbpLEzY<&%YodKpZpLD0KcBZhe>~$aX_U zL$^`8`_w7q4w!FPS+r`QSijDWM)uQ=l_&wp?5d{l!VJ+HEOp4<7cYp(;eHP7HM>cR z8gTUzWy2c>x_3+@T)PG}WQkHI5wi~uNRM+wen@F}kx>{PJ8+}d=#3S09DVSC8`twT_0F%OV^>kK3GPDVhRC5#0zg zt|A>g@DHiUXi?ab9bbfP8OuNEMw5hE^`n`R8aZLOUFzxyl(PSte@U5nxl^V@tA>Bz zREb8Kb^Rem1UT<~^g)PJkpYN`I4;{Tbu;9AQy>T*jgHRwUOEO=4TTK|CSkFD9~lf3 zbA-{Cqn<4?q;C8Sx2{!@F{Fsvl9aPBLAfMn8&o1rDn^yjfG}_?`-T#X@9rmZ=NO(hZ5} z!(?-!E*T(r=I>}Qd!%g}1V#Dj$-jD^p^$$Co`=F#L>7rdUiscf8SS}b!~*kFEw2N` zZ5g3?@c@?(1XTV3A}MnpO37jZL{tb%PSZ&8R1~i%ekPnK)v~HnHL{WTs}G#7sa_1f zzT?9B+-#BIkIWa3?m8oLj?%AD{KKD*BS}I?ApbztC+Yi+!!7G zPqd&6cq~4-OCa zxZY?fA>OWMF3J-wDq`>kbt+T9Jc?Mr8?S@E!Ee3aw`eT;CePO8LS>;_=)@uicfdPy z@}{_&H)~lbw1CHk+6)8&&Jy5NZLP`Xz&}ZnB94_WVzIP`{^v><5(y%lAPY@irb$l8 zBTQW!uNfl?#Wb!OMz>xh{^)43aXy`92}92DxrilI?AibjKdeQ$s!``y)?#af&d*GopJYlX;rkq3}9<^`f(ldk| z#JNI|6Uh6zo8OGdZ#-2Pmnv>eg!_8AO5?mJ{q17au9L`8IrtT$sZECZCr< zZLC#yctgeHI%bBv$T0KF0vK0uOa}lP0k{Cbl+=eoKU zA`za4l<@tEP{o@b_5D2R0NG$0M(jV>9=JGc;ZIdCJ*cIlNH=f{J?zQL*bEk2gBm@v z3WA-}(o%v7%-o(?IUSHzHI1thnzVtz+UpxSBkB&i^MVuF?v&}w$A7tWy-?+`v}Qw6 zue)f3ieoE~L$q&G^gTCu2Nt<_&sp8De}7c8wW!K#;MT`q`Wt3uA%X1P;%^9!d-N#? z91+<$i`ArG`Xk@hr--EaIg76`s5YGyt1{aePBkT|@jz=ip{4G{{;frif=h}BpId`V zur!a}%EDfS&PDn9KUi^Dhsxo&)^Jq*=@FGOo)1dm#HlfMs*5m=j$D)+(jrnQ4Ef-a zTj70f^s4NJ*o0{IFG*}8~_xGo&J0j=1eBI=|l)9 z&bkPHd_yl&)o=YfW2-lZEX+}k7!lkURC-g9u*?^s{YF=Q-PU{AB;NEFT4+0fi_0Zq z+^4HhmyRTlpAzRbqh7!GA6-msG00l{x|c+c1OSN}W#5b`P&qk~H_z%DrPR$o`TMck zAGZDgB*L3?>=r52_JY*$L&GSE-WQ8}fniAyAcCT#j06Z`E9i#b8u&=026dhy-x1M> ztgb!jzj_AWDv#ZumHi^zv!Wc_klOQ&A#fwYnDgLMa3ga7VD+Q69iqPdMZ<9Iic}=u zs5%&9zq5#?I~`S+f0Dt)KVIm&nCmGYVtLPd_}Sd<8(PvKbPi0D7lUl+riR7mG9wa6 zek{omc9rjdLtZ5{{i8Q8=@FwxRIy5G33FfI3cC>kF|Zu|(A11m z!;DXyA~YlGme2j(Ik?)9#>oqG``uC3#^OKP%0s7s%&Rk)7OG#7`7ZlP=c(0rcau-( z26I#kVbTJK!|Gj9 zFmFc9*AYusj2Ll=DzY71H!}ay=UJ8fxHNG)HpXjo%hpLL93!wVRrOm!qD3&{0{|O2 zzhl|;+fh!U{_-hum6t$%>os%zutNZiA?8<&&2f~!?Utj2mNC*OIUx4Qq*nDVTUX0^ zVI<3_Fdr7Q&&CnQ4=sKv?ySuhQ_Iz~G5=IsV20$>}JFKEMS8vE}iql0LS z984)|Ci6AL&|@?Qy*XqQ+?U*$5DxCs@}*6L+x#z0EkvTL;{l5mU?Yqlc`}!U|}1Whynj zmxq@il&2Pj{$?`y_I&91>cc+rLU@#|{-oyN_Cg{M~ow zEFkTab`bt4*+e5ogi<9URLhq}N%?j|%x-jnz;k==hgi<0vu>lOC8X8kJ z@aE|J!9b&g4cy%hyDGYQ$Y9a3-)L=^8p@Tmxuky%3^QpDi<9-+wC%J;yl@8y+8?ZOxAA~uUFKzSG}h(+$t@3}S>@c8liFXM2J9Jt*c6A_T= z--6nkjXr*J<`$M_uXqv_Vb`k8bzX;V^DW}cf8hp7hK^pJ1207>tc5RNjC_U_2K`Qb z)Im^>L^TPeLZveo-Snem^=>n$U4UHBj?J%Bl|+1?qEQbZDIb{QEedtWi&*?%M%F#P zpk?)laLJqQ_k!)me%y6>)LS-}Uta%F3O9xEgnKB-Nhk#_+#V?(8D7hfnddx}-jiXlkUM0g>r;7E0{=(_1B6 zJyiKF@rs&;<$E&yz=kRReZdEs2+2>n0j1dOx8-=Nrl)PV(Y}o%q945kC1%2ww3EdZ z2wNGj_$`Qd!>BMa;ykd|wH}qSREf zP(-aRJ6i}eftNYak*&NhFYfty>~y+fylo&Y%G`k809#Ljab<{z+LLqHSH@*Vm6?4^ zoJ}qX`(6_Ik|iI0$xTl>sG4s1EN(_65)&tnh3vg%5J~-exq4qr)UR~3li^fu{rO4u zNp+T2CF-=9M%_;Oc&DMUz}8?3*0pdj#Vg((I0yYwxFZl!c^#hCzJ^Q6ZBa2;NBS5Li#J#GmqcpnCtf-D# zJL;z9=1}h`Y^xefP21=MSe|(dc4uum_1pAGwx?@$;;B33TD`+x)OLrhTGu-`LTEli z5X`Q2Y)z4F-YEEFQpv%;4}ayfF2>maw+Usx)A(nY>p?d=tASJ*6C>L5qDF%^!GZ$A zN=d1!=9@7oj^_Hq^>{|SN6_JH`N{BlQ=%-(V$0ry^emK!1Em!=rJ4gQ1M8l1FgIlr zEHlcsMqXn!!yAOHL)Op{|9*TxOK-vA{RIAr%^hmSP=yWsERWbD?+@Xn!d?w&heOCb zCpL*Ea0pg#KdASchd`;^LJ3c$!dr5N#vmy&Kh@NqULsfiqCLm7;~UT=m;uE?8>@O6 ze}cn0I%8Ohm$XvyO{WgSZwCMDA8$o+m}>kL=q&GeUU6)HI<(TM4?sB*m<@j=Bh}h4V8;^{+p5w%uo(l}kn-|;X*s?A0NB=6{i(}z< z`EBH{v^uwydb5e$pvO$}YtNx=^7))DQMA9PkC_DH$x2t*W817>`=42JcP}zZUzbMt zvgq0pCIw{qLcO~XHo32Ns?6N9zQ7~sN{@=<>%8r(YgrHc6CLIuMg^e9Hj!5CevFz9 zo6g+>-L=vT;@cOQ0mYu60LD7hT-Yo9S4o>Rf zuorfS*4^&xd3m}gWYQ{C+wJ~vvC$dzs;JXj-*Wv2u`g!oTi}Pc3wcmwJ_5kG*{}c5 z;crhRWbz|_YvjEGSBMC1WDvZs4>&KcQ34*$)1hJiH2nVT2~vr8%^YQ#Znb;j#!-p( z-5gF|?F~j*50|Ls+9~tjtk!=rn0_o8J)TQ3rWbdbN@}{vKr*?{5%GIaJH46=Qq2(o zPB)rmXd~7oA{XvqBksL?LGYHtr4tY#>(`~~JE}|}DJpn-UsPFpo}oHX)Y7stA{mLB zc2lu{XOh*`RRNbhWE@JN1^d#9il_qFxW4gmMG|=UahKvy@7UOT*;oqTuwDDmw6Y+j zjEqdnm){vW78BF!latDY?YocNJb!L))wHx0jzo7I0%T(;g^T}mn0&hy-uwN#vhhFl z!=ReL&~6!t4(JvW4K6&p*lDn?;7$Oa0HyjU>QbllGB@k6AK&zpIIKE_vKIl9|5<{n z<(Fq~cwT-!A{s6gEFhrksPo}uvBJ9dqWd3}=fy@)WF*G(^GjI7{}J^Seo;1mw9?(( zog&?hbW4ZSE+``1-Q6GvNJ>bjbj#9R0!ye_0>^t;_Eo9|D00s|=(`h>h=#=SH_jqHu6Uw_El0H>(RpBey#_nW@U$kMPj$%Io-pvo2K_@~de*kbJS%LJK-0iqY_S z4n6i~Rnwk_U}^^jRSmzwi;aELXaLWwnq>6FJCq{fnYHBsnl~z zvLq+&xt;~5@#RHlXdik@&&7pfJ&~$>MEz3Dm z|AL|$eg9~s%PHj-Ug7p+FPhd|!>(57?%BRUZ!}PmC@^~g z^$M>%ddFtJkf*)mos~!OsNv8ZK)I2NQ+qDxcu0B_Z8B+xx?+R*bEd-OBjoY+UYv6yvV@r#@l?zBf7j{aKpM z@*OnsiN3o<4Nhj)6Y>_3bB9QMJv}m{IBO*j!Zc73|BQlE#q}AeV!YHEZ24}Ur<8cz z=zjW3EfEm2JL#1(;r}A1OCcn=OT&=P+N#n&JzbX^vbSU!(bBfY zS&iIZd)X-P(_3yykjS&Qkf+aao{Q;Np9e%Suq zM?sn&n?Q;=EIqU*%;l#mp!2!s{w__aM_dM+0mwy)t?-#W*VAO*>`?n7`kd7ef`;b% zQJ%r1`z=X3w=VgLN#mcr>Fpc7r(`3i%D4ISj_2`%N>!MDW*qIElQBQA9lve!prQ_# z2RqZEhwGM)*W3(d;7ARu@8{A4@}hsfZ-)5zNlM-qF-h7i!e4T{RSM#?d<~Pid#X>{ zd#w`L98yX*!2k)_FGHa?z80;nqUbdKiTFNw)$1`mTWFEEF3)6~)6UyCX8B<=rZVsK zWfbbZ^;H~o9f+jPO0HGYCfhw_cggODrbk_iglSY6LsPl~g0H(ip?Vl6&adunn&6RL zv)o$P`VlTy@oA~tvUh1k=nP^4wv57n_|F3ie$l*b20#4FHTYl|OM?B&$0Bu~0QuWs zRlP1!J{cOc+u@%nPI@2A`UHwD-?B;laZX;7z9Iv5v_)sRQ+m5k0;+%)YtrOsr-QZKNb*m!b zb3R`RW%yZYu;AX3Io^nIaJZAg`z~0LPUatw&qeA zj9ZTa8mNJ^^3q882F1CGO?8cvBBri_Mjyk4o1FRVK&s~<^70yo5-M4#^O4%dG!jLJ zG1l+9r|SdVg@~5*spQ=DvBbSgeFAD2Na)v?X&wF6++HK~_JtcP-bmUm;^#FV1$iS| z|E#Hpaal}WN&_#^scR^kMl+AJ60a=unzv_3Yh-om@4dSr*NsWD3s!LFwyd=2%F-QK z%(Mu~(!iK%+S3VDt98E@jSN}&{kS-bxIIzwL0;;@n3p&E%8SA&xyXgvz0!+1IbvUu)U+Af zbZ0?fRJes9>FL;pqFYKku@<7YuYXHd|YVevx?{wRj#X9 zy8G9qD5LDxKBX=o2lBb(TsW?UIBFC5$(pd)dvIe6zh8QXKV7lSUDuG`fJD1_!S_JX z`DW3VF#R65vQPrpwnZ@|KxrvnS6GXGJiBr2r?a%BY{Zh?yk)U3n0=9UHPcTEzsN}Q^}qEs9_j?EqA|es zM*P@8dy5$y%8e0zae*04g_?5!vq0P6gBV}E^)<(-!>+Way8#N1wf z!qo)_t)JS#>2fX9Xmo|uvl(~$v!*w1sNxr7hZI0X+upl!XSFe^B)OYSV|VI;-U7(U zUf9-%F+jR;Rh7A9*Pa@+S?oN(es{f972c(uG>v7!(yw_9eDFQk;5NqDWl-=)>gyX- zjJMf18iV75TxVAfJmMT`7GIr-$%urUF0};Uw^6Ph}OBLt<0w8Bc$D&vs(lX+R|szY=ik0f+Wz z1J7&Gi3URFWO&~3R4Vho(Z~omM5EL^?zPLgwE7#IYO9&76489+fH~l16zjTRPG5M# z_O0eMDD3DmL&}4%*q%G=<;QA<;3^UeM}qY39x~?h0BJ;8TSom5!SK~L7Lq<-e`@C$ zV`zrLufQ&c3o73^69FvM^+5lSeFG3RymH%7TwG;xVA<UxR_5)Fk&wzk^K1;vs?MT;Id)5_c%CQ(021Pl~}xV$F#QP0!< zA{#M?DzcRNrID#`#NRAWh?Og*4zv1T9~)oomM;I8y{5&n3{B;dBmoPMt4HqijXnhv zL->WZ8uc)msp*l^h%EWG!DVZSNnm)vN2ClPyEhRN=85W}Z>KEp#3@zTK*=Hq+)gjl z9693H=2Yj3+Q%40D~xoU7=2S*U7)Mu_Bxwk!-m|?Z@MoioWv~?um;C#Kc91qIjQtP zhzO>A$NVZ68_8r9<9geY@G~5#BfHEGEqa@__x=V_#rd!D*xspeOi4u#%cetvpdNmU zpBRac#UlE39)I4Rd@0f;-mFcgYoZYii^gc)G%S_+Jjn<8k;In)_Js53XNL5#n{r41 z!g5dqEkVYLh`Lf*&z%C74+K9vpdvS-ktsolu)}&_)fTrh zOdJHtBJX6>j*xY8xY>82m(jU|N^;4$IW_jOC-Ox!A@?@&K683YM6Y;C}T1_${gQ*q`1!}M3S2%OC5cnSjxi}gBT3rLtLL3a;uRU$*eiuo#Z(`nnM zsx;J^!Q=VCU90;U7RZ(X`!h_=ewJqa$A>?rsDubudR?8MOL`^+wrfSM7w`$dov#>j z!kO=_d$B1+8xUgC?ZQ><@Gd}=b-RB6l;(T{y&ht;H)EgOo*GE>?L@*ivUyEfedI?w z4~F)4@UOBEiz?%)UF9F$t4%s1e*b-QWY~!8K%6z@olE!Cac6U@fKB&JW+K*G5=)EM zY3`1UVAl#{%Rfc&;HP6@%q5%X*sez&V2sGuTq)3Z3?EYd1L5EGlsr4JYZ*;eRFsw@ zP8Ir({vxX;RDGNGqHqw;u)tZ5m+iL;S~>f1WTxq~kbSuK8P^QvP!cwD&(aQaZ3_S=~Q5VJAo@wXPQBHYdw&~jlCt>9;FFDNro9Y zQd0gb&*dc9PbHy19jUd?Abj2xGRU1MnaJj!X1Vbj0ZgqQve@~8@+xM9kq~)TFlp$Y zVP$Q3vjw>;a!2u-FTiTk;0f2-#t>Gy{mu1+ZH=Ej<(dkoHj+E#e%e!ZCYg{y)pvFc zSIeOJhwccIo*#p}OKyJNB3c@n z!TGTl^6b?+XSCVAlYE)%F{JS&Xd3=r%kK4N@I5g2s`BDw`o_|3RSNcfbvFIsLJb4Vl}>Hv7jkFmIw|m6aqRf$s!u; zTFh{m+Ia}bwZGbhM?bLDa+UVuEkEx)RteY*&59A&#Z;%*Z+Ml#t6FOgkmR&)aM1)t z4-dZMX|PuGn|FQJ#3WIiE{bXXvaRDc(}*JKX%i~-;>;mv+Ja^+l6V@WaV2C3qz;pq zcO=GL<78u_gX%}mgb>Oh-hmt@o9|kd84d45Ei|%-?;3Qh-40jKU!O~YYt>Z3ONKe^ z#K}XlaK7SsdPwcqpMj1?sqZ{y1T#o0`?KeoN}0LnSD|l;-~F^q=jtuHwDEFkM;&Ny zf|SO?eQx*?oPWuY?Al7{ec#IZj*A4jsiA>zZf*`F+@T@uu-eA-tF@A6w8E*1k??Jo z5mI{;rq;pkGm)O2(#7BYBl$M4gzX#2hYqSXkNv3bXUC5mVpI_Yx)gE8f6+{r{X zTz&ADz^<^ikMR7;R;~Mewv%E#W!PquziR@auBnN5*)O~4a+KZn1En*ftYWV8OU~QU zjmK1jjju)=O`MCE811X1lF}$-w|i7$b$^29V=V$a2#jB>ttk_Siv0v^MI2-togMs(>*cNJ;Rc1_V|tF&Wu zrhYsPE8%qnwD-VWkv33>Y3G83U&%B~TY?FUNVv;aE!3Pk(Pu%s+{KArm-*Lw-O@A+ zJ0~EQN!}wtk>DPT&iuTiglgFYi@^Nal&gQI0v~ z0Hez{qq|l8eFSLSoE^bPSwetck9n?S?Wf8nv5!W5(GFwS)%K;35rn2y8|mIWFt#nbmlVjqe$Q|cCiZE?vG}GF zzj){Yh_K!>o>dIdvA|Ql4?Yr8>DWQI?SYxj*jHqr2zmul^B=g)Nc_5zsXnHOe0() zJ!GvH+2itB&?SEmwWu+@sHT@Ym5HMyM9u^HscB3)eaRs6q8Uwpi3}@{Gg zIY`9D9H!%XYLLW!cIa#Pf#I|wgyC5;yY4o~e8hL7ps$Cd{ftvMn73q+BTE|db~L;P z_K9}!t17lG+?K=|+K0Gxm0^X+M_@Ta zFKq&i=*CEz2J$4o#?DuL%nC|@&-;Hkgix#3QYih=q% zF(@EzP#gB*aKFplyv?1RP|>G%;Z|P3m48(rHveumxOLnijub?Mceo=9OHa4hMmn`Gd;uPwmN*4bavo(D5gqAt8(hI3|tgJeXr!?DrB ziRhY3dofouqbVioDNLP@20LuJQ$}?^Xm}-6y9*2AKnD`uA1bSIyUcN3(KJ)0#1qu5 zLI{mAccTb_gf3)!{T^*! zGXHb#t}~;>4c+*9B@v6qn{@fq^2wm2jI`B9NWp=>*F_ZpGlLtYcehHRJ-?o3^pwsm zu1kL5yq(+ULe8)2&zoh-YOS@CO*y+aqK!0hU0aQDnW6;t`i8*zP)TFY?5KR(8_U0Y zWqU=?m~ch+Da*giaq9)LxqUKr!>yr?C{2owjWSc}ZNUi63;Di0RM5zPXb+tmz|)iC zw0$ad*J3l0f11~Z^n>YM1X96sWM1K5?w1Qp2g~|%nTFH9SXIcA{eFpG?dI2m=T|=i zKJ8KM&0Gp6HNx zmTm89FHH@^VJYmKcAp}?=;N4j-Q$llY{!vh#u+GK@U+*y8X=B1OB=p{umVDA$~t-772ElIDKhp}87{P7c9tO_qk6lzBj@VWho z&ZqP0geWI6w;DRNZqvGP8R9gD`bjxI8VNPnNB~0JTo1`Z_8F4M{z7{UbW_N)ZCId? zRk6AN4JkkIyEo{ze9l%Y+?ZMQm}ziitX!O5{LJa49ErDt8iUU+cc2Y9lN_w9!Kcwo zd()PrX^yL5db($ZbwD;^P9qcsE+IL|3ARVYcPVH5HpO8OI<%ZO^7)Ye$?%I+B$}9}j_4Kl*AlF>a1&6B z&JAhjHeoT@FKLz&^rn7dz|DjXX=^`utc2=M0{L6)?yxGzeTFB9+_LEdb13r!f$*=x2&;*YB>vJFPp>k6e6>y)C8#r0v&?JHpn0k%76rt^t~l zmNn7VzvE|`rs$2uNA2;L48M{@f6Cnk6KBTN+*5zduH&u67sZ=##n$Mhob|HXxURJu z#>Ts21z;t!HuaHF%Wem8VyCXZG6*@VJkv574aCt(pwrr>ON zm>%+@o$b|aZ9#t@yyXseX*aWH`g0fR3+GzJTf3Nt7??<{;3yVfrl4i$%uMb2ZnKu> zH!_8Z(q2L&z|~2#_~h>(>qA!J(r&mwkKPpCX@5JzZs1>l=TW_XXHYE)D0GmQk1tu3 z=95a1mpQRx%FA z=B^8=x5cGrfQL|#CU$_tiw002*#;aVs@jkP3%FQaNTnupBRF)b{#x#< z2Hk}ct|4JYwxC%TtY2Sgp+oK-9u)d4co8#_MBz%T=7q{gEn`UKS+B~ zqEc89XDaN@b{)m`2)lA3-}gWHa{m4eh1l*RdU~>C3%j7A;82Bjz9OZjeiKTjK#1*q zbUv%a3&H38@F62n3CA)yfI*QYTZ|-PY*X86phYGRaa@EEEBxO0M0IRr1m9l6@k08J z3Se1v?Dr!asTI{}zQkI6^6`vEIHHdMG>Ma}yf~ze7SfadEbKN$e6IUOSrsz~ZCCl0 zo3fYBxs0EL&ib8m)T@4^#-Cg}vy+dxVi@El`|40>D>$QF3hc*h`aOQaBrHZ+ahy9C z(J-nl!67QEAXrI$C_C)c$)^wW2Q%5lw8e~vq}K&wO1(DmgkZ)r1Qvn~)E|d}{)**I z#J4a$GgGM|H=lTZe)hGa$6Jwp6bzdyt?7=A>qqWN8xYKUYp(Ml+aR6Oc^$XSL#fe? zIyyMj;|B%9_T_$al&ztqCps025kSHl?xS!Go!<2PCUr>Ee_E#8q*llPMTBI(b4ai1f*FbBT#`_e1PBB-L!+YutJmM4Q__AhFdQ8Z+a% z^Auz4A3gDlDY{>6WdpA~2_vzhU=98b`bX}I=n?1)mtrgj8%zi zm*T_ZjcaBuF2A|wf5TNO1{C){iEsNis8429fWI|;aOGZX>uE5#1MrM57d{5yu<_?Dcn73 z_w52do^E-fK}w-8!xI-mNv&b8mxcf}HbK;t*#19%q)GR$uH1@>i@Su1e_2l});!!T zS}M=F#EmsH@XN`|L(U+*z$|%L4WV1)i$d*pzI1kR_uz=#S8X+AWxQWr)Dn~M1@|2y zt7vFw^qL%T<7}&H8ufK`b$jI%KO6!SHF89m;@n(S>YoyvOgPMT&8#x_=LvDK+eR&A z8qkN9%WHK*Jx+R8-lCVRf{56k((~bXw%!wa(@Y+IkN9+6HSGFUksi_HI z1wT%yiPgB;z$6d&)YR0*lg~_KgoKQC2|KQ7v*X^%Dk}KivmPg0%EX^;;#w^7e>f0> zb{-O(YSlUK`27?!*x`)OZbNu0&(R3ZYmbzq51NCW7~1y2uXmhIo=~1o771XIneDry zbA}b$Gl?(Xu#nTwvKT1R*ae1}eC&6hX13gHRBP1!r&no2qq$tTOW^;CKnGVh`Hl`p zZdo|V0zWBep*i?J(F`b%YJ@rp1#QUqLVEr&qL*%0F%H3|nu+M2f=2glc4+PgmKX>3 zoStF0NjMQZno_SbZEg?vDnby~!x5i=0FQ#A;(schVNyIix`DYbr{PQ(N~mZ`h6r$Y z(_W!<)2}d*4tjt5JKOono`HCZ|5Q8xzMTjxip;U=!-ZJR*(25ted!n_X+LG@C)kAJ zb(sylcdFIE z`$6Rk7>6SQl{Wx5G!`62@?v$|q=2U9Bu@q$&%9Nlj@KtiWHHQvs=?+W4t__srag`@ z==7!Hp2IX1PHshUfmP}{=iuO@RD=WN_V=mjhC*S7%0olK6;|9w>cCr4OVfePo7rXH z$6$CQ^h}JkL=?>Y=vPYU-*>MI^9U%t6 zBvcOw??>Ou+pO{S;|t(?Eh-EiY5xw)b8X_I4!Ff_ZEOVwy6N$Au68pb#sE@2BaFJK zX8g*4%-xogO_Sy#<<_b-$=x*C+2A<6F8bF^a#Wpwf6maZ`1=@Cj()M6L7p^|Bser3 zYyV4-B$fBX2O8oMb%{J=a5JwXmZndKt(3lV{WbTU)v@YoF>;04t4%rD?Ktru@ zl~x~@$y6su5*kMVQAc^A3ZlqaP~b4yg#=wSA11P_OC*1*0NK?nMpeZ0$~8ytIWE%( zk_ifD`4TUKnjv4Fv?$|6Vm`f$I^FktN?m6gj0qwF(!9>^y3riPt*}*JIzGN `= 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 ?b(SV8h^jnMf&cVqKP{%NGvN z3@Bp+taBk6;mHOR@Cy)CQH2?ZIzQ|#xC}wEcD-L>zhT1EV(dB%gfL8!PN{J0=$|ld z2F<}Qac01$;Eu;9B(iodxg!3f(35qHWYi*PqP$4VKkjMB({<(4pL`!4r8y}^P-haFx@$Y| zuD!S%{9Ji8`D(Vx{kxx){pV4M&ewu!pGWFreZzk)$KiPU`ui%}PV{VV_(%f;>hq!M zf2}1X7Z;a~OyB5II=%{c{;dZ5CUa)_s?52l!|J61(~fB#{1%s@S+ibFs6f zn&pf9t9wlV@Aee8JZEPv(7WI0U=dbjy0dQ5?j3ivyj!mz87HeyPJI7Fif)qMy5=NH zLC(A1TucmufvtTn?iL_2Xbgd)|ntaz%f&y?&jr4vD)S7Jcasb+C8v3sk z5c^&8<%Msg6>VqGp;5}C*RDZV($8E3A~<*o6sYNASC$etUO&fpqxKeoilmMYG~wY6 zo$t_HXtdkU>>#@qF9x{y-0=F|irb_li{6K+{ocV)+NH!4(#CVxB$vZ?ac=VWQ}Ijc z@U;YMKrSe?)nT$kiDvwy&zEp-TgHj`mbf8a6n%ZPzVDYB{YgG7?=ptJVlY7Ol|m?P z2#lh)2c==*b%tS^*qjH=V>2VSq29wsA^fvqVh?z!@~Y>WkS3?Op|%cuObEzMMkh+9 z``qSw)cauF`^i|nV!rRI3S?i1qaRsz)!`x*S(TZNKast@|1-8@_D5F5{zux+qgA%K z?+L{r@FY{n;x8(Q8g^jY$#%Z^oGRV;;t#BV=0^rxv;k^WK65}XqCFJiYb3X;-t}WO zp&-J2nAE+kJviWC_o-6PFSX)fP<$wt)r&aT>oAPXPVKdb+m038bL#IRe5suZ@CY8D z7rmOD8!wDFP2u-&!Gw~N$0_C`z80}n#po!qR9_~`r6Gw_Kt!{Lpu=Sj3SHfx)OwFX zenbt&c1D5K4NCcYs}Xrj^`JMYB(|T}m$O`HR5eBUCJBqgc(iKbnuMSe#;Yp{TEz7m zrls1wf+(|6hx`+J9FLQ$#s`W%gQ~!p06>XK9_A*BOjx9*`*5aU5!_k=u zg~6}k#yV6D`L?1a3Gjl;K|7gn#%u}!%-ib>-$EsQ~PL_8UXy zF=24pZ_y;Q({^_=AdoJ)_gz;<(iLce6f<=v zk(T%|3+eBu6^{*FIdI*Xi--{RHPd^~tyk$YYKcbXUY~opcjX z%*!Cc4u4hu;j{{?MmmzqHy8^6;w64C9MYbVgsVa+nMi$3_EP0=bRH;3L%?~U2U{8x z@UqJ`!LD

k&igTTWVd9|aZKO}P2?(~T8fNpTxH2g!>L_N9|m`p@EDAE*j^D(_he zZL8?0#iKu=DCXRk(CvZCC&#FCp2+pv@+~7|vX(ITXW@9Q)2Tn0L zlH}T_S>L%h$d!=q)1_Qlx`hn7+$X5g6=dE?rb74Mn%~=M)Dra_Vv4Z{qIlx$y4ZX( zlb4i?pH^rhqtu7?%$H6*z96tr@LWtuBxR0O+Yp<+NA?pTlq9y8!i4^prN3BRB-*m+ zkLPXdxs=1pN&?m`Pp!^x_g&K{l1MlSI~CO@W|Cc}MK%c)D!CrEJFLwCj9 zs#XN#Z=N)gQj0i?F};^S$8b9k;9={}$izvNsKNhKJ8LJimbR7>z2AT{U=sS30+Wg2 z?~~I4)Gw%}s*2k60qo8n%NA~RO~h;nM$<)|fWCD_;NZX9*mkm(Gr z*@@fN!si^#hVFNzx2?=1!$os8#b1}WXB~DQRv9IyrRBqetFY|JDJhG?xUc7@A#$l7 zwtxaqskv|MyuWot=Bj{%#;swez4ODD4Z<-ko6-ISm)}u3tfr&C;)==8{gd-ANyYuka*d2MmoZh+DrKV82rvaGQPkETHz%1SBQ2Ku{~H_$px9g~@e+NG~~V zC%vVDT_D2W{&Ja2msIO4e5k^@Vy20Sths&>xa_xSDzkDUIm1hot-)RMi_%dmq!F`g^ZnP#+U$~%5r6vGx86TTr zeE;;~=ZoIbn>~TL__w~sv_i7+Bgcmi{1~!qKQz)_EYxp);<7&ukf*~IM!@OF zzZS}D=Ntr`_j6kvZ1z}*u4Ixh@hCQm1eIoGuH=t+#T4kg3iTIx6K4^%mIiVU7Q2`k z`H6G?t9W%3!ae&rF8^$qQ>N6DX#I0jo}&os?W{Y!R3tsj^%b7b0ob(WKzu+%|DEe& zvSSDM#`!j}5kodq`XPUY)!(N6G0!n6 z*;4bowAr1!TZihc zq}pW7TQN1%u{=FC=^|cuNf#C^_|Xg$YX`49n0b`mcu7{xt^xf8)DIa7jXpohRf6Ys z)K;8L>Rf$YH)1-8<1~wbK|vjB;b4Qauifu9w<=YBW}t`3XQ>(+)9>qkJMg+ z(4SA6_Ct5DwAG#U&5m4Lj(j|?n~BX?nZ0RspfJsct;A}2JKoClxS;q*$y6r!*sSq5 zQ{BUc?4f55uDKq+obQG-ym6G;>4{_3%KJ$0z7^FU_}O5hhY$PXcjv>4FP}1}m$&sE zrSDkA%aattUHjbV^qBA4x1*-rOm!FuKV_)dYRQ1hzP5(QFKL_)vcx!gme|acQBF3j zQ%QZE4w(^e>3%PJRPk&A>9i0;)0kQo((@TtePb{kmo6DIN>AwD9#)a9#PnQTb8-GS zu}<8X>X@4pv$Cses!&%h@;BZHnmq*PVH}EMOl6vd-tm>{S}G9~9%@lTkuS6OD0W8^I$!JK0!l*P1&{{l+ zV`dca460Gxsz)o}2iA$I#m;xD(&aqdr&$)x16Y#vT1wB{f&ja^zhDelyo|Yg7Kk)_ z{TZVS;hG;nQXDgy;LL?RLL~Gqn2(l^R{YR&XaF?e@%pA`{?Q&hH@K-Wmqykpl8#SU zkH&((zbFB0&Y9%K8wJ$@T_#b84UWKt9&&wn{hK|bE1>`b?CQ18j84?xU46MkplDnf z2)(-n^D&2Z4!GO)nOO!i0nIFPft z)Z_E)O*I8d*7{#f0X0|19*>;`d>dE%j9W2P>#2yEXKmSwq2?A+=^vubBHgpkiK8DM z>lh`p@^s2O+p5;7cznd7YhfxJK02k+S}^GMd{Sq<&8g6H+Ho@~+TXil`5tnqyQ{9* zhi_LXgYaw7m`$Y}J9H#KGrt zChYs(^|(%$^pZxMA;a#clJ-|!5;7E0{3UI#|Dk4|iZXL)zxeL6L{*og7(?Ab*dh3b z6wbrCU@C-Gcuh_D6zj0DFMI-sYeA5;D2o$m7*3h34K6#scp z<^^C#SjEbivUpm?CLKe1^W2Aa>n#ghTnQ}BDg%Ft>z!OR1f34}vqtB5fFEast5MFk zy$$deun@r)FAL-N_?LHl=mKCo2-&ZwV44SaZ=7u!49HTx%Svm^8+*h(JKI9V@#Is- zA9v!nxl~ZLYiRe|DN=E=%eIngreMy0!^$-*YW{*4TMrgXBk`>0n4MguFi$(GH!;`v zezCb><(lzri-w^i&k(HHr2QO;t8!@lMJ~XSFP&x;=&%XTbjGQZ^&+Od*S$d0?O6SI z^A@UPa1yM4?)6q|9Z+re)yAcT62E&ORMQe_+2Jg*-;YF%5uD0std2%c#=+Yc4CpNCv6}7 z$#JYhf(ZqA)R6GTjL69b6eSH)O^EGlhF>{fD%MXGEl--_N36nZzn$5qD>lUAf>_=S zl3P|@*9gV=qL=*MvHo!~4=wkmTS|EHZulDH?J&skem{b1Av202T?faw@Umf(w1jb0 zr6KaGgB!SzC&UABZ><6ZJb9o&??eNqUv_)#jIO9pKfgP6EkitNL-vrt;lptwo<4G| zK|gDn=tuvW>gv9kwIe8!f6Se!8lKNV9`JD3Sz!i)rB;r#H1z)XgA04lKZ9e3?TjWo_zx z%79{0tmv2|vmj-)iN;AD+_Q*fvB^r5ga+N-`&j$x;l9aYoTP2&j#$lHO}DLutED0e z@L20?vF-gGDy<{8l%2`3>f#u%dQ8 zN#^*6{lhzDm|h42h1^QIGN1tDme)G{WBiiQLHTw_Kq)VZ+2?B2{_F=A=!FQhLj z_D)pe>NViSY$5mQ4^0oD-Gm_Oy}%3SuHEqA$5+-`p2>TpJSlM5>VT)2RaB>3yxST^ zcL4QSthVW2f~6#+jc1zjm9RkN$%kZS0>m^rh9Heq4<0H`N`Y|r6G<_3UMj}- zy&PeJCnR^ZqG@YF;eP7pTR6_s5u#>RKCH<8m+-EYIM7N3L2%>jHKn`o6?k{VF9xZe|L#NfzPb$8y4_D*#X7^5 zm-K0bW4-F>8eDCbiKR3G4zo{Sa`p7l8?ecdj*_J!lKs)gTC4b;==t9obVw5du=B@I zQ}!WCA|#DDqNN-o(QQOReB{eF-NqP$C|KbR1RzA*9$=gP~aDRm!oRQYtB9y z3teqqpWJt@d`-JJNjjW8w9W?M=YfpSRj@W$0>xoMNjU)Lq+|a-H)^_sga`?Dhw5JKfpp20XJd;8W(M*9*60l%`T;&^(butVlg#D$ zOmY^rjrI^p?_}rcv3rJ#Ib{{k3OM7I7-JmE za3Xp34S(tGk+MAgImVi%0LRfoBD0hNW!9-8vXFl-f*Ul^vW5BBdkWs4f{m z9C+@doj@WTR*KX~*T2Ce^GY(C8)4Cbwsp%p@oL8z+hR2xW(x+Ehld@uM6~-axl1;t zcO}1d1U?C}J(p+U&**{w5qd$BIYlzk_5h(hL&d z5J4>eGmo=?m;8aQaF$KS)Fvq&N_ep^v)oN84=#9^SX#S@Zi+fOMpo`lGGY~7V^qo$ zCg^e3WG~$6CN-hzG+>c*vgk?ZsiC#Zp$=q|61s6N6d|bCjTcxb0Tml9*<- zNXy#wbGzubE!($))i>Rh9hHFtBA-i+$HfZ5Y$SK=y8zGG-ssX1<9~CkW6XG0z;eF| zCxHa;-rgx|;Q66PR_KHUR`-LpUzcyrS)H*ewkU|%LMZ4=3vm=!UKB4JqvJlPH81KF zF-dFdR%n27Lgaf2^RYaKmyE^R3>o7JUK!TZeSL)!f34aOVQS7Tr)nB6UnCXJh1UD* zYsNlEJ0`LomuEI!$Eu>IMp)9utZBj7I~rYbrmkHwDz-WUb7 zSuN7Ze8xye#T#b;#~Yk$ck3YEMO*-zTj57#3HN|29G8b1u(mpti4-kPa9EQ)I`Ls= zA~G|)apmj|0Yl?VAZX+F%LvZwAA6oBZEv*now(>N&%V?5?ZbeUSIf#obRp^XMgrBM+}fi;ylVt`)7fYB9-Mw6O^Ydk5c^wpMk zt?I&rI1SNh0>yr-~b=(UPYxx$9@g3>0MRBx;dtHuj%@o><5Lz8w6+>HF+!FA}MP<^4pckdzH^ zkdGKxWHTtj4PTtytW%Z~Ur20q&&pWL0+Eu$xyaSgOv(~f_@aX&7V$HrAHgD!@^sV|0^k^JF_qqMZM`Ip!i2` zV+!4xbNDZ2r8v9!TEF^%Kl3V zC}wgE+J)EWa__lW$MxP#B(==|_D^Ato93Nu8K;uRz@te}#Pp~AUg+V6dtdk|a?t*P zQl>61@9PRZx5E{n=z@b>fkY%|t3M;*|(nuRqWZHe zn8w`qH+b9K{4EE57$MeqBt#4&AYy&6y~cc=x2^?>8a>XhXyCSV@|BaO32+zsA&#`+ zf9~F@Oq{Fv0jct;R~vp`+4%EyC@@=`xuaf``C$SWw3uwN7ODTJw??UbuZNFW3>{Dq ziv+BV{D%+Z#@k+3<*#Nji8jUBqL}YMMFfsQaPPK+xMw7tpbiAy(7Ap{St1 zLaQZQThZfj(frwF($rDeZ3Mhmt4ujaUi3^R1mWY`_WI&GBzns zK^uVYj#&*4uQCpzBP4}z4CW!A9;I`HESLg8%WZ-19(5N@rTCJj_Z5mI9RHx)DR*?h>GE=c{fuFvUE)8cltf7{QZCF9RxYFTBkxs zBJNBh1xJslTE5*eP-xqF#{=onQLy19Vdk9(atc z|MG@q(r!zrVrrZ;i>_}qBes*!vHOuvYvR24)vaGc+vge&E@D)>QA4DlL~Vyg{5171QsYH)S_vGV?*Z%y9%i)E2^y0g~#-81;k{>+HAiI~VOa^YmH!8^%Bm*Skmblvv9+ zc-4tFJ(IMEF#z25(aZ8Xfo6pn@IhxFw?*Ndic^*B&beAzLMZOCmL{kx|3C8OIqxsp zEjlcfl=maGb@m9H$TD%{-N_lm=on4P+3~o>4vfHQ)JX2yi%?fo``oD8Q_PW%rGsrU zWk}0yG`+2kgN5ovYT~wF$wCj1M$ztf07M}yP}&ioy1U_BZQV_HVfAB5y;WR8D(Rgw zZULA5<=Em`4KLiTyOgiO3VboxKQ$7=<0-!xATIC*c)Rzy!=+DabsH*EzI3p8=6<6` z9&7m`AyL`#P5>sc_S7X9ilumnKsn5_K%E590-;d=>;__s!oxP%)iXjYog+De$@8p- zc)9w;y&<0mi%i5LzI$xAjUzF4j9AtuP$VVE%Cr0C#Su<({Vl3^OkPf!H_G}Lub2Ms zJ>;&eDI{nlcZ1@K3GPZ2>XNjV&Cx)JcW})!(?3E6e(QA8Kg~3)CAK&{+M^46*?Sc6 z+_Kf2`n`Cz$_U)IBL*+Xwai$Sdgn$TCX9w_p8rU%s;Qy1*bI*gs&T$|wYsH}fsV7oR z5f$EAob^{^$Dc0Wi#F7SKFQLpS(W3s!S)>sDrvX7s|$s{=chrNvspZ!v6`R6h5^F= z>w(o%LL{+ySpE1~?Eg(y`t_8Wn@2Fa#h?dwDx z_#LP_yuhe!C}b8T*zhv__>%a{ZW1C$Rg|D5w`Au))A0d#rz8P(xhHlBy>Q?|8N7?J+U$x*{Qnp@4ZKJ3ZmJ$>88VK<#)ShYTZ7Q_8^-&PXG_KR-t;>!W=d| zY_f-_Kr3yuUDu{)d^nyZQ$IVm$}6|T&jtegD{MO}Y&rNZvai$!*SP^Km03e+Q>yE& z#xzqa16k28YQYw~#_Op~OwB8ZIrD~Kx7?t9K_*OUbMyw6M6QeG(cYAu&|G1i{Y#hG zwywIdz23_9>X{hMVunbaVn!Bm*~`YeXZPYi~jJ4kdl zW!d=A_D;G$)is>ZnXpB}Kn$=$7|Fo@Hw|G1>>2j<6*#j(81)9w0@W7jBknG|5u|7J z@Wbs|0~+3J{Z>g;5E6*Fo8^Tnnu-cwK-zc0TGvE)7XnIqR+9pMme~H-4&keQS!D2d z_R^|oSd|MC$6_}xxVjQ`m$V-CcJ-7X0al!MLY$4sx3tjJWdM}pbruplNwxMYAJl2=ntw_~ z%=2ld%EztB5{J~rxUdNLMh`NfZ5QtnI9P6X2*cYZqS8G#>+|3)92|fe^|$KuQ?#fvaAW9w{Cy9 z=9Rz1o#}lbzB*bZrJt~nfgbKgI`+v59mcObdAc^4QtNqKD;r&xVuMSoj({nqV} zPYGsr6#+Y-Ol41<*3R63=Z|76OvXv6I(sOW3S1rs9{%)!y0i4ncBJhTAs=! zKX;8G$MML&N^)N`*8`dN#@6>)tipp>TH(1}zn?5R76Qs=28ct(5)STLX=x}ac;T~- zdaXHLitg-DhN)i}$KA`N1hasKqCKV}3$X=p%Nx?LB)Fn_W!wvWIr4vQp#huI5ndE0 zNG4K;SR;@qI*?W^()L)Mekj&xL;CoxL4ecm5S{)%qP{XJ%C?PGL2>AzJBIF(mXM*l zq`SMMr38lVMp7E-k`5WVK`H5w?i`vkyx%$N{Fz^~o;7pF6?^Y%KXioUc0n#&Cdn`x z{yr6a*>**!3>-irGZ+zUb4-;YQ6+tA(}0&BA+!QB1y|@XL@^Ab=}fd7u;TDu}Z;P(Jm^Wv1c_0d6kIzpH<>pU|xNavRl^0~z|vTQ@g z#&h-WI)mTky;1Xxh<%TXQ)kFDg}+jtw0fmpA9&II`1bBilR{&pd=M>8CPRaB=R{>* zf!-SaYlvrH{k}b zQa&7{pJ66oVTGJVAd_>?^O$~8w>w!im%ph?hxR9S{CXp*-h9uqj&N=JfT1vCs3hC9 zRXf64HZKwTcTbgPK!NArGao$I+{Y0%?#;L;G|&4@vacg6fz5I|0~&-k#0K<^r#wXm zBMqG^s}$Z}MDa|UB&g0O^uCI$GQ0Vw?YVBccI*;;6v7?Ptqy*;ux3BEqlfMdo_SWlfu zW+F!dCqZt(RC)4U%#Ujfca@S*N^ZF|5AB9Yh9e9da`CPa?Z7sy+GhG58ZM<@$^LD{ zmme%g^ZyA237Cj=UEOoBFk)JVo+AlpM)uNfyf#t14R>ehR)IhjJ0A$5L_#3~--UE3Enm<|&z02SOH<4n*N;6FwUY5>IHe-U5ncYP_^9*}NCz}l+I zlxpIi=P$9ZxXSEERF_Y&dEmp%g%&)QoobzqZF$kMps|dF*%4+t8$(12#LBrFYz>r= z6)6FSo`K%I+0Vop=+NgGp5Zwsf@CQT;at~(-&zPl#lfAenP9a${YWpd~Dwra3IJuVcL_iwS-6I5D#0cVDCnF}%K*7D=aaN>XJD%yxY*Hg=H(0P%mKMw z#;koiC3O)YcgFOIZV%EIa*L7j&_R^*di0q3nx9y5+U&$w{KF1#@=q>VV=y&sZe7-c z3E@F4-Y6Nd&4(?Vo$_y9*n({$`FgXVxT-hxei`%HjwxfIo$Wn9(tRe}15-l55k5-o zP_&pbo7aF;3d&<*EO)4HC%4d;k-}50zniAO!n2#A=lQ)SAs52ZgV}k<4p9D&OHupb0To`SBCjHn#U}=FY4O-0kD|=hU>$WD&5rjd z`?VSjMHl}j*v5?z-+yroRer7OCvw||e%Z2bW?3@h9H5k&?JQDvp&`Wn;^Q*#ez=;L zIIzVB11gjSiN8;FzwUQ=i9CWLP6W_Yz`7RmTwZD6>o~5+ge;9%V<)oFqb}4=NlFuI zu%)BG?~DC}iv}dD?k3K*d%<}NUMk@d(jTAe#lAarFc)L(@ z)p-*+=>=ZWr=0pZzjf^rKsY%h@X}v`SQRNdI}USKbYVmOEuqj@v}ZV~X(HGC{^R1+ zhfpyU-CZAc}{%KYwx|>*bi_`3GX(> z5=KchQX%R^uU%H6dIU!R;^npxPsIkLI*!N4JT}Q(hjdun> zpnZ@I4TM(!9njPnn6P|bpxm@RUwR9yrSU?xp{-8TjVRS-9=$Qf9{;P7;gJAPWEZ!6 z5Vz0f#-#{YKrSGt>dlJSSxX~`;mI!Ecx54i_yh|$OAGLYtcNWpJT|MzF0gp_)u^iX ztzjK}HzR_aUeXCM%J(0O;5aYQqQWLv`lS&Yy9MqT?b%O0o~#5z#Z@Ce?7yUx; zeE<9ui-~VX%~t*jR(TV_cz1=ZR_I zRw9ti02S3vSqM#5%Gr(A-Z8hYq1pq=#f1r)(g9#zL9cCkPNzz;&vbSi=YQlzPD-~p zPcH}OP`LLID%0%k7Hi znyiPSB0o{~-mYuko&gRyE<-9i*eebxpdU9W>Cji+hE>qL`DWCADiS=^b|6zq456l6 z!`QxDK}v(79qtMs$$QvKKaW#v7DNo#JiGm|c6WeV8VRCgH4*#{zCLUO?@EFRUyLjy z!it5#gOdIEz$$4mS>X-Y&)DyWu{NrsOahJ}CP~}I&_bO_6n~6@O6J;)uQ&+eG5{a@ zK)w9`L@)xKYIgfIC{~AZrD-0G=(mZNn*3-)d4~w7hXCAp*M?{R?V)y z0+tnAV6`dKbh7lI6|)KIU2pExE>R++maR$M8bDcw%b-6PyO72pLCqYO7kWSbR)OM< zlg^%7Qh&&dl#m1UqN%zs@=AI=^9o__jE?Zy$e?Do8EL$dEFz9i=)1$X$q<;V7xz`* ztnJO0L8|$pnN1xN#LrO|-|J0?I|)C(S-;(yTxkX*HDyq9HK9Z_tU@kL3q`B?@-6I4 zY<5Dva$tAN>(4I>NA1x-F!OV%nLvnA1F4$_$OG${s$pTNd>kIV*xFLJ#@nl{o26Dn zIU=&%vFjbRXO1+{aZcS!TS(3=^@ssvWhim~1pjU0QgX2o2!^IM7n?vD248>2uO} zj(vaUXIq%1jy-xV?ohI_dEXqMZ6stFtZXmH$;i09xq02#44S z{?{colwg41_0!7-s(i~}GwzU13gCRUXX&YJT@URaj&kIAp5kJ);J?TTEep+5Y?_%6U7ho}AkLF{p(2u8WW4p1Z;2E{JZLY-6p|8|`9e>7%m}jy}(|$%Z+# zL>eEZKmppfzFQTePP9z68|t4m2(XEx{`?dqz*vJW&XhG~Eet{rUF6gr6}Hpi1T9xM6tok&YOm*O;8 zq`w&A=7N|`o6$HHX9%Jk zC8&9JuI6;$1?wE@j#i%qJEzs07zjKFZeARUf^ew3h=gOuGpQk;L6`RUP%3P2l~r1X zK?IP(VRW|^Yg~stA;BQ_5V|w@w}x~C)<#J)`sTf$(^u&sv%}pLBG)QuO6m)NA>#x} zIYu41!3rtx2IA<0F)vy{BocFyimTevR9$;5`2gB@Gu@0{{*!5{9>X;Oq8fLukogF$5$WK3-Upl*JKvK-K$ST zOvRkezS_RK^e4eO*)8r}Q|0$6ZxWpe+Yndf@d_~|oB5Tu1^6epwGM`LF%RIiZ6bsH&|naCgd#`~c(14(Aljt)=~epd~^o zb|h=so$=|p!9b#eP+?RyC^PKs=S?zBt2N5Y<3)-N0z*kJE^AG;Rmc6ccA_Cj;4WTHS6-@tjGfK;S<&d(q2SlDIR{8~rnEr%6MEImXDx!}`L z!VBxz)V&CaKZrY20YdAB=?Zr=sWx3`>vE3znt9kBbH(x#^llI)a^@!M7E&#g z4^&mAAXLSLs`@Y<^X*ws^?67$TLP?|*e1^Iv_U&7&1f28C5fKQHpc7|NQ#|RVWsG0 zs5I%nHE@l>Ey~>WnDXEf8}xa!B133W{BV*iNGK zj@qYD*3UM}J9Tc>xp9m~Sx`D5Kc$1I7E4j5-g>BD-VE0XU-q^zqcv0w8*BypC_yhI z=KI@~rZ6=zJp}|}jC-1pCLNO>ssfMK3!48qqoIwu*tF@WC~@b`9cL|2Nl!}`1Lqh- z-!!P{YU!t@_9yfU?XG&iLT5Ewpl<@Ek|9R$8kH~6U+SE?V10Y|n=&Yxi-bGb0+?$r z6w|(Lc;jUVCrS+H*KMtdnyF78f&^WBbXs4`Fj2>=naaMlaDhJkbS3Do6Wzc4zhTc4 z2kIUKw5;P6PO!%OmOLcFY~LHI_`&#OSAGMA8>faE5k!%l9Brzt-6A&kD+^Mix_8!) zHac+SWtjO@F*mkbU=>?vtX#7-2kx&p5O`5uwx0?Bp@PzYWY>WIL<$8L22s)FwuS)J ziY1|l>+_1!x5pU*@X^for>7BL15T-L-aQVgWa!iQUEaKfNLx*cWG0i#-~Slce9$$w z)S`@f3dpLqe{p?`eKY4-We1dI`tO+V^)FIGOq<@bK*Uq4#XntA-@KJbg2*(at({5( zP+|tQ%K2(dw}@E`8nH)GpPQXCGMf&+h7<{dsmRw&oJZrpA7xk&l1J0vaReC|JHSWG z1X=DPITxkt7ej9!o!NQu5eI5iKko-VY%nJ2xfdYqtMPxW64wzk7hF6(*004pn@7p_ zE+o#Cc0qP3X`sg2I3zyan1-g8nv)YtR`!i@02)K(zd{<5jPx5oE$38tbo9sM7Z1|Z z-BOvG+q+*gLt=w)Srn@%o`ttEr@T9#0yO`-?LjP=2My%->7@g3b6cQ=T$4Lffk?hg27ZyvoMyJGVgJQA{QB{qN#aZko5c@ zuzzr%s;gV(*7EX$<02zba7BC~LrTU!S}<-64WFmxM$R0ZH4(X*kP(Gd(m)npfTSCT zQ##Nz6=;cC0wBEp3;a?qjUf#Kc;y<>@a(>S*(&$15qo$hIgxqZNw?_J`F|yZvkNw6y*#W@ya#tRcVIR3_4czMgyO< zh5&$*yz5`vm*>%R;=q+-ra9++DyhmH7;iyKrkivP+#iz;QWH)ba0A$4%T=S!MORj%UA2?q|Oq{KMui z8t~ErIl_aQ04iCcwCQQbw=UY``|P{F%I9?NsK$T;eTM?}`Za?&uJ)qlF}o;0ULXE> zb8+^5_u|*-y1RTy&+ZS-N3N$<@hsCbT%j=DP z)=H$~92rA>zua;5ZOHEdW;mS8Z(GVz**N*dpsLIyXF^-(0yx%eHmV7xlmU_!%?e6X_>=EGc)wz6h9|xLvMFP+|CZ@fu!G6 z`N0zy7;;LqO(7gwwQ#rkAva@lFN!mjS4Bt3yUFwkMwb!7L9SO}pa(h4`!9iKG|j?s zvHt5OWYEw|$=ozY!aw`Q%o0jDCsSUFPX&irr#pUOy#V9IOLLpf0JvMPK${sxQ8^2l z_H^;H1rOQe14S|s{9M}~A!v~B9eSRHME$p1negSJ0oglRR44#sE1r}# zctZ+2<+uvxx)VCEXhNQ=11b(WDe=#-NruE9UZKVI-$vC02zI=t%toO0n2@i zN9q{zs|VwI1k4b;pYZ#_JDL+Ko1_Kh>v}!2#og6TisyEbw93NFR4&_+)9qHz8j`HdEUAtn4uipwm zk-CnKk`1syDP%GmY1Q|Z-`el4OTbTed{GN|Kr14M)QU92`%PYvV(A@nK|FSs#IBEm z8jM>4@x7G7*9;8~g!W})vpi(j=uXX2CmFHQP-#U~{)u3~M48I!CzLqm#ah!_R`Xfj zeDF=@$an6My*BN5ytt16%IT#Jee>j~CjZDFr~d{nmy=ImX_7t=6&A*IwWPV74$)5l zxLM%oE9Cz*b!+Xa0BW3?IUUlGc~A@_zAaldnJ=*_V6lTD*q$t8!`Ol-kxC!JxhT$J zYq9@;Yb1z3(E9#iNhLN=}Sh2t_HBd<*SaMt{2G zP|??6mNERH0AP>J3S@qIdzoX1?(Vi(DIqC~kI*5sw!Izr?*ZkLR?3=-uArJJbd3NQ z7QLkK&$5_$KM&IvY^JLJK)Q}8ytYmP8AZSrOYEVK*bwOmGL6?VgvhkLPro@cFTJOs zto|+`ra&twSY&ZYRwe_DK<;p!itAkbc}ceUF1+kBt}tfrO0|^nRzw?M%r~@sRDni1 z48+fc6w3!QdDJy9pX2`BqriAxR~LWrk4SEJy)gMtaae3dD{K%fSXibkff%0&e-Z{f|7_tc|ZxWhg(*6r$!0S~HY$PAK zNdbT&mfGeVQLaAWz6V(-&<2v&TSgd$_NR|x@&A1wN;Y|Pe9qI{d)iyF81+`f8dC6N zzs%$Q@@<76KYDm}ee?oTTDe0&?j{m=x1Kwoq`GYz5_s2i#zS^M6Km|K*+;?W*!L#Y zaG}YUqDuk9BCT#le%a^{l;O&~A=FUg{)hD+@2iRTiX6{9x6bVUs7x^{z62mR&J&y7 zy`#wAIo;#8$B8@qPLeL_E41zZfxt{EreEL!H(Ar=Q(OqgySe_@-t-W?nt*2!{r01v zl9UPKMn9oYC2h#o`#aN71lGc7+-}oN7Bmu}*LEHUJqmUtp`IjhTk`m3(D0n}`b~b` z%6!!7PAOGWbe#|!J?ArpPlLMLcH%V5Ds&SBJfW@Hw}h6Cf)o3Vj$`yT28tT; zF?jaq;1D?=e>bo|E!`+~e}RkUOPSfBsOZNDELRsO4=zSqS6}>!S&ePAh(ZH~agQ#U z`CQ~r4C)4MlU-blyZwT^NXaDfR9mKm-J(#u0!+%*{USmEt$7%G1RwIc{jhwS^)A?A z$MC^%U9FTw8v$>)V5KE5BI0_yk~}pa9LUtjmHOXKB6;aS;Iu>6b~J^;C?0_vVz&| z-}Dqa5T5?ZnYGiA#;AsMlO^#r32IV7PO|x9u;}m!{U`KG!^c>^wWQ<>5A)nOEv!oT z2*Pvw0y9Lv`g{i)dVWqkZS_U$>X)p9kR1YwX|3y@&*>5=`7{IABW;ym36M?vD*0yp z1W9r+bF?i!{YR1esvEgt-UBxdg+x`BZ=241b9k3Cz3q{- zp~10xUI5{i$TIz*TmMGm)S(Gs&eF5zXEVaQV`gxlbe76(-RsxHdYqP*pu*X93FzZ8 zA-@+hww4>w2cgeGKmvY4n*yV02#Dc}ito6NoU&kmdRs!vBvMWfoSx4fHz9P_?v zl1b1WA|_>4IrSiMd~&Mh2JQKGVXN2Uy7YhUKQFC5vErZnEcSFi)mn{mKe&w7(GB8J zr_XaLQQBQ7VDJ1Uf@#T_0)>@Q13)_t*$S+E?GBIl5832{qEnQ63u4}|I*pt9)>M@s zs)+!9uY}s^QVF<>v_~&0I;1u_MFL=RH{kGrQ+|C&0|S*3HR~Z@Jo#y}E+gLL(H|zJ zKslwR@5wzhcLE=}fNwS%MgqGPKMtwA1+|;SpRtYCPcCPXlU=J6*3XEQM=4S$^ncsd zJXbXUak>36f9}CkE}~?9XneeVxgJM70h53DJSi?txU&!c(N(OHgZ|lZeEkRe8i*x_ zf|_jkAc`vqswn&M@iLhD=Da#!pv1^cDorVO{rL&@9**)-o-oR4H5HvQ`yfwynQmFt zuj?ATI%2GMhB6Vwu-Cgd9AlHVkbs-C)*_mS8_9&eHv2j*f$)iph28n>)ETGRm(d#M$Tz`*mX% zvbe%A>bDeMzww5C-M@`+w++Y2gM-=%Kesysf9Y=vC(VS~hPVn`{a5Hdnc4u!-;s+7 zE;l(~hA3cNp;C>@ubMW?bmJWc3DoEIomZXzHh27fz6bLMj$iFW0yPON*B@G)YSum4 zCuJZcK7|?OriW!_GNW?8&IE*O&N7Hbohti$0*KLfhPkv^G9lme#(Qp6c@cijnchWb zPj(eVJw|D*H#-6&513Uobt4D{fBon*+6-6ZTCQP+c&BJ!@!z>qREPv%YPPm}`CnTAvh&{Sl1LSN$q{QHOZY|8v3|M14Su&oY5S$I6}c};BI^+;qi8vT2LE7^(w zEr*T>mMfn@h~5{bQ9hR5yMpV&Pz~pV0A+EbnI#`;Hz}wZ-52=^-55 zN7&owOR)fKXogV|P)+1R4!QpTJVCBvkoE__6BSz5M_=bdnkTcV&kFgz+tmbBYp@Y5 zGnUHtk>@|0WZnp@ZrE~&HmDAX{ns&xI8}=8Zp38A(m?jAr2va4ps3#*iKU{4OQ?9* zZQV5LNga=8Vav%n@hp#9OBM=_)ILY}&?Kw8I&%RFdpES?RA;mxLdTEv!5_fPR(%eg zO~4FYfIC1yjX$-pCO7tV|KwRMcxCiB~tCpI*<62nB6Q4Tfd*I#|IJe`!%GKLZo zJ9OL6)XpQ&*8;b+GG}eU!i!BNnN_dtt5(GIZO~CnPc{iHcGC`%rXUFX)>+*i8X8%D zJfQC#YZ={6RAVz1gl_g%L$sjk*xa$rlMm;%$>v_`|BjF5>yG$^e#@&EX+;Av@0~B@ zrF0Yp)E>x8%m^Y868|iDQD_tSY`A!{qI~W#`C$_keTUSmV*p(-c<1ue3R(hhsC?2y zVDB+g5w41w&oZr@DNS@u+im_dGqbJ(;lU_#3@O`J%9@6W6ZvVuvA)gAC&cD;@?Z%q z5`HgXFr(i@B4U<_16j~RBvYbXq9}H^t)l?@bS2&&mTH!P&E&8eZZ}B}$(RcN4fdo) zFn`>6GU&2qA?du;GcFrS!SHlCx~c0>99n_ zy|8PZiQJ+iLGjZo(8J+_1==J}F93TXZbBcJ4+&mU`+Ftl>79WxCwFy!oB2LBAQK9sJ->aCYb&?_-P0PFDk2l;wp` zetR7;dX}X+H5}c7IcV#s%k!DVQl;kCl@assn5OY=;azq%>MEqgmWRT+_kMHo@$ycJ z9H_8zo38uu7oB*`Eu!3Ss{t&XLP`iptM>~yzawXHL_a& zIphgBMO6t3H$4m3W1UOEBT{y88DJT9dX~Dy*$L=ctsydCFxt1;q2caT*Xh7`_SmMP zQ(Ni1t(o+SJ1?V{F6~`FFKbjIgYycjZ=525`!ztpd*c!=5Y1DKEFPkLwywMTuOPmj z8PsQ=-E_jC%`3)>yS5dF;c4Bd9N)({v=}`u7HnwF<)_8Q`#0nBglvL)9>H9hcy?#B z!ekfMm9x~4$T^yLrt+0Zv7cO^WFDqc#Z=?8KHb991dwT$Ga z-0Cv3s<87a`{qP9Wd}cBG3+6t!aDcugny3%f1_5*7l|AVmej@dN~QV77ciEm9g!s$ zvVJ_duY!DS?v^3WTpglTra@HyK{^YvdY~-j+d*TtyXBgge~x(mU9J=&dF^`z7inix zdlxsS#k@%K9SanPn0U~!*{b<|@GjMVRO`-|WIyt}GPwDG2Mdf}C3-9xjTP%yZ7%VU zJdBrduWHFVJX<@%CE&_fzi;lioJcOd_q-S@OenM1S@j|FjK)koWz?z}OJ3Q|=fNMx zB5U=BnXPDhz&YAe>&{mdqqE@6k~0zHjj+p{5{hiWu+=|FH=Yr|x^|B_&RgJIT=huJnZEM)X$7jjs#1;jDj~pP}17I17`~O6K zr|oc)jMXi4@L)X9Pe!@y55uO7UR>O>6{DJF#fTbDYVmXTCQ*~3>y_Zc5j5pQh?M*! z?EdjS!08}4!-g8tp8JC)FB|=24d-!D?sobYp)ezL&faek&_CBhmsMh)2KRteN2_Gk z7ufSEuL1+4_3higwMdsnCAo`F77uGwo7)L;53&Hn|Ab+K?Tp|-cfb~Sx3FR`J@2{Y zOiEdpT7mi&ZlPpBltlHw{UM?Fd95EL*BA4f#^m6$I%<;5@*KKJ34lOYx%f(?(@mqI z?M5!c!I~Nptuj4^eTVe#ps~qpAKC5U<$@qboCK+XlD8OFw?MZ8Krnor;g<&BL;yBA z{QO0c3@jjo&l$0NuQkItIz@IN>=#1y&t{xOi7HFL#pRfk-N+Q=RkR6ko zELL4ho)KazR(*V&W8PmgIsdoE2?y<_`k=%o`h{rL_c_-kLn^J$MXjg-AACtqNQLe? zZVm#eO{M>i**F42TkqSz883iA+sw3zns({`KV)!-jS)XfDCW8F;oK=K_UEwA!pJHH zc~34Zu>$U(*!OUv*nkDr@L`1i#k0&cMR&kkkgpyYv~lpw9*m?ZQoNH9E^D^OY6{RJ zc1S2`$)jZz=(_K;;c7>hzUgF-cY94F{7Fphk!P9gXm#ccEe zm&`NT0Jae_FMG{A!mOh6_(n{#Dm*}!$z7XuD$j-%0yZvtG z)ywKm<$1#eY{CebIt`0MsN?$Pqh>^|Tjo_I^iv}Etik&sQKGrP#KDfz@m~o}VWz(> z4Z_*&;)nEY>dhnmq%!DPxC>CR#+g0siib0oTzQk>LlbGVONl^~<;@zOVqr79G5CSy zU;}qz$7=03+OW9IjRXh&ile|w{dX+>0Z63h#474y2SZe8tcx1o8_yU?CyatMWE$I)(loY9)W3i{(%o;w90_ z!&nFL1vI~r!GfnVjIl*3$UA*)K!+^Abt>R5@q>mQ#fkMkoRN5@xwbxduy+SA?;Ga# z9?)1GzK1-m?D6j>h7}Y4o$sNgWys%TU}D5`(Q@G|5?jPWwZZ)@^tY}IiLwXnG0YL7<YP^cU?h|DT1wnyxO5ckj1h>drP{q052 z=V=g1TUQoZhxUSzDk#z>pz9Je2|P|>+-gd5cYPRBokl95uR)CAK@p*G-?Vw)NU@gmcPBwjB~UJwpQ(ix z&e&@H12=0meH_?2MxBh`zcxMmQ>IiY z*tTSxuqcVZzfd=y)3Tux2~#VECV{gODER0J?^(wqPN7g@O|Nt{KQtILWI z=?r_>T4f{BW2-W>GpVH3V-{fV7V-5g`nGv3H3|uL^SJ*8b6;$=&S~{ozf_!6uPr)sZdTTkqF9OKmQQ@~@VI#^9HiD_09@wPSB*0g= zkmBjQX?)&}I4p>MR{O6XkMGFWJ6wn8$IDk6`@|{+Y_p)~I)S*EdbY1iSjyPPrjlI_ zh59=D3uaUeIPzz``&_fxORH}AJh z%*<1l*bL{LL9gpQ*GwX*Qy=%b&caMa)-$vN)2>2lL_0B(whsdvha3o(e@g0iQ!f#U zB9_>z?PVo8`$FaP-6O>%6?w9m=Rp6cHf@@dK4DPe5QHgq3(P5e(t@YesoEP!fQc7N z*CnZ|4XMjVS^Fz!CI;SgB7?_(Fa-VC^f5Lnbr(F4{H&=+Fz^D$BlYu z0pkD@hdmtYqwJ`+Rt^bSISPf{Tf=Ij%f+G6HnZAyeNebD(NXcz zGbJ>N#@EMFHZt-f5-xtc({u{GN(K}{bU!ZJ8VNUN^*>7Za;g2!&Ch^1-P?oe)*zfz0ACUo^xq@`A zZ4!IlNYI{7Y#Ryw#(_x>r^B*rZ^{UA@4d6^#sBYfo?zx;{6UJ827EN~yn2$5dpQq@tu2Xk*85NnKGmdL9xMhO413RNFbCHiq9r4PM7>-YN7vqY5Y8(hVfnE*KpYmg z6|1*W0D1HnZK9C!|LG9hTL$@&rDXu#LS|{v19Bm!qHgFW8L4dQMXTd>*+#FP>~G|8 zz*`40a4Yv#uWTSjO9mo0BGm zQwIU>;4%g*a9`R>cEA?JJHiKBd2T((yhvf&NQGRcgF{sI!{F?<_=P1%0jlaLdgyr- zco0VkAwN4y_qgMx({KKYOt18djZ3Yu@Ui-4AkJl~TkJabd`?nYT7lmkC5(l|-1X~^ zGHD|kg-Ts1C#^3y~jsuQ=-y_AO7(Ki63(+}V z5!DA!n}#6KwvoyLgb`o9wYv*HW9%y`VF?NV?*?obg%}`C)az@Krl!o7J6u^Bk8*c+ ztoTGK7CU=eu)i$wIph0JzQQHX-XiQfT9OW|T&O4z*uyY8o0Pa&!D;7NA8Kh^>qcu7 zYGRI1U}qDblCB==MN+P?IM0&`kW&Nl#S6vYCCf-QMV$ZF>Z_r4+ zT3?JRB5&iM$6?W#kMh;d;i0+f%F~M*9eAT8-$1gTCM3Jz>a1;s#-e;y%wi0wl*K5f zE4w3{@tk1;GZy&8G%lE6`5nT4z27aieCyk3m&V~|wJ9|{k{_U%m**vQPzPjdahFer#f@c7O-{c-UEs}x zFf)B1adlb(rVbe$TwaCb+uqs@Z;gO!>mQ1CHmL`Vv5;w_XepF^3}2)+G7p~`nlRQC zFe!Z99*Y?u%(H6&aXG!_-vCeWR2_Hzg(Maz82=(PZ2n}<0`KeL0j4YgNEd|#)-r0g zdU6H{IXT6VNl7_JMg*!$ylGr%2~MwIF(HatS?loOycxvG(@wk3@wxnm9Gb%)C`J>W zgNzLQ^3<@xr2{!d&4AA*2S}P*ntG6c^yR_3RX~tEGX&8(phs3MY|8)1XC2(j$l~+o zAdLyKwS`wo*|L?l$+TCjrfI0em-acM+Sf;53$M;0ys7fufYE6sAmr5Wui#PWgtUj_ zxj&|nL6~D{o$HV92WNLzySjcSu3N5O?%h-3Z$ui}RFOF&ZgzOwA12l}Zx*H`OZ6Cx zt~)}UiBL_lCbyy)Aphx8dM>sBc?tk{lsOn+mO83SQ$z8Z1@loGe0_AlLbK?7n4GfwSh0Z%yukUD4KqIoM{umq7Jy^Je;lCzj z%tc3}b@fSq=lp(38Ae4VuEvR({QmLH8zjm-movNB$Eup>)HT^Jf}bx?&V=~ho*@%4 z;9mc*f8-N`>KVqI@7MrPF~HWoOepfQg9{Z}hN_`K^xwjfF(r+SfmGOPs`{$bv9%S= zj^2z0<@)BuqEcs`BIJL)r(hy{)w|NIn%LN^@abUlVr=!SWmzP>iDwfmD1YA5nj!pc zS?vFz=R!`{&<`{adLcx}l$?-11h9^5XE#a*YFporB*DPYwlb!ac%2)6T1#5?cixyT z!iZic;cVOo=G^y}$hP5_NjFDatq(eQa2gerQ=Me~8S67uQ4h7D^N59pnc0%FTQ4~d zP9DFu>S<`MP{i(`{km{ek-K*Kso~SzMXP%$U5oGHK^g-@eza`VeV2R=B;wv{!K=Ftt* zcn#YKmDx+sBAZ_LXTpAP#98NPsYTG4Z#S2qVAS|(r zY28l-exPu5SuPGH|EOBhHV`RL`jrYnv zW;bIQa`R4lyO=8rP5h2TYWMw&xrvkm_J0fXwqb6}sTccPfy#|ek>6Y#Icou8fn0T7 z&3iAPYZN;8^EH}WCuRKf{Wk@UX*K98DO+E5Dq-11_^clzrmMn2e4P- zONx3r1(-;Gc~lGG_;>=;WND4ODY^B!qoLqoC+{)7mC|o=?@cIDHwLPPg?{9T{%iV` z{-;K1Jo5Uv(khg$5wG=uyEzm4)Jxy6jCnTRfa9+5Wuk&z$ z$nIy5ijKjno$`aJayve^lbLsX4|1w{^5-cY6c_ImpgdXq8j3CWKz?V99a zBV~S>>il4`bRHG%Zx|!dN6F_w0-=+MJ-gl4MDJel#1MiIcukM@4&dhQ9)6r~7sqfn~`wykdiX(og^x zjKA_x%0ifoewos)>~!>rSSnTr0o~O-djFQk@pg++A%L^EOxoExu~3zT%R{&g+hFw( zVY$sWbjrs-b?ydXYl5uiv?q_>c;i)CR20WUGY?b-pf%PK+YtGx;-L_;AwM_oyoFs8 zMiNV6(q~=a6Z?^!o^W|7RMxMFx|oyf9nw`FV-xPD!oSADJIl_$*xqWuONNI*c&X^4 zEA)&19YJ)hrz3$`gb6Rksu6%p7LeVsC-M=@@ZUD@!ZSfz5D;mjG)z>eo)+}U_wjR7 zG^WWiF(NKE?~vf(c<)b__s&anF;5e{+o0!|*Cp*L2DJEp8gYr(!vee!iAnZVwTw_s zGVg0#I>>XlxvBmhAZaR4CX6)p_F{Ta=hxxSG@L{ZqezfYbT0`Yc|{6-O2q|xI*Dq( zeP_D05fwhnUi?U~ehj7MHzAJDPAk{uycI$=;r`T>9&xY3(;)PAz(+CEPzJ$Gi99$} z9ARHIhX0^^{_@D8@Dum?hAMat5phd(ed_!?Hm$zgv*Ik8gaqrax9TCyj{QXv37XE(4N118Lk{BvnOxT!4%p1-@2 zuM%&z{i|sHX*w@Inncumb0OV^e=8p1<|I%0w*gz8K3mH8b*0e?6@8d9l{sf-wyd@H8nDgszM>8LpX4d=j?Q#4 zux(={FB>t<-H+_-EVO$z@%8GMgb`gE5w)hi`~d)gjDYzOyoskhJc&ju_5izK`5-h4A5GM;<~K}l&%dhKP9 zEaKtPH4WvBwiXR!O+W_ZIYkG7aQ>dKCnUNj4KnS5SeQTqq7N5CUevHzU4O%jxIg3o zCcaOzqfZ006`0^kRL+Uy8U$?GQ=5zBstMRKP~R!t!_PGO^yrDW1m&#U4(Jg6M~n>T zQ~z>^#r=_k0$%0xJ1zDfC@T|;j-X&0R82m^XLK1t9IXV?V^}6%$4biSxT!6zgs)JR^vC_q{2DY<8Y*< z2h*pCY-bZjxG4HH<%2lVSAslE2qSgo!AFLwwCSxF_t`b5=C1#>@}K)KG<$?sASILb zopIHb$qD|jS4OYnu3IKWTU z-7k{m8Up$ZOAO1&*pY~o_E;%MNDj-(YxxdAYHn3j;csDvONzzxd#u#JjzdH8g3C$( zLb`;IVK2Z#l;QHcuW3u6+5@4KNJ-u zkEdFKC71}8@`J(h4*v~ho=O$#f8r3L9q?__#k2;-?tf0~)mTFCa(IRQqW zv+eV4z+(kQ{auI36OYQ5kFfn?#}jR)>cW_5?Gxg43+n6{AvR?$DMLS%E_t-ugDViz z5-hYiWg9VB(!4qIfFn7U<_}F%?pDfl1R3C-2yiyaThU+CnG_vT2-x*HMg}f#;~@RN zCd>&4QE4gxa+%{6!>JqK7RBiDo^B8Go@cTU5!ON%8T`sD{dC%b<@)$tSh0TgkDNbT zm7wVPJ}QWO*qhLXojp$Mnx(H!`1;~B_3&Wb{o`2=FR%(-SQgTa1O=}LgxyrI)B+;Q z$Jf{5yP3X|?k~HE+`L&%Jc-<2+~<{Spu~L#9r$+Bw{aZff2{vszX2t3nCyW@gKTQb72cIbGn$&RGP58SZ zA|02YIorycpYOx7y~1c+PIB}#Yh@H*eGU36Kk@3e?#46?(OiWDv$MlD30$yKU3>ydTy_J=fH!rvQsc302u3$M^GU^^- z<|`~qOM0cyK$2)(g5`gEW5~c+HVOaem=t!{EMW+cYRxF){`ob;j}f_TZXQKlZic4? zryVaiEvt+V7P~wmAlw=yc@3*&1in++USmh~wMAa$-(R=Ew?hGINgzT`TLxrc?ALBF zK;B6SA;SI| zJXbOP)qsvFZa%40P+Nwrx|%2lB=z5|GI{LdURGUH{4Sq}xDmSMYA%TZgekx41|=pX zeL%M6AMk&9TdQD)1u`g(aQ}eS%cTPM?}Bj1{?$G}473YB)2DC0{P9@7|+7IfJL^XB`|3JQS+ z7q0!@NN4F`i5{w=m_591r32fO_aeT10$tCY{rkYz1!4DZCs=pGWpzO3t z6h80NuwE154(7K}*X3pHA#i1GE>u`pSYTiv%9X=g#{IGipz&=3HX@+mpAYKa4+AB} z{vIX+uS_j4u*=RB?&!!HBJfnRf0y%u6sv3~zW3UA&5=Eyk5(+1L}WJUV(_Hfz%gvN z7&H4LBn5c7-|Ka^d^lh^V!bj#G(Iao46@9Jb&*f|_1q~tAylBbd6*7(OVZ^_`}7NlNF z%suvk$+rMDtgimWqzOiQK{wmytA_d3B{)4>CgiWMI5;?&CgbTo7}W$<%n-~wJQO`R zMAi*z!|r>7(q8~I=dXtt10{;f`qP4e7v55!2L=lzG|QZj%zar6SiSiB`pR)D9b@&V zlt8+g0+Pbmck^EreG;Wj`pC$#vM!Ggz$Fwk2u{ zD;uS-4nfMCan1sp8ZjAVX?l>VmTUM?7cU`7Xz39G2eeOdw`5*1fc4K$e6R*eA@A^t zZ!*LC-@4Z`g7?lN6u#!3Q@ztugDs5|C1OOAHj(;wkH0xHkFA^W!Dx@Y!}pWEmB*4k zw@&c6@b6kqZLUj^pDVtlxWczo+=L=PeSW)8>9h2!EGmK(5fSl0DA#JnqLfMfuAqSS z)7;!|9a6h05(IJy24BFzW(EAOnFeA_jO-}Np8{ZS0q@G7g&8F~uE%xTv4zuIPACCJ4>L?3fokUc0)}>GYLIXQ%;F@3<&~1$m&7h#6NNITx zRO8cpoXs$Yu2^*cI0KyymPi8AD?@(%r#hceAP*a%ppbTlvb>MfpTOI!_mJodpeqx` zEbAZMouc}FE;(dADRo2n z%BobN_oF**Yid354hk1HgDx(C+pxC7n|^W>9Jk_Sa=S&$jV9xjloq~IM8ntPy=<1# z(m}}32&ic%X zdik8lNA=hOg4RT}bgXg@SI}E4PJ)8oOsu#2TP>SrLxm+q8ZCRXN-*8m0XC}?iVyd@ zA#fa~r+p`!_Ds%a9w&`E0oVh-m-2TXoHq4GGPpmRTQ>kuJEW|oX|*a*;P=P7Q;m*w zuf;~PGM=?NeI9FHQx_MEaYFsE!^CVF{CnZCV6XQ}myk00r7!MmUJv~up^EEXaL-P( zf*e&}veVJ2`y*OHdl5rMO|rC5`oPv-4sX+FM{IOk6@ z-pggx2smN+*aMDAp;?tL8*>DqDV``ye$s^npCe2LwFAF?_3s?vjHDvhpXOV7+;PnvSO41u$7Gpi^{(jo?5*K?^Z0>#N?Lbzk;Z41RpN?t&K+H<;Pf# z4)A7YW>~u?1$qHlmJU2JQ3&bRa6NxIsEXpMAd%C)C8!V!C!B^1{9E?@8|Y!XRXcM) z8v7W@bj$3Irixd3!u0sesg$%bDnSKpU#2?tMQONDah*T&J6=m^cxO>w4WsQ9k7fh@ z?`rHI#swEB?z)pcL@u^&PwdUdhL6x$&Q)G(P*O>CDEljRhXd%gna@Hi!Bh|#3(BIs zg$WbdJvu%l_;n>E_F3Sv0Dj7Wf6K|X8KXpLu4LM$w6tL+vn?{(HBZ%aV8~Y_y~BKsI!U?=om_ftcqC!q4Mwi zJ{}I8*`7Z+%a!`egoZQ0+vqgS6lm?*5{KL>Y3D(hyp)~6Z9QReWEw^{j1zLcLi58o zmt)NbJi2IiY5`w{x}fIoExU_Pj~a4Z|HGd@B1r*P*0m8Z-67ey;z)l~37fjYV~u~< zSZ?#R833lV%`?c0wuhMvVl6P6GL32RhvO<5Z~NH8XtVBiKL+DTt&~=}E9rP#+|#QS z=ZB$BxAg^hzu^e7X$x4$z#idKqa2?=VXuqX5|e>%#X1Hn^7U7v)k$P_cN>K@b zvQO7c27A;5tp`3n=Tu;R(R!BPcN(}XX(=8VcbKgf=Pxrp|ER)?zf|F5*b*B#L`TF2 z%$N$k;Pihj_KSpQGP$Uz&1jyV@4LNPyrL)=Ys*LZKKEngc<;;FbX|U3jlR;Yz0t7X zvByrox7L6CJq#GQ>)GOOkN8#(x+tXvXz=49j)IwIu=6&v3TQ@d?)3XEy2V5&km@nJ zFwjd0tMEnU*$tZgd8v!9ZJuX7tT-@sjuElwUFG7O^_v*n9hqOi-}e4Ntf}0p>5rp(7|2c1WgHuqUDK}S%`fgveuuCFJa`V z#^fI7cqQ?Zvu!UU0Yj8F<6ogcbR2N$3N!`~ae+~MKgMtP?Bak5UIbA_*v$%V&_jj$ zs|85yhyM^>Q4JLtaGN*LPC|V(=Dt)j zW4brX^uEquXr@=8nUv+oj|xL@`O4c1+a5z#edz>f2;#&>6g-+C+_9I z6hWq6oB_wBl!CY(%O0=s}%JJ)Pt6isb^;AvYK9SPh>}W0+r`cV|2rmTUEOY5DMuo z`}`U9I;vhc5%xxNJcWRBk9aEM91*o5Xw5jJr35XAS>L|9%74HLd&67hdxgsIn#A<& zm-3f)!6elA7><;TlopAhrp*-y@4q&&%tEweJFZ)w5`G(cT_FKD&DpkHqXZ;)2xg+9 z(ftFZ_N74w-(~yi4+iDvzMuie;k;f^ySyilAuW4wP4Y%PqMJn*sNcT3D-)M~v+qp; z=2VV9CY82f%IO^YI%bUfK)TWN5S+X@F|n$uI2hfT%0I{bw}_<1B!I~TA@kg2+=KzD zH$OtYEU`Yl*xh7s;H8xJz#X0(@gUyYL(ViiLs1K>#lp65V8?H z55|`My)b1)VIc+xOQ7xe@T%M6zTQ!7YjSZze!;rM)#up;#pL1Q7_`9ola}Cs=hk?v zlWE#CYqzG_960%5BOrMRZQ%?OD6*N8>ddK>k}!OP9k0n`b442C&Yw(W{@2}AL;tV4 z>(*1PJv=1zQDY7K3x7WAb^};)r!%MgX16=vjnN0L-mQ9)hckc^V;ik`f;R=DM< zWJA~mMS#zWc$DQz*sRHy#f36Vu*p{qB7+#3>&$$@F;WMVwYOn|$ zk)Y*^5*u9ALqRHdcR+FAA5XD%h6c1!mRNDQ2Atk!4-xIinfnTwIAc$PxU7V_?@KZKM46b zH!{RI(o$bMKf?Is3pEm)7SDP2(a}-yQM$I)dGT4fe$VCivCz}uO3r;$6TW$susofN z(Vc}=(65^va*C+vqyQN}c&BNv89>iCfsNICE;IrEkM3F&;3_73;<|V3A!z;kTrkbe zyC~%t?$E+g6)6jnFq)$q6EA<7boN6sj-3_LP1yUM&gvd&T28m|x9E&iDLWDRAFkXQ z)}7)!)7tOg-4A|p$^*p}ZTfSIRF~7Gsh_&tm^5eptn57~1N2OQ;Qj4rHF856XJTmTDLytmOhiM*RvWlGbV0`@VYlnxL4kltZkQh=LQj(s9gS8C!<+XA9Xn`J zSv))qA4D_6kPBkK6Ug~s83f}?67nNT7MKk8$+#qFD-|KHW#k2|O1o`QQ$SujYC&el zV8(42`_ViYu9t5>!^bVyjzug!tf4fd4(w1xEIz0nJ6yHV^Hkjhk{J3U!K;+6xr2W# z5`$S&mw037ibNKZu0gRSbwC5x%b6^pB9DtnE{qX!9LGg9;PQpQ_QGCux{ z=tY;OEY5H(f3!WS;ng<(5O}}c22wL4|56gEIe*H&4JXOGm=r6MIaj=b*3SK+25d=; z9BJABu&o6fIxCTQ0e>QA1rMQ*`hq9e>m#+c5;p5D)bzddK&B&{q2onGrHi$(!Anf% zMAC(UH14Qidc^nG=Hr z7dXz55mN4vYE+yz6u=&}FP)uO)xY`-%BkBI7_Z7w)*@(+31lRsyv0EY3yt9*F zG2nD`3y2iAF1+Dj>>t&aouC^+%v&J1G79}10FVAQ`paOgF@a%rn+5WUsoTABQLuJ) zYmPgxn${#J6koW?ii>*=DyyC)I1=b)r%RLqveD>{yA>y>C6PS3tQn6)c-mZ{hv@Ez zNx^L(K)t_64KJ;~Z`B|O(5(zql6Q@EjYN6c$F`@U5P#v4`jVyjt_Eh@mvHa1!WkIz z{j}(1!x%t+lArqnKuEz`aL>@ZDkw(&7-YWCQqP~_?9p?1@KG<8JE^%5ei;ctH(}79X%`75iDTb)q8UOc?A zj8AmVLgL=5xOx2#Zzbf-KRc{Wu(&JusQvQ)TU$hAV0J$gqAFk#!3`oTmo>a`c<>VFxcZ8Fp~-_Npxv8MJ4Gz#@b{4J#1WkVWd9KRV03M@@ED&gLK?OR3`D~HrmhT^&UuHf zpTjR0Q0EtQ?f^>*4u=E`A-g8X1e<>Zu@?$3?@Sp?uJROF`8>8n`2`OWQppRk~mR57WI5}RkK;YFWZsOv~%x2_0ZDyrlBF^5b{Do zWjNk&@P7Z!9yg|D%!)5nnICO_%XJcZPoi_5{qD&_wc0wjO7s4CH!J&UyTLQv^ZfCa z(d=yC{O)S?(5j-{vwS^m&x`8t9Q9o=3Pcr<)`;tZ-rVooS{*z@jcgnMUo#vw`1Q@% zy$7=dF5uzKJ)!lT+dRGKZlJcDnD=BPEY<-D4wnZbEl^g$pZc#k|<3hae&o`rdw7H-Bx+qln+ z<&cu40(|hptU6`ERT4)cQuf&xf-&j%#i;KnRGLvtZnLlV;x^ zI9pD7v+;9poLA;|ukHDVOgfpHdbY`Ib-^{4Q}p=M;2hRtJo~0`pyqzp&)9Wh7J5av zV;E%P-bN*YK20`Ri+=nv3RLafUJ|lXFG#`6)Sirq;yDvRAT`=L_Sf=znP)~GCm;d$ z?_Vro5<_l-T3eJz42O;B zyG`!IV5GQ3@=gEKf4R5e8w#D(SFy5p=OIdEtBK@Acd9zU;-D27+PTrJ)?-{2O6^Y> zBgvSN((P*J)7NUqccS0Uo_Te6S4E~bj6-QI;jgIG5D6+s{6_r8sBaR=C|$2)HE#!4 z6=?Y-jnmqD?2R?%L9=T~MW>pt5TSm$lrxws`v$I-L5WV0d=-ct?b&duMmVJJOX2odh#Gvy11H-- z96Tz~FGw{uXBJrHOA^I}Vn=b9wJ)db2RxQ^&q&sJ%j-Isx4&>tkcSE+09$@^G>N<> zz|UjkdRc)To&_AW?)abSdld9A5zlzMVxAe)x&sY7uq9)?|OZJMlet z4?CnZ`xz8COz%HvH^d9v<+LX4g{D|nmu}bVv4q! zi}nu=v=Nd$KcG8(oRikQ$UHSXbab%1q91?TWq8>o9={Z+Q8@`mt2Rb$Ac)O_s&?pj zc6hn_uc)Zt;i;E_QOxK|;lT~mdyw3C|&?dOcl{Pb#9 zGWK^({LUlL8%X;5bK~k&RiB2DM<|vrHn!!I^Gx0^h)yK!w!Kg7UT;u-(ohWzqxK8V zb#&ilonMWnPmj3Wv+QXNi_kEgL|FY;&QU-#enWKIZ!1(&^748;BzOeKkJ>;U^zpDiq>t70&P)8}@%-CO-ZGJ# zzTynE2G;QeZ0sSfh|5)X@hy%CgQ>{;1}kq=)I0E$A}IqjK9eM;=@>aw*K5zES3BAB z_)N>ei)+tDZl#y~)NRIgLu@7V0VI-0=6uho!X{I_jRqS72i7?C2hkksbecNsQ39V@ z>q8M?=v3orjc4B^F~lF45*hbQV#vKF2CU0iexjc{5cb|i3L?0mR**vNGR~Iz0|emo@=>}jHoiouN*97mu-DhmpP8udnCq$Ho$JmE7K7k% zyum0#L|t+~Ft%b%EYgSf)Q?uhf4AwsDV~}G=$#p0bV*c`U{_ubP~D}eN&YU7c|4;Y zn@<{63ujl0whiSUnEWFf~a>-*NDCAN-Vu58p zu6BP_c}(ZQqpSGq3y&|Uyl?qd6xdPc{X&0Dp33e1!Ukg)ZRde@-u4FT>yKnIkn1QE zyP~^5oKo{m9J8wc{j$5yP!QWa_RMlU&+?url!yx~Kb?T~15&VFILB%^n=tz!ihy`7 z?f3L}cK67v5$QwIGgtK~(TNl3SN3vroTSjPpQ!vk794OdiM$>-f}-KM_RSHvbz7{5 zu%92VlB^z%dYoIf&|2Rn{8?Zg9|X-Q&fzJ$Oo+7jQ$?~LR+XZ>g81IwC@oFSNXz6Z zLY0&8He_{OKK@YmUvnRJnUZ|Zw=J;7;WI=*XGw$Dz>$mk$vM`S%yW3~h^iZ&JqC$a?Y zFUm6x3AMvYd4%CYFo31+8h!abIVY>%LM9Rw!K;Y_#u+q9D)5=9!w*t~KnJ{<#;xg$ zVfg|8-(-e74Mh2RWOFAS7A%~GQfknhZlr|MVvn#+gA-D|%NJDgsbo+_eoHuKO`_kxK@BNqlL@xF z)A@F;4l_kc*i|Wt3^8AiUn1?50cl|Hc<&dl(jCfv6rw1RM)}l)D@5HCk56h|@m&Tz zJB45Ne2|}eTO(DOt#OClQfQ5Ow6OOde|u(+HFMg1OI0Wn7k^&$^k7r~ zT-#rBcQL4OImD3&tC@QX@V4a6x@eq6#_eppHNz^Ts>J+nU9mBh;z7efUBm;`}VOJpi z8r>NoE%{?AcXN$XxFIf&86?`@2}mDyF`vgyB+eb7{o!qo8{$7<8qHEXkfcnIT@`K3 z9~{!otdhbm1D7q%nyk`ny0c^XBTYao^}a^H!d!JqE$;JV*j19yWMy(#HDzVKR8^UD zY0P2C_6`bx@gzs`u9~0zq6I4255;&|!I@6Os*sjbwH>tp;}nJPdrlg4cK5U<+>+tg z+w!l9yJmt&IZF4MbsD=U!pvho+|LH~J?QLKB+1vfTc%!NL=x(=>FS#HlL8agKiQV! zB63x&Jui|ODWnc#+0xUv{@A_$p5A@cyzy!^K*ZnpvdY}k$Pmy~R8;ejPIc*==Z^E! z3O8Worhm^tU+F9~aSI}4pssY`OwAYCMG zeJze*471gKTC;(m+$I+3MlLO*A{GK02AW5`fj!+L~e1RH0pD-U_?P zJ6BRz`0^wNW@L#Oh?L{GgDZ~kEuM*I?S1WMCMk>e2Nh--(3xVbalN>wVm!UVFt#ZgZ-r|Oux*TzRn(= z6WiT6!9IEJ_!?ouJ#@2^UhiL;5 z#^}CpyYPUhd{<*-+*AO#i@+TWERy}TZ?QcwNrWO+daStWsHUYz)VyvIS2+U%sAkvt zO!GHzZnZl*!5pX==}Er?l2$jgJH=fEFp@Y)bS}L`R9LwRG{nq+jhym3djT=&=mJS? zdxu@mpCjIwUsLFEC)9hD|GsV|um2$EVNDIE(;*rvjOZ!6l`=gyY%&^XxYqQ1nOn_o zR1a7sC0P3%ZZqN#7&>wXr}yhiOQsSg2s4fnB2=LlKM4}^Lahg5{3IyvrvSJ2$&u4< zve!v(*hD|PFOmQI4qwbuqhc1LydBsGoI+3x`Nt14fX(g1qMl_z4gr8(dSvIv-KeZWlCb{)TM(Sz zA||f#qcXtzr<@M8Jmd!8OEj2~Lj#~!_3siM$R(N~VFTF;B#?1x5kamrd}#EWICM~u zm;bF&q71nuE@%4C3l)Tuk|L|-6_pv8SZxOc%Yy*#*?+xW%+M!yK$uEbFSNiNN<0lO zxIMKo)LVLU9}CpHTE0^;X{rQymA$b+=QXii{S4qW6M(M~a#o8`>D^yO>2XB^fM0Df z$|X~VY!@NQ?S7)E-0tP`$$_hU}##c^E%z{kuZ&#M39g z3GReTsIgx1>X~<};a9;06g1!SGP(cT-;`i@)iS*USN>#c&H?w7yDB!Gc;{y%w5!WV zQkM6TELMGl>v%T(?#q}JZ;~crY-)vjo0BQ!bDn{3S=8tmtAt6-rMULavOvXmUVY8o zKJR|RbB(?>e#l2PYE*sFk@m^oMbbKRg97sgNoh(3=p-^%JJCH(?2&v2N-jR%p*Z1k zM+vK1U0emzwY2@@mKMUd=^D>ie^G|pEcnN#1+6Fo*0168h%<&;{#dais+{WD%Iz4S zgA`rK#1B8@8ul5Kr00*FQi+xf?mncGn-*{H_)S<1kbN7?h%L1kLc}|N(7Mx{V*V&5 z0iWGts0TVYd?ZN@*}}*X7+ohP7B3zQF{N~*rI4x&&8VwCc@NlF=-EuV6>W1XG)hf0iFjzf z?R}+ESqblg;EBV`;fA1*Mw_s9dd+@*Y|9hkpswTZJyq`yBOWd z#6yYlVnO1b9F9K)*xccv`s3+ssewbqm|O|HF8!K)MD9!jM-kH^8^>>2gQ zo?giAi17!@KY1>=90Aw@B*ncei+%_%=r96 z)L-WLSK0GZrP;7XXd)*#`v}%A&A2-aWJs{iK`x*O2l0nvbd8)?Y*l3F znS=PgZi$wTk1Dpf9DHo8SkGJy%3lMM}gEXrok7O|F(gL z*C9v^i!FLq)n{Ndf~4R}_}10Oli7Q_5(1gO6bp?NQN*VhV8#hg6q_yTvaI&!ZgCZ& zRWYaXz~KmBJ0o;jLj#{F10=}MTQi4Ex!n*-q z{22KeBEpvMtLZ8}hAfBcgz|64u=bb^1x=X_GA`RtsV2IEsXv9}#E3Dv#%lEOAJ7^6 z8=_2`EMOfCw6MVhmo;nS+l}A1jeRO8RElhCR@C4(7H6cht#Y9~M|<8E7g)1{XQ8xX zZL-_a3DuiMvGb%`mwJPZEyDX@xqVk{#+GE;0}ys2y6vzg3b4e;)!ccCb1YqDjXaje z{#xB=qoxpab2ySMCzg&8CV**tgM!48L?jxS7BHG4@Il8{`V4 z6<-}HCpB2`)~BWPtkCNh{4rsNL`2*@SrfD9Zc42u{3CS^r#v;W=PhQN!^JKB0a|M{ z&J=ccp~#kigVSFtKqbn!Z9RnCExTe2>#%M2ASvjCmnX%g6;X0gS%xreWO90Y(cS~D zKDwrOdY#{;+IcE}_ya+9=I|{Qm?9)+tW8;u<*==06j{WiW6NRNPObM!E38p-ztW(7 z(N>w03I4H?qt~{=LAO*qhkdj3DzIs0@yzRBl!O>rWm{{P>NvC^wschA+q(Z)8jDB2 zKuaY?4J#~7CPH~Gi;KgOB1(JjxKICv2svkxBwi~KakgKSfIqD>R3mkL&BJP+VIFt% z?kFLYNA0Lw5ycVnxMam?ghJzVSd5v27RDi)R@TulZu5^UdXRUXvL@3wmXdfH=) z(Z9p(%^>d`l7kkpz^+bg%_n1_!YyNq5W3aUNcyT6{IWJ=D^#Xpe(J22-J%p7*V~xc zvE2G=>j65qpPB268cNqvZS-@Cnu4&IFn!1;E2e9e!Uy*huPYYtKZ^qWa^-h1k6TRb zctSXr_9|}m;>j@Yi*m#m;?MuMB+_QO1ir^>?+-X_wx{oYltX;?t!x}>tg?lrsbBj} zx>KTZ1J+ba!-TR}r-OO{lsuJ^t5lG?oSO0xH2fwhLybYf5;da6cMI*N6b_kHqGP`Y zSz{WJR~ADwVomUbmzp5B3D05a$x@V;hM=wFR}2WYhNxl1xZUhze3@qmIU?+^%Fc5X z#z0oWXk|f$>Lh95ms!2lc7WCE%Vf@q1*fZk6^Cf1 ziyKX~g%IR*%MlYuFGn#{sL`9$OD%Mmu=aV|Gd(>0jxMU>JbdG9!e{2E82XX+NSVA< znqZLySMyWWwvCeOg83>$_LDQRE(g@q>&w+^Ym};XG79`&4 z`NO*%wC*=TdoC)WDoRyJo&~?y#Z(ax zQrMpN`<^%BiOokg4SH@7uYr97XSA4PX_ahZN`^JEoDID7mmE^cYeG;YU92%-{(gJg z-p?cr+7zmB3H_N3X zRz)*0!_GwOMF-BHn+|D@$Gz|L`Gzs+>Az(%hK961CDlFS;hIHhwr&X4QX~yBcn*-P zn_gL!7O02trOMDlas^EK9F(T19aDbJpN);ce~dc8HeBnhJ!m3U|dhZ?)cY+l57ZONp^`8`d7!0s)^G4Ty)NC4~ zT1BbuJbo%ws|!VR_Z;{(wA_s)Wn_DzR+V}>f5%)dK#JddZ^KEhX)l_??Jms*ssh= z_If%5qswx+?(%v4Jsn%eBWgH-A%yrF+rRYlh!~P)y~%llOv$!3FxFo8HEN$<;JIoE zdpkYM;Gj>Q_CE0)L-xS+)79kXZjJ={y78cmj(lZW4US(bbo){2>RmqUIyb2RG6&e(+IN)~C!tDvtAZ@KI&`=fg);bl0@T#0rX%rsnWlKV^{>TQ|G6|Y&) z0r0myCz>6R9~9L{@sg|1^xI@TWpP5Xo0Uw@? znRH8$G2`l%o(>VJMHK;?*Y_x0%oQkj2o&=79&AoeFET(@+<}l$Lz@`&p2lLvI342+ z_zZjM^{+dU5wm(<4Bx5qLzjgG@&Z~eMr)t8B|XS`s-NeF1JOUKqIjjs6Y}NTpHDvQ z4x*0cq12hEHX%89Ihai)r2$ffg@T+%345;OnR&l&@BbV*2qE`#Uu&IfT}kX&#bCAytQxT0TzEZ9q?`1@ ze5P7o$)r67P#pAk8zim9ia=BRpf9)*2w>-cL1LN#wnrkt?hm0V%Zt289E;K0i2?6rb(LTlxfug&9l(BZ|3QLpS8vX1@<}-_wVquf z^sHX*0;h^9Cf9nim%%C3dA68V#*BGCnWKJ)qE-o)e6Tm&7$~VA7TD*JPN&ugBHKB> zi2nj*On(4iWAFAhCi$mE>9dk?C%VP)r?N;n1}M-Qc)MD6)vLiJZu0C(iFy3#CniF6 zroGv{+?^d49(M1RtuqHk%w5K=ZkEnKClWP%BCC}sE#~)Wr_HUR@5c7z^B4AWAXOyC zHA2)WZKBNp7Zb+L7VF8HCr5=qm9&BnVcsNB2)bYvEbn#2Q9_6{Gn)-qW&F4hdaZMX z`woUl2h7~Z$W0`SSdlUHeYe^w9PUK*oqpscs>o^*w=|Hom#b39^@XEJ-*jAvbedx| z$N>i7_paRk$ocGX0zcGz!>MV)svm474HC2AjZ`yduQ9nJdh*@nHTJtC4|Z%0R|&P8 ze`IQ%`~D2nDjI1=2j(nn6#_Em*z#;v?#y!*QRQ$5F}!GvNBB~Di$9T+axBxXePmpK zFYa}O=%T%9U5+7Lcoummo@F;tRrXNNCd*x;w_J;20Mr!Vsiu@9GSn#wm<~KL?+GzUQ(-~5vc8D&$K~Q!>_9}D)RRZcwkl4B zS)y#9Ft$g8KZu>ymML5il6ZuN#;p^+X~;(T6Kj?_$mwir9bD(vS!z+f#?)+y|K@BvvcHakkQk5;M znxB3QG9b)6sp3MQb)O{GYWsY$sJ_g`6{{6&z@6s_O!_e;_|T{Y;Ag@U zs7+hP>qIM^k)1WK%n(g6W6M7JD*APr%aK94Uu7z*7pXQzxH<(FO-qZrb>|?Dp|<-( zY;pp{8)Y;5=Xl=d8{nW4<8uJi$C`c+I|Ff_FS6C?lg#ZlEQS$;Yqh-m;VHT1Gl-<+ z!V*T5;crATcpf%`i`bgI1^gqP@+W zAK7tCc(?xBa>~VPMNVuL_wQ~^=|V^t{S_^W3CRb&i~XV@gSMH5NCGO~D&clQqQ@H4 zDHkdJ=4cVRz4(!3nZt#*$wTYvZ6qSc@!`2qnmEezE>j#ypnK;%PjR}2SwvqS=1W~>i!g@HEKD$+7e5%+5^)PBpp7MtFOowyl8BhPl`ySVXhmEnjkbhIT(fu-^4O+v26^`Smm3>%Ej0 zO%Z8Nd#{F@V!zc4$t>>~w@%!%(5sM2XP|N*dY4(Gj`#XO!VayQ$)^qlxXG0*y4Jz0 zt${MwUyxS?(>;cJlMb)oC|eo8*jTP2goF6zP|n+Jr$0S`DK+ayna$MSTMzUAA03>> zhbP;fY+vr(euk;@k=aOM;p{4IzPHBjdQv<1to_O;GEaTaZc8Ht;uxi>QtNW+tqzja z%7Ekd4X?M_wz5e0ya9N!*yf|%nC-c|PV)jJ=kKGQ+NN}3?Of7rs`Ssar<&J)96Vd?pC5Dy zn{6CuuM6IKy5nu9;0|-fD{?|u;TO-Tn68DQN0Qys<(#KWgwtiCkMUV+m&m}*RvLT@ z-zRTdR@qJ9rawN8wXQUamyQ+02iQIfxDGHby4tCVBo$6Ce1$Ry5tj^kIzDrK#}x+Z zkF;6|q8%QBFzGOdt4wUh9G);;ei(cycC)?Dip_?{U=2uke4v7S!yIU<3O{07}osJTNbq6MF>UtAZ?B^W1j1dRSUnb*^_pdHV?bjSUEh|?3BE){3FuAX`|v8 z#?8o4nV#Us)&~{qz9`DElAtB|A%0vhZ+h}#liyS!OX@)vB}la<521F?jD+ZemNxMR zwkujYH8w&zo~-yBj5UPavaqzZlNwh54u#i-bZtt3djbuLJxp(|UTY^g9yHTVf)RnZ zTCd`YYn)gNRLj<^uBpD_Js*cWL#4!JHgX>J4#1UoM-`~MR~({dJRDI&eY(&P@hgMB zW_!m?Aro9CipeJ_#NYw4oGKCxge984c^%6qp3P0|c*bSY^%bOUGy66GF67(?+&R$AAMuMHQY#H;l7r6Whn9}bO1hDC@ zBNF`2ie4YI#Qxn&MQRFabF-8-TyDwAy1S~e?svyF3G24`^?r0N=eiXmlFl}Br7g^X zp__9NhD03i?5oxEDLP?qR>1;{L~Zm*5h0gVei0>S^;w3hEL0prF`^m#RhIqF91BQ$ zn$#6~g7#?%b`!HZ7h6B8z2H?%Y)CT76KnA}ShM)>PG9~_rdVT$gF!>6-#qQR9h;%r zn`Ht2*h2$;mIeyd5G%~ISdL`k3EP@Rw?}$?0<+a$LIBAPruxvaWDPU+RouJ6-gTb0 z+uQk>9IsSgsc$)%y$Qhaa}@BYcQDI2b_0&SiZ{&bwq@N~Ohd6>Y5LYp1i~ea2mTPt z89#ewp`+)t)O#vgW%8rH=v&GF^PtuK+7TIEoa~e2t7~Si^h<*)0O!ckk`YBi1W4#mqL_6CeWO`hfA>xGk3ZM9AxS4BjK&l= zzI}>mT9_ZXFDqubI9W8TKb!Ph!`ZY9TN~&;O0E}Ow1}_(X${wP4jV5A>SM}O-JW+x3T_8!($OF~ z-HN6FPNN*D{2$MTe*eDU(+rCx6~xZz-tA#>9xxVhJ|)_Pz3=Be1q%>K2L=u^I%88g z@Uh6ev95x2CKaj;9QN>Ghv*&uX7}L=R3cW^In~D&1zSsMd>huiOdqUO$W&secMg^5 zqYmNWBCZ+|k#53nA@fn~+vQ4gfC{KbkJxr=WzFhj>CASrzGEpZDUFXAHHen)83eFZ z`vWyBjlseZxXPBo>g8k~rFXO5=Fx>HsBau53!{FU#pEhADxU84+1IAPu^g75l82hZ zMOAp0`6id3CxnQ2x>(lu5fJ= zPsx%1J*$#P^kDCEmvMqlkNgDZP=~cL3E0og2&UQ)t86mqdoLE(@yk2s2&$TNM-`-& zkkb7-pJ-SgWV)x%j!5u(lJ2{cP)bK+ccYbdPu7*fFcqoI_3~L_ zk{uH(>wO%sQ3Y*X<{z0J^^cQ4%#|+4BJ-BaKQ=?xo6Gi;6$|_k<4vX&iuEN&#UYg| z3Acd9wW3NeS|hH*L$sjJo`Xn~FjR+0OG6(@ny|dEt{ur0pR(j<-atPoiglkr zbMj|)1AsWW{}`XIaqznmVocD^9@;JTvh_2Yd2}mN?Q)66b>`L`k^XZqq&nK^{=hJr z;&3R=VE6k%cbCyO0e1;U@tm3z{&+pprV8Al?;HcLg9Rg`?(mJq>)D-TUeb>#3VQoJ z#M_AO)&^HCDqjpWDYeV^74sF%a1jcHu>;ZBA0os|fob}JQqqR-#sHpv1?8bSSa$B@ zKvL2-lG<}Cx1Ov{$A&-XSsvoSw*t3(=|L}OTnilPcjw30uvdv@&({*$#GJ{;hU)N! z!F?ouKrdQ3H9Z$5Vy&7ZYdvGmyxi5C)!)mpOBU^DC>5M*=rucRA9uD69orL`XCp|o z>T^NB=y~YbuvO`jC@_oWcMqDqFn`G>!ml6a^w=WCpi7j)>-ol=1eJJk=;FX ziK^>GZ14J&w^5+zHbh&jiJhV}sxY?Kht`iQYL@eA>Rp>}0m@kdh5rHUC%puymQUvc zD}PP`m*LRJoF_i+5Cp6;or%+YAC46Bc*U~aI#^o>;`WkP z^!;l7$EcWh94R~{Hi7H^RJ`Ch7;gKQz=#FvrKdm!j2LX3Z>cHo=+@fD3g-$TR#Sf` zXR`i`Rs+5yZFd|l?#3~#6&!dP6#ZA0KNU&DEsqBh-{=LN%)Mh4wPk%Qz|qAJHSF-# zN80=ZNg;hc5P^vC@86N`{lhnUFkV}S*x=#Zp;RTj(&dT^pl~pRX)6AZ{GZv5bnbm~ zdG_h$;o8^6IzE3O0}2Xw@~PygmKjGh4UooqsNLh*b`$p>@^JcO97tS%qzhgXOd*3ItvQ)ENESxG0Y`=vb7_@6%Vt^XWV)p88RQ|d*vqW5rJ%8&BF|x0 zv+VuN_>(%iqksMb)PHy&`TiS8KV&GnjDc;3H3a)w)4tZMYB#jSDbc*RdxChxLp}|? zG#~%TL0FI|IiKf++u4KIxwqhxBXtPT0d4be9+sg!zD5#(a~w)bxyC14xPcq(&5hHw z4KAIGU}%+xfuNO%dM!?b^)bCR!}g0u$48u?5*KGHfnpD&Spe01K?~cg-alCq&w2E_ z1Nbge0LrYWim&E%sP|wz^fi8cW}|&6j40q$V^Gf)^TyDkgP|fjE${Cbh;F%)Z!daP z$44a%jQy>`JOoXw=B!bhchdE>r!M$8@;HSyFm30wI-HAP_I%ujeS&-g2lkMtEWw!n2mk{&1+6y8byQKJV;_7 zgTFjl?VU0;2R|P~+xziIGa4?ONFq4Qhm!lMXyVt1NW3z8CIu3o#mcu{9f2{zea=!Y z#$i29hYG|mh13}=39&(fgo34^jFOkL^3Ga&%(H1pp7|brZpWGGa*i?w{`7t|@pUe` zPV}s4fm5Zs7dM{uIl{f|yfuQj>^&-%Crp-@&ICEHg(lX9M1Jv+6#>6;+`h@tE$8X7 zikR0;Q&EwZ6{=aa8SE;RH(aVoC$PJ$bQ*vDHGBy9aeL7=t~lyc7>{It+U1>{s}SUI zr+>z@l4;=>MKp)z=NeNOm2>28$A40-9yG7o7<4SEC%b@ua&y0>%*(6z6?h|KRnl}rhD54RiPy8z`z!w<- zY+>Z)iYjQd*_cEw;uy{?==!^yC#59zFZCGQx0vuoP#UY_Y_z5BR2U8d-ZjHQHt+d& z4}dDhmS7?EHixCYfTyc~sWN?T004kb^3S@AZztdwo9~1h*sS1I1(1D1^;15xBG+?c#jfE>i+V7ath8kCj@ci5HRifypX)IS zy+dFBy?!?^DloSFYw5&tyIyJDD`EKB&-Y^Eecpg&Uqr>3dJdJV?HP7}FNjtm$ZS>W z*4ZI_s#ROI`QknjCu5AB#TBK)fhV1jsfbt9wYov$awkkimCrXwo`HC_h^?ERwNJc1 z9O6K=KZG6Zx~sC9y|T;i<f*({~S-POqgL!pO;2`h3o$_<%W4cnz?YQuX$~Kxb=T z{Ce%xr9l-KF2H~>* zW2^jFJ6!>|JK5i$YDk`yrdU?i6#LN-2ETJ0n_~JVmgSb*y1ny`+{4GfV*_W?trP}lTZKXupkBG*P;3Dyz@(V zUVHtp9hT!2mo+Sh{s~|%SkzF4|IOe*h)agKlB`y*o zW|XXri7fQBE5N0oUI`EzYh6mI)TpAOz}UDNzx$=$6Wd>gWk?>_1d?eRGg7Lyt|3J4c@x|E@w!_$T6RsUMxY>Z z`AO;g&u=ZYQnZWh36gSv$jwyS0gntV9>;{+G&`=%CMy5kxNu@r(drH|83UTc-tTx(72nLnE>SqqqMHmqc@(qzLkBRZ#*2)RQ9kIW<#fNy<@T>J!hU^mjBK}go3&34D18ns12qOM@`r}sHy zP(|Nq_U1OuSVpQq%^aT`f=;BQ(Zu@so~vfGAlBWI>M+C2bR{mLjCeM4PApAT^=p2pKZS8rv;}t-HWg!ckJ0hTXs0kwU5! z0XjWDc0*d_$`pyfC)%lP(3-sy7V3l(oiX(H-%!ys?=?o*tz%k+O>%dcWDsGLyu=O{ z{cC*q6?xwx_uxE>sFoCkRcPq`lm~{j8Dat!QVrVW0%y`?nly*)?+THXYxwfpulu^b zQBh>Fb{{SZ$PrUA5ej*h!%pAE8CjSy7SDEhVLWz9qAU}xQ32S_Xg}Xw$vAzL*CQrW z;=1MR1ogbVIFziIh(H@qf(^(2S{~*Nb*YHOWZ`#VYx`OaD;=hs&G6Tpb#a<|HfayP zE??+^&jaa>TOgY1UiiywmT&*n`m_2O0=?abjbznZeLo+%hZ;UobaU+Oi%9B8FII7h zoP}6rjwOQn9&dqu7`gYW_N88$Ef@_WUnM|AJlklZPb(>vdvncMglYAozo$29W_HzQ z2d(c}XSzrAk|eTAdsbIyCI_jwU^U@TSM9uYC!HCR)LRO;PbT=cQ5LSewL@k%HEhVH zS9`aIc7N^kQv!aPxLltat4LHTDa>OwxacQ}h`HkN{DrRThY$4Lfv=4A2KabE|x;U~#pvyni;^9LI? z{Vj9Ff+|sur8}$^l=Pt_GW?VyBN!>vPHt1P(hEn?jmCqw)ju8!ao zW7-|6ylDFOLB{gvhxSi-zPqmql*z*`p1G9(pm|P@PR_YCTKyvSB|YXCv;ns*7Lh(# zk*5_2eBZejyU2JTPttp#DRQK@Sho4^VtLjThYR7v^$oP}3{+T7<457kl{TOsW-i%c zuSMOatB|wMfga4$2YFeD7ILmukDXf4uVUOh@M@@;cSu!s3-*{GZCeuTaW^wCxJV7+ zwS0(=yWsgaZ1%*ecc`O8J!(^LMs&B1+y9%jUlqS!nSv$6=Eb2-4d6g&<&cf9N~LGD zX-vjBlWcyNJ`&Lw-imZ7Q}-N{2w8NTGhq>24GnLIrH#r6UwTFECl?}IsmH_x6~pj< zH?Nxh?@LJ)sBoOl^d;UafZAcZa8F;Jbv~ZmG_p0aTP0N5sW=HSGcO$o!#t7c;uln5T zHMGW#-izx=ENKx4cwgnHZC-tOtHJa_@e*6eS2&)>k$B-OM*`0~?yK{!aax%;?hBGy zCi=KG186!|LclrTv87 zgOJrBC&rsmRh9Sb?9ri+b(qcT#6oGX{ha$HS*udEL}&(X_t%p%v!_cZK~9u>O>7uj z1Aq9Yy2QrCStdH9les{DP?smw%1^NBk?1sLq{uKqdM8N@agnE>|N@pqw}O zGC_FX9MPbf=VZ)+QJy7HQzTxPn^xzMvGQh9KAVfwXh6kYnty=wfh+y|d1Pmc^NxrX zi7%6$U{G~F=C~9s^ordL+3oZuMG|shG(|jKN}1p93u(;#rsqog_5Q%z7l91!-pmi4 z+ubtfup;n;3*IR2N#>l=v$8PFM%~Pm^v34>G8OW6;p8ft zQ!6V!-U!kk6J_LgTt?oJmNvzzJ5_Ygt<%IsTk6a`JH%@DL=vacK9W`UYk@i?>Ccel z$|^spROD>#Ib*t1zEQS!JkH}8KTn2x_CaK~?~Rg&FGO^{M{GfqATx(M))=KBj$xF$ zrW%y@g=ncT=-3Ka5yYC)8v4!ul-M%HBJ1|2h+ktb&KMk$GS%c_EsfkYGUWNcZyj}@ zBTc&Uajrb?n#dDflfPHp*m@ENk}JzoYEb4Ww|wVH`l!;Et7d7WJ)|@ld?7vBt|L}~ zY5BwIO{sK^Mack*t~^R1zUp0S{PpB#32qIcrZ0^7YOF-+Jazm8H_|(o4fI#`weerW zT`a~tqlUx$7+()IvIVYh%B8gxcrVtVA%X+syuPfoXuLR^=z|$D^(0iLW_B~EQLwej zmQYgRM}^J+RelS3d+ZMVkO~nfO4>Lsq~TDNG@W(6Z4(NW)A#FU5)!{7_`>(vK-k@C zYh90u6+G0SMA&{sqFBDAg_%pxcKICTaV5iGb}uVIb0Q23XVXyD51OR01?)1huoWrM z1j_R;(kGDQ>(J~Kse4l#(>d|BInmcJ7UxCA#{+7Gn9{*n=n2NM^0p-2NWJ?oidr=R zw;JF~2H_!~cDV5Eo1tdCGV##ew5r-eZ`tdPODJBbGGq9{U%_2;^=Tt(V_SAwVewpC z>36w$Z4Nj#oEgQZv zQYU$sA^B?hUhCLi{nMp)_HTh-l0fV=q57L zgwI?nMAj$5cYZ7#)1(}^@cIWdCi!+Zy!6kT+bu4Y49 z7m;@S2~wxszct>Bv_eQ? zugqP~Q9cgmbm#$%n{bWWbfyb|KN5tbv%~Sbei<|%ip3wo#2-&%hSPZ!?<>z4&5HiL z`Dm;H_4M5%^3nq6-Bxb)j3w}T%^w-`#fY3?FBAAT0%EJ&FpFBjbZrc#!unG!8sN{b zEnkT-?4F?}_V$_1bEht^Kqj&&Bp2s881_#{$eL2dGc%NAa>V1CY}pAU#Pp`d;#T&L zVH8*WwyjF;tEjNd=C9nAmc83Gh$3nCWz$3sl1shYRhVAJPx=f+l=w(36_`4*LGPgF z+q9Kjb->gj)v)@IaJA@~=Z6fTk;W>Xcb@Wq#ImudQque}Z4p<5N~?`2a7lxc1#c7V z=!4%SyqyBfb@sb=6gkl%QjRy;w@-I0?1`Qw=P$Sp7F054@oV5`gvf#xK*ro~(Uh*= z0ukxJ&Neb~@J(>TqDi{ndZ~t?E%mqdw`=<~aCl&hPeIN;`&9j=y_rHJt%=@P8Qsz# z+L`HndPL&F@aka_Pxu4V*d{DJ*Y$Wlik;1;=HBpm3o@X%ez~v5x!Hg)K*d>+cO<7W zoGwFA^mVNA(jlrxZDMK^$!tGUb@{w5C!=yfCH#a>?*AmB-0OTWUQSLf+>k#Q!7=WJ zP!GKO%93DYF5`UikxxdQ17vjcGh;~eKd>|B=_W@hok!l#goQv}^B-4XFUy;#Yw~?< zyD(QFTo-u++wB-LJ7Q1`qf1g&W`tuJaKS$(o&y9DE^`H|-uij7Zj~;L_tT=Y;A*&g z@h)ccb241#wNV9fY>T98+D+UZe(>?HLJhUypLP@FD|fhd#%=H>p{D`zAu|}aC9b02CU~;t%Tt>$gtsJYOV_s zYW{(9;~s*W4ZgfQ9Q|4orgzX~{L_r&>Z2~7?3Q+i*Fl@*@>7uUio_H-nG5yRwO{{i^H&7J@P^taRL5NXP6KOBvjJlOgk$Q-#KfgeX$x3bnY20HUK5Ng_tMP-A8;180ID&aw+`*Ytq6>0vVPTXrx^gNNit|IQ7N5@?^K<&~)y ziE0mY-*i8RC8^5dC8sM-uAlPk2m}|H-LQT?(67xa6_7pdaNDwv!z@+*L&BovW(V6VVhNJcUh?6^un%fyl{NNx<@oOm@j*Uz<^z^~`Q60%_c z@jUXNbpDz5HUGh2;`6n!Mo+zd6J6>`F4mI)i#zS0!Q&650J!;VAOT*04Yfma6x_;} za6z!iCNfC?aCKrEL4ma+9-kppa+0Mw)!D-2K4ALkNJND`A}umQ!gu0?Wt4&Njfd^a zl_gdh#H>|1PP(L?1?MXEUSHnX?))M6n&g-}@a&!6P-{ffJcOEL0&&$k{`42J@3H>} z3W><+3zD>r#`ft~;!&ifxMDXNgS{`ii8(j^VnX^1%T5Bt)!>04rUJuajNG9txn~dv zM6z^-`K=ya#sAI5Dx+Cu4u0v!9gG|^m?)WO;ju>$ETI5?Ft(3oQn;W`VUU!qKp6|v zAaUr2o)zknP{-L28e~)1v(xrd77*`#-Iw8Gp{(D47V0>wjO_WE41Lah&L$aQ6$3&3 z`sm^X;n%k3j@+mR;US3kw;r~gJ`Q3c$M@9HvurQb@vZQ3rMkV7eWzwRD(z`4~brtt_lbgxJeOq7am7^qdmnWj+?Jtk}&f{rixUIB5s4!4|ukTMVE>Gk5 zPc9Q#;wA@d!^n*#X@f?#Y}GmBieN_^cvYhP0ArFMa~CWV`!F@8hN(q3avUf9J+q&5 zDB@vnT`w3Ixq!c`feLb8_HS#Rw3T70Kh376aC9IZ`%NW0z`Im6TX5!?C}J6tuQFSA znHk^EGy-h@Ik&4cWZit(**r<Ri&qc4s>3UVr^3tl$uKL0WS$)>W}DSOVjhi2Q!QoB|woAbY!wp|x(?q~~{d=Jp@{2ZjV zzU^&w)G}uDqeO)19vtX|teATJ=beeX_U*tu(g<`qr6B}*{NRwr^wz-l#9CRO60pnh z^0{6^(^puRH*v%<_dEX71W3D|Syl7ir9P59sJU#+*LoqPc4b@D(mloYM^h5V|L^w= zdE1q=MEL_(XW=bV=4$BV-=uow7YuIW4fBb%ibtX|p)3toi*ZJE2#lV2Eo&*18dRU7Z%of?>iLle4k1QS)ez}US%}4H7 zlf3PEsvXqjLB^!;& zKfMQe2+4nhuRn)0kXZJy$C@!Bvdh#7Ee4^cZQD=M5>jsp zMQKsCueep&ApcbVhMa?*mP2D8Ub<=>z1wde z7-a_xN%z=JINB;tt_8%4tt+b=2N+uMr?8u7{G-<8{&CR$JYdLxa)qQ*h0hAy?m9vr zi$n5{z82AAae z0^?@dBA}mC7iDjnF7P=VKHTPVn&v<~b`6`M7RsT;#8n2rC zF7Kbs+fy9;(5=++1ZnwH1DMVP)qEiH30``k`I#~J_Hl~iM#}4mi+|AJ5)q#NX_wMy zr6S=LO%Yw3!NW9d9(X*aujEN@0dy(uc`a2$k~@OK`d$h`);;#sv%`3nx*!vB5nIS0 zv3QXVT9yRnV5)E^xT7tx+)-*PEOl@9R7$_(le2rwuFdN#$!K65J2!u2kPK&X!}FRZc~awm;GTlzi0A^; zlRdT)(;YzltEJ@tRejYaP7R)yfxQsXwQ@&SLv3yo1A=`}4i;(r-&d(gu!yC34Ce32Od-AN9^4 zRBj6vml~nz1aqV_w>M!eB*7oO=58XQamFwDzOu5H%Am03oxSw(2q`gOZ% zof-0*kmt+vx+o`%ZnL_P>j)&-XGKZYyNe%nhxwz0W22r}YEh|dP9|2!9e1l0Kd#<; zV_`WXlH}y2o#VpKR~n=%&HKn{2-a0!w_t4X7 zexJ}t&ylUVellKK{h}`G9IfQDy*6VkMPr74SHMEc#h#ohKs5#zsx53PD1>X2Utvt* z0H+&xDq`cS%`gBMKh!p)H}%w|WZa(-P^;$WX0{G1As|>ozemII6&AQ{21Z78_SAGw zl&HtOCwb;Q}!RcURx0&BdF@f_!=5hgDgyi0vrjjYXRqjUOti=tsSWqZVh={ zh;x;50o+b%leHe%(u7b};mFHljXCIgt6rY?+*t&H$wb&sBVM!RiR^Zld&a`fE>k?U z@@V@0e@7A7pAj@J&w-m!@9~X3x0prsA{ApNOg*{#*>V09xz4G$FQ07#gVqg2i$MHBs5a!F{|@D`w0fy z$=E$^gT&XQ%28V6`NHXI!{)9pBVugtCqjG?6HfOKW`XGnf-%u6LP|cbhz2q8&WlMf zc9eY=DBw&e0_7p~$`R%9LPqnW?|3A3f_p-;Upn?vhxqB|nq;1UC%-<*=t9Qf5dTB5 z0^5kI-D$sPDGwgw#~JH^7K1--5%cqQ7#S)@7Qj+Lsf9APA`&gHx6UmqWqMU#!|)iG zbL=+$be1CtFbW9UriqPHPdP*W(-MBpyyx~Wcn&f9+>|06VM}(#QW2Nyj(_VhKP0w) zPlr5hGa+#BbNB8g+Tg{SyIv0;F!Vshav@)7HMz6vYO#8_f><{xM4`b*F1vxOt?sSr zfx_d(trCUqdR9uSlw2CoL6rG~tr`k?PKz^q=#X(4cpCC~OP z*kpM02AP_KK^D_829q_H;5qqoYmUA*i+?#LDk2vl{(d^+qr@f~4q_GNt4UK(#Aexc z-vV`bg~6ZQ0F8ri!youDpNZBqQ*JiUedpenUI6Ftu!2@1nu=-Uah6o)o^EtMvO$$q zf|Plhu{mFi7asbw-fZ(-!@PpVKTm?)jZK79JBmc8*QR@8^*;8LSNL#V$)SRc;mX}& z*4G%~JiWTamzTsFOjf4(*!D3Ty3rxNqaPAnzCNpXP5tvW$Sd=vj2yw+UEjwT5gd>9 zmN&M}0qbziuzQcm{5bw16TPu(QP5zJaPp%IvTIGL;DzIAd)Cu+%+sgG`3Mf$S*-_vtrQ*h?x}YwU~u^RdYB^i<}K>xI=0Bi4#c$W;d7NZ7=M zl`7?TTMcnL(_i1FmV~YG5!$gylBTv)Buoo>Twt#~p5#oUk-z6&IT>jNt!(rUpymK< zmhF>4t_L;U?Lfv7aM;ZlSbJ410w!t4v(`neJb{z>g9GS2MH zspo(H!U8QtWgixA;$=lh-bWaUC%iG(=3KieCmX9nE(U(HB$J)`+ei7;Mvif?J_e_> z{qZBglzX6gcURJaBne<$z*e8(X6qtX3hmT*zVbDsoKEwj#@C{*5Bf*wx4hTs5rXhU zLL&289Vc6Dll1xw1tsGkz;;#dURPFIOia6;eDZ>nx(a&`U62LRPoj#xTL}OqF<>$U z8Zq9=OFa9`?)}XKYGqXK1(MPat?0cSSl~j(D+zBuvv{`3@_xEjZLBaFxIdH zxQcI`vDX=z%uq_)M&+tsU}>H3!k0)RoCG<3@AugZ9ZzR`L+#>xXd@FNCjWywR$`3L zd~qG}qKr~1Vpq1Q)t1_C&ai@@OV~IM7Yy@qme&94uULC|DG4nl0f}Py40*XL(*e?N z=zy;)zEQcay{oRKW!kgq|JI5MDmCcmvVM{$3|I~-)D4tl2HNE3or};I=Ku@3gSy#Y zIQ|Z4y}4wFT&4JsHYoS=$s5&GuX9kjjkx`^2zNz_Fp^}fGozp65wT4MImO5=%jh*F z><44BWk0crCg0|sX;rq&5uNAMXJn*cBi!zySCF~(ndLg!d7qLtAhu4GeO8k@9x5il?anK|Y zaUvRuQiRugV3!)WeS+@d!*A+3$rn!+QpjyCb!5xY&|52ASs!Fo%w{e(@pT9*8|8&( zUnGYsL*_5Eb?HHvz3<=Q!(SUl5M(UK5McWj2XrlUd*FGvu=pYSH40++UHV?$V(%)Z zGA<{zXKV%dM$8(ujQ`Li@@5kc(Z6igS>)2{XjLZ)>Hl^-X<6&Ik~N4B>=oy;I2wFW zOBjIqRLbJtOr3m*Y+k~&PD3c;0Dr+*L5sXCQm@$QH=Wu(;hU%iRxeu%BHpS|H={03=S^Z#q+>vSXqMHC|{l}L9-uZ$NDunCK$UftRFZnY-n@QV2w00%WCi0M_ zfpQ7ZvF}z^Kb_BK7V&E zGm7;+w}o)GaK*+(*eTETnTaQSWX^NO~}_u_o8;4Ka5Z zPON!>D$-rwU5@MwZ+yVa-Itj>Nz(Pa=xx{)y`p`oB24ndfOyiKkE@UQyy;PCpDPWm zR2I$ty}2}rSQB4ih)R1@)<#2kjEQ%Wu8Ds(KdM7f&&R&@XAh}$EHAS3(SAWgXVix; zLGMmeo*vjSeL1QN+&uV}S@AF8+C&I>nu@O^1vF>1`GW@rGrgQUc7qc~2a;%G9c(t?D zmWDp}*K-`Sqb}TG+f{Pb+oQGN(|&v}0>yTZ@B6Yu%%_R;<|8aWjN3g*IH(dKGUgZG z2Y78^F5bXTum~!!06~)qiPFLz`Sb!~iZso8Qrad~pFInXBwv&!tCq!93!LQN!l{VE zFG)$A*>EAt@$IFCwn!lD2%_e9Nn(KR%2C9Crd*mjNj>s`z`9Q_#&QZ38oV8B9`bEl zLd(Sm5P7I%Hqgw*>lqvAR*gZu2YH|p1(x1zp$(z8UJ%adWOajAO<83P%X53?=J-z; zQX~x_qo+k@6vA=k^)6qGcC8F(&UFEpF|MlaV`SrJX0>8{MGy#Lbz zB+*I@dlQd$KOl3*_>|XQVH~ea+kD=|hoEJ{{1S~Ye`WC<`FHMh#C}cVNZ>K;x>7Q_ z>i#CYEz~^F^J?}Fu4QG|*=&0rt~5B-K>976r!L1X1q6W{9`3=kvy96%H$ErB-Rp9W zjdfFm&szAYjg%i}+{*PmuC|5ut-FllAf4SyO~@QC+6K8LbIx(nT-GVZjIEv8q)KoeP)=Q1HUP@nV^Q1(OiaPV#~7@8X=`igBW)Ipw#Mego^al z%Mz~EjDynco{Vlla2`@oUkEWaU=QEj9yCje+~}D77l7vXEq{S_5?$T4>QDgkaxVYa zz|-pgo3{vsw5ByjBvg4v6)=C`j?i;%PvZsR1;uk+m^ymP8-)r;UX=L7`B0@u$1dXV zr_Wb@aE;J&8MpE#?!o`O-ZNZf?+MQH6r3V-zsoA-YK?y zC2}NVE3_Q`gW|RyLZg<43>fqJRQD)PmY&2xYhne1-$2*qUXglrn%)&fz-mV z-9ATdDHg)bBza(+9vd*}LFuPM1x~FXt z{g2+1XVar|oz`nwyZ|2mPcJ@edb_T*L)#x)c?~_)!r-!URS;lk8|^c79ovO__MN~C z8`SE6eXIkU9z{jL=xz^jmjYm0Hp4EqaS&rnd8NsRF_|r6Aum~GX8uQsF6w?(E|5tSp@S=xtAj@$uzz%$s2);HYCSe z|1uNMnPWLCIIxeIVjE*>JxD|T>5-Wp)fGhAMGICTZ9KSzTyCQH9CO@Av`ZdD#AYn- zili2uMIm11gZ|s{)c>#K9*o^97JZXcGi!aAH%coyZrHWUX_GicwNt+HakAD}%QbzT zGizErtGN-czK^~Z<}6=R5s`dsnw+6iXmhDBtI|p&&Aho`xes%**{|xpeqn`=m8azp zxDGGELJhN1AIiV6z!e}MZ~7`tNt*76sENXp4{=>?g(Cg*F4+6So^&o)*#o|M?f(}) z>tW%`18NrkpIHV%WU;!Y|Az1ijYJt@U8IICXfQ@be=Ye>QL5x0ny)6P`TxvI`NP3) zFa1bGd)LX`1S>Ez9pwRIp~bw0y5q-i7#{H<8i02UaLQ_fr)~dDub~hy5~jDo=_P#& zrn!&(%`%p2V72%LliNey8sn<(M2FaFp-;yokvEcsR9; z$5{MKZ}xHZZ1cS%xYQO0gLa^<5wa?e625L+Hp|^n#C$*7HX5$G_<`${kQEw@|6l7a zBtobM0NYz^>9+3lek6^A{;3Uc`WDRM+-n%dV3$EcjS}n)EJ8?D9gd1AzqjRM-BpN~ zeKl(sbGexrl?J*iz0{NaxYS;7jF6DIA19>>7x74{n?>*bWzM&){8!=NQ)AjFkANGR zK(Ssg-J zox~SyUT32he+!$uZReG7>FAOkgF(te>#X*GZ~p4bEPkX-Oqa#4cY5A$$y3}hW*Gau zD_@{3cye$>1XJY`gzfZu77Dl6-2Z)1Y+c5UUJf3o@g~QdMmR>)5dcSfUiR5*qY_L# z43xs}g-^XY^0TMQ<)^X!%SbA#ZfS?i{)jDNxK3#gg#Jm^5bz<#R|{u*+v<4NqoZ?) z#b|apReL|}dJo5>mZzEGI_>xP7{lzf1p(~;m+n*C`hcF&(0cv;fS%$Zees6V50-bA zb;5w$K6-Fn5Sz^otK--%ccTTOS0iKYlDdF~SBJu|2Jm#v#cXh!o5)TeS0ZVyNdol+ ziKOqIAJ-0O9ve)J&~ql1eN7LTpc^u*i}P?oeG?;cGBfhh2&!4VnYp)Zyrs% z{EiVuUd0l_CZQo~11&NVsmmXPovCe+^Gb*)ZK?Bwe0cM9a00KDz)g$7S=Ig#)A*x} zKe+L@`Z+2#m$Tw5_L6?E%$b8nMcH*nl33`;4>j95NU*elJ9sG-yci2wrxB_dH8D&E$J9p5u#6BH40Q9d}{o|m?^_Q#;+T9W9&i$()xtcbFr znVN%7Qq-w)rSwieOaaFXCL+NXU#J};O~l3G(=tIJ`rMR{ zEn-!9j$9C;-hZuEUH|r(ZMHgfp9N)D|IgKio(Dv_d%wGax$nGM(X#DUZZ{Yig6Ek| zH`Sm2EmGLKZ=SbsTwW_(=$S6QH4$7I93J>*a6^He?u+L2R8+ZzfD4^FugqaI{z z6F2PPf$g{@aYA|BsXMXGdeior#OB2YCQNPN->(p5Eu;@JcXpT8@qh~0ZO-RozHvQ%$U5WBA79L zK(EZylN#&#NT;RF?|L`bdEW<6q9=5NBg2k|`=!UM5f z;+y)F-I1JwZ);tppw81Pq*=2K5o?)$%2`bV@oK(cbCvEwggJg?tu82tQDyvQ7{ z6b37++E{%nzW>(Gln+@5ET+qFVD=uIq?ic_bDW^Ef4*7#x8X;Po#+J&{JGX>`|qKt ztI)77sDE&fZmO*8KhaXU`^jCj-ZE*vgJ19kkDi%l9U{Xd?C{zX3M}8ha@)y%bz73U z{IrA$C=$_+;XL|LFqs{EJJZ2m4kOWzB0crGG^yfPrC<*_LIX8BQT4&vQx2W=@6#Tx z-)$pho{6~jSiZEcC!cC@C4veXk-f7fj{ln~3*;HfgV*>TOY-&re_qaqZ>~!;&eUgjew{CSKK^{?Ya@v5!^wBTJ?Y`o`6C$E!l$gD+I#= zG*CDi=n|2|E~8Q#=}kf#Wj~A*H;GLx+D10mR2_Rn|7BZ9?Zs@n2yCm{Wi*;31lzTe zEJJBmw%!xrUP=Bs8!3(N)^!HCkM@xS>NMFAGj~3bd3bne474!r{=cezIGPqj;_!o) z>iMVows06qRySof=Ivg7TPs22l%uml&FIsw#8tG>=&HUL+-OPzE^J>3F)g4GJREIT zGp4ao#!W;DQevYH(qVEwPe;PdnE$5vVws5PC>vXmoX6jJm&rRBi{E_^rf%-p5gSr! zVHj5PSOCrU+Ar1)WG{2pto`O*b3?XRrsv&pRf`{v2H$XDulrxF0< z6k9bmCi?>GM?=w*fhgYEl+AnPqRU7zW%szLk7s=I@W57Ha{Q+kxC|ynbM2u?5WpCI zg(oWNJQ;9~{yEb#G*|Z(J>4^GkU0vtq#@RSVvk>U#z3n`cyxD7QLB@eE431?FeLVey@whYTP$TxPDz?5`0i#@o{LNn-3UU)5%g z>E&PMV~)dGvMA{ignYj`c_JCs5GV3jhs%zkJ#yB9ApL#kp9DdCdQ7F_>_5f-%-@Pq zwJ)b)4scfEJA{-3OcNv7aHJzSSlEDQh!?1%sI1UQ5j0V%Xb#T86rI-y0`gzxTLklQ zJ01oUk0Xlw(zDLmV|&Z|Gc|~rtx_Aanh1VSZW<_M$7<&c@WM)_kmXOfpc~FQOrR!CA*POklJIoeVDxZ#Det-9Tiq=I4%gRj&1= zdw%_M$o8;Yok1wM69b!&r6V`9nuRxauhZ$-qUQ-f7XPN^13L!WKE-$0@OKVXuwY=? zgCc=%8t3V1;ZkpZuF7k=^|;PC9U~wRv{?TVK^wd?js5!V&sZ?KPRTjz!7DJQYzS}tXzHp*X{43uG;B4F)5LCei_q z*Z)4Ai7$QE(-tef=Pun<6qr8E-R@G=Taukr-?0o(Azmlr%iD+lGb z)R91f;NSl?d5KWOkWNQa|4%U$;)Ox9mLxt%rt}1HSNB_z=`AqUGw^IL?_E+PYcb=c zmocl4Qw8U|rS01%@>=pY!;L9n6}_u>%@Zh;>7!>HCK05X^kCJb&+OXTaje$@v%w!x z5yt4F4{XhOhY;QgNN~V7I1Dl0`%-0(^n3PM9cx%M?{6H%9WTY>$nu0KCbcau*W$vQ zYaR_qQk&@*7Z>i8xGCrLqBm~d+wA?O1-aDM;7nu0<9O~D17qTl$f<>TYxat3Ua-D& z%*Pwogo*}s6@#g|cw)eAAhzn(!CrJ#(DkCkz-(!y$N&$0|^%)P-l;wOC$O;LuFxt(750@@#ZV!l9mQkW|_%~@xN()BFYh$MjIOP?$&^B-hsFM{X?q3! zj8q5U3XYP1v;`YwFKyLBfW=$%7NDtko`2ZRrg{x!Yy}4Nl?sA<`3JF0Ub^R4P7p~9 z^URno_=Y%h!Dat?#!d6C2tKVi54w>y5X_HRBQ~>1RXeUF*z~OV0`426tdppI*|38s zjG4`Cbx94OEc*a;fIX8$e1huSwg%z)v8Baic4?#=Wwr>WJ4mzfFmuqCHErzO_nr!j zu#?9`Dx3V9f)LxXRw2zPg!$tdd#Rp;2=s16A?|@*a8Rd+V#P>m(Z%R4p3g;!@22f- zSF8-{SQ(i-ES$T~Y1FZ-7Dd`z97WfuZTwP68Ezks#$l6pX|JN-&!#@la)VpTg=_6Q$2FU-oS&-c zR{tLX#(J*@OS##H`&i^%YI6Wk z2AO4e-J*8*tG!1m@LM~{eoXxITVlX~ef;v<7e`LyV*VN!?JK0(B5(Qa#pgZwf8_AW zLk3dF#XEZ@H-}x~MpNp;n3fHt`sT4ko+f_E&5N3xc}dl|_`^tkcD zC&Rv-qdmv#Q5*ZJBRo!at5A@7{}J+YXY&YeMWD46?pbWn7zNW1T}Ym!=%qNC zz4v-#2zu&;XbT{0yRqalM(!M)7#AG1*Ey~8ZR8Jv7jl6XAHGb1=JaH4m(Gx}cCMQ? zh=CQ|0i-`eL$`Q8vkgU)QtLcugu8slp-t@U>|Ael$mjfc1&$%ZqZsW3h?R4@gZ1c_ z=DZeQVawNgv+^aL&rYk3ug>v!Wiv&CHRq04{5Xkmm~;BV2Ann80#FFm<_yPpd2QAt zgNf6Rs+|ytUF{)yHy#nrSl-S*mpUk`nIP&oB;Vs9Era1Tru_y{yrIB5qNr6nzHdp* zb$B3emO=5|q$*VP)}JO@-B>Q@#ySCyV(4yP7MpMJdYKKPy1=YYFi9A{mp6mt>`1*4 z%{_>UH2gBsyvwf-SwwaEiQE*+F)caFs?b*N3n+);^*2N`_T}>|R?N<>i&=w0S_@6- zkNMMRA`Ed^#WK*Jb$ShBbmMlGoX0gI$R@EEZ%{h}`fU1AeZK5g7!Wmr%D3~z6KEzg z_}zlh=sI+wVFXM;fDI4;*>gi+ajAy}F3;5vdu`q6Z3--G-+$q-Tkqku43X#Q3_tT1 zblhVpEiFZ$rKK$>ER2nf&Gmk-p`fOw{}^lE``~!~4oI#1%9X66=&C5sIS`PS!N4}) zXz9RO`1~cnTl)5VxARu&RR426nUyGNt-8b8K#xBl1Exwi$; zLEH3p20h6jt97+N@SI%7w_XOEs$0RnFxxwYYxel3cd%g`;s~T)OvTv{A(FmK2%|`k z^7)W}bWGekI-E{61K3fn3u za|RwLJI;lfar~8LcLpuRY*#JmH0$&~J)$oKh-{fed=Anr?%$uTqeB#xdGdU30DWAZjPBG*Or`v>mhRNCP$TsN$hl<*tk{V!sFPIadM zJuTEAw%1A{Y^y=~Z$TyWV25ZefC~sftOuMYv`w)|-0Z3QQ+)CC5NtSD+z>clWs2 zh;uE_u-fnTq<6Y^rQ{ef<5dY+T95UACP1C9;Oe!RTXv0xOg~0HZXkoq^3ZhFH>tSW zqq1DidF1v{C(_vS728T-4vx{I zLW(IOfE#Pm1;?-L9}60lro7dBnI>Xqxyr9KI&yP}w2k5IjKflfwUf*RB9ANm!ydZD zs5^Z{a!33Y91c{#_yfE})XnZ5a=4W`<_I=mppy7yWq#Ob6?)qk`Q*9rlOF0`K(qWX zSAZV`J@@U)N;oEWwJirCZpB_V{&Pob_8B~wU(Mu8jo+)3QvG6E{}i~AEYykbN1Te? zfa6drsboXK=phXWw4 z$EgmNZbWYE0=GxSgYGpXg3x&L2Le|Pgy?52B3;W#7~zsCjHXI&8SrUECwBT3Ju}}Y z^o)1>-PvjpC8N2AEB_Fbr@>Iw`(@kFGsR{k|LE>1^?n&}CzHvb&|MSC-})Ep`&y-J z<{H|*(L7?(yEb*THRWbLH52JAV8bTN8ajTy6t?-NZ-&pF^*tP$=z*s>9y9v=q;uP)&9k?1V(C1aBm&y4h2E>}#b>=lyM)^vdgrkBL?(#M32 zMjyrkwv#0$Z*E3y`MYe!MBsCYG+y=wBSrPb%JkHJBWfD)i5BYH#|%wp_0(^7eY)h>-92`uZuGZ!Ai{T=UzFOj`S9 zU}~|^usqW4c!dqS5>X%;fsIBLBfI!$f*%J%|fkw$P%Q_D;!yH>n5pg8`D z-0Apvf+%hr#4tg^uR6eRdWAezRgC84Lb%ob#>CjUBB~M#pAW}=s5a}kC<)s!lN{Uk zrcuX%#+cZjsX6lN0x<+Tax72;7aoAT?Ww>k2KgEs5V~cv#~PFG>)KYW&+9|B zK44$QVpTTEPICh4gZ+#NSB-};KZY%yGZ^i=ex+WAn3)vM>Ww!>A6YXtk+8Hd=ZIn` zR`{u`lqbczuX>B?w}3OH{AH#%;yNyjTu76TqC#A@u$B?VjG?d&D%x`*LG|b{iHiq# zY{1we*} z%WY$b^*q-2{74UfrbFf&SYzCf?u~e3tfc_^6kz8dVzVavI&|nX z0X9Y{L+Cv#EB+EFYn6S&zNf@$WZD2xxq!iiz|rD5cm31*lrA1XFDxbn8*wHXdyoB` z0fS3~MD3;Gc(w;jFcqXtqM86tF&f%QZD-y^g5k-VsnL!vke2=&IL$$J@}%KR*oY+6 z@T)Ty9-#qV8aYwSrNxC9^5$xm=)LAy5bbpMTqNlRq{Nn3Zd*%uICHK&K*V}_BH7g1 z?j5DR4xbd6A&W^8c;|`NnqrJVAsaLDbcui4zzs=0ixzE^?e9+! zfM!(|(X#_?jmxoohRc0_i}I`CJ{EM19ykRtshWEmC3}qe=Ws9l$O73On9uMu&8PV< zb^tw!M77T?6y0~|eM?_%lk;DHHZK4&Reu9xf)53ce+5gIv#bul>7uOcOhCKQgOL^b zmkql|jbo~dk)OH)wF6@WIOy{RbI41`fhsZOp_0QUyo@_cw!N=Ex+0i1Hism#8Nfdx zVI!6Nke)6zo<{C7O1v06QU6q`lkHt$L}c%Z?!cMoe-Fd&t5A^64&*45q{RZ2%x|b= zN#+I%D}yWg%(i3vpb7{C)Ei^=e&nicr!5f3>L2)9#YwRaluEs}tNrMwT2i5S);1oE zfyi6(M6!O%h)LZED70<_Hj*JYwaWVYIUpq6J;UgJ|Mz(-A|>F<7%I6kth}`SA2`&h z%TJ7LCf=hYAHEM;+&(XNBIqDjDRr?S1SwTuUe&U}7Aq>2y6Mi-OT)5jH-AWMr+Qz8y04$pYr{#n*|r8*k&oE%x%}OJ7Rbrl$~w2Cc6WdMULP#Ihk*`5 z#;QVL0P6rhnaLl}4VGNC{qCRQiSGuVy78#4iwCpzcBq)cF3c1WyfHa9T*~-s4$7-v z4N(!p4f{|hK!Mg$0?t&jo{7uAZzSh;1Wn zJTPIDkWUIJa*#iBk6(leDmNK!9pK}!{{_UUI_j*ne8M!#602#1=gCFEdw6e3@!^F+ zPujg&$CKcdvEL!6&>ky~Cp1LEF`A2Dp7xoivRSD?C0wlPuj$sZkUY@gtP;9BmZ`S9 zL>VX8LXGG0$^*@Wh*ovrUB8(Xl>C~_fp&k)6uzQzNRWYMxlW9&?o11SPH!~6PvgN8 zH2o4F6R{q{b$>qZAAI;IL_C7-#uuc9>J}Z$au%Tj6Es;eN0%{Gqz>UMRJm zL~$~>=Jd+r>Dj%Pj}6n*1B$zG7wINJ<+~w+4d-mAnH;{3JW*hNI$=hX=HC=27I;Hm z`HChG2(otrLob%QuD|M3>I_hN(Q|tqf>sowk8XnvEf10X9=~zh?M8l1#Y^oubm)EH zJ*kJC-;?Mzdqv4W9uv3K<8Sx&-u5|QpM;?T_3E=7Y_~A;iUK6`u6p@ifBbFm8LFZG zHwmH{=LuHak`s~5ZRH6g3ClrWK{lGh;V%QZGfQ!@*YuE=j~QWk`Gs1V+lNCXp4cm4tg zK#LdPRteqpjrVhJUaYp*+`LtZ$(et&0SqkcR~kXw`}_T2`LW`y`Y`#`ve@{zNPHQ1&oKE(qojy_RE^Q+ny>Ep!^-hkqhc1`rIUSpdiJk zrO&;w%9J}lB+RWI??0FxRD3D;1s1ha3yW%dt60R3@jOo(`I;BZ`2+b*mU;4gPgwu!~X4ZhO-l zNPxjtI+;P;79D%^c?3+y;GX|yL?gqtE|5K3ZG8ITPBpEC!L{h6vB9s;%yfOYk z8jqJ&T$gKS!JAl>(>`IjQqAFg`4x5QZ5H^57RCJo)Lf+r=(}J5ds}>mY(@|d2aGJ3 z_m{MPoG8TYWLom`^G6GEh!SUF)o>;9GXT9~XjIt}%)mWs-v}C{&wrr0PxSTODm(>( zo_MIieN$dL6+T1PqZj$hJ&4;ra8%&W7`->1lshu_>-)gcxQ^1@Wb%aBm2a7WO z|JCF#Yx=a&K9+L-LaRzZ7v1r;*ONR1`N>=75Hu90hwgN*=xZdt;{_Bwa=L|tlgIUJzmWSvzh}(fzzI~A- zy{??|%!PVifAv`Gq2BTHcd0hR(I>16fUOcguOv#FsNm;N`OlqRA|p@4t6K|Mr6Qah z!11^P_qILSpZ7r)!XWoaV*4|}FkCl{ShT?_kbCyFFk)^jE{G&+i~UTA6%$mU<=;$( zO(zOFe6f>xXv0m-IW6!=$N!LdVE9NAy#FUxG41vsa2n|}FmW`IKbkiziF(q57eNm| zntRpl1we+Cq`;6YRD!(e*4MM9buGY{6rk`d^KfG4QMr0ad=ap)zLmtS2e6l5NEA8e zCtm$cddt6K!O#_;QMALy!yAKw*}J3-W=X;AeMLr90(=1hxr)?nZ5h>JAuDVj-P+n} z22|NhM60clZJ;7&h&D4?N#m|GuQpxPMa-3js^}3Nx)Wzlxl`cKH%g*SV8Kh@MaG&M zq}^k(wl-kLZCdqwjn~ZbP|)wJZQe$};TU-_SkH%;8&U8>4ud-Ia$7Z}$p8w+ zwpv210uKS%>-i^?{Dt=KK*R&%6(&NH#dL#tTE$E!VlUSWkRxSiLD;^WM-9{&CbQuq z6g3w9yrgSwZ><<&&BQEX;wo$jslTCliUwA)I>_&eTuAK;;KqYQ75rtIJ1cd1}(ij}u1No7)X}xT$N{r3J8t zqvmKB3F&o1wZHY>YFwa0w`ifZ$in*=^Dy{&6aVO71K7plvU>GeXk^z8-9c>`jtnpy z$)&ADX`*5_wu5rfc%H?kNncV-nm(6I?R%)8?>T@{GGhC5@2y%g0}hjCAhxkuX$C~v zf!GD~hXVY6e%awvgt7@CSD{E)t1+fcUqOs5C5gQEHQW8KmgJXt*xT2cOL@TlblP5X zr!{+#oeQWT56ZKHgtsB0Kq+wj6eoqvmDA|dA66MUXR^D8Ry` z9pMy9!3uerB5P2+PQvKsHNM8|_jeQxoj?Rw3jNh6%lrp2{WbSprMoI9KBn5NqVo06 zcqwSoqrX~hvLq5;h~xp7bG7ckGa+6DK=j{d+jg|~xbFYCjj3xV5RK}w0=dF&xV;aH zy%d%T0d!JD=s?OyuFelbYy9?nv{6+H1rwvgr!UnH6J#waTuZ`G72@DuG-W0R{Dp>9RdD>7K@}p}bu_OF#_WZ)2Q(k>^tGV2KPNrt(8h|7> z+|rCDATcT8=rb4T`Hx^7tJk{@ElkFLl_5(4I}StzhA&Np?3b_q?U!rNQ}}0QFvMej zAIkIuU~3U)Fyro2eK_|2jfHZ5M#cpX%nO+|{{Uvx1BTulb7srZNzn{JG@`%mwZ`>) zzOenb@Em1-+f0cTdBwiIrC}GL)(Yv|G0AG}2EG`PmTT5v_@^#aU%i!H$+ia3ZutZV z=2ICTrR3uAdGR@#L@Ioj2GNkkR*d}hP$`|*3%r7w?g3dq&H-jXJK7Dz;)vWZK(5hW zz2e+g&wjd24}vWX*9(mlZ=Zfww9HW&cPK{v(H1v&sT@NqiJUH3P*83`NJLoig<~;Y z2T_Ek=PaGfluY(7zR&$+XMs!gPfA&Iqeh5m;O2M4!?|1uvX!V5CIbv)$mcuAt$s4p zqcbuVaj@D|V$g6UX^0f3vDaJ-9jn`~m=vApR?z^6WF6K@3i}(Fuj@ zx@mMwicrQnJI>qCnMkfmG{cq;-p3p49w&R=-K^2SE$gkmj%gUN2~}Ay7w$>Zc``u? zyrs%zgVpMupYn>`1*+?f<^S2CEm$E2PNndQzqa58^z`X(;1xOosvJOyE`g5skG&NL z^Y`TBLf9)-iUf9JgcWi3`$5Q&?BjW2ut%GQ4`Gyog(>_PZ{4WzWVgVOi zUS}d7Jdh7RwoKL{rr7YX{2GtP5k`E9CxV^xEMoQ3a9xexy>kQ+D~1y%saPrsg{xyi z!AoDyDB(TVfg!?_=;~fOBte)Qj7`n zS2eB-lfG1DeEm+wMK#o4p`+yeu?eL`M7FRI3ZAojH*-Y6XZk_D0-eP!cf?foJdp^6 zfGEVEoTX@G141<@xj}rSlMU#NE)wXrtIq&>ks2!lQtuz9^%9q<&00nz!RM6)F@$OP zpC`vSca@B=RirVLI`H(g2XjBV;We6nQWhbsmqi#J!n=}fl$?Z3ecDZ_EdTeZvL z?;>2r>`Z3T1-ZL(yJbA_0BwZDZtF=xUeqALA4AqXmX*V;#iryCd|2@@TOcelBjyo| zB%`^AR?TiW3Npnn>7-!LL}oKh;aMH*AQdK(r|qpQMT|4UOM_|5j2hrO5I9bDEqSC- zhM|am`CCulPa63IlM7EE2bUsM_<+4(#Qk<5c~!P65rV$@fHINQnDAIV(;FN3fwx#? z>k<8#Lsn@m^rLXv(Hhln0MQWcmJqF%>H?l;KazZEVtRi06MQDepVibw4B7dT(LD}@ z8R5!&t9dGRrHy&5pW$m31>zYfL5~VCisS)8C4WyIsyzV6acsD&{6iKj#tJF>oKn`5W(B!}F z9K;?Yhb)b^?(PRmWOvhe-Yge1bS|rekKztvl4FC5iAfe65ms8}$TZ!J(XR%V_ZVSw z!ZNQuE*F{+-j>|$^tF(Wds#CRDY|fv6-DCazu+m;zcfF``|iTrbj|NBOND7;V{>&g z#@yG_<1eqLVhfJxh~3jOxa92Q1A6l}%K=W={KKB2ep3v-Q8Z*z*!}pp{Wuc6r6*de zK_GSYA^ah5Pl21gbJ!m`IXE!K>U3rhRrA|#ugGVyVl1**b2sQyKt17e?J?y4u-@Oh z{Gh@3P04Tcz!AXS36A%+M%$bpdi^@&gyScs03SF2R+I;cnZZ;~g#~>w<(;}m5snPp zmtnSvHlKb!i1>_Joo#+lHj*}h%S-c5<}uQ~c3Oqv^JRQxomLk^ajo2n4pGYVxY32F zY9Y-(#Db$Kv4UD6$wCufv+o}-<)oS8%3)tbnd{UFHEH;K{Jssix)0KqWo2)*(&_q% zgHk-z&0O=#i!xFEkC2oj3(@)6U(Doyy&Q`9GBL?668{+M&1M2k@XgsLZa&_>O{SQz6H>ZmE9x7H+xc$9z#oQPPnaV4m%U`1JG?Y|QldTqLbNmP zIThJf%PsaCD-m>5**7N>U`6lIOa8le5Ph@i33lh*x#PjrqE0|Xs5$*3Tn+dGu4jP9 zWeUtIS%<4@lNAPcqDc7Sh55XHp^=pna#!K5%;*a6_CHeZz|TJ1?gmds`8s{PKXw_~ z+oN`<1HclbVvgm(XGHqry&H^Cd)@+y$58HUVNIym0h6)!3XE@2+p<+%BFMS&LA@tDa6pgsIKh7m{6= zwLTOzC6oH#6zdNb3cyAlqEtH^gM_n7CRj!yDimgeMTYjG=#}%K zB{T2OfBoLkz+B*J^oHk$pFcC8US)7fSUIOQQc$zU>I`>TNP&T-Dtef`Z;e3C3!+NT ziGIr^7n<36x)F;0SeNu|G?f*inP1>@r|Kt@Pe_pyif(`h;|HL&{hr|Wagtt|w#XE| zQ=|f_uf47WzC_k=z*?49(y83n0^6TRlKl(1thRqN8z&%^MwLt&H>JV3QYbAzRJJ#M+7W3n}WJey=G?OL3n;Ja?~4soM{_Gb;} zC$ibH0UDX=q4}yL@|6PN`B+uFWn&mMQWuGeB6!u~sFe2=C6n1n`j8cWWm)~D`%$W1{38s@VNmqiMj3Z$GVHvN{i# z?j`B;tXDFExMA9=_CzGc`aJPk_N^KsJ$$?B0o&iE`1|02r#pa$49v(I<@P=Rq11z;$pvz&dSeqFceG4bWtfx5kJ*?zxJTb%<2 zg2dPbP8#nhDKZeLk%#!~+XEEeymng2M|7Vj{zZP-X8+KpDQfp7M%gYr{P;~v{?a$# z$w!5HIkr%G`Iv3IxZI;5VBR~mc)l3|DQZAX*MOSe+a9b<7 z{he0N$eK3Hcq)!M4uUX>b!c=jB-}pEP-Jz#V+a~>)XXQHb}a%kvpyZt_?hf+Z|}tx zO2$aWk_r$ysr&x!Ht{Pcu;~j`4pvz6mRnZ9jDEfi-u1Mkmtx@dM@?D=`6P?Go1K}7 zTJgO3gn&wfYR6!myBDH|)6l=9WT z_IQv7-K~cZF%oz6q2{SK;Y$`xonYW1ow8%XN2+rF+hFnDxYcE7j10(f{bqTtI)23e zT!i+rC$e#JBQUiKh1siIEWdqRoP7X}+0e^X82*|ttf*Hdq`4sgx&@>lHMV{v;P$G4 zhDmg2LeKE%jIZb8{kjRO+J*A)m+aE$c%xW6v;@4o)1SgDk6RT)ot%_AkW#m1~=~zqLMR4XEoqF%zdqE^BDT^(nWN zWEMXqOWl}75QHr0c}Bgy4~|Wx7skw%)_rbn=5V6^`P^~88lJE<#@*tD-PCTgium!& z#oO_K;ro=fNFP6`cHiQcm(#EpSe@@N46;Bu_HbBMo%v)dM`w08GGkFbGzgY8;n=da zDVypks#lUs6QHMKCB;3R09jyR8E9((MKkPE|6=3+#@vtd!stDDTKG9>@L4ohF%4AcL8n#(JL%7-UIDGX9H4<1YIm=H*cWTObO6|+cf$=f-Td_k8N^>k9xDRC8R zdMC`CO-&>B<+Tts)YvknR;ows3T9dLg)aIb7@(7jgaPj*Q5NMafIqfL@M-8Xa!z>n z9#>FL%R0lFA|ISVpc5ASw%NGusk~#qymYj|GPNvVOcLq?hMx2aL7IW;2 z7p}gXqk;YV**@}@8%JAZR#>7vDp;g4Oc2-b&>Y$TTRUvn*qX(D8-E@TY50Z@j1TQb zCb0lcJ9A2T8DTS#-etLu+-BEjoR@aZ&cksTU`lz|lm&;%)iaI7Dr>+W|KK;sog0H_ z_VPejvXN-ZW;0lB*A^tvr+HONT3*E(&|j}N!4n~&0^#`C6JnAT7)r4)(ieiVPR|4# zL^bA31`ib0ScC)$7(N(twAmC|raO+P<43&EGgMG0k4Hh#ohQEy;k~2KS;`T~x3%@oufI}9tfN!~u+1lD^zu-z z9msTR^?zZI2#5(qR;B#@*@-$zC?Mq33Wejs-ECYCqnA&&AGTI^(QqVXNYWx?Jsl>(YVDuu@t@4$9BLM;EqcsOF0WQQ=E1#VYDH7_uYK0IgLlin7#s)7oV_AEt$BB3 z>2x$V2}$oY!Edjw#;3=p|6SraR7FalNhLn4vhm;FH*zLN*ysH!V!|aXy6Y~oc3E#V z%Y8qw^8W5ae*;l8j5Covz3F;#4-#L@lW z!>WWzuJPIBJQJu!trNc=Y=_nx{=pMolUWSRm^4|&T&u`tTEyF<*tTZ%U53J%nN-2E z3uGl_68*fOt8x-h!yGN4BEsS7vrLF1%=2^g4w|am3A`5i{B(4wZ;*a#DeHZ2illJ} z?=QY#$4oPIiTlvTF+GCO_NBM4?>G3O2+b9%9jy^^W8)r|UX3CgdomU}b4coJ>BcLP zWRz4q)#hS{sgLdu3W-UqnIE;Y_OJ8@J0(wI~-^tA$?f*Vs%I7 z9h6;3H|A0J!#bt>opB{J6G;6mi?R}|dqT6>K8bHUX=pxR3i5&sRjTDceW8pF`nYSB-b zRB&0;oda3~9&qgs-br6s|LBEEf`CLl-@yA_ppq*W04E>@yb3n{G)y`XJXz~?vBeLkA3j3>oV z@36Y8r*=BsAR8wJwLRlT8eMiHs`?lC^hh;c71Q=;VXSugE3itpBY+k`kDU%2~IhFz`~VWReGd~NXBrzSw}O|V+9i}nsIXd`8UQwYrlK0 z+7QQOLSii7Y76ZgT-+PB`?SApj7)0=bUZ>E=OX%_8Kvy27$1Mr=8cw8SF1b|;8j^) zZ!|gj<@yA+b$-44=5+aCv{;wh3jXc+i#Xg0*XKnpT_LY0BAH_F*IWemo1w|}a$JTS z%4jH2*MFnM1U=(Bn%Vf0Br|tuDJtwLxcHo>8#wc34n^VZ{o{0aWk((?p@BPYML~;{pw>~Hhv2UYof9D6h z3t?ccWe2AN-I-Ker~k0^~`?qiCK{^I^MWbkWS;d^}O5D zlrFKM{*4W9p!M)Pqn)t5?i}Gt62?{S3RhK$Uvfv2WY!Ox`yg#m1)-WGbu}FMyQSZ` zUl&9W+eE|#D~K~{c(D!~FFH$m>?lOP48FB0 z+a15pw~qPEzCmupzCo8QJyi#iD8T77bv?b9KY#v=M^;xer)OqT0|oIBL0bjRoTbuNK)Mv1S{mv^heAjC^{#ONle--}iV!gYE zGZg-VBkT{_dgMDX0GDO?pL?<9uhJW*IT4Irhx?_vAXxm$bA4Q*ETjfH8f=e=xMS_g z8Ex2OF#vELH5gm0xk5q1q%CklZ zkRP6H;eT~9-A7xsG#bpi6d#MC3<{xu!=#!kii#z~qbP_P3MT-?XieoK^YieCd}@sH zS|_S3$6uNM#-GusRF42dE~QT8#g;!cnUZ@~;q_JgouPN zq5C!*+02k0$({!dh7^%A#gX-}A$=YUEyNlcJ>p`X>w)eX*12|bTaeMN@^T382FlU~ z54{rTZme#39d-)q*Q0u50s8u07z^I>QFezhvA#uJ1*uo+V_kg?OTDZ<-u1N=u?0GI zMkO1CSv-leHy&DzZ~X`Jv5EmtP~ra8dlF4qs;MRty?F@(V|&q6stNy4a}+Jr9DQ~5 zX3d5@cy7;bpk9v2ZF4@1Cv|P*!HP5Bb@#|^A$wY5DxBQ(FzTB7yo5h_WGp;ZZ>3p0 zcNHo!N&fEpO!;_IC@=3I4`IsZ`<|^{^B^%gQ{0Tx>eHk_UarAQ$5t_@#nvV znu2oOh}fn#FE`Z8%AV-1>)XpagX_0DEDbd^;bNp0FQ9AnU*{?ckC?|X@B#K*UKs#D zW8d>DUr(U;9#&)&9fUmpp%l|#i}V4&4P-?H3f`Q8Jv#e*&PU(fQkQf3Uk~R5dYmv7 zX3uZ5AOdc7_w`xUiPJaZ3kf$J0_pI-G7A={Q!J1Iyf=7cQlZ~z5E8mcXLg@G7#WY^ zwTX1Fscb;zLK6IRQ|MG?Ci0rppEgp^pCY@$nnik?(2MOI{?FmDWJ8$$DDYxi4Gw|U zy}hEF{WM5V8B+NoYlLK2n|0IylatlU#ZAH>=wp2F0R}++KTe7S9rQ(RL?kQZ%w1y2l=u?mlE*Q$3BR@vYeTsbACfu% ze8p9R@|%Z5?1r`lQ3=kE?!{HuDiy+56t9}0EW?(z6`er|tcfe_ha7Rv^;j9BPOER7 z{~s`h0-xc#d_YSqc1x3|U&ZpASQg(b79d_<-@UH>o2p#NqnV`@e`qz>l9@fAq+;(D zEV`OQ;)3}1$?UEk&bPeiHVX2@NU3-F(vu@QB?5iCL*eI=w z0ahd(SMZyvKU_iXWaJb{a(vN;5$ zpZlT>`G{-P{l+l!BAMdz4x=sXO&LZm-#?z%>crGvQF~AnQwC~P@^EG;Z@Qq-mxhuO zUak6G5c91T=%ZP<_sR0ns`y*{{l(@u11j~M8S?tN4bv8X)b#eVaCZ2{VBZX_7*rm4 zpXqH=Lot=>hKE%}_OTrW=>NQO^js%19Mw&RI}6)xUZO@ zx+EMZ#EpA*J-Qjdnw6>p^j`WD4Pq;*N0vEUqy)0EMzK!dkQBqHOu1+o)JpVDQ$(k_ zJI{DK_~?QrdUh_;Gi{7*3!}=9(#a#o$VDjsn5|*F zBrNX?I?pTHqKBM?CV21{$Psw|ufW;>Ia+`p50DNmEU5u$E!maL-x;`k^pKz(*4q_X~~lMi7t7m&!D7 zQzL`)iqMTTD)Zc>IySYW<{NgpzoF#5+9u9ZBLrOch32P|pkJU6_NvXC#oXRPR^J}# zACi{koq5TAUkaIN8+&x!@PP`Z-=?46l#%TBDr}idZE*%2zQg}p4@No5J8N=UB&ro7 zgJ~N4C!4-;49wY2Pyd=XqC%fI7Rn@yEf@B49uRXfcOPO=Od_;8!I*P=yqI%rniFrXC+E4RbN15B&r`!J$=Dzn2@-202m!a-; zF_M`CqgUaGW-QG*r?V{O8819rHqp%;o$&8hUc|ya3U&aM%67MOmo>a)4S@gfCc0qD zjE;OQT@U{|%51l#DsMpxzk`9n>Na?+J`|lwYoPH%2Z-%lO(jc*?~}Iq4M}xL*%8OH z1EYaJ_+k##CJ%C$`F;Hk_wwfgcr({lL5#o#y=^p4!K1Y?F3DPhUsyxTnQidAq&AX< zMre~iU@9@0jx;3nLUQ(v)TLpy2{o4$kqK$M_nnA3b*{^c%onhrQy9R?O`+69m^ZlN zk=HWm94R}qcNLO3S9V;cWW#-YI}ZUfNTvTmoXPe?bWF&IG;rNZuUakc>w$$u5uR66 zH!zOzi$ULe7Sj6ig-X0|wHOQ~oztPB-K3`j3s)Ih&Gz1TA^F(CvA@&er` zniXVHRX>qiYbhdp1t(@FWiqlbpLvoL+2mC0fNpMXV6Z+yr(#@e?MI>~=&ZQ{P2RAy z>37|rfJs@TdX0oOSB8Qe+O$K*0|twwM(nhd*C))s%%@dm>JsG|MfD{_5i-8W-5sPK zBQGQqn_);0Sj0*71nB_sR>`sOT3$@3sI~@iPvIzY&f!t)5JEDSiyoT9A5W#RL52FB z6zpdrVe{OAEzGHvIn3!xT%{GpiZ|9nuG2w2<)0+v$I*-BLEQ9FTC5N-)sZprq;Vh< zK*3J1tg@zF+85zF3qW0nj`xrGR0F}vif3h2V(2eSVatiTdZx+HBEY4%{LD+ zoYj)Bse0ULfhsM=nY$`R4mr=d5dXW1yhDW{uz_Y&bu3ZdrVAi6;%>7mZF$YbuEzck zFmq}H71+(1?Uw>Qb|e0G?6N>qQqh+$ec^n^|K*G-C3Iy3%RaR-5}j(OcmA7W6ud zKOSVwEvB|CVd`SNxXk}>%(S9P0#?6PB1c1j(>SBKksyEv_TE06dcYv2#&##;dKdcQ z)lIUDvBYcN95~=7F}?ng?5-7_njgvv3U7$yhw__;3Ed|0iX$Y$136>KlzbYGzp`12 zbGzeWqGtJ1w71Y>lFU_=l=Et%s?kj#{9K8^%mI>YpB&%${z}o-c_x_~P#fHh#G1we zaB79`-F_kxMLdU0XNVHL{apLazH$2ec3b~RKK}R6 z!SoBgY-tmwPJ7bG3uRywMPYAz-wj7H?H{0W%joa9{t=z+fS9EIKUm|B=wzhtqQ?JD zzx@`mWTT#zYWkO7>{7KV0r;FyOc@w@u^p6{)K84~b;7Um;7;J1A15Nl6G1~zE0MyA zM_b`>sNi;Rj9ULIX1FZ+=x?qlaG4I(j5$-#nJ{v=_+`}RP~r*9Mv3?Lo`gBSx)3#W z46Oh);GA8& zKS1u`Y&_*ZSxZH*s>HuDfWja^CIV5J)-k_nLX)4Jgq&6lH;Qy%F|Zp+ zb;_f0<<;EckNx#7=7{RPOb;k6!t?PnPF$e#Ffd9@yQOqnnsUXG# z$yOOd0ol56o{!kbu$x6}u_2E+_jS ziGnqw&ndA6nwFWR^}mk|T#px(*&jWf4G>b!$Rg5VkCRI#C1ujcI6!i6K`8&cW=0;i ziceozDZ)Z`29$AoG+(_N9=b)WkZK>p#*F?b(<#p?>qr-4^EAW ztf4P$Ct3ZcLRscfX-1TNUu6%bNR(PL2gq3-`sA8-& z-*asErt;bWd3SWcaRT1A!(|c0RU5%&!yivwyA@g7A7J3UF|cyTib>WiYbq)BkJS;N zuGDX9hnTqGOWof>g7W3TbehSz3_p`<;#y#6dTPhlR=kJ%^hD=p$PCL@)63kDzhS1j z=RygvLX_G{sV?@fVq}6AaUtm>M0Z*YpVT5yHO#0J>wchZ8#0lDN3YtpB2Hymk%jDF zj<3w8ny^RB*ac2-qW_X8cK;wzFc(U6Kyz{G##lUAx2i=Sy#FN!FpxzGp~uZPRHOo+ zrljeF_-$M#Q;>d`K{iN<#!*75?cDos!;n*%N{pp&UJ(v&?N?um>C@R5_`$}hC{L< z21d8g#kUJ`GW6-F!z;V>{Q^|p(UnL&vy)Zw2}ZP`vsqkh#-d?ADRhE9Ua~%X-}UQ# zEwa7>1oHB_jxOT32TD2X13~3~K?s|BLycAgAJ*v)b~d*X)`JTaDk!pzkvJ_L&G0gO zi{5K2%m_)sc6IM5QTPOIB9k=|1(?&W$OnqA&0SJJA1#Jp^*_b5m9t)Eo(iLo!e;fTL8E@3}xqH zK+Q_ebu4Tz53dqqN1sI9IqmU9dEf7H6n65P=j zVKL1f2}x5xI0QWww2^AUA<31e0zCehd_SZm8PUe`+WiNqIVo{G;g9;(v7D#{|E*z; zL<^1suutPY<62wHje4ZRI}RgBc>%eG@h!HWQ8TMr<;6rPUlCa&bmSSm5>FzXq%ez@ zvywaud*e`E0#nEcM^VhWF2&+6n_%pq`Ul@2VG&0lx@Svhnu$=EJzGnx;^U8tfgWE2 zY;_i?dtTwQ=AQW5vw(wx3<*Y#i19wS4x)?%k|q*Q6!!Jj&xD2=W#D6@@ZOc6JY*(0 zsqhcG$C$evO6aKWI4(~RxOy9{=_6n(}GcMcPMu zn{B;U$~3-pH6V2}nC89V9gkV!stiR&D-A6j9U6XqLKGB~=$M#Jj*`++Yzm4*hqe0M z)Ed&isV#s7%Ex5=z>{EF-^*(n+Jb7%W!|Lu8 zPHJnapXIaA@PZ&LYyt^gjEpbdL1Ikl#BhS$CNkYCp}}y-g+2CUzAz)+z?4ko&AB?KxEd;5_OpqukXW9 zHfYoNGJ>Iq7sBE40OQoZCZB)E=oCC3N+0}61@1`BFuO~o>(2+w*nE5_Sg|ybGf1$T zX~MBHJ}Gin>`*+XX3!6vHxqI@WN=nF01g8w7?LQ%TZidrzf6F$4`OidZLo9nkm_my zYn%1J!UHe^n@sYHc9~8SlA_i;i{ftZ1y7=0VVI63fu+7Ee8vg#eS&O8*cA35aO5M= zA)X1@Zp=5Q6hI{&*yRC0KWvtUFxw@(|Ja0!{M|-PqNZ5q6V1#k>!Drv^cpU3kqC%? zK)o)EN5{>(tjOyI%9ke*O)kK}(ybQ91yH`F%8Wyn<= zkC4#4S4VlVr>6(|cOzjA&2}l5B?rLyAMLBVj&T2D`}+w)0u zs7*yh1>=DVur0jq`rpL0>6plP-7KO`^8XYmx}p%r4|W-2F8fS&UX)4t?BVg?${$94 zc(yN1{;umT9QM5_M=LJEaf+o;Rg!8rGIkmISvl)jp+}K1ywuErHKFafUtOQtnCFVj z9?mAIGBisUn+th}Iz+6_jHTHVjrP=sC*D#Wrz(NA3LDFYVyA4J;zhsYS9sS}@)DII zWpP(>l~~H5gsUFBuNtR}`JFQcYxqz$+0-!Z(9u35Q&ev=pfhs^v4#J4r?DsTYf!5n zoVOtti3hErGWE%$>GF~S)k{K6QK=7KqsW&wU$M-j_@HhfxbJfP>iM6(lN;dO`mdev zejkUyKdcK+tqG?qS}2RjY&q{&voK(a`~_(ng8JlfXl?KBl2}6gMpxt5=GvOs)=ynaH zs0Os99qB}&6mz23JmksdMANp=Y&G6~Fg;CDK*Qx-b^nr+Gxh7{$nAvtPZC!6#lZ)j zQ3?jGmQDwf;rsTK!T5OedWN)q%c&)Gj~)ObbY9yZ`hSDM{U$;XCf%|=KCkh)ihqmg zX$lG{F25IwAS)}n6Gef%NGt5mQqcuGCm3nUZkhziv(%gRD^DRmO+=QO4yDb1T=`#1 zeLjFDE`WKj-$0CPeUVbab$u}uPlyJc&l#hABh^?MjSv@+i>T*G;V*~kl z=+AlL5y?fTw3#QBb@dQsW=QN`rv_z;0)NRL0W9NC7+FY<@1A2Le!ViYJ@P6vf&gfV z^kP67W`gP)~Evm3~Zam)eP$x0x-KNm(A4RtmZ5Jrp^QPyoM<}wv-$=n{Y-Zop$ zyA7E>lz%jy1G)Hc4cQvB>R@8c^#X7WLaWbk7|Tn;r~#YzSl!G>Fo3=!#+D+{X?rPTEz3k0=eiI z?*|oV!ck5^&@*Df_m;%{6Q6Yg(gH0l;J4WH9lilbDwIFta%kI9Y1$X95_k63eZBTzb$pGrQd~wE zVPvk82+%=S*0TC|j=K-3Tb?e^43= zwNV{dqrv#z@ZkuK@^Ju3Y!k@C!?Vc_IUA_&@o$mSM=`7MQAI}K`$YM&;rCOtluu%G z%e9`%Wj~`?fNr#@XNBZ7!2@;W-1V%PFV4auqHUx#GQsZIeJMCL^XVs>NzL(}$(1KW z{-s|mj+;w-cbX@;H+`LAx`FA;Af1*2|EseL zMybscc0OIb+gau$$aWAM_-T!{rnSC+VydB-$S>SZ!eafAC({tWF zdFbj+`RJR|uF$=_MUMIi-1O%FRgPEE z(}_^M=W04A3gLjGT-P;hijh%K{2~osixev&5;Ixo=!qy;jX+Fg%gODt2KD?!taM>z zlax)wo?xP%s_#sAh-|2P)VsT$_`qwrWZNoLt-eOqgemhwhSC<*Sa5Y*_Zq&>qoI_G zE%Vgj5n^YrNI9y#a)L^pqrAahWy&fsDL6YHay7#&pH8c(Pj0W|wzFm*Sjku~ka94$ zgtTVy4XiS4Y^0f#*F#NPeoXa|51H^+1MsUNI!c;kD|XnTmXne1BSW!9eMDm$JdBo( z+O};vldfoPJ26V4WP_ZShR9xAMDpST>7DfwI^qHSI8A*>g?iv&3%fEZ%n&t>I-|L0 zvJhigYcvK%*w;e^%gAWpH%t?)c*3-$&^~DUYNVsLcp? zDg~b~Zaq(5UY|pb)Pr_LJG##+K|1Hp&UxH{BHJwq(;f}%_ZJOm6iXrAzk8*wqZ?6+ zk2FnSc)@cxb2GZI9=lu<6uBlXEIMd<<3HNR`M*9$qeVHrC$XQuJsY~ei7hY|-3=Nq zf>ZHTUhqDL&yy|lE3woh$!mqq?+DCZ4+UKF!tUyINCqn?EmpKdS8!)Eo4K9xuaYVgMa`DRmEW93I>@wmF9 z|F6`pc2##j0c!!omBnV%ZVxTU#RZT?&ww}pvjXyu?bW3Vg4N%X5W)5KB8F#-{215X z7xS%h5K#ni<9g2rO@{cPFNF`oyU4)hI~3h(3-8-30n%@41(L;}1dy}CzsK)bM52LW zs|B%;3DZ3iHuhjoxK?sWqK{>iV_2l2mt)QnwsoBgX)V>mpDS~z7`vhs0)qzD)l08@ zAIuu(v<4Yfhbw}%_j0e@Ic-|WapD{r-G^wEbNJ#G`{Me0#Ne)%KUHg=*P*4-_u{1x zvhVxZ^D-E*8rQE596#FMp1d*nseO~nhJhlQuC|j8zd!m2AqG9dSa)W?l%SJU+;LeA z*#QIa87M=F;}_G%@-2kX@8E)q7ppBos~A}VkzSgA1c-JU02;2xXaGaFd0tq$4w zi{JhhCS7`d7^vL8rtOtgeUzqV%EOu&`r6PJ$CQ}@NV{rX)}z+m85-<-ELrj=>SsVU z7X@c#hXoqQ?%XkmhiF$I3K`+@Sg}9;OL8vRp2^PQa~25h?ZK4geGq4WeHl)`vr)S?rPZ_23|<xc zYBw>XdYX;@d{OCmQJ1DJI?b)N*UIpgKvzGRoW`kyFI1V!gRK8XUf|PA%HDWh-5IFo z1j4Dt7+deZgTx`vZ>46w&MJO944&x!O^*3d!v+EDY%d z{)WcaBnVKZ6f-6B^T_@0#{@@tLF9A_qy?s@0%GyKldAQQJ=4Cn#Sl*N048~9>18iC z2pf2kABl?i=1uIcXz>^r%(RFr2W@&;mggt$mVKI(w9-`_?4dDxj0E3}Ls_ex6>1TJ zvOF-UTagjW*>Z})kH-YFx>k{#kb(!I$z5&jxm_B{wX|%^&X*g^u&Jfs{OgRQXhxbd zpY4i@#@IaGEzvg*(P$t70uJ1tHt3{ePo<}(Y#PdzzD@r+@?-I&#nWPNzWVg)4L4TpFRa=IS!gCx1j_gA@-&4h^p@1>=jxj{2^XozVN?gh;D9<7z( zR_}wlr+G52^vH+G)hqJo4>~dmRkhB2R4-{rE!~ zIbh!3FPZscI^Lj{>>%viG3Bu?niPP&^7qr^Q>GCOw zx{*dKi&>)Xy4?p=>#E`fK9Jr~ER1ulBp*qq=P-L<+X1ljmFi>$FJ2%^O35;0?udfu z8xxVn^Q!dsJ}M3@x|Ug5RMAPmhPQ45>AA4mOihvII6UY4~KgOvht1%H9A-aDB>CWF3GqGNsbT8{P=pyfao~#oXB9Yg0_QnXbA zP@_|>*Q+4qlY8RYw0J}3Xlb($S-prfgHJ)tdiUq$kjRrOz_7hfq8Kz@D~o8U*mr!^kM=$70ox?+=Ny819=r$x z=0D?XvS?Q(dJq1-$iJTLzO;z8V(nSYA6I>m2QNj9+)Q)1o=7SOd($7)X2tRw2M~zY z_CUA=c{kl~aEku+oLuPMk#x(Xhv^;bwpmx zZP43PrAt#{S}^TPDT=@HnLT^>r>mEL4CCeuj;5Qca#TnWueke@sC2+2q|evdOwzXT z$$YNUV?v(!hgWiCZc(a?JLtC}$d=kp_hn0drlhM+;k0Az&va!bi;LNc2fAK6(oNs< z2Lm{(`6`39@`901iS9QQ7Eim#7k~eKKd)t2P~TaM71V8E0C+m)lwkWwQLK89hu{*^ zLTHnxVjYMUT5*j7?>ui!d`LQ5oMv9K3(7iB38bR-dDx`VXmK>R3K83x@zc$j{>meM zi*-<^;g>MRkIM+}8x}U|F5afqCwxYAe0StLV#`hBH}-{bP7;NPq+p}E!qgsNj%~Em ziM?BsE|SnTQt}hiAl;27;j+1yKQPyd;voW2%=0#!0^W~ETg3aK!qv+j?CA?=A-;rM z7j-Bd>6(ePwW!D~sPGi|aTkGWRIGLAt;`y0kpYg+wp59_G1&S0O{gxS&*iO}0d}KS^R~-a}8d7!|YmacTDikI5wCBYy6I>5H84zV~d(0vT{b zEKL_L4UH_dWI9Q+q~*~VS}$F8^_^01}dXD@zI?f z@KRsvWh%&$zZuJaDhM0VB5;*LCY4A2()*DhuAX2)86oShotpkQ9kNh2B8~sU=)fht zS+0%HA5UdVU2>=~P3(?GJJ}5EaI@`EDz9Jz@KU=Mexa++?D`TjtHuTJ7xR4 zh-bPrZesQnfsUgMS5Bw5Om8}wI}HF$uj&$p#k}%U)v6-ssf(M@c$|4PQQM+tiEHjy6w4leEo5xByj@xHf zxFI?rqWS1D_uPfk(l19mjZ7|AUezdFFO|c+mocw?Zm;K z?oE|I^)DwmVC-NrxEBmro~OkW$|JLp6lCjxb+HzHf&#U%j^n5yYNc>l8KSq5p<3oi27vdDO{w)he2ylw)|YDS3| z8{X#A*o3qM_=67zlB_wxC~=rwrSf?Y86*0=YWVr=TNk4n_OV)&p~dTNu7qi(u#+g?yQ4P`$F^pLLvUj70 zu)P1ySsT6fG4ovJ!hYqPuOE>iX@`@k#vNH)_W=&1^>@FmMVj6f|AJb=aGnjjC7+pw zF6SDGz4&pUD7K z;RINW?!2$EUS<4kpEn{@KD}`DKlssV+%QIqK<^|+gB&JU;i__OQs&n7A?amGo2-y8 z4j*tQZx`F?hdaws>}?+nRoW}+0! z!2hxHM^$jbm-RYXlL)4>25yo^lW4=OWE(m0pcSihAu{7=I(3%QX4dk%Zh5eZ;-SE7 za9Gka$|Do@caja#lE`{8A9<6Yc7t#f{>I8$VDNd7$A1*mZp;-#6;Ct)z06`d3I@Q$ zv{tP@zJb?|iOlS)BdspY)(|_f1Eb?o?;u$;Vmg7<9yp9jnd5-FN+zTct9Lhkv!%@5F-+C;z^WS_<`~?e$R0< z%ng!1Ek)UlvN1oo1}g{I;lOHz^hv@+H5HmV8`5|;6v~?s48;`IN)vpJ;tiDd5>>VM zVegI$sPa>dy0LL$Y;3H5No{RBY4Y7r1e!qbo5(|Zgh4;lRqM)w_KavL z?Ay1G51Gm7>3GY_%SByX&&9)2R-QYM#w-ZfbjMF23tD|_ph`NRBe{tjx2~Fe; zl=c@SFvh_6hRShOHz1%^!_9lI!wOhMS2oe_f~!qG_LBM;l$TU3Qi}J96MJzrWr^&# z>q;|$kJ@oBgPTyQYR~6!WhG=(6pJ^!0=gdY>|+->ZJy!DP;rX-=81bvE+X7zXv_Ul zRrCd9@N^#VYaNuxL!`Qyp92g zS7UkAY8=j#rb->9P@XPrFvyOD<{B_Ho)u7n7pdWVOTmq$N=v60LBiY8$1>eu@s#8M zV23LUGu3Yh-!)uC#$a2@?xft!4Rke3+AK;M+Xb7FjP_#7bL0U2C%oz($sA{WnqEwA`F#SZ)uByQIR1W^V_w@DBPNCs9R0enmikEc zf<`do zkpgjQs4A;Lk9RfE)!apG%)~d(L19vpg6pq>pEoSo_&3S@A4}V0;}7(}ZU!U0%)V4NIG-o6PaB%z*;q(6?5>{`M&*|Zn+-kL+uFXL-jAUh z(!gYJsnY>xl-vi_u?T3!)*-3xH`ia*#D=yUNO-bvxK2kyT{5b7Ig5qqn+uc#UuOyC zh8Ih*8QHtzf%!oYn>vb!i@57O_wd~YC&+loMOF|sg1wp8r~6mfQp{0m@nexOFN0V- zO}b3aKk>d7yqimhXE7czAk3tFgQh>Gc<_jtH$j_Xdr&e1F9`+%q`fcpa=zBkEAi}XIGby>cqP6cy^ws^7?gSTid-Cuq@n9lvmn2Zm3xgnL*_< zu89)t0IftVk6ZAmB?dTlvC-NV%j3@`vGZ+Kgp$)SXYCq;&vE`7*E^WU{y-t?U6BJl ze-kTz>rYt3adXk))J~TTL08`|;>*AVG@F}H_;Jz4E+rigx~+?4lv3}fqOv~t)90RW zexbm`yZTN5X-=|2$&dHf_Uktr3)d=nHMhmC3nBSiHvu;CXw}Prh|&AW!n<=yLfw;{eN3Osv*%2K+uvFkTM_^srKY0H5r$*eZ^N(0HNA)}GMn@eDat}_0 z<`XHjM3uYvRm+V;@4P~uzJx|yeQ|2CWFT8}dc?jr`mKwf7`RCcQcB!7UVh?T-k*&r zo%<8ig?o|>C=xJeya#tnXo7zKjOf<6&Ub=y8EC-6@g#1$y^L?)dctGL*PvSc132m+ z_$3eD6>vp-A7NMQTst;NtmL}RK6S+ZsRZzT^vtFV-vZYm2hM19(obG?0H?W6(}p){XH=%kXsH+sU55$ zR&wDfL$%i?CtFSU8W=nEvO_A=DIc*BtKE3ZLFbz>=>9-(CV-Cy(;YQ`^P#WwwR-x6 z(iLh-2n_wBpfRoV%2{v}{Pm;csc(vd7!HTyFyW;~#U-U_ULXaDigqKBAZ6R6#swc* z8!L4Lrh>8XHP_*fr(aI%WQ=m^x1Q*4J4PPm=i`50g8pEZO{)m-o}>M|+!`Lq7h^2_ zmR6lAKl7Y=_)d-~vzh`~P=GmPDoP6foh3!rNLuVyz*6bva9 zG5$ZljBU9wKoXjXvyl%k)v!cVQ(hc9P2W> zv!KDuXRh^uNk@U4%;%=Bliy#YZk~(IKjl-#o>&mGpsYxWYf{0=pC~c_8MzpfVDSqZz%P??avt8(9Nc>@gow3yHwB8ZN--eAs zT9-)bX&P>UW>9C5KN~{AtSNbyqWQ#j)6~y8m+9fiY15W((0~Qk86UFBU&HZIUmW=5 zmG4j0q82>i*CNk(zhG>zq&;)o9p>6XQYarA#4*3|T>fOVC3t1tIWG3-Xl()0S+(YH zRaA$ajWL(K_>shSKjE;VkQ}cC3%L?x|2%W?T33F;);}%F1DrRbKvWft*O-dCgKb-` z5e>ozE}wYt(zqrd0_GYiHu5L^o;bi7UZEI^2FtdZ4Mt~G=(H$D0L zpZEk7B4?bTSOs;9+c%yAwfI0K^S@Tw%tYh+yP!AwK?nrC=k58_&>}xKcbfc6zv81l zgp-vu&tb>G-oDDU0qW;X)7t7OuckKM*Zb1((r|zABb?{?!tI)Rt*AM$rn$NLm#?qS z&(fCoUvNfu^2o)C-qjXZht(fw6Zc0A@>QAO;P)&-OP! zGm_kTIDK|@c4Kq%UgQ@uq;+V}f{G1DS6y8O>CmvO+zJZkW7GSipu{wadZI=|jBZ-( zrKf9kbaw9lY;~ZGv65H$ZtHDKQE)G>tX%xce5ykTx=-io{uSv@l=P=q12EMsIrh3j z+0?c00ouG=wG>rYOtqP?LI|?~KQ|ww=*r8>C+6mkF@4yUh}l3yczE%ti*EMwOP%4| zSabREii$GUvIHP0kOFd?EhQ>QRh8Ym#3DI0Px-|Fh_jdWGyhA}SJ9HveFgN70?=Rx z$SVnGg7#`EgJsjoVRb2xgEPf)q}E`~$zlL%u=_~ue?&|savVK6o7i6f-5VgURsT~s zy7)|`u{Ai@l+1#dt1DYbgxvMjW_F|e$S56$^VYtI{G( zmY4;){pf0EKSLNWFNbjXkgiAU97J{laMU{1)oI*G)O-p?ag9~~(_$iCcmu=OHWiS! ze>#VM@zQ%Q12l)L#~u7aO_Lg{b3NM`r{KH3xpD5ZOjAtogT7!RY|27N$KwcJuycT_ z{Qv!~!p?y#Z+h?iXajeZS?LV5@=-!-6?MM@3INRvW}sI!*krud@ww-o=bq<2_xa&D_kJ#Ytex#I4JV1f@U_ht z6J$sP0>R48z8u*8`@5KOTyDeNLEO)~P%Pwr*D|o@6Fh`u!wJ|=MeywB#W$Y*@dRG| z%>S#WCuMUk8D-dw5F~sBR(yd=MqU`fa^5%>y_7cH)F&k*=!ql`Dw4%Zf9@sce92#WKE#P{WhJN*NkX=RM8xyQGK4W z1#%((V|)OMI0921E4nytX^Ukn73=}G1_Ap82P!zK0cS$O*3DfYdswcP;+&Otcnqt3 zk6kkw?hXoHfs)sYl;u=m8pI7B6%kSPDxoW%Ru3IP+YEL>f`~WuodGLeAxtfXg^qyb zn?avJ-FB!yRet{OQ_e~xENF_LC1r))WWitY_2nrP{3ggS}ls4z|xOm22 zF%CL?Fhl$wGpuuhU=`XF=&ZDsZf+H7OpR)~UP=&{It^DR4^|2a``oMd32;BHxviCcp=;P^D63#Snk&-e~(oq+zNt=~M#gt$9dKlwKi|xK; z&L79iqE*vEjT-42OY5-d3)Q3@R&JNAlY=AiB0oKQxMjz;C#s3^C+Fu7ZGARC@Lz$Oz-IdgdFOcL3Pv`*w+D_QTJE#cgMc6^wrcQfYr zPpg=M$TrH_4ej{Y$~}dtvR7W;OxA>%>P$t(id*kDh|^ofb^@>7hxr4DBUg<5#IZwV zc1etjyV zprgfw0FtRsY$lCe+64}80%sU4PYC+#tsw)Z1_9#U97_#uVVKM4l_8nh190FWRX+oC z7qfx5>MUJ+hWUEFQEwtJS~|EP%sj->N~4V56tQiW>GYS|(PV%mS$O_-7!l!LYFGIR z;q{cV8hlFVe8BBmyhYn(SsOTPBa}KAChh)c7{%C_C0QSI(!&=3w)wRyG@Y8hkS02s zY<88holx_u?gA^L0Gh&yl&qp50@QLGQ;Hu-8lSM_h;GVye5`~ng;F5yLl&;{U~zHA33REt-531n@7Y8OKK)c9AwV67b zuao4Hii`3#eC(4ZZ=$429J#Z`GO izgsTLHNoFdk1C(D96L2zo-m7m-R1f8OfIb literal 0 HcmV?d00001 diff --git a/doc/ota_updates/a-ota-ota-upload-complete.png b/doc/ota_updates/a-ota-ota-upload-complete.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5bf0ca943b0013a8cf9d1c9129f10d2f426e0d GIT binary patch literal 69852 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

|NxCdtF2Q8ka%9U&!o_ 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 literal 0 HcmV?d00001 diff --git a/doc/ota_updates/a-ota-sketch-selection.png b/doc/ota_updates/a-ota-sketch-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..50ef7ca51d14ae0161167ba3d039335e86e5cb2a GIT binary patch literal 65429 zcmV)~KzhH4P)%xKL7y#H%UZ6RCr$OodtLtN4B=Lm-oN-?%suL zV8f0R$8iivoEVarnVFfHnHgmUF2>YI`mJB50GrOh&!-o7Sww5fLfO>A|Ep!OGrpayq_aJrlas#^A}@P2+m>8e`xs`%myn$mgf*B5H@rbBJ@Vln7AupMg0U0V?p1Pm+_^ zI`xZV5(Io><-{bwCpI2FF-kBPd7w(BMk*9Pq?<1U}JqP)&)4j)%5bet}9yaKJ~>*)~Awc^~jLrmYTBeY%j$Dngc zh~Ga!=alhmM?76Ca_E}!R-)}%<7=;t)@xFZc&#d~TfUB;Oh7`CN&;I+MtEuljLj`z zWMYE+fpU%-rqgXB_&V63ATJLOb8;Rd?c%~Jg5_x-V8`AWDZr{la&FgDw`V5_ZbD_aCy+C%FwTWx3^g4fw<>xON1ZrEY( zj-3u30=pbNu;;!f_BwfCzq2>tgZ(ayFAli+;UICqmEZdc?+?1kkuQ4;mCO0Fa%dT+ z+m?1m#BK3D>?8Kl{_LUs+U4Yp9gbdvC$`akZzZ-kxMMT1$=(f{=(si#8;JFEtjs!w zj(r`S2L)@bU9je!GuBu;V>Pjg-mkQB!U|%!)qQb#*9psrrS$*OyZ5og(h-aA5O*E1 z=#B#xG8Xn&VBvuI<_?%g%r&#a9AdVqEoPb8V5W%;W|&xG+O2z-Vssai3@kCx;10&? zSzxT5ImYUmVT`URM(fkJZh-Hv z>0=-<;Hp0Q6aB8};XCHC9{OI=5%}h!Hom@~g+A(<=&i1SFVEjZkFz(?{q%KoJADnG zow|yyC$Hj@6IapY_+@;2>=HgYdXW&PA0APH=6%TX1Zes3E9i3a8oHjofzQs|M7MLA z`24&Ux?j*nkBd6!aY+|n(!O+r=RXTyJO$k^GCIGAFBrw=6v#jSxwq9#J5071@>1BLC=j{W2FXtngCvf5lKBn~q=zSOZ+$Sfl;S)-O z`INqcPwBg0KI89%w$bhE4SY^?r|;AHC@O_NMQ%_eCvyMc?gLm+1TD z@AEh-NI11uK3#GYixw}ZH&}5 z#V8%V2KibP8AsRV1pPahNK7K87+PYg5px&QZ{5X=TUMB1Y=xP`Y?FJKMa;QvP1s-_ zUGvO*y8h>z5$1N-NcqfpV^f^cHGmi0C_Ba_J(2ry$s+M0PCtQPW-c@>?!qscBuzJ- z&Lp_UNs*HZ7n-`zyf*lM#e5MjO4H8bHoVM?5Mg1AFk?ML+}1F+l=n8SfyRBhGq1z!~D49G`(^20Hfw3W3>>ya#qk8vLTK4!Yin19fgm`*?P zX(Xnp1{Rn?Kl;h~7WCt1%rTKNg$a~NjMFj2IFi*^$~eZ5teDXxtWlJqj3h>A-oh{v z)ey>T2D7LrGa5)4(|44i3NkvcfnJokeMyZ$?0Cce35h;Mi*hvz*DoZc^`4@3L#OZZ9& zVV?Z+z3F`~l4Nf>o-Z$uM9*sr65!)yIj|%?J#`&jSsrvQSl*wK#6@Tx(TyRoh_LAC z{GMT0Ds;}7b1WA=hx9!N=aB_N--~dgph-6jTJ&9!V2HkSe!n5P@D0VcEEsy-E%BGE95CeHCB074-QS2@aZ;Qs?i5E|xpNIEg_NKS)mBF&e>67tE)fnUx; zCGuL|`x8Ey*>I=z+!EVhk=dD=z{A84;bw*iG1Njh5qV3S&_s-p7UF4|Xsn53BF$I} z=_XpppiG^~HPu4#9bJ^%(L<31$%P_}d~+S)|5BoW-e(ExGupyuQ;8%Zk#Z?vLSX+rYS)46{6WkneIU+ zPaLM`;V5O+Cn(}LO_}#u%GA|KFc*9t;F9kHT=omW75`8r!f=(L1HMM^RPp{v|0~{i z{9m!|6QS+!_7q&E?K78%i?m6Irf6y9T?ecr8Lgm*X&FUKOD*gKmXMeh^N*K)#Ea<1ywKDd3+Ttq%qQm2 z4}LB~nZO*r+oTL(mYkV%N6JiNVdB;io zOp!B4%0NFmDVGi1u`{0tT%kL45)r*;A$>-fDrca=9XX}blQPC$6eaYz+?J8EFkXao z7*&FK5~6s1UOtaWM*)4lHysCyrLqI5*LuyB-777w2zMp-_e3xZcf zG%Ozyk09?h`FzPY1cG=-<^)TJVF7(3k7WCjblOEY@+fB@MZO#b|DYV@uzW~7LrFlx z`8pu!2=bxpVl+iMWB4Y9BOF2@9~RGKk`BZ2nMU$qX7F`J*PcQ?3h}hchptaSUY11 zNhgDDnE58!8~Wj~n6!8?)V}QvwWagK24%Z9LGAEvsGU|6v&kD3aJ2KZMQmytSK@!W ze?fN6$0o|SRLO?fLu|Ek#Y$@@tRhy^-S=jDSCWl~5Y;e;DHA=$vT^stY08k#Q$~Hs zCkR(4Bfn0W`pv*FXaz+;`#}VBf+GcVL!w&Idn%$;%u^p>(m zY2P$xA8!PO<9ZN@jAbYn6U&mhBq?uL_Kte&6(dB5(#CRpK-L)PB_G|ON3lREFa2XITIC% zg6Q)-SUhw$-kUP&KEzjqDtSCBs^s!hJWa&&81z|1w9}KM(}SZObrz4NSPVwT%`y?B z!_c|-fK|Zui77s@~49kbbqb#5Al;y+4Yb+i*22nhQ zf_NBFJYo?W%ZJ4?l5a>zJfnrkN0iS57Efz*Ey_nIV&e#$#X~nbj6yzhh&J(1Bu^;h zvxwMYPtq|q#ZfI?*pfs{gChjYNDLy8Fz42qt$`O&ep)p)S!f-Dl26w}v zh-g?v#Nwj44Rm#Gqp`6Os$M*Q-~Q7u@eP7iIDLjcM^guipe*&Y;i`2F{x>hc_u@(T zT{?-t%O??Z`4mEE8cswK(L_9vNF-f3ft(vBabVeMgpow~WlcB!n-{Ib?mZ{)sJR7Y z6_r@GZVysv-Q+9$nNx@-;)rM>k_ab4uAIh$%cl`Q_>(;1?^$5gq;YcTcnUYfC+J4o z)X@cMAAbb3c{9XlXZt#+?cYYx&VI2q+x0VI-H!g%r!QhtTeAdzBI(2ymtg~CNF8Ov zk<5MyVW-m_a(9EILj556^)YY7%jPW>eMlPF+l;K{bjQM6jC^RVp z*QE^IfHL@7VKFc!lbX<%cRMmpPP{NRrKxEY!BYkNe@C9QO!;$!kS@&^(^o|tOyn37 zw+JKJFC*GN!|)jBhmzRju%NU_l8hFiseq14L(WYS)=d)DO*&rYMj(kxiEAWXj<&AQ zIk_A_0u!dnkya=!&^cqoh)aZ{uCt81sPHsH!r};wiz-hr9DTV5;Fy~~$%&#Xx_Azg zm=2PVgnBf(gV|3}=svoz_A(Ti?x7n7u}GAVf7e2BDG7_&PSV;=(o(RM8@k%^SSjNx5~QSg)UX^nbFIFycnTs$mru|7u;`Lv0r7oS^&c(_i7>+G1vA|Hxk z1^MX9>vjzBJ;71Wj~w;T_s+0)^q&xasT(0}_t{ zGs;IyZd}FvYwGYga~Q5icEg?UI<^}=$9BPw2s*wC!9>`JU5FxLSLu1`qB+zv!Cyr4n}-+As5HT9%vx`;3RMB`l&zNG!^j3|OV* zz$!HpW;D-`1ggLwl!9nUmPEpi!QVvI< z$0=$OpvdW%D@CX7K{yu}Oz*vMghX|OB*h$}AI)JmipT=OahfD}gnn3De7cY8?A!uz zz#|a5NN}4;XltzRW4;O9r5fH5qMlKjB%bS(G07vIUS~DXo$usNQYOg}ja)WeIzr33 zuy`nARaAlt^*byc%AC0_gvHaEnUeriiR4-6D3_n&mlU!66f7PtUgKy-As%ip(T&d2 zXCw`wUWd+=AQ~2r0{UNBKJ6tW3P_NUaPAbeNk|ls82xbL52477=y{IhqlkPsLM2+| zLnxvjK|X|7>?Sri5$b$MK0n@IDDsgvEMUa?9=Uu7MUk5r`Irfj&qS{8kqbzu@8Kd` zf{WW&K0b9S?|*W7`oyM9YaGl27b_$G$CCGk+yKD4*q5Nog5&?L3N`t5yhNiaWjoF+?;G zL4*^*$9CWW5pZ+|dGkVFBvupXqyV| z$+3G6+k6aex&DecBxhZRpM?GNwaOA4!R#CV|j+Xx=@CkH0yO ztMPFpC6bXKrU+3?w9fW})9~fQleiEPOHou?5gKl( zn*UFMKfn1l-kZG*3rrmZ@k}T2OrSg4k(BBDcugPuD6{%XT~laSz(s5<9cAHg>ox^~ zba*+z#cX^B&zWUw{SFtiQAW*0RKI5FaQzfVJA6EhP{c;Z_cOm6QIA4CLgXW_^XVWT<)Sxk%_v4b`f~ZmTeWfI zL-JwqDC9F#XfbJ`RNrITR^Ou|*7da3_q0YmT-ReML_JJ9@o*y(?vLA}2H+N zOmT7(#I)Mh1=syTag*-Ex$Z`vGSFM$ak!h90f)3~IAvr&`}lYa+jjw0@fmQ=$b(C2 z8bvXg~sAWSS+rGgySL!NS!V!=2A!iwk@5F4?lVrZ@xbd`+cKmJ~#aE z$9exS9KW&x?|(iEd%WXuJvbcaNJytiNGB*tI?A%5DCeN7BgV~Lj2}1ZW2LnN7E-1# zlcOCyGmN2(Mu>Jev!aZwCuer2=}!Dan{ngzT&zd9j@Eqig%6> zIOBfN(qTHvFOrVXprBPcH%S^d(3Ot+6OMM|(s@igOb79_%7@Q0 zeg1LzC`CSU`G`>uonM7`gr?L#EuX%$-(sDQD4$mGF!Y_Xcm(;#i`|5lZiJ%9t*yRC z5%tK$Bae7kK2u0Kim0cx$c>?EY&MIBSZ71hxowVR$4_JKH64sQdj;c(31_cjlKM3a z-?$epj_yKK@TAxF?ME=>+%-(Ua04?g66!awTF(Tt_aDI(D_hLFqK#P>H3Vi~(!`{F zC!uj&4`t9W?rNhgSdY&?5}{e~#M&KgXScpTYWv&tUuGXSh#OSHhj%d(hNv@aNb%aum*7 z)I@DfB_4!Eptz_I-hL0TaLPQG4e0~VAG^VWa3h=vN5W=MH{AWc8!W!>4wHdjz+m8) z&>heNnteZm{n{m%`00D9rStATp*C?e)E3Ny+NvdD^XYc=I?pPd#dAnH-P=ot*zf3p zALy>Nm&H9~S5@PBL^Q5P#h{|00aNe0AfTWCRvB41`XChHC8gLE6oM{BX3(U&ZH>S% zu~;oE9#&Ca*symM#?D)WRgM((oSB5-`!B*FB?D(pEX6i$Uy@7&HZER-i3^ru!(DIK z2ijrc*I(n)FNR}+wktd{NkSSsFloVJ%vfiRTQR<_{(;?I`3NXX$JxWXg|y}#xd@Y_T)1WwL04xv zZGSN)?$XEYxC}VuWKr~!1;+;_=>EoL7^S*m+>c|h#VHz^*AHOGlEcu8i^K7Q3ovHx z0*qfqV(^QDIoBaY(KI>{2h?Yv&s9H)ti*`On6ONV!rK0nj)f&wj2(gF!5Ji^Xq>Uo zz^e17Fn!^1s0T&k=!L}?K5HQsZeEJNcR2;^B!8^ftB+G&;UsfEtUIcM19lX>m>Xfy znfuVDb2fYHZERMbi@|f2Vxy@miGsc}M>EV>G8;cmpN)xIwQ!lDPHx=65zqw+qc4Xh z;ij7b`n@*?`~0J685fZT(R^<#`e7`F&zXinGv;9Gk;^#iABA&VTu1WZV!4CPUf5-L z9(@OP!T4KVSZir7G%()aHg9gcKZI$h`-@UuALGdVvm zA8|_3VdU~*=_n-BG4c`WdI+HyljY9x;d(f^c(~4o5gHuO_t@v67QVhj@}YfZ`EYY< zv8lEATvtCXa^vrv>wIYXqwp*k%g0z~aL`uYL$G{w#A3Ix+!|6I@rUe*$rLjsz-?-aBsswpooL1kq*swyi) zswyC>C==%GCF#tj{a8TJ4l|!vWnhY9o7TZ>(@N-!`W_lT^n&(}y`Vq17mNtgA-!;C zNKaS~?Fl>L{;-~K9o`e}!@q>zu+MRD^hjLQGNuTt8vb;%zi|3uXzAWYZEYodgF>-# z-U@gQ?*WeyJ>fQ@7o3Opf+JxwtQV{(ZHuA3VKTH2j7Uy;gZn^hU=KKKT82s8K76ut zCXjTvF~O=uP}{r;YJ0ar?btq1I@iuXP4j}-g6-B*NoTf7=^UgT_^0+QIA-PI8%t}b zoxKdTb5}6V(FOI79zioM5o(ui;&Nm({&HCZUJvu}j-e^E0>Yrl(xE8lc32SBuGxga zOOIinh9=GhCBpF3M2tS6h4ZHeqQ{&g&<+d12@3TVpEkqQ+ZQpa?{Zvl^1#Mvlkvld zbvWQkckCC|%zXV=uIWg0Oi1QcTwlf>}%~HgEU>|I+;jEIn_B z!&ld%>z7Ng(NF{PN4$f-bvZ*3krh6EdnqxXVqv^R8MPyG9kIaq#d4|;vm6Jw8A3H3&2NIEA-I!9c5vG(jX zbeVVz8|ivk%`Mxw*n=|($~4Amn_w8->HZ*>PH)P{zTk|HGf{r9Q6ZX+$i>4`&QLic zi9QP(51bfbuenW!uuMbyI&k>0w8HP$XrC+Vy>ein;KW>abZrd`mas6`7i zNQ_etoyY36yRd85G3?xV^fC7AK90F7wqouT9g0YFNe+6LN5`>=B)8!330%MDfF-ow z3+Z?k(eW%IiO#2UwVcx2K@rln?S~&@=Z+&-xMn97ldP6p*T+)&%o1X~(On$hwh`vr z*Fk^UC}@xS9(rTHhapW(#t($~gn_s_X#i{{^@lx8ou&+cE8#w+KYXWrhjUZLVcVWl z*tGi;RxaHDqe+9Yamozg{~ZUwvwd7O{ckUPRb92=XG9&bl%Z2LR4uP-n(Un zR9U6K8wOl~226K$heb-d@P4(25ALOBqKk<|t8}<-!XPXL7G8HTaK&*Pu<^#7WV)-r zvJh|o=fB|3<1XS}ZV3V-%<$%4|ADu=bjAB!KEfM+{|C0&N8#$;opdo6;C@CFHcoyY z>s%kgH#-+@Svk0CaR}oU&xKxWJ{-LaF>BT!oDX>jSK6QZ6zw>r72=NBO1wEs4=(w| z@GXwS+V}p6V_vaXJiR~u@6Gq{UY9O-=bd*j_Q(mW{_s6)am|GnMQ%;DQ0Uz{gwN^j|Flmm4(uO?w?F6}2j>sL@MTAE!Oa6Z*3HC-={unjk%SFx8KJw4%q62zk@ zaw8eAe8eI*E3CZdj0?9du3$7Vq-X%S{`P9K&+OPS< z0s%cNl(U2)vSl}o1(s`=2-BUnZL#FY8EDdVy++3zD>QForGP0`5i73W!ZO;%a{4T@ zq64c)fNSVD6s#t;ncCs(j_tU!Zwri<&w|0+@wi2p&L0nR!fL^IST7m}d*c3*v2a~F z7Vh-B^CY|pFT!Q%f`ZI`B-=n9)!!Xam08yE|~zk#S?Ik zxVvy7EQs6lC*sy@O8?wpOz+*}C!{k9YI8eChr7i&#}A1qrj=eh$IC|o9 z3Ng)TXNKB1;14Ix;}54UV6K}dYMPp0l9URy3)gWVCrt=^Y z`XNy;Pb!34ggFKc>WVkl+=IE+LVWgRFZB9y3^to*A|%%yJ^ybOjwV+iuC5Vb)m8A$ zNXE&{TQP67DLfx0W6O+>Fij%@{-rYb6&K*H*&$4zlb|2{5Oy90m_2t0&IRYfC0Sm? zmRbPoJL~b^KkS45U99E5*hw&GD5M0}Y(5eOmRc2w=cYnf^bCK{V zFN0Th4jkemaAN5U%-F9F$HGdu7Zkzp$}D`fatBGF49*Ws&~wIOY(2jk|Iz&r>|0u3 za(p2Ewpk07v7%sZMB9RK$9VjOl4 z$A*2A@y$Lb+)9eWn#uoz?~ez;@?km-?4C=~ISJilNA!Mw0@mM;#w|}{eEHFMEY$bL z{*zlsI(pCxxIxm{hT~CjF!a*Hd+)BprrTFA?2~R-ZJh|6ge2@gz6{@ztd0i6;DWqv z=VC}auDMX=@WCP+jY`MWfB+oOx`e%MURW}E1in9L0?p_!ESoU`LzZ5^0kbPuY3`1b zo*_7Bb``!X;Qd{p3;40LqZRC-HF9!}1Y|+}g?KwpipQh=+^Z#OBp3AC7p0UJY10^6qn% z-F3u8D-r}nC8zB@v0V2KMLcF$qG^t$T7{l4&{fNjcl-9->Q`j2JP9%7>aCCV02FjT1M=(a)tW-{kVH%FYatv3Dec{ zVZLTQEZ5G1)w+4GAsjc(h0CV7aNj%|p4(=_d)plN5dQR@2~cLci2wFEG;PC=@Yy~W zo?9uME%V^Ic|KeS$Bpx0yM6)g5ti#0!glK_cpBxSg1cqPkj)v~_@M4n-Zg4{NH&^kfVjI*-CqFKC_|fx(Bb;U^#0@v%+s>K^{tbj)@1;O zjT?*aM;(K1OgfAVj$mMqo)~!E9!3@?(C3Q}(QoVojF_nlJI46sd&!VEXuX(S77J^qE1KyqX$z_!q&={3!nW;~wZYatsEJT8y2B zF);Tyg74n!f_{_6jvkFs3opVr#vYTu`U*XVjz-`9{qfyS z4P1AjAH}@y@crZw`1lWMP+Ou2i4BKuttV!lx5motBk{#{JBr?taY}m)zIf{k^rf)-yDxjiS&kJ(c9`|O8ot*G#8rwY z-~Y5Hdi~HJpY&aX)psMYY`Gf#cZU@&h5BLc4DuaK>6o2P`wQ#e8Ec%%qHA zg3xT*MCc}`KV?ANdaVZ+<(#@IJg3uIr=yUJO62PhoPlIyoUoi4k7a4{@bpI0urC`F_cF>EFXCjYhtjx z*i9iHu}d9A6Kj@_ygMCvk(=;*56NdX-Q?Wx4aS(&>#*whIT-nc!XP*fxxY>tiY|1xK@k>;$cjmzZaX19oKc?OuuEbh(wr##^d&5B(!20CSul+@HXxy zWI_M@8F*@6M~L|?1Q}`~#7G07L^x&IkwmnK2I6nuK!Vu~q?lb7NHe=e@U)F|#$1^j zt)vmD<~NZ-B$;baS{jHm)k3U^7NU){5W$$~!^89zb}d_sD`(FLkCJdtDD9;4Pm<1f zg>)8zI}#9{)ln&(nQ{IS%_7w;LF z3QeT{Tgw1bo!zj;CjbL&?C_DnZ5;RT6N+uF`G-)n!xi4)xaMe&W4Fw3%FGoO3CXbV z_ku2oiJ!4Cbg{xUw+FC^i^LU6E1Wa4gu1yWEMiFrWT12QJVt@&Bi8-@&=Np17Tm24g2@oV;z0 zW9AOf2%?KEIvILy7C2;Rh9hS8aMC?kXoBIt+3V#nEO=y}l-rX*&5M(3u7C)BOo zaq~fxaDHwEN8pN`9nQD};JmXljyu!26Q0cp$LTx9*rt68#~t0V-@+4@f+BI*(*Zkm z4YA9_68rCZ;JAAr&fIswJ}Vzw@bSWKQx}}^3x>M4H+J22rib(IP&SMkPk&Z{pp+u z@{t$036T%WM=A1A6uAlYJ^XMf*Y$AJBbN_1G~mc*FOui!oTvkjGepAq$pZ=)$GwKW#R~(RAFB6|Ib4va*e(A`^a&Wg_EO ztj4U-!?E(4FR*mrH&`~{Yb^i%YpnSG8?5}HFIN3X4E_#lhV;YQp~Ub3*f4w`@x8#t z;Xlw+&WN`6>pT3vj#x|UuNm<@R@3KK4egH=%;0`lHt0Jnp=~XpZEYLxhI0)DB;eZ zdmu2SgENba$DQbSk_1l^g@;7%L?z-b3F9t_NPwha$q#nMr3e-Cmi&MxzmMntlWBRf zIOWffpzN}faB|KheE4w}{8P@n>-Mxxn(#SZ&ypet@c~f&41Jb9e}~}6#GLlQg67|$ z^(<(g%xQnj>3^=5F=c39#b!j zAFLY;!Xw-Ig(KPUgPoV@j!fuEhtAVQI$sxjxhDedLPzX{K%JJIr+H`Tf9{RojAxM0 z6Tun!pZkM5?Hwfa2X~S#5bl}aga^M@^b4olc_|Yh?^4GXhn&S;3b->?0lLTzDG=t< z-40C;IC*0KeffLE|J>yf&D%pF+-WEFD$ZT$th!^5C8oAQe{I|=0r$r?LgN+&U8Br} zGM%p}BNCs{p}T3$@F9AA;R0)TX3rATxVzk2Bqe?ys0V&t>v=dK9 z`6x#{B%d#p#3S?`LE`C6$H1-KxVViGIu(@{yM4z+Zgk%IQ^cc)dOFtk43S4YiiQT< zoz7_Ph*mBiMbtB%SZr=D^c2F+{_)MHtpfVrj(+EMln>Zb{$Wp3?vBQR-aGPR6#}Wa zuOKlMPI8=+(%{UGYtVZanzlmoMbZUandJ7k$#G{=GK7BN1XAfe;YRZq_moVPcqmN; zQi-%oq5n1oUQ9ZZ4R0lU(sOJrSmB>Kx8$Os z#II@L&)SCg%E$uS?t2QIdvd>P{Pa7^hg(J|`ds6?dTsf0JBB2oTVc^k#E4zvF#J#@ zW$20rE)~zbw04)H_+NP*VGzqG4#SEiu|~T02YO! zS8GL|YuwiwOG0?=h0dYSStucNWkZq>hH8*=fQN)|Ww_UC@77@%6un-z!5#O>arDAY z2T$yv?~vI}-|sf=lg&;Xfa2m?e zVU)!4iBOcsk(DSO7M>9KbPx|mo67QG@qEEi4-c8ZQ7C`!B%xj`9)_gTHe`Y>z9I2^ zOUL^yowt4z@vwXbka)Ph=X;@N19^RqqR5S-9&M5jiDwjvM-lam(>Ifg=MD+UjF$0G z3TDF49^({^5V#(Qm~3cCzekG1=~@-L+u?rR#HQD?XevDW!#%W{iYWK<#+{5Vly@?! z=;e9|U;lEJS~y@CcdjdEIl~?9c7!|PRbrK;BUaIGsUzHJFSCYzYs^}@xm#=PjCI!Z z`=j6F1{+tQqhIdumxo;0Y$x_uFF?QXt@a*mIEbAEZ{raJg-0|gunaqk5Jl%ewjkK7@sHf8YI55&w~(IF>K74Nm>B6ys(&k64d;pu*! z5<-Wb{D38+h)M{d&$K}CNq@>CPWo}LNp_=42>W56f#AHY?OIoF*pg?tnO5}^HfTtJHGhr}a?yDbtL90=kOQA9pMg9AE7G4c@`8+=E{-qzAhslJD# zBh>ehfLdF*k$l7lOBM1l6QUi(I6d6RKx}Bx){omvmJ7iTl+NWYbmZOWv`VFeO!#-v zULJIlC5L}Y%xYo{{kD`@d(R2$=r^ZeJ^cn5t}kyzkcKlhGW0*goh_?EdHgcr29fdv z9vX#j9(PcF!TARdrNViM&`Y!u?QcXy#GBMM_9=Khq{9a$N=LyC$^aEbZ`@-6qxgR} z9Xxj=$pYes29I!`UUa9pD zg*!d5^$+*%D?oRG3b_9(5$+31d`3cme%Q=i){I)U zV4g%r=?Ks4$i?$HMGs;z8~0EkNzyUygj}_=O@jLTu&MR^QXs#9Dl?wDs8@MUfjt zHlldAc{N8imO^ABL^XVKB#bH57SXVH1o?ggetV2UKFZ?ZMpmuz5u%Z&5RY6s zf_UivUnU+`iekhP3cfLA>F^j`;+S3XF}w(6={%Kql%#X)b&?Jj$0)Oq^AIC+=^~CmDvT;hQrSoQ zEJP>#K3gkcOg!{JtH+!~7Sm^m|}3{SW_KS3EFkAT@xI0{q>M-DAl z7SCfX*(eiJG@*W#4GNg&YRyLb&jMxfD5S&D4i~d=QI}8zCJ2J1bES1OQI)b$MF;8p ztay~<)7HGYO+3m`Pn&!+gzu$QK73=qaO6wJqlkLA*KigOM?GK5<-_7>l@AxW5!~2- zi`|6!9z~ZrtwnAWVRMfLT&zadd#ilt_aQc~rl?0rJVMmN#cA?xbQI!IL_Nyl;RXsq zNq|B;BpX!`k0_pB7V)T(&(DfSAsvNyI4_nS;RUzvFqjV*et^MEY>38$#WLQaAAbdP=3;c?(vo2`UPgYJxvKA zq7v#Krhp?6N_z`!W3zx*ge49^ z?J7e1s3^7)hMT72UP;HsBXuq#I09KH3?XetQG_jt!-iyW50mMFon8AErg zZHO6*fRNFM84h=`B4mET-SZWEKpEP5B!zb=DtY_J1-x}wUF48D-aK?(*IYZ|94~`1dwS^&}KfjppHCR!x)QH5mZ~5tx-PrZ@%LcpT=b;twHKXFzM=Sv#Pl^sM0CT$4H5d&Z(smL z*aPWi=m)MxBq9CCH&T2<`v{bH<60^9Z^#DZIYt=K~cve6wlpp6cCHISy(*4Vq3(t(n?;JL;ox4 za=7SDnKc9t(6~;JnJ6?KU3eoy`KVa0Bf|L`M?RC zDxfIyiO}-X0z7UL!#!n-`zag`9Ty)XA1~LzwVj*Jg~vwX?LRF%o{};bxDJt_<2p~r z$Gx}}afJ(i0E3dQKcOuc1TTTK_R`xJLC z?(SL&1lJItxNC7M9<)etcP%Bw-HUr6SfN-bPH_ss-3upuzweyu>>v4+YwwvoGi%*T zcgBr@!wjdXL7cN%@C4?1b~nBZK+4sRIe}Ac9S~Pn505 zV3HN(PpHsZ7tHZ}g;hNn|1eP-thR(q{HdY{(JK{CuKA4eGbX03X53xc)6YIVr$QMP zf@A(J&TJzYeVF*eLRA+(*)}rrWbdsg6=gi(1Q1q;0}I@}Nla&*KEb39b)C;Bwy^r` z`@!W2@{W@w@}dRp-+B=01zc$mMJ0=tBVB0hRpJ zG9C{PPfBJc!<8(5*b_1V$r%{s;gLy#nZ$c;PR^L<-&K##r0+(cQq>ISr?#_>aGXD_OEB0)v1n^Gq1+gL8^uQ$yFo%*KrWpyCOr70b~ z1#S%!wc@H9LZ<^d@5N!A0mnDs)hV|AM?P8;uD-h_EYZaBM>S!{$jx5Wu>@!R?d3Q# zGjs5Gb9PesbmwslaHBdSNvPFzDRjk7|Lh|H3J_b!v?nl;8T>jM_jqIb80+^JQg{6L zsN&DUN8JO2)Rc+n49A$5$>A0< zRZ=W7&%PeT$xh5FG^WdwEnLuk#~>HDl`8L;AuWKrELCe_teqrdzuX&%TSEi!Sh%1) zX^ZkIK!+wwYgWR4>^c%7&g@S?M#qiJpypD}8vz>U zvC7@(buHFz7h!q1w{Dr}^IuVMIw9%jUrA>bHYgG?!+&bKG~f9?-?OwRAaj~rc=#;( z-g%CG;5O@}T;W@l4U{FuirfX4Cz01YIfs}gafU}v3Y+$kMPJn@@8`G3fgOqCRQx4h zXS^+9XCq=`og5s*rD|}Rr_S>X!3fz#&Jn$1XXN}OmznP(lgdpq48+~YUx?UBI@Ijs z@Q5P6oiuIFNc%Mg;5H~KD8cg=>zJ16CgqxcH!|WBqV%%l+;|hgz}R${-+g-Q7xBc1 zuJ*h>)2{Ph#>?Q1!hzE(dyVv*BKL<(QTd( zN6sC#GL=_g#=>_aaExpzL;)X&d_LP2G*FN7R48f(P^5jUN_lR;yw{sCygbLqyGduL zZ>A7K#f`xb8oa|N?SE!S$z`7{E|YjM5?Crc#bjCCdFtge(6PoBo`#(gI78%Lz;a!}JfCx0?bWK2aXlqw z-t#OOau7)a*K(j)n?cRO2~&JA&mH`<&C-)@fuUBO)5`x9qBx@zk>=#N8;2}R|AC4 z-^s+waiPF`Ff`l3B@Faa9woXI3gyG&TKFKZ6ijTTGZuqY@;V)?lmIOv_Hp;bkG5Cl zwG!gmsA|Hc>zPIEA)AC&gy4)sHpr2?n#bz_>)(TJdGAhN?ugeYyI~LPsoh5H4nnIf~f^-I3}!cU+Ll3DU%V z{FC(kEYPV{d3t9`v$B| zW6HEiYZD1S#Tn{AZy8Ov`kp5H_YAb)N)FJ$?ia>1{JV)!F)Q|Vxswz-yJjRsqicii zw`0&sAd!V)vl?ed7Ro5U-NbV#5bQ(e)-D3ZgayCs-yiSAhH-nTUYQJz{{c%gqj{)Z`_fQc; z9V4-6_$S}|KuZH^C76x3>{|5PaZXt+X<*)RyY`EuD7H2ll9U#*rqQ&m^y>1xnir+G7NF)_yk}xDt+W8mFY1M4u5L2mXBt zc;6;ZaUm~!zGM<_2?3_Q#*~>09xT;X(BaNjCr~8(Ok!EO{C+V1K_)z@v6Y)*y!R*+ z+I!#L`<|Tjv^$x5IV=2uHQ}o-ZSN1-ocm4cMM-zyi=~doTrpP5HIMQ*yX=wm3MbIX zlGe2@H%vq79t}B|JT7z)U;bh9_sdE0p%!X;=X;U|jm6N*gKPok2T->!lw^H>|!TNpLaM4uoYJ@ruD%>!3 z$hqybo$*a7BgCAkanGDpTWE|hT{EIUQ%Eh?UhpbCy&=A&NlzN1Q~b|%^(*WK*M(Of zmc8*P-wI&Fk40pMba(sJQeeVOne}3Sep92Sc#GQgvq?*t!o`Qsw(NPCTtXJ#qcm}} zRs-6qF|1vpgHrr%yut4_2qh}VQl;&6!{mS3?3_fi2QtQDTTShvHF&6c6YXuz%u+^P z=xbT!=e4<%zwF2v#rs|@!8Z-(LU35!7UO9?YFPDk(mbX2G@Rvcy9?p5tA88Z5Si~U zt3dmaVJD{~EJsIf9dO&?K8mXCwJLD>8{tE8kbOwMVd+8pTxw}}BSq#mN6%FL%25_T ze)nwNZZMBMgn2-```H6C;0<%^}E30zvE1dQ=2abQEj%WFr00 zB)21P@YBzpGr^I{s6#mB{C4ob-`agE81=8klBJ2DP3F$##j2QL|HTG?=KdzTN1S@W zO2txn<<2LG)k^5z?=Z!TFgEiPzu3zZtEqN-=HseZ1k0Yh+XCg!rT0k{fpy{9Yf%Vl zc6(KaTvw-+l@v`6fz~Sk}92&uIKS0f>G!)9Cwg;PEi#kFQ7Vn~CVz?9(j)H2a znlZBw1rX9+EJ;SJjKX5C_7>ial$&*Jrt>{mm)eOErC%7ArW?S*cGM`eB5PoB`yY%W z_@rNu@`LATEYz1!vqd|{MOKnsuU@|6t~6Rs81X6*watkfL6*5S+Weg3De>QZq^03G)OR2t zAI}`My1|(IbU)tJ;@yz#p4AR1ilw870Hkunlzh0q zH$q!{>qf5&&2zuLFSy6wHS?(3@X*eO_}6+dg`yIN?Ge#6bwk{baT|h;AuDeGql^F6 zOXh#Y!8TcE>(u}&?SAigX^ubMqQVzN{j>(t;&qeIw6PH4?o*CJ8HuC6o^lMIf~Tvn zwst%LL^EQi#(0P14I^70t)t@*M)E{th;kY|jcaMvFi%O$uNtSFjFy5LoJ>d-cotr%ebrMensaCaO4AdZnn`G2BOP= z@)YSTJLhJWb+dVCpk%I{R_=h5UJJcQy|KegnR0nWN$Ae>r$7p2!OVegfy;eI)WP*u zbUP)m`_b}dFLoD8Nk+*&3YH7-<%Khff0;H(#?*+?rOFum&cU2g(PiMq(^-q&Lf=$< zBxPt^*Cl?^kpoiA=xS7+1BAow#|pi^6gA^Yt>r~~j}~9WbE*_{xngF~oh!*g?#$eo zuXRRP7#PkEBSTiay}x6m;rWjJl+^a^1pDE{=)=k5Qzs|Q(BIo`$5phOBG#L?;|vbs zRA3GYUYSH@XN23NC@`C|Ih{3hqX4+}Ec;zQGVh607y|z>p90|b_XUxdR6Nz_=#D=O zHh5j=;NTLkm_xAZ=dEEHlST1|_ak-Cv#Z3x@G}Hmvr4~~wd6n;cge`nQ{U%j$WTis zMknjj{c0Q*MQll_iM1mbp2Q6R7f~oQr8>Hr|9w`Aii?XQLo3hD&QAs=(-wAjo9+UL`huLC zoeBS(Cim4E;kU4G6|`pXI{mwm^}W-R%PPsLTV|5|o{D`UGfk|z0s};3-u2V+H@yLT z89BKkVxtby5H@(TB7mFbWs=9-xq3FWgz4N9@xyQ)rQe@$bylVa0k?J; zK|r}8$rlx(yM?*KbGNC{zB=P_!QX5}De8e=zi51YX37i$5;)W!0 z)1ap%IopGPwD9h@D3naFJ#Eknw-myi7f54}@#BD9esVZ-#=7x0JxQis=72pXNGVe; zic4p?Jn3}B?eJP5Dz{48@3(1exZhCY4cW_>WHm83Vun*Q!$rZl;1e-yNH2}&=_-IGOFg0oFrSw5vixJDYGjo$b%8XYGq}!SoFQA68*p2%Fc37;!fDQOLbv#iLA*X zjvi+0!WTAW`=TcCs3p<&Ii)S5lHv(0{c4QMwYPb&C5OGJzkWRw}-*Jo-tI^+qx zH@EXOo@40Z{Ym-0v@Hdm)0d6?(H~)8%ELp@nD;cK8}r1J;TJ4|lOk4Z94S8F!za}S zQr6_9Pwn5Z+P|j%JDSxpk>Iiv#AHDf_wx|VFOqalO@CxvCeWU?tI(8I#9QJ6zKX*b z;724Svqq`vU97VZi|%2V5&s_)7>7`cu_P{+#I~iF8{lR=NhV`gKk%+xL%{V$LXG-N zU^t&2`qc&fJyjO^ZFujz#BV{wPKHicwl<>n$%8h0+ zbQ4!fltNq2Kv4jWY+EY6s`0HKnGqLhaGpV36@K$6^u{$IAB+U@7Ov24oLIo*HUCKN zMK-RK_$kOvh|(e7xvFE=Sh$KRsPW*pN4w5=^@0AA<+1Pox5I?so8QfchwG7Jo1nlg110m@ye*)bl>)WR9=z}Ig9kA%(Nz5SA%%7GByTL zR)<~d+bYb_l9i&IZpxa#uqrp+uw7U0yR6J&rMqCKlze|Gp=U8-S7u1(f$`3r`F9gA z9{NdVIMP3PT`!^nqp)>Jo_ULRcUaeRcYFOs;D`8sZgeFH!E1~O-q(W`>JZ|2I>ker zw@rftmtD;C<$Lkq52lU3`;pN>0Ej`i9S>>!IlU`{gT}}f6~<&{S+tvwH)j0MN7)hy zniluQA!S%X=m@zCC~l2$D~c++7r<8<7ZbvwqovTP)hiJJ zAifK7cjF7jbL8OJ9FNeI$Q#*PYyWE&K2YB4z}8}6E7uK&84#aHi*I`f!&`?iIaOqzOZuedYx*}hO$zpxb) zobc4Z-DB`3TR*lYcM^pBLuqClIX0Gg-q7H8aL)qD|0cq&2-t2{AAzEWNP-9_V3~3n z$iHzD&Rc#5J;8tZSMZpJN>fXR3pB4eh!KA+_L~T0gj}~;mCPan4fD<`?bno`av_uY zN@L(w+yBvw86`qXOEmfWRNMH@B5^&km#6aQRE6-q55E)Zc}`-z#ki@r{13p?TWOI1 zhzm0W84+n=OiL05MaM4yI({@)c{2w;D#KD!H03J&j>S(V?S%jGlJbNvmmS~jMOOPg z-Z^#$?Vzmn2GUrVh^OS3uX+KvA=mS~VPF6cEH+g&I)7GdOC44io`pah!GDNT7@=Jv zGrl<>_R(K=A{WqrBQ8-N9$R_b5~MKDx00;CXn z{$Ecj%X6F#`)CjiV=mjd1Z;D&YM}|tzQ6xVIU33(082dpGn-5O)2A%FT%1$6+{>gM^z@waZ!9RFJ#l2~pBFb|Q6hfEWgj1~f|@+sP&sD} zBDG7PxIbDKJFN3n?Uev;c^5Y~LYZipX)68RZLu&RkW4PNlD zbWGpTGFz*UPG&DB!un+9GxuVG-+{BhV-2AtP3fi3)TE*67%-=njt-ZNQj4&#T>bc1 z{v!`#brorHcE$7Oy@V>Ks*rwYy`Zk%LUWlB3mwU+cf_qmT2e#=(UbUlM+y8YSP&5w zd@wE*&o{hveW>k{ktPdIni@RFR4~f~xfr8t{3PEBW{{IaTSFpC1CF zI)M}H3D=)eTS=R}6E+%BvDPE#qztGjhl!d=V)UiVu++7PLHTb#UX_*Ukk* z*~Lt{$!t3>zpDBtK@AY8>1h$YB5f()8!=z~5*<_4s~)JC3Eef$kqvxwT2l|>kyv%c z`Rc=ml@@H(KS|IF9oA94kAIcA0||fW8Zge^GiIsf$0nNGyx;qCEm~linD7m}y7uvP zXk?3=2Fliho?iqB^~t#;-eS2_qX81Fhw$VU`$MoaR<-XD^kGhj-};!4NTWyFxE>!1 z{^YVtStw!R$101U>Py3KNFj9M9YH1At467KAbVuhXhujegc`1^ugCBhD)mPr52b5I z>5M>t{d{Qbxv7vihc$_OtT-BrDO$e;561dDg`7L1y9lH$`iw5W?XRanK7T(4?NK8u z>#!UjJawOKLrKmxnO-#vA9#|>n0vH@uSad&K!FZBsq&HAm9pvG*^Wc>u88u&RTsHB z1;=21pCovw*V^kqw9p4`Q=>ODEArv0X2+Q9Ag&Mc77A>Ft>%c#?TIxdPce)V`d^oY- zf6C#bq_pT$jvbi=HH(METJth}u_E_ikKzQBQSbkxi|cz{3E4ibFW>Yr{V(Z?IxLl# z)e_FZLrp96x?CA>oneIhdOE)g*|o*np|YNZV}W7eRzm4k8Wa!^;iS^kSx3asmSlNp z>0)Eh{k2Ce+Rwl6%U8l@OE8t23c_~d{o{K+UxV5ZucbWFLQF-}Oj_?zGTVWRS;aZN zQQ3pdb(!GHW+ z&w<7$!L=!gfpZ>3`gz@VTE$6L_3NvLCu^y|1KL7_oTINtJ5dy0d&Vf6=u0Ge(>(SG z-NV^6_InvV`)X~GwTy%h_&Dy}O{s&UKReEr&oU1-g}@9VLt2FOmOLi%5nsk^4-Yn$ zo3i&2ZJTw!IZ4Ub%plTzR?@I{8wsX*Xkh{0r`)28V)fHOY(+1DrVp8u04`dMiPs+? zJ>oz>BQs>8x!-^g?mlC*)3co;?ki5jB}-I=L~FafRiY?*N*Hgr5O4VQEH;@Hb*>73nJku18~Mj~F9c`@UEYAV z;GcGeoXgFGQXx72y_;ytxxMDE>2rS-@F!`MzLJE+$g=;FmOJ0811>I23j?%~bn%As zJ2R5`o?v-DRfJOT8)669OD@0{eXQh>WC5+*G#b>0NAu1Zn{P=XtVeP@76Zr0@Z-HU z>N>F2aaSW^x;dExsDUrZBT&{djB_6#fAF-?j?~ydC|{S=S0!?%v3M;_)6nkbm7L2T za(?6Nv$Y=mTWzcZrIk3Hvwt@7yoicEOj%EKAC5ZUK(lC@EKR;c87kIBvauCCZI`AE zXOJaH&1BS+2rsndH{I7MVj~$0AJ;UA-mze^6Rk+oh8=22#F$X32a6DmKw$fehH|C+ zhV4|YdUFm{gz*H`wvqfRf)q?`Iodlq5uz`uxNR6J$$@{;%M4~2E;zrX*e=Up=9D3klOH;)$Y@-)y zyvXuvAW=FWYJIUz7F)j}oImYB#3Qxy+-)X3BF1vr({Tr5e{>Q4(u@+PYL#7J!##KH z6#e!aW$AiGRM?Sg6^lyqvC7!{N7b};K5}?%({%K0-<0N&5T4@iVp36>$5$5kdB{zR z{QEywa8$8ga&x~~wtI42A%D}Fz-1oe($rhAba165ualrzXnRLA30m*Bw*0ab25eC| z>{j}xe9s0x*)f_vu~erq z48y7aBm-d-l5&NcKGQZ2Fx|Mcjm73i}<>nWtLv^Z8>kLjeJW88 ze!J>LTGG_l6t}RYq71-0S=`&<0RfA2{?9mU;cBd#SHf?hbRupebRr-6=|o&zMxqT| z-&a-dd4WbkOPO%C{zM@|=ElJiihvak*wWrnqRtw=yM9{IpsLb8*l?na2eaqi-=Wza ztO_+30dI!J&$Ef``9n(v2mIHR?U_LK(LG)CG|`iBU?0&mu&FY@9C14S4|?g&Y5}-2 zDo@t@O#XhOr#fMH2)U&h5H+40|JvsFju3w2?hfsrOqqP~L|C<(mbf?Kj~mUtXIxz7 z+qPI4dwuNYJ`Y4yTHd`ZaAoBRB|UkhtTFP3mqahJ^ASmO{?RqebO3hl5N1q# zqO7SlmWqwA+(=HJGZS(LndZWRSo|Dt! z=QN6*u%N=~O8nHzy7c*R0mJ^|(xag-7jg?OpE|*}F{~ZtsQv{ZEJZ<(1lHYLy@mAM z{e59aN5{32{QsW+l^K%1)lnj!I%$`Nmt5|%I8pBvw?L%A6%o9En0hcGwN%#QNs^oV zS<)3{G(vWj)^-j0%gz3~1S8oT!kzaaI087Z?@AD5K`K}`2Jk@Zp>*a*FCUGJ{^aaP zx+lD#Hxsb+w%Uo4;DZOwxSgq@hbng5-zn>9GAcr&^{|7gRxl;I%4YBcXZ7K(mxH;m zZ=d+FeeOM`WU{Fxx zDP-@T!q9wI{*THgB)(Dt0T4Eb=aJ6^(b(nWUBt!_&7pd_x}F~DQ?rlNWYL#VH-BcF zt@%Z5w5FDLkDqU;e>}Ij+rZz}e33*m>$)EFD3^F6^0q*5j+(g38@l%!ZL`@02Ma6D z!)70e+Ymr#CjFPB+HGi4%dE8FU6%SN#M+SmoFvWJn83aj6*>E$I46%GUSyb@0kYY? zLm6E)Y+Ul-WIaG;Hq+v4Q1Lid)bSRL%^qJ~#Mo^h&4k@?a(LHc+~aBA$#_o(XSE_Z z;pj2vdUE}I@8vJLlzCYw%+q6~&-YFkyssJfbUuO<8X9^9F#!FOsz_LH_l39I=@tXb zR(D=1_T`d5z_a_=kpkS^e{E?p3lD#*tPQ>TR=lvthav{V=}u$J`2)R*ThIe5tevsIr+3b`r$v@`Ai2{0WcYNzvCYJ zV5j*&9HxEBJVpi?>&9K2+a@_h*i!!0P>%nsfXl-NZix?38O%c5&sHp9egti3d^MZ0 zt5~^O8mYR@=gZvhG9*=ozV^=+7ROGZQ441`AwK=s8Lfc7RXP!L5s(R`{wTJ?V^) zLG91{Nk}Fq-4+$(aBvzpg4E*kSHlOWd)}oL@qeFrN6uW@?$6Zt{2yzb(AYA5a__h}O5&c-gesPTK$32{4IE z8J*7i14BUU(@>LJK}s6J`>AbahHGH3Fn?+y@J}iZaw&lT5?Oe@cY!}83%p9w6%Ykl zYe}7tvXBz5I^t63C1)@zr@8RV|*;$&&LslwU!WCpRF%PNEZ=0ivL4@Fbo&F>mi z$xP3xWOd|eu)_I@*QM8>BXmI#$z@;VOv6z11DnvEzmfi$^Lzh$ugTKlN|~G{qmMK16d~=#-!E>Pc zx53eYF7S-OrTSKMABeiC_EI^WP$i?PipHDxImyfQGkff}p`TOh1L&7^s@?z<@CV+B z{{hhudkJwqH#oGZt*I1>A4OX{t@4{Mp~S0Rr<94lS}91LDK|HFdQp?F`FZOcY?U`< z{XAN%yxaeSHkIE`Q^>sU8yapiZ~eNig?y@_@B!tarcuA6{>(=ec|X1~3nQ~|fUySa z&-B99I@*>Dsq)#1jHGr~m&0z#G*bL_eXjMkvSGC4Xq8{nQdp1Lyz<^blC>j_dWF5I zvz4yD>mr<(5gM}FY6s@Q2>)OY7xmw42ik+m)uND@A=?OFMM#=D+dRC&82Cz+ZR}Z; z_4;?{ewAG%#f2M2mU=~-$Xa({V#v%dXdl8VlOTI3D@_hr5cuBbe7L=M|8$MO8#kgz zu!^ect~3RlrKe=!vb(+1L0ug$EIEkj##Y{ke);SE}%tG8DK1dSL1?tDu*GELj_dqcYxCoq-23FT`Kx7@G zH6aM5TLH01eDG^43uzWek{-$NKUGc()S&*;E7C*veWp6S1UgYVrRm_!ql_5fI4~{g zD$Shlrc?!BYilcadXk!&I>1CXMx>pEcso)9zYDy-f;l70JncD}I|)f*FMa<##Pt7t z2u&$;U^DycSK400chVFT639zCbdN9@~)4W;U$QK7{Y$BeDwBndZGga zf##0LlmA)}diu{EwTfM*>JK_^rqrXTv?Lb0G=VV``nvgxMQrYaaiK8q@xCv`^JH@) z`{)Y_bX@?uZ2OiO1PlPxlRX}=(mMo6&I*t-?R?RLBI zpZG?BVPni(HAinK}Q$B0bV3{p;QPqCy^wlCh7eH5Y2zY&aL5KPGTg%JplvZq1 zmgzoUZgfw8Y{gw{P&$F5qho)&$M)ITro8N%ID~Zmw}l${5S37842a9H!?TnCE(!n) z%+3#r!;M*sww{~nQd(8#}ymwJDLd=~yr8;ItXd^n~{4QUJb2-AR zCVKJne@X1C<;V35Z&uVfm&`6D-~!_YF*oY*Y1lZP_u-PdEtEs}CA341fyI?xp| z3kgG0WY0n&do&*>bUFPM880!j&x^vzgVtxx1j%TR*9)URe=5k!hw~!@^#3-{oB(Vy zCaRc*Ry{&B_2A$jg5zJQHg9aD+;~em?Q{DE8KS>mzIsYhjY@?~=Mf#&@ie(sm}2kuTgUwkLR^Tg%D47>kHkZE}F!&H$d*My%cpIYQiPUrFH>wAxkb(?Vg60 z=&ydaZe{{DUwCP=<_frfQ+1Uk59Ksk7t(2A+zPEUIPYN|8C*|*F zr7_XC2y!buAz<^C)D&Aj1ct{bpU8DPlLZM1q>dra&IIqWx5ef!CskFow*F> zU37r}8|8Uj)xRe7M7*7l?E-mQhCI8q*8Lx9IPhi!IFT`iuZ{~|X9Mpr8HRI3j zPaeaw-8aO*6cQncAp@|rGtVa7tnEtWrN$hT?PLfHxJ8y=F<8m*N>JvYXVr`Hpl~+6jm%dM1_8?pP$$=qR2|!~yVd~j zes3F!YSB2p>o@%StguKDZ;>&Ph3~$|f}HD>y%FPxQN>Ojv|k?jE*g&!AVbE~c?@LC zy?+dy%kuSLm5cg#m|bv7_T?n}f2%@6`DVX6T=iwjLE zBM8_S_-*0P6DZ8zeOco5LmFklF&vH1qus`K!4a04nav>18DT^JRkZqAl7I3$oo{y1 zK=ZwcK=3_fMAmc|<;R5kb;|~q9b=O7*L%UVm*{lzcs+bczo0o^XEzO)c;&JGWec`` zE^6o{EkwNF5^QBRtp2pNUZjo$bBe{)ZL0l}Ke8cf4mF+oT!C-qclfhh`r?|wIyfQL zNMR8jON&Acbgp|p-uHfZQ#P?2;9xefkAB}?djfCIPDo8Q1v6wAeDbmtPJ%@!AcRn}xMEZ^`4@BgOz`*~(HQ}182px9UP`u%_^9O3JZ_BLOn&LFY>kb4ip=k}1a;-jbY-Vlo86cakPVXp^C z;&t{qR@9^#f2$1Zvkqpj-Twb(D+ID1GWILA!O)syStoEn0j7Zi#bp6{!X vR~dh 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 w*kGuMmg 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 literal 0 HcmV?d00001 diff --git a/doc/ota_updates/ota_updates.md b/doc/ota_updates/ota_updates.md index 1351f87b0..43010c2ce 100644 --- a/doc/ota_updates/ota_updates.md +++ b/doc/ota_updates/ota_updates.md @@ -11,8 +11,8 @@ title: OTA Update * [Requirements](#requirements) * [Application Example](#application-example) * [Classic OTA](#classic-ota) - * [Troubleshooting](#troubleshooting) * [ArduinoOTA](#arduinoota) + * [Troubleshooting](#troubleshooting) * [Web Browser](#web-browser) * [Requirements](#requirements-1) * [Implementation Overview](#implementation-overview) @@ -87,7 +87,7 @@ ESP.getFreeSketchSpace(); ``` can be used for checking the free space for the new sketch. -For overview of memory layout, where new sketch is stored and how it is copied during OTA process see [Update process - memory view]( https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/ota_updates.md#update-process---memory-view). +For overview of memory layout, where new sketch is stored and how it is copied during OTA process see [Update process - memory view](#update-process---memory-view). The following chapters provide more details and specific methods of doing OTA. @@ -109,34 +109,35 @@ Uploading modules wirelessly from Arduino IDE is intended for the following typi Currently there are two software configurations that support OTA updates. -- [Classic OTA](#classic-ota-configuration): Arduino IDE 1.6.5 and 1.6.5-947-g39819f0 (of July 23, 2015) or 1.6.5-1160-gef26c5f (of Sep 30, 2015) version of platform package that provides first OTA implementation, yet without support for [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. This particular configuration is easier to configure in Arduino IDE and therefore suggested for less experienced users. It soon will be depreciated once implementation below is fully released. +- [Classic OTA](#classic-ota-configuration): Arduino IDE 1.6.5 and 1.6.5-947-g39819f0 (of July 23, 2015) version of ESP8266 board support platform package that provides first OTA implementation, yet without support for [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. This particular configuration soon will be depreciated in favor of new implementation described below. -- [ArduinoOTA](#arduinoota-configuration): Arduino-PR-4107-BUILD-421 and latest git version of platform package that includes [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. This configuration features preliminary build of Arduino IDE and is intended for more experienced users. Please mid your step. +- [ArduinoOTA](#arduinoota-configuration): Arduino IDE 1.6.7 and 2.0.0 version of platform package. Arduino IDE 1.6.7 is the first release that provides support for [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library. -Instructions below demonstrate how to configure both [Classic OTA](#classic-ota-configuration) and [ArduinoOTA](#arduinoota-configuration) using NodeMCU 1.0 (ESP-12E Module) board. +For information how to install ESP8266 board support in Arduino IDE please refer to https://github.com/esp8266/Arduino#installing-with-boards-manager. Once installed, it is possible to switch between available versions of platform package using Boards Manager: + +![Selecion of ESP8266 package version](selection-of-package-version.png) + +Instructions below demonstrate how to configure both [Classic OTA](#classic-ota-configuration) and [ArduinoOTA](#arduinoota-configuration) using NodeMCU 1.0 (ESP-12E Module) board. You can use other boards assuming that they meet [requirements](#basic-requirements) described above. #### Classic OTA 1. Before you begin, please make sure that you have the following installed: - - Arduino IDE and ESP8266 board support as described under https://github.com/esp8266/Arduino#installing-with-boards-manager - - [Python](https://www.python.org/) 2.7 (do not install Python 3.5 that is not supported): - - **Note:** Windows users should select “Add python.exe to Path” (see below – this option is not selected by default). - - ![Python installation set up](ota-ide-python-configuration.png) + - Arduino IDE 1.6.5 and 1.6.5-947-g39819f0 version of platform package, + - [Python](https://www.python.org/) 2.7 (do not install Python 3.5 that is not supported). 2. Now prepare the sketch and configuration for the upload over a serial port. - Start Arduino IDE and load sketch DNS_SD_Arduino_OTA.ino available under File > Examples > ESP8266mDNS ![OTA sketch selection](ota-ide-sketch-selection.png) - **Note:** This sketch is available only for 1.6.5-947-g39819f0 (of July 23, 2015) and 1.6.5-1160-gef26c5f (of Sep 30, 2015) versions of platform packages installed in Arduino IDE using https://github.com/esp8266/Arduino#installing-with-boards-manager. It was removed in [#980](https://github.com/esp8266/Arduino/pull/980) from GitHub repository. + **Note:** This sketch is available only for 1.6.5-947-g39819f0 (of July 23, 2015) platform package. It was removed in [#980](https://github.com/esp8266/Arduino/pull/980) from GitHub repository. - Update SSID and password in the sketch so the module can join your Wi-Fi network - ![ssid and pass entry](ota-ide-ssid-pass-entry.png) + ![SSID and password entry](ota-ide-ssid-pass-entry.png) + - Configure upload parameters as below (you may need to adjust configuration if you are using a different module): ![configuration of serial upload](ota-ide-serial-upload-configuration.png) -3. Upload the sketch (Ctrl+U). Once done open Serial Monitor (Ctrl+Shift+M) and check if module has joined your Wi-Fi network. +3. Upload the sketch (Ctrl+U). Once done, open Serial Monitor (Ctrl+Shift+M) and check if module has joined your Wi-Fi network. ![check if module joined network](ota-ide-module-joined-wifi.png) @@ -156,22 +157,7 @@ Instructions below demonstrate how to configure both [Classic OTA](#classic-ota- **Note:** To be able to upload your sketch over and over again using OTA, you need to embed OTA routines inside. Please use DNS_SD_Arduino_OTA.ino as an example. - -#### Troubleshooting - -If OTA update fails, first step is to check for error messages that may be shown in upload window of Arduino IDE. If this is not providing any useful hints try to upload again while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open it, you will likely see the following: - -![Arduino IDE network terminal window](ota-ide-network-terminal.png) - -This window is for Arduino Yún and not yet implemented for esp8266/Arduino. It shows up because IDE is attempting to open Serial Monitor using network port you have selected for OTA upload. - -Instead you need an external serial monitor. If you are a Windows user check out [Termite](http://www.compuphase.com/software_termite.htm). This is handy, slick and simple RS232 terminal that does not impose RTS or DTR flow control. Such flow control may cause issues if you are using respective lines to toggle GPIO0 and RESET pins on ESP for upload. - -Select COM port and baud rate on external terminal program as if you were using Arduino Serial Monitor. Please see typical settings for [Termite](http://www.compuphase.com/software_termite.htm) below: - -![Termite settings](termite-configuration.png) - -Then run OTA from IDE and look what is displayed on terminal. Successful OTA process looks like below (sketch and free memory sizes as well as IP addresses depend on your particular s/w and h/w configuration): +In case of issues please refer to information provided in section [Troubleshooting](#troubleshooting). Successful OTA process looks like below on serial terminal: ``` Arduino OTA Test @@ -196,6 +182,69 @@ Sketch size: 346664 Free size: 700416 IP address: 192.168.1.100 ``` +**Note:** Sketch and free memory sizes as well as IP addresses depend on your particular s/w and h/w configuration. + + +#### ArduinoOTA + +1. Before you begin, please make sure that you have the following installed: + - Arduino IDE 1.6.7 and 2.0.0 version of platform package following the process described under https://github.com/esp8266/Arduino#installing-with-boards-manager + - [Python](https://www.python.org/) 2.7 (do not install Python 3.5 that is not supported): + + **Note:** Windows users should select “Add python.exe to Path” (see below – this option is not selected by default). + + ![Python installation set up](ota-ide-python-configuration.png) + +2. Now prepare the sketch and configuration for the upload over a serial port. + - Start Arduino IDE and load sketch BasicOTA.ino available under File > Examples > ArduinoOTA + ![selection of example OTA sketch](a-ota-sketch-selection.png) + + - Update SSID and password in the sketch so the module can join your Wi-Fi network + ![SSID and password entry](a-ota-ssid-pass-entry.png) + + - Configure upload parameters as below (you may need to adjust configuration if you are using a different module): + ![configuration of serial upload](a-ota-serial-upload-configuration.png) + +3. Upload the sketch (Ctrl+U). Once done, open Serial Monitor (Ctrl+Shift+M) and check if module has joined your Wi-Fi network: + + ![check if module joined network](a-ota-upload-complete-and-joined-wifi.png) + +4. Only if module is connected to network, after a couple of seconds, the esp8266-ota port will show up in Arduino IDE: + + ![selection of OTA port](a-ota-ota-port-selection.png) + + **Note:** If OTA port does not show up, try to exit Arduino IDE, open it again and check if port is there. + +5. Now get ready for your first OTA upload by selecting the OTA port: + + ![configuration of OTA upload](a-ota-ota-upload-configuration.png) + + There is no need to change ``` Upload Using: ``` or ``` Upload Speed: ```. + +6. If you have successfully completed all the above steps, you can upload (Ctrl+U) the same (or any other) sketch over OTA: + + ![OTA upload complete](a-ota-ota-upload-complete.png) + +**Note:** To be able to upload your sketch over and over again using OTA, you need to embed OTA routines inside. Please use BasicOTA.ino as an example. + + +#### Troubleshooting + +If OTA update fails, first step is to check for error messages that may be shown in upload window of Arduino IDE. If this is not providing any useful hints try to upload again while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open it, you will likely see the following: + +![Arduino IDE network terminal window](ota-ide-network-terminal.png) + +This window is for Arduino Yún and not yet implemented for esp8266/Arduino. It shows up because IDE is attempting to open Serial Monitor using network port you have selected for OTA upload. + +Instead you need an external serial monitor. If you are a Windows user check out [Termite](http://www.compuphase.com/software_termite.htm). This is handy, slick and simple RS232 terminal that does not impose RTS or DTR flow control. Such flow control may cause issues if you are using respective lines to toggle GPIO0 and RESET pins on ESP for upload. + +Select COM port and baud rate on external terminal program as if you were using Arduino Serial Monitor. Please see typical settings for [Termite](http://www.compuphase.com/software_termite.htm) below: + +![Termite settings](termite-configuration.png) + +Then run OTA from IDE and look what is displayed on terminal. Successful [ArduinoOTA](#arduinoota) process using BasicOTA.ino sketch looks like below (IP address depends on your network configuration): + +![OTA upload successful - output on an external serial terminal](a-ota-external-serial-terminal-output.png) If upload fails you will likely see errors caught by the uploader, exception and the stack dump, or both. @@ -208,18 +257,6 @@ For more details regarding flash memory layout please check [File system]( https For overview where new sketch is stored, how it is copied and how memory is organized for the purpose of OTA see [Update process - memory view]( https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/ota_updates.md#update-process---memory-view). -#### ArduinoOTA - -1. Upload and install the following software: - - Arduino-PR-4107-BUILD-421 - https://github.com/esp8266/Arduino/pull/984#issuecomment-155905800 - - Latest git version of platform package - https://github.com/esp8266/Arduino#using-git-version- - - Python 2.7 - -2. Proceed to step 2 under [Classic OTA Configuration](#classic-ota-configuration) using BasicOTA.ino or OTALeds.ino sketch instead. - -3. Carry on with remaining steps. - - ## Web Browser Updates described in this chapter are done with a web browser that can be useful in the following typical scenarios: @@ -236,7 +273,7 @@ Updates described in this chapter are done with a web browser that can be useful ### Implementation Overview -Updates with a web browser are implemented using ```ESP8266HTTPUpdateServer``` class together with ```ESP8266WebServer``` and ```ESP8266mDNS``` classes. The following code is required to get it work: +Updates with a web browser are implemented using ``` ESP8266HTTPUpdateServer ``` class together with ``` ESP8266WebServer ``` and ``` ESP8266mDNS ``` classes. The following code is required to get it work: setup() @@ -260,10 +297,10 @@ loop() The sample implementation provided below has been done using: -- example sketch WebUpdater.ino available in ESP8266HTTPUpdateServer library +- example sketch WebUpdater.ino available in ``` ESP8266HTTPUpdateServer ``` library - NodeMCU 1.0 (ESP-12E Module) -You can use another module if it meets “Flash chip size is 2x the size of the sketch” requirement. +You can use another module if it meets previously desribed [requirements](#basic-requirements). 1. Before you begin, please make sure that you have the following software installed: @@ -291,9 +328,8 @@ You can use another module if it meets “Flash chip size is 2x the size of the 4. Now open web browser and enter the url provided on Serial Monitor, i.e. http://esp8266-webupdate.local/update. Once entered, browser should display a form like below that has been served by your module. The form invites you to choose a file for update. ![OTA update form in web browser](ota-web-browser-form.png) - - **Note:** If entering “http://esp8266-webupdate.local/update” does not work, try replacing “esp8266-webupdate” with module’s IP address. For example, if your module IP is “192.168.1.100” then url should be “http://192.168.1.100/update”. This workaround is useful in case the host software installed in step 2 does not work. If still nothing works and there are no clues on Serial Monitor, try to diagnose issue by opening provided url in Google Chrome, pressing F12 and checking contents of “Console” and “Network” tabs. Chrome provides some advanced logging on these tabs. - + + **Note:** If entering ``` http://esp8266-webupdate.local/update ``` does not work, try replacing ``` esp8266-webupdate ``` with module’s IP address. For example, if your module IP is ``` 192.168.1.100 ``` then url should be ``` http://192.168.1.100/update ```. This workaround is useful in case the host software installed in step 2 does not work. If still nothing works and there are no clues on Serial Monitor, try to diagnose issue by opening provided url in Google Chrome, pressing F12 and checking contents of “Console” and “Network” tabs. Chrome provides some advanced logging on these tabs. 5. To obtain the file navigate to directory used by Arduino IDE to store results of compilation. You can check the path to this file in compilation log shown in IDE debug window as marked below. @@ -306,8 +342,8 @@ You can use another module if it meets “Flash chip size is 2x the size of the Module will reboot that should be visible on Serial Monitor: ![Serial Monitor - after OTA update](ota-web-serial-monitor-reboot.png) - - Just after reboot you should see exactly the same message “HTTPUpdateServer ready! Open http:// esp8266-webupdate.local /update in your browser” like in step 3. This is because module has been loaded again with the same code – first using serial port, and then using OTA. + + Just after reboot you should see exactly the same message ``` HTTPUpdateServer ready! Open http:// esp8266-webupdate.local /update in your browser``` like in step 3. This is because module has been loaded again with the same code – first using serial port, and then using OTA. Once you are comfortable with this procedure go ahead and modify WebUpdater.ino sketch to print some additional messages, compile it, locate new binary file and upload it using web browser to see entered changes on a Serial Monitor. diff --git a/doc/ota_updates/selection-of-package-version.png b/doc/ota_updates/selection-of-package-version.png new file mode 100644 index 0000000000000000000000000000000000000000..33e1a6d21cac4cab9adaee28eab8653e1ea10513 GIT binary patch literal 97396 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 Hh5`Q{TdXF< literal 0 HcmV?d00001 From 09a7940006c9672e5d2247f9872f9b0f9c96444e Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 16:36:55 +0100 Subject: [PATCH 03/38] code style --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 439 ++++++-------- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 680 +++++++++++----------- 2 files changed, 511 insertions(+), 608 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index a95bd1f7d..b946d5bdf 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -1,23 +1,23 @@ /* - ESP8266WiFi.cpp - WiFi library for esp8266 + ESP8266WiFi.cpp - WiFi library for esp8266 - Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include "ESP8266WiFi.h" @@ -41,27 +41,20 @@ extern "C" { extern "C" void esp_schedule(); extern "C" void esp_yield(); -ESP8266WiFiClass::ESP8266WiFiClass() -: _smartConfigStarted(false) -, _smartConfigDone(false) -, _useStaticIp(false) -, _persistent(true) -{ +ESP8266WiFiClass::ESP8266WiFiClass() : + _smartConfigStarted(false), _smartConfigDone(false), _useStaticIp(false), _persistent(true) { uint8 m = wifi_get_opmode(); _useClientMode = (m & WIFI_STA); _useApMode = (m & WIFI_AP); - wifi_set_event_handler_cb((wifi_event_handler_cb_t)&ESP8266WiFiClass::_eventCallback); + wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiClass::_eventCallback); } -void ESP8266WiFiClass::persistent(bool persistent) -{ +void ESP8266WiFiClass::persistent(bool persistent) { _persistent = persistent; } - -void ESP8266WiFiClass::mode(WiFiMode m) -{ - if(wifi_get_opmode() == (uint8)m) { +void ESP8266WiFiClass::mode(WiFiMode m) { + if(wifi_get_opmode() == (uint8) m) { return; } @@ -80,19 +73,17 @@ void ESP8266WiFiClass::mode(WiFiMode m) _mode(m); } -WiFiMode ESP8266WiFiClass::getMode() -{ - return (WiFiMode)wifi_get_opmode(); +WiFiMode ESP8266WiFiClass::getMode() { + return (WiFiMode) wifi_get_opmode(); } -void ESP8266WiFiClass::_mode(WiFiMode m) -{ - if(wifi_get_opmode() == (uint8)m) { +void ESP8266WiFiClass::_mode(WiFiMode m) { + if(wifi_get_opmode() == (uint8) m) { return; } ETS_UART_INTR_DISABLE(); - if (_persistent) + if(_persistent) wifi_set_opmode(m); else wifi_set_opmode_current(m); @@ -100,36 +91,32 @@ void ESP8266WiFiClass::_mode(WiFiMode m) } -static bool sta_config_equal(const station_config& lhs, const station_config& rhs) -{ - if (strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) +static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) return false; - if (strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) return false; - if (lhs.bssid_set) { - if (!rhs.bssid_set) + if(lhs.bssid_set) { + if(!rhs.bssid_set) return false; - if (memcmp(lhs.bssid, rhs.bssid, 6) != 0) + if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) return false; - } - else { - if (rhs.bssid_set) + } else { + if(rhs.bssid_set) return false; } return true; } -int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) -{ +int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { return begin((const char*) ssid, (const char*) passphrase, channel, bssid); } -int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) -{ +int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { _useClientMode = true; if(_useApMode) { @@ -153,13 +140,13 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch struct station_config conf; strcpy(reinterpret_cast(conf.ssid), ssid); - if (passphrase) { + if(passphrase) { strcpy(reinterpret_cast(conf.password), passphrase); } else { *conf.password = 0; } - if (bssid) { + if(bssid) { conf.bssid_set = 1; memcpy((void *) &conf.bssid[0], (void *) bssid, 6); } else { @@ -168,13 +155,13 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch struct station_config current_conf; wifi_station_get_config(¤t_conf); - if (sta_config_equal(current_conf, conf)) { + if(sta_config_equal(current_conf, conf)) { DEBUGV("sta config unchanged"); return status(); } ETS_UART_INTR_DISABLE(); - if (_persistent) + if(_persistent) wifi_station_set_config(&conf); else wifi_station_set_config_current(&conf); @@ -190,8 +177,7 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch return status(); } -int ESP8266WiFiClass::begin() -{ +int ESP8266WiFiClass::begin() { ETS_UART_INTR_DISABLE(); wifi_station_connect(); ETS_UART_INTR_ENABLE(); @@ -201,18 +187,16 @@ int ESP8266WiFiClass::begin() return status(); } -uint8_t ESP8266WiFiClass::waitForConnectResult(){ - if ((wifi_get_opmode() & 1) == 0)//1 and 3 have STA enabled - return WL_DISCONNECTED; - while (status() == WL_DISCONNECTED) - delay(100); - return status(); +uint8_t ESP8266WiFiClass::waitForConnectResult() { + if((wifi_get_opmode() & 1) == 0) //1 and 3 have STA enabled + return WL_DISCONNECTED; + while(status() == WL_DISCONNECTED) + delay(100); + return status(); } - // You will have to set the DNS-Server manually later since this will not enable DHCP2 -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) -{ +void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); @@ -224,8 +208,7 @@ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress s _useStaticIp = true; } -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) -{ +void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); @@ -237,18 +220,17 @@ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress s // Set DNS-Server ip_addr_t d; d.addr = static_cast(dns); - dns_setserver(0,&d); + dns_setserver(0, &d); _useStaticIp = true; } -int ESP8266WiFiClass::softAPdisconnect(bool wifioff) -{ +int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { struct softap_config conf; *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); - if (_persistent) + if(_persistent) wifi_softap_set_config(&conf); else wifi_softap_set_config_current(&conf); @@ -257,7 +239,7 @@ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) if(wifioff) { _useApMode = false; - if( _useClientMode) { + if(_useClientMode) { // turn on STA _mode(WIFI_STA); } else { @@ -269,13 +251,12 @@ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) return 0; } -int ESP8266WiFiClass::disconnect(bool wifioff) -{ +int ESP8266WiFiClass::disconnect(bool wifioff) { struct station_config conf; *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); - if (_persistent) + if(_persistent) wifi_station_set_config(&conf); else wifi_station_set_config_current(&conf); @@ -297,28 +278,23 @@ int ESP8266WiFiClass::disconnect(bool wifioff) return 0; } -static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) -{ - if (strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) +static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) return false; - if (strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) return false; - if (lhs.channel != rhs.channel) + if(lhs.channel != rhs.channel) return false; - if (lhs.ssid_hidden != rhs.ssid_hidden) + if(lhs.ssid_hidden != rhs.ssid_hidden) return false; return true; } - -void ESP8266WiFiClass::softAP(const char* ssid) -{ +void ESP8266WiFiClass::softAP(const char* ssid) { softAP(ssid, 0); } - -void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) -{ +void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { _useApMode = true; if(_useClientMode) { // turn on AP+STA mode @@ -347,35 +323,30 @@ void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int chan conf.max_connection = 4; conf.beacon_interval = 100; - if (!passphrase || strlen(passphrase) == 0) - { + if(!passphrase || strlen(passphrase) == 0) { conf.authmode = AUTH_OPEN; *conf.password = 0; - } - else - { + } else { conf.authmode = AUTH_WPA2_PSK; strcpy(reinterpret_cast(conf.password), passphrase); } struct softap_config conf_current; wifi_softap_get_config(&conf_current); - if (softap_config_equal(conf, conf_current)) - { + if(softap_config_equal(conf, conf_current)) { DEBUGV("softap config unchanged"); return; } ETS_UART_INTR_DISABLE(); - if (_persistent) + if(_persistent) wifi_softap_set_config(&conf); else wifi_softap_set_config_current(&conf); ETS_UART_INTR_ENABLE(); } -void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) -{ +void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); @@ -385,142 +356,120 @@ void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAdd wifi_softap_dhcps_start(); } -uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) -{ +uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) { wifi_get_macaddr(STATION_IF, mac); return mac; } -String ESP8266WiFiClass::macAddress(void) -{ +String ESP8266WiFiClass::macAddress(void) { uint8_t mac[6]; - char macStr[18] = {0}; + char macStr[18] = { 0 }; wifi_get_macaddr(STATION_IF, mac); - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return String(macStr); } -uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) -{ +uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) { wifi_get_macaddr(SOFTAP_IF, mac); return mac; } -String ESP8266WiFiClass::softAPmacAddress(void) -{ +String ESP8266WiFiClass::softAPmacAddress(void) { uint8_t mac[6]; - char macStr[18] = {0}; + char macStr[18] = { 0 }; wifi_get_macaddr(SOFTAP_IF, mac); - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return String(macStr); } -IPAddress ESP8266WiFiClass::localIP() -{ +IPAddress ESP8266WiFiClass::localIP() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.ip.addr); } -IPAddress ESP8266WiFiClass::softAPIP() -{ +IPAddress ESP8266WiFiClass::softAPIP() { struct ip_info ip; wifi_get_ip_info(SOFTAP_IF, &ip); return IPAddress(ip.ip.addr); } -IPAddress ESP8266WiFiClass::subnetMask() -{ +IPAddress ESP8266WiFiClass::subnetMask() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.netmask.addr); } -IPAddress ESP8266WiFiClass::gatewayIP() -{ +IPAddress ESP8266WiFiClass::gatewayIP() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.gw.addr); } -IPAddress ESP8266WiFiClass::dnsIP(int dns_no) -{ +IPAddress ESP8266WiFiClass::dnsIP(int dns_no) { ip_addr_t dns_ip = dns_getserver(dns_no); return IPAddress(dns_ip.addr); } -String ESP8266WiFiClass::SSID() const -{ +String ESP8266WiFiClass::SSID() const { static struct station_config conf; wifi_station_get_config(&conf); return String(reinterpret_cast(conf.ssid)); } -String ESP8266WiFiClass::psk() const -{ +String ESP8266WiFiClass::psk() const { static struct station_config conf; wifi_station_get_config(&conf); - return String(reinterpret_cast(conf.password)); + return String(reinterpret_cast(conf.password)); } -uint8_t* ESP8266WiFiClass::BSSID(void) -{ +uint8_t* ESP8266WiFiClass::BSSID(void) { static struct station_config conf; wifi_station_get_config(&conf); return reinterpret_cast(conf.bssid); } -String ESP8266WiFiClass::BSSIDstr(void) -{ +String ESP8266WiFiClass::BSSIDstr(void) { static struct station_config conf; - char mac[18] = {0}; + char mac[18] = { 0 }; wifi_station_get_config(&conf); - sprintf(mac,"%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); return String(mac); } - int32_t ESP8266WiFiClass::channel(void) { return wifi_get_channel(); } - int32_t ESP8266WiFiClass::RSSI(void) { return wifi_station_get_rssi(); } -extern "C" -{ - typedef STAILQ_HEAD(, bss_info) bss_info_head_t; +extern "C" { +typedef STAILQ_HEAD(, bss_info) +bss_info_head_t; } -void ESP8266WiFiClass::_scanDone(void* result, int status) -{ - if (status != OK) - { +void ESP8266WiFiClass::_scanDone(void* result, int status) { + if(status != OK) { ESP8266WiFiClass::_scanCount = 0; ESP8266WiFiClass::_scanResult = 0; - } - else - { + } else { int i = 0; bss_info_head_t* head = reinterpret_cast(result); - for (bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i); + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) + ; ESP8266WiFiClass::_scanCount = i; - if (i == 0) - { + if(i == 0) { ESP8266WiFiClass::_scanResult = 0; - } - else - { + } else { bss_info* copied_info = new bss_info[i]; i = 0; - for (bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) - { + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) { memcpy(copied_info + i, it, sizeof(bss_info)); } @@ -550,10 +499,8 @@ int8_t ESP8266WiFiClass::scanComplete() { return WIFI_SCAN_FAILED; } -void ESP8266WiFiClass::scanDelete() -{ - if (ESP8266WiFiClass::_scanResult) - { +void ESP8266WiFiClass::scanDelete() { + if(ESP8266WiFiClass::_scanResult) { delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); ESP8266WiFiClass::_scanResult = 0; ESP8266WiFiClass::_scanCount = 0; @@ -561,8 +508,7 @@ void ESP8266WiFiClass::scanDelete() _scanComplete = false; } -int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) -{ +int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { if(ESP8266WiFiClass::_scanStarted) { return WIFI_SCAN_RUNNING; } @@ -578,8 +524,7 @@ int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) } int status = wifi_station_get_connect_status(); - if (status != STATION_GOT_IP && status != STATION_IDLE) - { + if(status != STATION_GOT_IP && status != STATION_IDLE) { disconnect(); } @@ -607,142 +552,126 @@ int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) } -void * ESP8266WiFiClass::_getScanInfoByIndex(int i) -{ - if (!ESP8266WiFiClass::_scanResult || (size_t)i > ESP8266WiFiClass::_scanCount) - { +void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { + if(!ESP8266WiFiClass::_scanResult || (size_t) i > ESP8266WiFiClass::_scanCount) { return 0; } return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; } -String ESP8266WiFiClass::SSID(uint8_t i) -{ +String ESP8266WiFiClass::SSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return ""; return String(reinterpret_cast(it->ssid)); } -uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) -{ +uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return 0; return it->bssid; } -String ESP8266WiFiClass::BSSIDstr(uint8_t i) -{ - char mac[18] = {0}; +String ESP8266WiFiClass::BSSIDstr(uint8_t i) { + char mac[18] = { 0 }; struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return String(""); - sprintf(mac,"%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); return String(mac); } -int32_t ESP8266WiFiClass::channel(uint8_t i) -{ +int32_t ESP8266WiFiClass::channel(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return 0; return it->channel; } -bool ESP8266WiFiClass::isHidden(uint8_t i) -{ +bool ESP8266WiFiClass::isHidden(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return false; return (it->is_hidden != 0); } -bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) -{ +bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) - return false; + if(!it) + return false; - ssid = (const char*)it->ssid; - encType = encryptionType(i); - rssi = it->rssi; - bssid = it->bssid; // move ptr - channel = it->channel; - isHidden = (it->is_hidden != 0); + ssid = (const char*) it->ssid; + encType = encryptionType(i); + rssi = it->rssi; + bssid = it->bssid; // move ptr + channel = it->channel; + isHidden = (it->is_hidden != 0); - return true; + return true; } -int32_t ESP8266WiFiClass::RSSI(uint8_t i) -{ +int32_t ESP8266WiFiClass::RSSI(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return 0; return it->rssi; } -uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) -{ +uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if (!it) + if(!it) return -1; int authmode = it->authmode; - if (authmode == AUTH_OPEN) + if(authmode == AUTH_OPEN) return ENC_TYPE_NONE; - if (authmode == AUTH_WEP) + if(authmode == AUTH_WEP) return ENC_TYPE_WEP; - if (authmode == AUTH_WPA_PSK) + if(authmode == AUTH_WPA_PSK) return ENC_TYPE_TKIP; - if (authmode == AUTH_WPA2_PSK) + if(authmode == AUTH_WPA2_PSK) return ENC_TYPE_CCMP; - if (authmode == AUTH_WPA_WPA2_PSK) + if(authmode == AUTH_WPA_WPA2_PSK) return ENC_TYPE_AUTO; return -1; } -wl_status_t ESP8266WiFiClass::status() -{ +wl_status_t ESP8266WiFiClass::status() { int status = wifi_station_get_connect_status(); - if (status == STATION_GOT_IP) - return WL_CONNECTED; - else if (status == STATION_NO_AP_FOUND) - return WL_NO_SSID_AVAIL; - else if (status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) - return WL_CONNECT_FAILED; - else if (status == STATION_IDLE) - return WL_IDLE_STATUS; + if(status == STATION_GOT_IP) + return WL_CONNECTED; + else if(status == STATION_NO_AP_FOUND) + return WL_NO_SSID_AVAIL; + else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) + return WL_CONNECT_FAILED; + else if(status == STATION_IDLE) + return WL_IDLE_STATUS; else - return WL_DISCONNECTED; + return WL_DISCONNECTED; } -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) -{ - if (ipaddr) +void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { + if(ipaddr) (*reinterpret_cast(callback_arg)) = ipaddr->addr; esp_schedule(); // resume the hostByName function } -int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) -{ +int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { ip_addr_t addr; aResult = static_cast(0); err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); - if (err == ERR_OK) - { + if(err == ERR_OK) { aResult = addr.addr; - } - else if (err == ERR_INPROGRESS) - { + } else if(err == ERR_INPROGRESS) { esp_yield(); // will return here when dns_found_callback fires } @@ -771,13 +700,12 @@ bool ESP8266WiFiClass::hostname(String aHostname) { //-------------------------------------------------------------- -void wifi_wps_status_cb(wps_cb_status status) -{ +void wifi_wps_status_cb(wps_cb_status status) { DEBUGV("wps cb status: %d\r\n", status); - switch (status) { + switch(status) { case WPS_CB_ST_SUCCESS: if(!wifi_wps_disable()) { - DEBUGV("wps disable failed\n"); + DEBUGV("wps disable failed\n"); } wifi_station_connect(); break; @@ -800,13 +728,13 @@ bool ESP8266WiFiClass::beginWPSConfig(void) { _useClientMode = true; - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } + if(_useApMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_STA); + } disconnect(); @@ -841,11 +769,8 @@ bool ESP8266WiFiClass::beginWPSConfig(void) { //-------------------------------------------------------------- - - -void ESP8266WiFiClass::beginSmartConfig() -{ - if (_smartConfigStarted) +void ESP8266WiFiClass::beginSmartConfig() { + if(_smartConfigStarted) return; if(_useApMode) { @@ -863,27 +788,24 @@ void ESP8266WiFiClass::beginSmartConfig() smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); } -void ESP8266WiFiClass::stopSmartConfig() -{ - if (!_smartConfigStarted) +void ESP8266WiFiClass::stopSmartConfig() { + if(!_smartConfigStarted) return; smartconfig_stop(); _smartConfigStarted = false; } -bool ESP8266WiFiClass::smartConfigDone() -{ - if (!_smartConfigStarted) +bool ESP8266WiFiClass::smartConfigDone() { + if(!_smartConfigStarted) return false; return _smartConfigDone; } -void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) -{ +void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { sc_status status = (sc_status) st; - if (status == SC_STATUS_LINK) { + if(status == SC_STATUS_LINK) { station_config* sta_conf = reinterpret_cast(result); wifi_station_set_config(sta_conf); @@ -891,13 +813,11 @@ void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) wifi_station_connect(); WiFi._smartConfigDone = true; - } - else if (status == SC_STATUS_LINK_OVER) { + } else if(status == SC_STATUS_LINK_OVER) { WiFi.stopSmartConfig(); } } - //-------------------------------------------------------------- /** @@ -906,7 +826,7 @@ void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) * @return bool */ bool ESP8266WiFiClass::setSleepMode(WiFiSleepType_t type) { - return wifi_set_sleep_type((sleep_type_t)type); + return wifi_set_sleep_type((sleep_type_t) type); } /** @@ -914,7 +834,7 @@ bool ESP8266WiFiClass::setSleepMode(WiFiSleepType_t type) { * @return sleep_type_t */ WiFiSleepType_t ESP8266WiFiClass::getSleepMode() { - return (WiFiSleepType_t)wifi_get_sleep_type(); + return (WiFiSleepType_t) wifi_get_sleep_type(); } /** @@ -923,7 +843,7 @@ WiFiSleepType_t ESP8266WiFiClass::getSleepMode() { * @return bool */ bool ESP8266WiFiClass::setPhyMode(WiFiPhyMode_t mode) { - return wifi_set_phy_mode((phy_mode_t)mode); + return wifi_set_phy_mode((phy_mode_t) mode); } /** @@ -931,28 +851,26 @@ bool ESP8266WiFiClass::setPhyMode(WiFiPhyMode_t mode) { * @return phy_mode_t */ WiFiPhyMode_t ESP8266WiFiClass::getPhyMode() { - return (WiFiPhyMode_t)wifi_get_phy_mode(); + return (WiFiPhyMode_t) wifi_get_phy_mode(); } //-------------------------------------------------------------- -void ESP8266WiFiClass::_eventCallback(void* arg) -{ +void ESP8266WiFiClass::_eventCallback(void* arg) { System_Event_t* event = reinterpret_cast(arg); DEBUGV("wifi evt: %d\r\n", event->event); - if (event->event == EVENT_STAMODE_DISCONNECTED) { + if(event->event == EVENT_STAMODE_DISCONNECTED) { WiFiClient::stopAll(); } } -void ESP8266WiFiClass::printDiag(Print& p) -{ - const char* modes[] = {"NULL", "STA", "AP", "STA+AP"}; +void ESP8266WiFiClass::printDiag(Print& p) { + const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; p.print("Mode: "); p.println(modes[wifi_get_opmode()]); - const char* phymodes[] = {"", "B", "G", "N"}; + const char* phymodes[] = { "", "B", "G", "N" }; p.print("PHY mode: "); p.println(phymodes[(int) wifi_get_phy_mode()]); @@ -995,5 +913,4 @@ bool ESP8266WiFiClass::_scanComplete = false; size_t ESP8266WiFiClass::_scanCount = 0; void* ESP8266WiFiClass::_scanResult = 0; - ESP8266WiFiClass WiFi; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 5a7fe54c1..8e65af3f7 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -1,23 +1,23 @@ /* - ESP8266WiFi.h - esp8266 Wifi support. - Based on WiFi.h from Ardiono WiFi shield library. - Copyright (c) 2011-2014 Arduino. All right reserved. - Modified by Ivan Grokhotkov, December 2014 + ESP8266WiFi.h - esp8266 Wifi support. + Based on WiFi.h from Ardiono WiFi shield library. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #ifndef WiFi_h #define WiFi_h @@ -25,7 +25,7 @@ #include extern "C" { - #include "include/wl_definitions.h" +#include "include/wl_definitions.h" } #include "IPAddress.h" @@ -36,11 +36,12 @@ extern "C" { #define WIFI_SCAN_RUNNING (-1) #define WIFI_SCAN_FAILED (-2) - // Note: // this enums need to be in sync with the SDK! -enum WiFiMode { WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 }; +enum WiFiMode { + WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 +}; typedef enum { WIFI_PHY_MODE_11B = 1, WIFI_PHY_MODE_11G = 2, WIFI_PHY_MODE_11N = 3 @@ -50,390 +51,375 @@ typedef enum { WIFI_NONE_SLEEP = 0, WIFI_LIGHT_SLEEP = 2, WIFI_MODEM_SLEEP = 3 } WiFiSleepType_t; +class ESP8266WiFiClass { + public: -class ESP8266WiFiClass -{ -public: + ESP8266WiFiClass(); - ESP8266WiFiClass(); + void persistent(bool persistent); - void persistent(bool persistent); + void mode(WiFiMode); + WiFiMode getMode(); - void mode(WiFiMode); - WiFiMode getMode(); + /** + * Start Wifi connection + * if passphrase is set the most secure supported mode will be automatically selected + * @param ssid const char* Pointer to the SSID string. + * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). + * @param bssid uint8_t[6] Optional. BSSID / MAC of AP + * @param channel Optional. Channel of AP + * @return + */ + int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - /** - * Start Wifi connection - * if passphrase is set the most secure supported mode will be automatically selected - * @param ssid const char* Pointer to the SSID string. - * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). - * @param bssid uint8_t[6] Optional. BSSID / MAC of AP - * @param channel Optional. Channel of AP - * @return - */ - int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + // Use sdk config to connect. + int begin(); - // Use sdk config to connect. - int begin(); + /* Wait for Wifi connection to reach a result + * returns the status reached or disconnect if STA is off + */ + uint8_t waitForConnectResult(); + /* Set up an open access point + * + * param ssid: Pointer to the SSID string. + */ + void softAP(const char* ssid); - /* Wait for Wifi connection to reach a result - * returns the status reached or disconnect if STA is off - */ - uint8_t waitForConnectResult(); + /* Set up a WPA2-secured access point + * + * param ssid: Pointer to the SSID string. + * param passphrase: Pointer to passphrase, 8 characters min. + * param channel: WiFi channel number, 1 - 13. + * param ssid_hidden: Network cloaking? 0 = broadcast SSID, 1 = hide SSID + */ + void softAP(const char* ssid, const char* passphrase, int channel = 1, int ssid_hidden = 0); - /* Set up an open access point - * - * param ssid: Pointer to the SSID string. - */ - void softAP(const char* ssid); + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + * param gateway: Static gateway configuration + * param subnet: Static Subnet mask + */ + void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + * param gateway: Static gateway configuration + * param subnet: Static Subnet mask + * param dns: Defined DNS + */ + void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); - /* Set up a WPA2-secured access point - * - * param ssid: Pointer to the SSID string. - * param passphrase: Pointer to passphrase, 8 characters min. - * param channel: WiFi channel number, 1 - 13. - * param ssid_hidden: Network cloaking? 0 = broadcast SSID, 1 = hide SSID - */ - void softAP(const char* ssid, const char* passphrase, int channel = 1, int ssid_hidden = 0); + /* Configure access point + * + * param local_ip: access point IP + * param gateway: gateway IP + * param subnet: subnet mask + */ + void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param gateway: Static gateway configuration - * param subnet: Static Subnet mask - */ - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + /* + * Disconnect from the network (close AP) + * + * return: one value of wl_status_t enum + */ + int softAPdisconnect(bool wifioff = false); - /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param gateway: Static gateway configuration - * param subnet: Static Subnet mask - * param dns: Defined DNS - */ - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); + /* + * Disconnect from the network + * + * return: one value of wl_status_t enum + */ + int disconnect(bool wifioff = false); - /* Configure access point - * - * param local_ip: access point IP - * param gateway: gateway IP - * param subnet: subnet mask - */ - void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + /* + * Get the station interface MAC address. + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * return: String + */ + uint8_t* macAddress(uint8_t* mac); + String macAddress(void); - /* - * Disconnect from the network (close AP) - * - * return: one value of wl_status_t enum - */ - int softAPdisconnect(bool wifioff = false); + /* + * Get the softAP interface MAC address. + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * return: String + */ + uint8_t* softAPmacAddress(uint8_t* mac); + String softAPmacAddress(void); - /* - * Disconnect from the network - * - * return: one value of wl_status_t enum - */ - int disconnect(bool wifioff = false); + /* + * Get the station interface IP address. + * + * return: Ip address value + */ + IPAddress localIP(); - /* - * Get the station interface MAC address. - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * return: String - */ - uint8_t* macAddress(uint8_t* mac); - String macAddress(void); + /* + * Get the softAP interface IP address. + * + * return: Ip address value + */ + IPAddress softAPIP(); - /* - * Get the softAP interface MAC address. - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * return: String - */ - uint8_t* softAPmacAddress(uint8_t* mac); - String softAPmacAddress(void); + /* + * Get the interface subnet mask address. + * + * return: subnet mask address value + */ + IPAddress subnetMask(); - /* - * Get the station interface IP address. - * - * return: Ip address value - */ - IPAddress localIP(); + /* + * Get the gateway ip address. + * + * return: gateway ip address value + */ + IPAddress gatewayIP(); - /* - * Get the softAP interface IP address. - * - * return: Ip address value - */ - IPAddress softAPIP(); + /* + * Get the DNS ip address. + * + * return: DNS ip address value + */ + IPAddress dnsIP(int dns_no = 0); - /* - * Get the interface subnet mask address. - * - * return: subnet mask address value - */ - IPAddress subnetMask(); + /* + * Return the current SSID associated with the network + * + * return: ssid string + */ + String SSID() const; - /* - * Get the gateway ip address. - * - * return: gateway ip address value - */ - IPAddress gatewayIP(); + /* + * Return the current pre shared key associated with the network + * + * return: psk string + */ + String psk() const; - /* - * Get the DNS ip address. - * - * return: DNS ip address value - */ - IPAddress dnsIP(int dns_no = 0); + /* + * Return the current bssid / mac associated with the network if configured + * + * return: bssid uint8_t * + */ + uint8_t *BSSID(void); - /* - * Return the current SSID associated with the network - * - * return: ssid string - */ - String SSID() const; + /* + * Return the current bssid / mac associated with the network if configured + * + * return: bssid string + */ + String BSSIDstr(void); - /* - * Return the current pre shared key associated with the network - * - * return: psk string - */ - String psk() const; + /* + * Return the current channel associated with the network + * + * return: channel + */ + int32_t channel(void); - /* - * Return the current bssid / mac associated with the network if configured - * - * return: bssid uint8_t * - */ - uint8_t *BSSID(void); + /* + * Return the current network RSSI. + * + * return: RSSI value + */ - /* - * Return the current bssid / mac associated with the network if configured - * - * return: bssid string - */ - String BSSIDstr(void); + int32_t RSSI(); - /* - * Return the current channel associated with the network - * - * return: channel - */ - int32_t channel(void); + /* + * called to get the scan state in Async mode + * + * return -1 if scan not fin + * return -2 if scan not triggered + */ + int8_t scanComplete(); - /* - * Return the current network RSSI. - * - * return: RSSI value - */ + /* + * delete last scan result from RAM + */ + void scanDelete(); - int32_t RSSI(); + /* + * Start scan WiFi networks available + * + * return: Number of discovered networks + */ + int8_t scanNetworks(bool async = false, bool show_hidden = false); + /* + * Return the SSID discovered during the network scan. + * + * param networkItem: specify from which network item want to get the information + * + * return: ssid string of the specified item on the networks scanned list + */ + String SSID(uint8_t networkItem); - /* - * called to get the scan state in Async mode - * - * return -1 if scan not fin - * return -2 if scan not triggered - */ - int8_t scanComplete(); + /* + * Return the encryption type of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ + uint8_t encryptionType(uint8_t networkItem); - /* - * delete last scan result from RAM - */ - void scanDelete(); + /* + * Return the RSSI of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: signed value of RSSI of the specified item on the networks scanned list + */ + int32_t RSSI(uint8_t networkItem); - /* - * Start scan WiFi networks available - * - * return: Number of discovered networks - */ - int8_t scanNetworks(bool async = false, bool show_hidden = false); + /** + * return MAC / BSSID of scanned wifi + * @param networkItem specify from which network item want to get the information + * @return uint8_t * MAC / BSSID of scanned wifi + */ + uint8_t * BSSID(uint8_t networkItem); - /* - * Return the SSID discovered during the network scan. - * - * param networkItem: specify from which network item want to get the information - * - * return: ssid string of the specified item on the networks scanned list - */ - String SSID(uint8_t networkItem); + /** + * return MAC / BSSID of scanned wifi + * @param networkItem specify from which network item want to get the information + * @return String MAC / BSSID of scanned wifi + */ + String BSSIDstr(uint8_t networkItem); - /* - * Return the encryption type of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ - uint8_t encryptionType(uint8_t networkItem); + /** + * return channel of scanned wifi + * @param networkItem specify from which network item want to get the information + * @return uint32_t channel of scanned wifi + */ + int32_t channel(uint8_t networkItem); - /* - * Return the RSSI of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: signed value of RSSI of the specified item on the networks scanned list - */ - int32_t RSSI(uint8_t networkItem); + /** + * return if the scanned wifi is Hidden (no SSID) + * @param networkItem specify from which network item want to get the information + * @return bool (true == hidden) + */ + bool isHidden(uint8_t networkItem); + /** + * loads all infos from a scanned wifi in to the ptr parameters + * @param networkItem uint8_t + * @param ssid const char** + * @param encryptionType uint8_t * + * @param RSSI int32_t * + * @param BSSID uint8_t ** + * @param channel int32_t * + * @param isHidden bool * + * @return (true if ok) + */ + bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); - /** - * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return uint8_t * MAC / BSSID of scanned wifi - */ - uint8_t * BSSID(uint8_t networkItem); + /* + * Return Connection status. + * + * return: one of the value defined in wl_status_t + */ + wl_status_t status(); - /** - * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return String MAC / BSSID of scanned wifi - */ - String BSSIDstr(uint8_t networkItem); + /* + * Resolve the given hostname to an IP address. + * param aHostname: Name to be resolved + * param aResult: IPAddress structure to store the returned IP address + * result: 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ + int hostByName(const char* aHostname, IPAddress& aResult); - /** - * return channel of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return uint32_t channel of scanned wifi - */ - int32_t channel(uint8_t networkItem); + /* + * Get ESP8266 station DHCP hostname + */ + String hostname(void); - /** - * return if the scanned wifi is Hidden (no SSID) - * @param networkItem specify from which network item want to get the information - * @return bool (true == hidden) - */ - bool isHidden(uint8_t networkItem); + /* + * Set ESP8266 station DHCP hostname + * hostname, max length:32 + */ + bool hostname(char* aHostname);bool hostname(const char* aHostname);bool hostname(String aHostname); - /** - * loads all infos from a scanned wifi in to the ptr parameters - * @param networkItem uint8_t - * @param ssid const char** - * @param encryptionType uint8_t * - * @param RSSI int32_t * - * @param BSSID uint8_t ** - * @param channel int32_t * - * @param isHidden bool * - * @return (true if ok) - */ - bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); + /** + * WPS config + * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + */ + bool beginWPSConfig(void); + /* + * Output WiFi settings to an object derived from Print interface (like Serial). + * + */ + void printDiag(Print& dest); - /* - * Return Connection status. - * - * return: one of the value defined in wl_status_t - */ - wl_status_t status(); + /* + * Start SmartConfig + * + */ + void beginSmartConfig(); - /* - * Resolve the given hostname to an IP address. - * param aHostname: Name to be resolved - * param aResult: IPAddress structure to store the returned IP address - * result: 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ - int hostByName(const char* aHostname, IPAddress& aResult); + /* + * Query SmartConfig status, to decide when stop config + * + */ + bool smartConfigDone(); - /* - * Get ESP8266 station DHCP hostname - */ - String hostname(void); + /* + * Stop SmartConfig + * + */ + void stopSmartConfig(); - /* - * Set ESP8266 station DHCP hostname - * hostname, max length:32 - */ - bool hostname(char* aHostname); - bool hostname(const char* aHostname); - bool hostname(String aHostname); + friend class WiFiClient; + friend class WiFiServer; + /** + * set Sleep mode + * @param type WiFiPhyMode_t + * @return bool + */ + bool setSleepMode(WiFiSleepType_t type); - /** - * WPS config - * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - */ - bool beginWPSConfig(void); + /** + * get Sleep mode + * @return sleep_type_t + */ + WiFiSleepType_t getSleepMode(); - /* - * Output WiFi settings to an object derived from Print interface (like Serial). - * - */ - void printDiag(Print& dest); + /** + * set phy Mode + * @param mode phy_mode_t + * @return bool + */ + bool setPhyMode(WiFiPhyMode_t mode); - /* - * Start SmartConfig - * - */ - void beginSmartConfig(); + /** + * get phy Mode + * @return phy_mode_t + */ + WiFiPhyMode_t getPhyMode(); - /* - * Query SmartConfig status, to decide when stop config - * - */ - bool smartConfigDone(); + protected: + void _mode(WiFiMode); + static void _scanDone(void* result, int status); + void * _getScanInfoByIndex(int i); + static void _smartConfigCallback(uint32_t status, void* result); + static void _eventCallback(void *event);bool _smartConfigStarted;bool _smartConfigDone; - /* - * Stop SmartConfig - * - */ - void stopSmartConfig(); + bool _useApMode;bool _useClientMode;bool _useStaticIp;bool _persistent; - friend class WiFiClient; - friend class WiFiServer; + static bool _scanAsync; + static bool _scanStarted; + static bool _scanComplete; - /** - * set Sleep mode - * @param type WiFiPhyMode_t - * @return bool - */ - bool setSleepMode(WiFiSleepType_t type); - - /** - * get Sleep mode - * @return sleep_type_t - */ - WiFiSleepType_t getSleepMode(); - - /** - * set phy Mode - * @param mode phy_mode_t - * @return bool - */ - bool setPhyMode(WiFiPhyMode_t mode); - - /** - * get phy Mode - * @return phy_mode_t - */ - WiFiPhyMode_t getPhyMode(); - -protected: - void _mode(WiFiMode); - static void _scanDone(void* result, int status); - void * _getScanInfoByIndex(int i); - static void _smartConfigCallback(uint32_t status, void* result); - static void _eventCallback(void *event); - bool _smartConfigStarted; - bool _smartConfigDone; - - bool _useApMode; - bool _useClientMode; - bool _useStaticIp; - bool _persistent; - - static bool _scanAsync; - static bool _scanStarted; - static bool _scanComplete; - - static size_t _scanCount; - static void* _scanResult; + static size_t _scanCount; + static void* _scanResult; }; From b1b19299bbe5f508f88872cc57b6ecff25b22245 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 17:02:09 +0100 Subject: [PATCH 04/38] mode docu to cpp and make it doxygen compatible --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 241 +++++++++++++++++- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 285 ++-------------------- 2 files changed, 253 insertions(+), 273 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index b946d5bdf..3b85344b7 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -112,6 +112,15 @@ static bool sta_config_equal(const station_config& lhs, const station_config& rh return true; } +/** + * Start Wifi connection + * if passphrase is set the most secure supported mode will be automatically selected + * @param ssid const char* Pointer to the SSID string. + * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). + * @param bssid uint8_t[6] Optional. BSSID / MAC of AP + * @param channel Optional. Channel of AP + * @return + */ int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { return begin((const char*) ssid, (const char*) passphrase, channel, bssid); } @@ -177,16 +186,26 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch return status(); } +/** + * Use to connect to SDK config. + * @return wl_status_t + */ int ESP8266WiFiClass::begin() { ETS_UART_INTR_DISABLE(); wifi_station_connect(); ETS_UART_INTR_ENABLE(); + // TODO is static ip not stored in SDK? if(!_useStaticIp) wifi_station_dhcpc_start(); return status(); } +/** + * Wait for WiFi connection to reach a result + * returns the status reached or disconnect if STA is off + * @return wl_status_t + */ uint8_t ESP8266WiFiClass::waitForConnectResult() { if((wifi_get_opmode() & 1) == 0) //1 and 3 have STA enabled return WL_DISCONNECTED; @@ -195,7 +214,12 @@ uint8_t ESP8266WiFiClass::waitForConnectResult() { return status(); } -// You will have to set the DNS-Server manually later since this will not enable DHCP2 +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + */ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { struct ip_info info; info.ip.addr = static_cast(local_ip); @@ -208,6 +232,13 @@ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress s _useStaticIp = true; } +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + * @param dns Static DNS server + */ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { struct ip_info info; info.ip.addr = static_cast(local_ip); @@ -225,6 +256,11 @@ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress s _useStaticIp = true; } +/** + * Disconnect from the network (close AP) + * @param wifioff disable mode? + * @return one value of wl_status_t enum + */ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { struct softap_config conf; *conf.ssid = 0; @@ -248,9 +284,15 @@ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { } } + //TODO return with more meaning ? return 0; } +/** + * Disconnect from the network + * @param wifioff + * @return one value of wl_status_t enum + */ int ESP8266WiFiClass::disconnect(bool wifioff) { struct station_config conf; *conf.ssid = 0; @@ -274,7 +316,7 @@ int ESP8266WiFiClass::disconnect(bool wifioff) { _mode(WIFI_OFF); } } - + //TODO return with more meaning ? return 0; } @@ -290,10 +332,13 @@ static bool softap_config_equal(const softap_config& lhs, const softap_config& r return true; } -void ESP8266WiFiClass::softAP(const char* ssid) { - softAP(ssid, 0); -} - +/** + * Set up an access point + * @param ssid Pointer to the SSID (max 63 char). + * @param passphrase (for WPA2 min 8 char, for open use NULL) + * @param channel WiFi channel number, 1 - 13. + * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) + */ void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { _useApMode = true; if(_useClientMode) { @@ -346,6 +391,12 @@ void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int chan ETS_UART_INTR_ENABLE(); } +/** + * Configure access point + * @param local_ip access point IP + * @param gateway gateway IP + * @param subnet subnet mask + */ void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { struct ip_info info; info.ip.addr = static_cast(local_ip); @@ -356,11 +407,20 @@ void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAdd wifi_softap_dhcps_start(); } +/** + * Get the station interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t * + */ uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) { wifi_get_macaddr(STATION_IF, mac); return mac; } +/** + * Get the station interface MAC address. + * @return String mac + */ String ESP8266WiFiClass::macAddress(void) { uint8_t mac[6]; char macStr[18] = { 0 }; @@ -370,11 +430,21 @@ String ESP8266WiFiClass::macAddress(void) { return String(macStr); } + +/** + * Get the softAP interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t* + */ uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) { wifi_get_macaddr(SOFTAP_IF, mac); return mac; } +/** + * Get the softAP interface MAC address. + * @return String mac + */ String ESP8266WiFiClass::softAPmacAddress(void) { uint8_t mac[6]; char macStr[18] = { 0 }; @@ -384,53 +454,93 @@ String ESP8266WiFiClass::softAPmacAddress(void) { return String(macStr); } +/** + * Get the station interface IP address. + * @return IPAddress station IP + */ IPAddress ESP8266WiFiClass::localIP() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.ip.addr); } +/** + * Get the softAP interface IP address. + * @return IPAddress softAP IP + */ IPAddress ESP8266WiFiClass::softAPIP() { struct ip_info ip; wifi_get_ip_info(SOFTAP_IF, &ip); return IPAddress(ip.ip.addr); } +/** + * Get the interface subnet mask address. + * @return IPAddress subnetMask + */ IPAddress ESP8266WiFiClass::subnetMask() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.netmask.addr); } +/** + * Get the gateway ip address. + * @return IPAddress gatewayIP + */ IPAddress ESP8266WiFiClass::gatewayIP() { struct ip_info ip; wifi_get_ip_info(STATION_IF, &ip); return IPAddress(ip.gw.addr); } -IPAddress ESP8266WiFiClass::dnsIP(int dns_no) { +/** + * Get the DNS ip address. + * @param dns_no + * @return IPAddress DNS Server IP + */ +IPAddress ESP8266WiFiClass::dnsIP(uint8_t dns_no) { ip_addr_t dns_ip = dns_getserver(dns_no); return IPAddress(dns_ip.addr); } + +/** + * Return the current SSID associated with the network + * @return SSID + */ String ESP8266WiFiClass::SSID() const { + // TODO why static, needs RAM for nothing? static struct station_config conf; wifi_station_get_config(&conf); return String(reinterpret_cast(conf.ssid)); } +/** + * Return the current pre shared key associated with the network + * @return psk string + */ String ESP8266WiFiClass::psk() const { static struct station_config conf; wifi_station_get_config(&conf); return String(reinterpret_cast(conf.password)); } + +/** + * Return the current bssid / mac associated with the network if configured + * @return bssid uint8_t * + */ uint8_t* ESP8266WiFiClass::BSSID(void) { static struct station_config conf; wifi_station_get_config(&conf); return reinterpret_cast(conf.bssid); } +/** + * Return the current bssid / mac associated with the network if configured + * @return String bssid mac + */ String ESP8266WiFiClass::BSSIDstr(void) { static struct station_config conf; char mac[18] = { 0 }; @@ -439,10 +549,18 @@ String ESP8266WiFiClass::BSSIDstr(void) { return String(mac); } +/** + * Return the current channel associated with the network + * @return channel (1-13) + */ int32_t ESP8266WiFiClass::channel(void) { return wifi_get_channel(); } +/** + * Return the current network RSSI. + * @return RSSI value + */ int32_t ESP8266WiFiClass::RSSI(void) { return wifi_station_get_rssi(); } @@ -486,6 +604,12 @@ void ESP8266WiFiClass::_scanDone(void* result, int status) { } } +/** + * called to get the scan state in Async mode + * @return scan result or status + * -1 if scan not fin + * -2 if scan not triggered + */ int8_t ESP8266WiFiClass::scanComplete() { if(_scanStarted) { @@ -499,6 +623,9 @@ int8_t ESP8266WiFiClass::scanComplete() { return WIFI_SCAN_FAILED; } +/** + * delete last scan result from RAM + */ void ESP8266WiFiClass::scanDelete() { if(ESP8266WiFiClass::_scanResult) { delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); @@ -508,6 +635,12 @@ void ESP8266WiFiClass::scanDelete() { _scanComplete = false; } +/** + * Start scan WiFi networks available + * @param async run in async mode + * @param show_hidden show hidden networks + * @return Number of discovered networks + */ int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { if(ESP8266WiFiClass::_scanStarted) { return WIFI_SCAN_RUNNING; @@ -560,6 +693,11 @@ void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; } +/** + * Return the SSID discovered during the network scan. + * @param i specify from which network item want to get the information + * @return ssid string of the specified item on the networks scanned list + */ String ESP8266WiFiClass::SSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -568,6 +706,11 @@ String ESP8266WiFiClass::SSID(uint8_t i) { return String(reinterpret_cast(it->ssid)); } +/** + * return MAC / BSSID of scanned wifi + * @param i specify from which network item want to get the information + * @return uint8_t * MAC / BSSID of scanned wifi + */ uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -576,6 +719,11 @@ uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { return it->bssid; } +/** + * return MAC / BSSID of scanned wifi + * @param networkItem specify from which network item want to get the information + * @return String MAC / BSSID of scanned wifi + */ String ESP8266WiFiClass::BSSIDstr(uint8_t i) { char mac[18] = { 0 }; struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); @@ -594,6 +742,11 @@ int32_t ESP8266WiFiClass::channel(uint8_t i) { return it->channel; } +/** + * return if the scanned wifi is Hidden (no SSID) + * @param networkItem specify from which network item want to get the information + * @return bool (true == hidden) + */ bool ESP8266WiFiClass::isHidden(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -602,6 +755,17 @@ bool ESP8266WiFiClass::isHidden(uint8_t i) { return (it->is_hidden != 0); } +/** + * loads all infos from a scanned wifi in to the ptr parameters + * @param networkItem uint8_t + * @param ssid const char** + * @param encryptionType uint8_t * + * @param RSSI int32_t * + * @param BSSID uint8_t ** + * @param channel int32_t * + * @param isHidden bool * + * @return (true if ok) + */ bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -617,6 +781,11 @@ bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, return true; } +/** + * Return the RSSI of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return signed value of RSSI of the specified item on the networks scanned list + */ int32_t ESP8266WiFiClass::RSSI(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -625,6 +794,11 @@ int32_t ESP8266WiFiClass::RSSI(uint8_t i) { return it->rssi; } +/** + * Return the encryption type of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); if(!it) @@ -644,6 +818,11 @@ uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { return -1; } +/** + * Return Connection status. + * @return one of the value defined in wl_status_t + * + */ wl_status_t ESP8266WiFiClass::status() { int status = wifi_station_get_connect_status(); @@ -665,6 +844,13 @@ void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback esp_schedule(); // resume the hostByName function } +/** + * Resolve the given hostname to an IP address. + * @param aHostname Name to be resolved + * @param aResult IPAddress structure to store the returned IP address + * @return 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { ip_addr_t addr; aResult = static_cast(0); @@ -679,10 +865,20 @@ int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { return (aResult != 0) ? 1 : 0; } +/** + * Get ESP8266 station DHCP hostname + * @return hostname + */ String ESP8266WiFiClass::hostname(void) { return String(wifi_station_get_hostname()); } + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ bool ESP8266WiFiClass::hostname(char* aHostname) { if(strlen(aHostname) > 32) { return false; @@ -690,10 +886,20 @@ bool ESP8266WiFiClass::hostname(char* aHostname) { return wifi_station_set_hostname(aHostname); } +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ bool ESP8266WiFiClass::hostname(const char* aHostname) { return hostname((char*) aHostname); } +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ bool ESP8266WiFiClass::hostname(String aHostname) { return hostname((char*) aHostname.c_str()); } @@ -724,6 +930,11 @@ void wifi_wps_status_cb(wps_cb_status status) { esp_schedule(); // resume the beginWPSConfig function } +/** + * WPS config + * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + * @return ok + */ bool ESP8266WiFiClass::beginWPSConfig(void) { _useClientMode = true; @@ -769,6 +980,9 @@ bool ESP8266WiFiClass::beginWPSConfig(void) { //-------------------------------------------------------------- +/** + * Start SmartConfig + */ void ESP8266WiFiClass::beginSmartConfig() { if(_smartConfigStarted) return; @@ -788,6 +1002,10 @@ void ESP8266WiFiClass::beginSmartConfig() { smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); } + +/** + * Stop SmartConfig + */ void ESP8266WiFiClass::stopSmartConfig() { if(!_smartConfigStarted) return; @@ -796,6 +1014,10 @@ void ESP8266WiFiClass::stopSmartConfig() { _smartConfigStarted = false; } +/** + * Query SmartConfig status, to decide when stop config + * @return smartConfig Done + */ bool ESP8266WiFiClass::smartConfigDone() { if(!_smartConfigStarted) return false; @@ -865,6 +1087,11 @@ void ESP8266WiFiClass::_eventCallback(void* arg) { } } + +/** + * Output WiFi settings to an object derived from Print interface (like Serial). + * @param p Print interface + */ void ESP8266WiFiClass::printDiag(Print& p) { const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; p.print("Mode: "); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 8e65af3f7..c3915a932 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -61,348 +61,101 @@ class ESP8266WiFiClass { void mode(WiFiMode); WiFiMode getMode(); - /** - * Start Wifi connection - * if passphrase is set the most secure supported mode will be automatically selected - * @param ssid const char* Pointer to the SSID string. - * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). - * @param bssid uint8_t[6] Optional. BSSID / MAC of AP - * @param channel Optional. Channel of AP - * @return - */ int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - - // Use sdk config to connect. int begin(); - /* Wait for Wifi connection to reach a result - * returns the status reached or disconnect if STA is off - */ uint8_t waitForConnectResult(); - /* Set up an open access point - * - * param ssid: Pointer to the SSID string. - */ - void softAP(const char* ssid); + void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); - /* Set up a WPA2-secured access point - * - * param ssid: Pointer to the SSID string. - * param passphrase: Pointer to passphrase, 8 characters min. - * param channel: WiFi channel number, 1 - 13. - * param ssid_hidden: Network cloaking? 0 = broadcast SSID, 1 = hide SSID - */ - void softAP(const char* ssid, const char* passphrase, int channel = 1, int ssid_hidden = 0); - /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param gateway: Static gateway configuration - * param subnet: Static Subnet mask - */ void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - - /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param gateway: Static gateway configuration - * param subnet: Static Subnet mask - * param dns: Defined DNS - */ void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); - /* Configure access point - * - * param local_ip: access point IP - * param gateway: gateway IP - * param subnet: subnet mask - */ void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - /* - * Disconnect from the network (close AP) - * - * return: one value of wl_status_t enum - */ - int softAPdisconnect(bool wifioff = false); - /* - * Disconnect from the network - * - * return: one value of wl_status_t enum - */ + int softAPdisconnect(bool wifioff = false); int disconnect(bool wifioff = false); - /* - * Get the station interface MAC address. - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * return: String - */ + uint8_t* macAddress(uint8_t* mac); String macAddress(void); - /* - * Get the softAP interface MAC address. - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * return: String - */ uint8_t* softAPmacAddress(uint8_t* mac); String softAPmacAddress(void); - /* - * Get the station interface IP address. - * - * return: Ip address value - */ - IPAddress localIP(); - /* - * Get the softAP interface IP address. - * - * return: Ip address value - */ + IPAddress localIP(); IPAddress softAPIP(); - /* - * Get the interface subnet mask address. - * - * return: subnet mask address value - */ + IPAddress subnetMask(); - - /* - * Get the gateway ip address. - * - * return: gateway ip address value - */ IPAddress gatewayIP(); + IPAddress dnsIP(uint8_t dns_no = 0); - /* - * Get the DNS ip address. - * - * return: DNS ip address value - */ - IPAddress dnsIP(int dns_no = 0); - /* - * Return the current SSID associated with the network - * - * return: ssid string - */ String SSID() const; - - /* - * Return the current pre shared key associated with the network - * - * return: psk string - */ String psk() const; - /* - * Return the current bssid / mac associated with the network if configured - * - * return: bssid uint8_t * - */ + uint8_t *BSSID(void); - - /* - * Return the current bssid / mac associated with the network if configured - * - * return: bssid string - */ String BSSIDstr(void); - - /* - * Return the current channel associated with the network - * - * return: channel - */ int32_t channel(void); - /* - * Return the current network RSSI. - * - * return: RSSI value - */ int32_t RSSI(); - /* - * called to get the scan state in Async mode - * - * return -1 if scan not fin - * return -2 if scan not triggered - */ - int8_t scanComplete(); - /* - * delete last scan result from RAM - */ + int8_t scanComplete(); void scanDelete(); - /* - * Start scan WiFi networks available - * - * return: Number of discovered networks - */ + int8_t scanNetworks(bool async = false, bool show_hidden = false); - /* - * Return the SSID discovered during the network scan. - * - * param networkItem: specify from which network item want to get the information - * - * return: ssid string of the specified item on the networks scanned list - */ + String SSID(uint8_t networkItem); - - /* - * Return the encryption type of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ uint8_t encryptionType(uint8_t networkItem); - - /* - * Return the RSSI of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: signed value of RSSI of the specified item on the networks scanned list - */ int32_t RSSI(uint8_t networkItem); - - /** - * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return uint8_t * MAC / BSSID of scanned wifi - */ uint8_t * BSSID(uint8_t networkItem); - /** - * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return String MAC / BSSID of scanned wifi - */ + String BSSIDstr(uint8_t networkItem); - - /** - * return channel of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return uint32_t channel of scanned wifi - */ int32_t channel(uint8_t networkItem); - - /** - * return if the scanned wifi is Hidden (no SSID) - * @param networkItem specify from which network item want to get the information - * @return bool (true == hidden) - */ bool isHidden(uint8_t networkItem); - - /** - * loads all infos from a scanned wifi in to the ptr parameters - * @param networkItem uint8_t - * @param ssid const char** - * @param encryptionType uint8_t * - * @param RSSI int32_t * - * @param BSSID uint8_t ** - * @param channel int32_t * - * @param isHidden bool * - * @return (true if ok) - */ bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); - /* - * Return Connection status. - * - * return: one of the value defined in wl_status_t - */ + wl_status_t status(); - /* - * Resolve the given hostname to an IP address. - * param aHostname: Name to be resolved - * param aResult: IPAddress structure to store the returned IP address - * result: 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ + int hostByName(const char* aHostname, IPAddress& aResult); - /* - * Get ESP8266 station DHCP hostname - */ + String hostname(void); + bool hostname(char* aHostname); + bool hostname(const char* aHostname); + bool hostname(String aHostname); - /* - * Set ESP8266 station DHCP hostname - * hostname, max length:32 - */ - bool hostname(char* aHostname);bool hostname(const char* aHostname);bool hostname(String aHostname); - /** - * WPS config - * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - */ bool beginWPSConfig(void); - /* - * Output WiFi settings to an object derived from Print interface (like Serial). - * - */ void printDiag(Print& dest); - /* - * Start SmartConfig - * - */ + void beginSmartConfig(); - - /* - * Query SmartConfig status, to decide when stop config - * - */ bool smartConfigDone(); - - /* - * Stop SmartConfig - * - */ void stopSmartConfig(); friend class WiFiClient; friend class WiFiServer; - /** - * set Sleep mode - * @param type WiFiPhyMode_t - * @return bool - */ - bool setSleepMode(WiFiSleepType_t type); - /** - * get Sleep mode - * @return sleep_type_t - */ + bool setSleepMode(WiFiSleepType_t type); WiFiSleepType_t getSleepMode(); - /** - * set phy Mode - * @param mode phy_mode_t - * @return bool - */ bool setPhyMode(WiFiPhyMode_t mode); - - /** - * get phy Mode - * @return phy_mode_t - */ WiFiPhyMode_t getPhyMode(); protected: From 49b0821beb52fc3d6cdf180d5a6fcd71089c2d5e Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 17:22:36 +0100 Subject: [PATCH 05/38] reorder part one --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 1863 +++++++++++---------- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 138 +- 2 files changed, 1066 insertions(+), 935 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 3b85344b7..65dc97564 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -48,6 +48,996 @@ ESP8266WiFiClass::ESP8266WiFiClass() : _useApMode = (m & WIFI_AP); wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiClass::_eventCallback); } + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- STA function ----------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +/** + * Start Wifi connection + * if passphrase is set the most secure supported mode will be automatically selected + * @param ssid const char* Pointer to the SSID string. + * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). + * @param bssid uint8_t[6] Optional. BSSID / MAC of AP + * @param channel Optional. Channel of AP + * @return + */ +int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { + _useClientMode = true; + + if(_useApMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_STA); + } + + if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) { + // fail SSID too long or missing! + return WL_CONNECT_FAILED; + } + + if(passphrase && strlen(passphrase) > 63) { + // fail passphrase too long! + return WL_CONNECT_FAILED; + } + + struct station_config conf; + strcpy(reinterpret_cast(conf.ssid), ssid); + + if(passphrase) { + strcpy(reinterpret_cast(conf.password), passphrase); + } else { + *conf.password = 0; + } + + if(bssid) { + conf.bssid_set = 1; + memcpy((void *) &conf.bssid[0], (void *) bssid, 6); + } else { + conf.bssid_set = 0; + } + + struct station_config current_conf; + wifi_station_get_config(¤t_conf); + if(sta_config_equal(current_conf, conf)) { + DEBUGV("sta config unchanged"); + return status(); + } + + ETS_UART_INTR_DISABLE(); + if(_persistent) + wifi_station_set_config(&conf); + else + wifi_station_set_config_current(&conf); + wifi_station_connect(); + ETS_UART_INTR_ENABLE(); + + if(channel > 0 && channel <= 13) { + wifi_set_channel(channel); + } + + if(!_useStaticIp) + wifi_station_dhcpc_start(); + return status(); +} + +int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { + return begin((const char*) ssid, (const char*) passphrase, channel, bssid); +} + +/** + * Use to connect to SDK config. + * @return wl_status_t + */ +int ESP8266WiFiClass::begin() { + ETS_UART_INTR_DISABLE(); + wifi_station_connect(); + ETS_UART_INTR_ENABLE(); + + // TODO is static ip not stored in SDK? + if(!_useStaticIp) + wifi_station_dhcpc_start(); + return status(); +} + + +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + */ +void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + + wifi_station_dhcpc_stop(); + wifi_set_ip_info(STATION_IF, &info); + + _useStaticIp = true; +} + +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + * @param dns Static DNS server + */ +void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + + wifi_station_dhcpc_stop(); + wifi_set_ip_info(STATION_IF, &info); + + // Set DNS-Server + ip_addr_t d; + d.addr = static_cast(dns); + dns_setserver(0, &d); + + _useStaticIp = true; +} + + +/** + * Disconnect from the network + * @param wifioff + * @return one value of wl_status_t enum + */ +int ESP8266WiFiClass::disconnect(bool wifioff) { + struct station_config conf; + *conf.ssid = 0; + *conf.password = 0; + ETS_UART_INTR_DISABLE(); + if(_persistent) + wifi_station_set_config(&conf); + else + wifi_station_set_config_current(&conf); + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); + + if(wifioff) { + _useClientMode = false; + + if(_useApMode) { + // turn on AP + _mode(WIFI_AP); + } else { + // turn wifi off + _mode(WIFI_OFF); + } + } + //TODO return with more meaning ? + return 0; +} + +/** + * Wait for WiFi connection to reach a result + * returns the status reached or disconnect if STA is off + * @return wl_status_t + */ +uint8_t ESP8266WiFiClass::waitForConnectResult() { + //1 and 3 have STA enabled + if((wifi_get_opmode() & 1) == 0) { + return WL_DISCONNECTED; + } + while(status() == WL_DISCONNECTED) { + delay(100); + } + return status(); +} + +/** + * Get the station interface IP address. + * @return IPAddress station IP + */ +IPAddress ESP8266WiFiClass::localIP() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.ip.addr); +} + + +/** + * Get the station interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t * + */ +uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) { + wifi_get_macaddr(STATION_IF, mac); + return mac; +} + +/** + * Get the station interface MAC address. + * @return String mac + */ +String ESP8266WiFiClass::macAddress(void) { + uint8_t mac[6]; + char macStr[18] = { 0 }; + wifi_get_macaddr(STATION_IF, mac); + + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return String(macStr); +} + +/** + * Get the interface subnet mask address. + * @return IPAddress subnetMask + */ +IPAddress ESP8266WiFiClass::subnetMask() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.netmask.addr); +} + +/** + * Get the gateway ip address. + * @return IPAddress gatewayIP + */ +IPAddress ESP8266WiFiClass::gatewayIP() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.gw.addr); +} + +/** + * Get the DNS ip address. + * @param dns_no + * @return IPAddress DNS Server IP + */ +IPAddress ESP8266WiFiClass::dnsIP(uint8_t dns_no) { + ip_addr_t dns_ip = dns_getserver(dns_no); + return IPAddress(dns_ip.addr); +} + + +/** + * Get ESP8266 station DHCP hostname + * @return hostname + */ +String ESP8266WiFiClass::hostname(void) { + return String(wifi_station_get_hostname()); +} + + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiClass::hostname(char* aHostname) { + if(strlen(aHostname) > 32) { + return false; + } + return wifi_station_set_hostname(aHostname); +} + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiClass::hostname(const char* aHostname) { + return hostname((char*) aHostname); +} + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiClass::hostname(String aHostname) { + return hostname((char*) aHostname.c_str()); +} + +/** + * Return Connection status. + * @return one of the value defined in wl_status_t + * + */ +wl_status_t ESP8266WiFiClass::status() { + int status = wifi_station_get_connect_status(); + + if(status == STATION_GOT_IP) + return WL_CONNECTED; + else if(status == STATION_NO_AP_FOUND) + return WL_NO_SSID_AVAIL; + else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) + return WL_CONNECT_FAILED; + else if(status == STATION_IDLE) + return WL_IDLE_STATUS; + else + return WL_DISCONNECTED; +} + +/** + * Return the current SSID associated with the network + * @return SSID + */ +String ESP8266WiFiClass::SSID() const { + // TODO why static, needs RAM for nothing? + static struct station_config conf; + wifi_station_get_config(&conf); + return String(reinterpret_cast(conf.ssid)); +} + +/** + * Return the current pre shared key associated with the network + * @return psk string + */ +String ESP8266WiFiClass::psk() const { + static struct station_config conf; + wifi_station_get_config(&conf); + return String(reinterpret_cast(conf.password)); +} + +/** + * Return the current bssid / mac associated with the network if configured + * @return bssid uint8_t * + */ +uint8_t* ESP8266WiFiClass::BSSID(void) { + static struct station_config conf; + wifi_station_get_config(&conf); + return reinterpret_cast(conf.bssid); +} + +/** + * Return the current bssid / mac associated with the network if configured + * @return String bssid mac + */ +String ESP8266WiFiClass::BSSIDstr(void) { + static struct station_config conf; + char mac[18] = { 0 }; + wifi_station_get_config(&conf); + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); + return String(mac); +} + +/** + * Return the current network RSSI. + * @return RSSI value + */ +int32_t ESP8266WiFiClass::RSSI(void) { + return wifi_station_get_rssi(); +} + +// ----------------------------------------------------------------------------------------------------------------------- +// ----------------------------------------------------- AP function ----------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Set up an access point + * @param ssid Pointer to the SSID (max 63 char). + * @param passphrase (for WPA2 min 8 char, for open use NULL) + * @param channel WiFi channel number, 1 - 13. + * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) + */ +void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { + _useApMode = true; + if(_useClientMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_AP); + } + + if(!ssid || *ssid == 0 || strlen(ssid) > 31) { + // fail SSID too long or missing! + return; + } + + if(passphrase && strlen(passphrase) > 63) { + // fail passphrase to long! + return; + } + + struct softap_config conf; + wifi_softap_get_config(&conf); + strcpy(reinterpret_cast(conf.ssid), ssid); + conf.channel = channel; + conf.ssid_len = strlen(ssid); + conf.ssid_hidden = ssid_hidden; + conf.max_connection = 4; + conf.beacon_interval = 100; + + if(!passphrase || strlen(passphrase) == 0) { + conf.authmode = AUTH_OPEN; + *conf.password = 0; + } else { + conf.authmode = AUTH_WPA2_PSK; + strcpy(reinterpret_cast(conf.password), passphrase); + } + + struct softap_config conf_current; + wifi_softap_get_config(&conf_current); + if(softap_config_equal(conf, conf_current)) { + DEBUGV("softap config unchanged"); + return; + } + + ETS_UART_INTR_DISABLE(); + if(_persistent) + wifi_softap_set_config(&conf); + else + wifi_softap_set_config_current(&conf); + ETS_UART_INTR_ENABLE(); +} + + +/** + * Configure access point + * @param local_ip access point IP + * @param gateway gateway IP + * @param subnet subnet mask + */ +void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + wifi_softap_dhcps_stop(); + wifi_set_ip_info(SOFTAP_IF, &info); + wifi_softap_dhcps_start(); +} + + + +/** + * Disconnect from the network (close AP) + * @param wifioff disable mode? + * @return one value of wl_status_t enum + */ +int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { + struct softap_config conf; + *conf.ssid = 0; + *conf.password = 0; + ETS_UART_INTR_DISABLE(); + if(_persistent) + wifi_softap_set_config(&conf); + else + wifi_softap_set_config_current(&conf); + ETS_UART_INTR_ENABLE(); + + if(wifioff) { + _useApMode = false; + + if(_useClientMode) { + // turn on STA + _mode(WIFI_STA); + } else { + // turn wifi off + _mode(WIFI_OFF); + } + } + + //TODO return with more meaning ? + return 0; +} + +/** + * Get the softAP interface IP address. + * @return IPAddress softAP IP + */ +IPAddress ESP8266WiFiClass::softAPIP() { + struct ip_info ip; + wifi_get_ip_info(SOFTAP_IF, &ip); + return IPAddress(ip.ip.addr); +} + + +/** + * Get the softAP interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t* + */ +uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) { + wifi_get_macaddr(SOFTAP_IF, mac); + return mac; +} + +/** + * Get the softAP interface MAC address. + * @return String mac + */ +String ESP8266WiFiClass::softAPmacAddress(void) { + uint8_t mac[6]; + char macStr[18] = { 0 }; + wifi_get_macaddr(SOFTAP_IF, mac); + + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return String(macStr); +} + + +// ----------------------------------------------------------------------------------------------------------------------- +// ----------------------------------------------------- scan function --------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Start scan WiFi networks available + * @param async run in async mode + * @param show_hidden show hidden networks + * @return Number of discovered networks + */ +int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { + if(ESP8266WiFiClass::_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + ESP8266WiFiClass::_scanAsync = async; + + if(_useApMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_STA); + } + + int status = wifi_station_get_connect_status(); + if(status != STATION_GOT_IP && status != STATION_IDLE) { + disconnect(); + } + + scanDelete(); + + struct scan_config config; + config.ssid = 0; + config.bssid = 0; + config.channel = 0; + config.show_hidden = show_hidden; + if(wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiClass::_scanDone))) { + ESP8266WiFiClass::_scanComplete = false; + ESP8266WiFiClass::_scanStarted = true; + + if(ESP8266WiFiClass::_scanAsync) { + delay(0); // time for the OS to trigger the scan + return WIFI_SCAN_RUNNING; + } + + esp_yield(); + return ESP8266WiFiClass::_scanCount; + } else { + return WIFI_SCAN_FAILED; + } + +} + + +/** + * called to get the scan state in Async mode + * @return scan result or status + * -1 if scan not fin + * -2 if scan not triggered + */ +int8_t ESP8266WiFiClass::scanComplete() { + + if(_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + if(_scanComplete) { + return ESP8266WiFiClass::_scanCount; + } + + return WIFI_SCAN_FAILED; +} + +/** + * delete last scan result from RAM + */ +void ESP8266WiFiClass::scanDelete() { + if(ESP8266WiFiClass::_scanResult) { + delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); + ESP8266WiFiClass::_scanResult = 0; + ESP8266WiFiClass::_scanCount = 0; + } + _scanComplete = false; +} + + +/** + * loads all infos from a scanned wifi in to the ptr parameters + * @param networkItem uint8_t + * @param ssid const char** + * @param encryptionType uint8_t * + * @param RSSI int32_t * + * @param BSSID uint8_t ** + * @param channel int32_t * + * @param isHidden bool * + * @return (true if ok) + */ +bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return false; + + ssid = (const char*) it->ssid; + encType = encryptionType(i); + rssi = it->rssi; + bssid = it->bssid; // move ptr + channel = it->channel; + isHidden = (it->is_hidden != 0); + + return true; +} + + +/** + * Return the SSID discovered during the network scan. + * @param i specify from which network item want to get the information + * @return ssid string of the specified item on the networks scanned list + */ +String ESP8266WiFiClass::SSID(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return ""; + + return String(reinterpret_cast(it->ssid)); +} + + +/** + * Return the encryption type of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ +uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return -1; + + int authmode = it->authmode; + if(authmode == AUTH_OPEN) + return ENC_TYPE_NONE; + if(authmode == AUTH_WEP) + return ENC_TYPE_WEP; + if(authmode == AUTH_WPA_PSK) + return ENC_TYPE_TKIP; + if(authmode == AUTH_WPA2_PSK) + return ENC_TYPE_CCMP; + if(authmode == AUTH_WPA_WPA2_PSK) + return ENC_TYPE_AUTO; + return -1; +} + +/** + * Return the RSSI of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return signed value of RSSI of the specified item on the networks scanned list + */ +int32_t ESP8266WiFiClass::RSSI(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return 0; + + return it->rssi; +} + + +/** + * return MAC / BSSID of scanned wifi + * @param i specify from which network item want to get the information + * @return uint8_t * MAC / BSSID of scanned wifi + */ +uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return 0; + + return it->bssid; +} + +/** + * return MAC / BSSID of scanned wifi + * @param networkItem specify from which network item want to get the information + * @return String MAC / BSSID of scanned wifi + */ +String ESP8266WiFiClass::BSSIDstr(uint8_t i) { + char mac[18] = { 0 }; + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return String(""); + + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); + return String(mac); +} + +int32_t ESP8266WiFiClass::channel(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return 0; + + return it->channel; +} + +/** + * return if the scanned wifi is Hidden (no SSID) + * @param networkItem specify from which network item want to get the information + * @return bool (true == hidden) + */ +bool ESP8266WiFiClass::isHidden(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) + return false; + + return (it->is_hidden != 0); +} + + +// ----------------------------------------------------------------------------------------------------------------------- +// ------------------------------------------------- Generic WiFi function ----------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Return the current channel associated with the network + * @return channel (1-13) + */ +int32_t ESP8266WiFiClass::channel(void) { + return wifi_get_channel(); +} + +/** + * set Sleep mode + * @param type sleep_type_t + * @return bool + */ +bool ESP8266WiFiClass::setSleepMode(WiFiSleepType_t type) { + return wifi_set_sleep_type((sleep_type_t) type); +} + +/** + * get Sleep mode + * @return sleep_type_t + */ +WiFiSleepType_t ESP8266WiFiClass::getSleepMode() { + return (WiFiSleepType_t) wifi_get_sleep_type(); +} + +/** + * set phy Mode + * @param mode phy_mode_t + * @return bool + */ +bool ESP8266WiFiClass::setPhyMode(WiFiPhyMode_t mode) { + return wifi_set_phy_mode((phy_mode_t) mode); +} + +/** + * get phy Mode + * @return phy_mode_t + */ +WiFiPhyMode_t ESP8266WiFiClass::getPhyMode() { + return (WiFiPhyMode_t) wifi_get_phy_mode(); +} + +// ----------------------------------------------------------------------------------------------------------------------- +// ------------------------------------------------ Generic Network function --------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Resolve the given hostname to an IP address. + * @param aHostname Name to be resolved + * @param aResult IPAddress structure to store the returned IP address + * @return 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ +int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { + ip_addr_t addr; + aResult = static_cast(0); + err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); + if(err == ERR_OK) { + aResult = addr.addr; + } else if(err == ERR_INPROGRESS) { + esp_yield(); + // will return here when dns_found_callback fires + } + + return (aResult != 0) ? 1 : 0; +} + + +// ----------------------------------------------------------------------------------------------------------------------- +// -------------------------------------------------- STA remote configure ----------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * WPS config + * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + * @return ok + */ +bool ESP8266WiFiClass::beginWPSConfig(void) { + + _useClientMode = true; + + if(_useApMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_STA); + } + + disconnect(); + + DEBUGV("wps begin\n"); + + if(!wifi_wps_disable()) { + DEBUGV("wps disable failed\n"); + return false; + } + + // so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + if(!wifi_wps_enable(WPS_TYPE_PBC)) { + DEBUGV("wps enable failed\n"); + return false; + } + + if(!wifi_set_wps_cb((wps_st_cb_t) &wifi_wps_status_cb)) { + DEBUGV("wps cb failed\n"); + return false; + } + + if(!wifi_wps_start()) { + DEBUGV("wps start failed\n"); + return false; + } + + esp_yield(); + // will return here when wifi_wps_status_cb fires + + return true; +} + + +/** + * Start SmartConfig + */ +void ESP8266WiFiClass::beginSmartConfig() { + if(_smartConfigStarted) + return; + + if(_useApMode) { + // turn on AP+STA mode + _mode(WIFI_AP_STA); + } else { + // turn on STA mode + _mode(WIFI_STA); + } + + _smartConfigStarted = true; + _smartConfigDone = false; + + //SC_TYPE_ESPTOUCH use ESPTOUCH for smartconfig, or use SC_TYPE_AIRKISS for AIRKISS + smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); +} + + +/** + * Stop SmartConfig + */ +void ESP8266WiFiClass::stopSmartConfig() { + if(!_smartConfigStarted) + return; + + smartconfig_stop(); + _smartConfigStarted = false; +} + +/** + * Query SmartConfig status, to decide when stop config + * @return smartConfig Done + */ +bool ESP8266WiFiClass::smartConfigDone() { + if(!_smartConfigStarted) + return false; + + return _smartConfigDone; +} + + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------------- Debug ------------------------------------------------------ +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Output WiFi settings to an object derived from Print interface (like Serial). + * @param p Print interface + */ +void ESP8266WiFiClass::printDiag(Print& p) { + const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; + p.print("Mode: "); + p.println(modes[wifi_get_opmode()]); + + const char* phymodes[] = { "", "B", "G", "N" }; + p.print("PHY mode: "); + p.println(phymodes[(int) wifi_get_phy_mode()]); + + p.print("Channel: "); + p.println(wifi_get_channel()); + + p.print("AP id: "); + p.println(wifi_station_get_current_ap_id()); + + p.print("Status: "); + p.println(wifi_station_get_connect_status()); + + p.print("Auto connect: "); + p.println(wifi_station_get_auto_connect()); + + static struct station_config conf; + wifi_station_get_config(&conf); + + const char* ssid = reinterpret_cast(conf.ssid); + p.print("SSID ("); + p.print(strlen(ssid)); + p.print("): "); + p.println(ssid); + + const char* passphrase = reinterpret_cast(conf.password); + p.print("Passphrase ("); + p.print(strlen(passphrase)); + p.print("): "); + p.println(passphrase); + + p.print("BSSID set: "); + p.println(conf.bssid_set); + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void ESP8266WiFiClass::persistent(bool persistent) { _persistent = persistent; @@ -112,213 +1102,8 @@ static bool sta_config_equal(const station_config& lhs, const station_config& rh return true; } -/** - * Start Wifi connection - * if passphrase is set the most secure supported mode will be automatically selected - * @param ssid const char* Pointer to the SSID string. - * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). - * @param bssid uint8_t[6] Optional. BSSID / MAC of AP - * @param channel Optional. Channel of AP - * @return - */ -int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { - return begin((const char*) ssid, (const char*) passphrase, channel, bssid); -} -int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { - _useClientMode = true; - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } - - if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) { - // fail SSID too long or missing! - return WL_CONNECT_FAILED; - } - - if(passphrase && strlen(passphrase) > 63) { - // fail passphrase too long! - return WL_CONNECT_FAILED; - } - - struct station_config conf; - strcpy(reinterpret_cast(conf.ssid), ssid); - - if(passphrase) { - strcpy(reinterpret_cast(conf.password), passphrase); - } else { - *conf.password = 0; - } - - if(bssid) { - conf.bssid_set = 1; - memcpy((void *) &conf.bssid[0], (void *) bssid, 6); - } else { - conf.bssid_set = 0; - } - - struct station_config current_conf; - wifi_station_get_config(¤t_conf); - if(sta_config_equal(current_conf, conf)) { - DEBUGV("sta config unchanged"); - return status(); - } - - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_station_set_config(&conf); - else - wifi_station_set_config_current(&conf); - wifi_station_connect(); - ETS_UART_INTR_ENABLE(); - - if(channel > 0 && channel <= 13) { - wifi_set_channel(channel); - } - - if(!_useStaticIp) - wifi_station_dhcpc_start(); - return status(); -} - -/** - * Use to connect to SDK config. - * @return wl_status_t - */ -int ESP8266WiFiClass::begin() { - ETS_UART_INTR_DISABLE(); - wifi_station_connect(); - ETS_UART_INTR_ENABLE(); - - // TODO is static ip not stored in SDK? - if(!_useStaticIp) - wifi_station_dhcpc_start(); - return status(); -} - -/** - * Wait for WiFi connection to reach a result - * returns the status reached or disconnect if STA is off - * @return wl_status_t - */ -uint8_t ESP8266WiFiClass::waitForConnectResult() { - if((wifi_get_opmode() & 1) == 0) //1 and 3 have STA enabled - return WL_DISCONNECTED; - while(status() == WL_DISCONNECTED) - delay(100); - return status(); -} - -/** - * Change IP configuration settings disabling the dhcp client - * @param local_ip Static ip configuration - * @param gateway Static gateway configuration - * @param subnet Static Subnet mask - */ -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); - - _useStaticIp = true; -} - -/** - * Change IP configuration settings disabling the dhcp client - * @param local_ip Static ip configuration - * @param gateway Static gateway configuration - * @param subnet Static Subnet mask - * @param dns Static DNS server - */ -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); - - // Set DNS-Server - ip_addr_t d; - d.addr = static_cast(dns); - dns_setserver(0, &d); - - _useStaticIp = true; -} - -/** - * Disconnect from the network (close AP) - * @param wifioff disable mode? - * @return one value of wl_status_t enum - */ -int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { - struct softap_config conf; - *conf.ssid = 0; - *conf.password = 0; - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_softap_set_config(&conf); - else - wifi_softap_set_config_current(&conf); - ETS_UART_INTR_ENABLE(); - - if(wifioff) { - _useApMode = false; - - if(_useClientMode) { - // turn on STA - _mode(WIFI_STA); - } else { - // turn wifi off - _mode(WIFI_OFF); - } - } - - //TODO return with more meaning ? - return 0; -} - -/** - * Disconnect from the network - * @param wifioff - * @return one value of wl_status_t enum - */ -int ESP8266WiFiClass::disconnect(bool wifioff) { - struct station_config conf; - *conf.ssid = 0; - *conf.password = 0; - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_station_set_config(&conf); - else - wifi_station_set_config_current(&conf); - wifi_station_disconnect(); - ETS_UART_INTR_ENABLE(); - - if(wifioff) { - _useClientMode = false; - - if(_useApMode) { - // turn on AP - _mode(WIFI_AP); - } else { - // turn wifi off - _mode(WIFI_OFF); - } - } - //TODO return with more meaning ? - return 0; -} static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) @@ -332,238 +1117,15 @@ static bool softap_config_equal(const softap_config& lhs, const softap_config& r return true; } -/** - * Set up an access point - * @param ssid Pointer to the SSID (max 63 char). - * @param passphrase (for WPA2 min 8 char, for open use NULL) - * @param channel WiFi channel number, 1 - 13. - * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) - */ -void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { - _useApMode = true; - if(_useClientMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_AP); - } - - if(!ssid || *ssid == 0 || strlen(ssid) > 31) { - // fail SSID too long or missing! - return; - } - - if(passphrase && strlen(passphrase) > 63) { - // fail passphrase to long! - return; - } - - struct softap_config conf; - wifi_softap_get_config(&conf); - strcpy(reinterpret_cast(conf.ssid), ssid); - conf.channel = channel; - conf.ssid_len = strlen(ssid); - conf.ssid_hidden = ssid_hidden; - conf.max_connection = 4; - conf.beacon_interval = 100; - - if(!passphrase || strlen(passphrase) == 0) { - conf.authmode = AUTH_OPEN; - *conf.password = 0; - } else { - conf.authmode = AUTH_WPA2_PSK; - strcpy(reinterpret_cast(conf.password), passphrase); - } - - struct softap_config conf_current; - wifi_softap_get_config(&conf_current); - if(softap_config_equal(conf, conf_current)) { - DEBUGV("softap config unchanged"); - return; - } - - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_softap_set_config(&conf); - else - wifi_softap_set_config_current(&conf); - ETS_UART_INTR_ENABLE(); -} - -/** - * Configure access point - * @param local_ip access point IP - * @param gateway gateway IP - * @param subnet subnet mask - */ -void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - wifi_softap_dhcps_stop(); - wifi_set_ip_info(SOFTAP_IF, &info); - wifi_softap_dhcps_start(); -} - -/** - * Get the station interface MAC address. - * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * @return pointer to uint8_t * - */ -uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) { - wifi_get_macaddr(STATION_IF, mac); - return mac; -} - -/** - * Get the station interface MAC address. - * @return String mac - */ -String ESP8266WiFiClass::macAddress(void) { - uint8_t mac[6]; - char macStr[18] = { 0 }; - wifi_get_macaddr(STATION_IF, mac); - - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return String(macStr); -} -/** - * Get the softAP interface MAC address. - * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * @return pointer to uint8_t* - */ -uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) { - wifi_get_macaddr(SOFTAP_IF, mac); - return mac; -} - -/** - * Get the softAP interface MAC address. - * @return String mac - */ -String ESP8266WiFiClass::softAPmacAddress(void) { - uint8_t mac[6]; - char macStr[18] = { 0 }; - wifi_get_macaddr(SOFTAP_IF, mac); - - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return String(macStr); -} - -/** - * Get the station interface IP address. - * @return IPAddress station IP - */ -IPAddress ESP8266WiFiClass::localIP() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.ip.addr); -} - -/** - * Get the softAP interface IP address. - * @return IPAddress softAP IP - */ -IPAddress ESP8266WiFiClass::softAPIP() { - struct ip_info ip; - wifi_get_ip_info(SOFTAP_IF, &ip); - return IPAddress(ip.ip.addr); -} - -/** - * Get the interface subnet mask address. - * @return IPAddress subnetMask - */ -IPAddress ESP8266WiFiClass::subnetMask() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.netmask.addr); -} - -/** - * Get the gateway ip address. - * @return IPAddress gatewayIP - */ -IPAddress ESP8266WiFiClass::gatewayIP() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.gw.addr); -} - -/** - * Get the DNS ip address. - * @param dns_no - * @return IPAddress DNS Server IP - */ -IPAddress ESP8266WiFiClass::dnsIP(uint8_t dns_no) { - ip_addr_t dns_ip = dns_getserver(dns_no); - return IPAddress(dns_ip.addr); -} -/** - * Return the current SSID associated with the network - * @return SSID - */ -String ESP8266WiFiClass::SSID() const { - // TODO why static, needs RAM for nothing? - static struct station_config conf; - wifi_station_get_config(&conf); - return String(reinterpret_cast(conf.ssid)); -} - -/** - * Return the current pre shared key associated with the network - * @return psk string - */ -String ESP8266WiFiClass::psk() const { - static struct station_config conf; - wifi_station_get_config(&conf); - return String(reinterpret_cast(conf.password)); -} -/** - * Return the current bssid / mac associated with the network if configured - * @return bssid uint8_t * - */ -uint8_t* ESP8266WiFiClass::BSSID(void) { - static struct station_config conf; - wifi_station_get_config(&conf); - return reinterpret_cast(conf.bssid); -} -/** - * Return the current bssid / mac associated with the network if configured - * @return String bssid mac - */ -String ESP8266WiFiClass::BSSIDstr(void) { - static struct station_config conf; - char mac[18] = { 0 }; - wifi_station_get_config(&conf); - sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); - return String(mac); -} -/** - * Return the current channel associated with the network - * @return channel (1-13) - */ -int32_t ESP8266WiFiClass::channel(void) { - return wifi_get_channel(); -} -/** - * Return the current network RSSI. - * @return RSSI value - */ -int32_t ESP8266WiFiClass::RSSI(void) { - return wifi_station_get_rssi(); -} extern "C" { typedef STAILQ_HEAD(, bss_info) @@ -604,86 +1166,6 @@ void ESP8266WiFiClass::_scanDone(void* result, int status) { } } -/** - * called to get the scan state in Async mode - * @return scan result or status - * -1 if scan not fin - * -2 if scan not triggered - */ -int8_t ESP8266WiFiClass::scanComplete() { - - if(_scanStarted) { - return WIFI_SCAN_RUNNING; - } - - if(_scanComplete) { - return ESP8266WiFiClass::_scanCount; - } - - return WIFI_SCAN_FAILED; -} - -/** - * delete last scan result from RAM - */ -void ESP8266WiFiClass::scanDelete() { - if(ESP8266WiFiClass::_scanResult) { - delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); - ESP8266WiFiClass::_scanResult = 0; - ESP8266WiFiClass::_scanCount = 0; - } - _scanComplete = false; -} - -/** - * Start scan WiFi networks available - * @param async run in async mode - * @param show_hidden show hidden networks - * @return Number of discovered networks - */ -int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { - if(ESP8266WiFiClass::_scanStarted) { - return WIFI_SCAN_RUNNING; - } - - ESP8266WiFiClass::_scanAsync = async; - - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } - - int status = wifi_station_get_connect_status(); - if(status != STATION_GOT_IP && status != STATION_IDLE) { - disconnect(); - } - - scanDelete(); - - struct scan_config config; - config.ssid = 0; - config.bssid = 0; - config.channel = 0; - config.show_hidden = show_hidden; - if(wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiClass::_scanDone))) { - ESP8266WiFiClass::_scanComplete = false; - ESP8266WiFiClass::_scanStarted = true; - - if(ESP8266WiFiClass::_scanAsync) { - delay(0); // time for the OS to trigger the scan - return WIFI_SCAN_RUNNING; - } - - esp_yield(); - return ESP8266WiFiClass::_scanCount; - } else { - return WIFI_SCAN_FAILED; - } - -} void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { if(!ESP8266WiFiClass::_scanResult || (size_t) i > ESP8266WiFiClass::_scanCount) { @@ -693,150 +1175,11 @@ void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; } -/** - * Return the SSID discovered during the network scan. - * @param i specify from which network item want to get the information - * @return ssid string of the specified item on the networks scanned list - */ -String ESP8266WiFiClass::SSID(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return ""; - return String(reinterpret_cast(it->ssid)); -} -/** - * return MAC / BSSID of scanned wifi - * @param i specify from which network item want to get the information - * @return uint8_t * MAC / BSSID of scanned wifi - */ -uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return 0; - return it->bssid; -} -/** - * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information - * @return String MAC / BSSID of scanned wifi - */ -String ESP8266WiFiClass::BSSIDstr(uint8_t i) { - char mac[18] = { 0 }; - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return String(""); - sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); - return String(mac); -} - -int32_t ESP8266WiFiClass::channel(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return 0; - - return it->channel; -} - -/** - * return if the scanned wifi is Hidden (no SSID) - * @param networkItem specify from which network item want to get the information - * @return bool (true == hidden) - */ -bool ESP8266WiFiClass::isHidden(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return false; - - return (it->is_hidden != 0); -} - -/** - * loads all infos from a scanned wifi in to the ptr parameters - * @param networkItem uint8_t - * @param ssid const char** - * @param encryptionType uint8_t * - * @param RSSI int32_t * - * @param BSSID uint8_t ** - * @param channel int32_t * - * @param isHidden bool * - * @return (true if ok) - */ -bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return false; - - ssid = (const char*) it->ssid; - encType = encryptionType(i); - rssi = it->rssi; - bssid = it->bssid; // move ptr - channel = it->channel; - isHidden = (it->is_hidden != 0); - - return true; -} - -/** - * Return the RSSI of the networks discovered during the scanNetworks - * @param i specify from which network item want to get the information - * @return signed value of RSSI of the specified item on the networks scanned list - */ -int32_t ESP8266WiFiClass::RSSI(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return 0; - - return it->rssi; -} - -/** - * Return the encryption type of the networks discovered during the scanNetworks - * @param i specify from which network item want to get the information - * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ -uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) - return -1; - - int authmode = it->authmode; - if(authmode == AUTH_OPEN) - return ENC_TYPE_NONE; - if(authmode == AUTH_WEP) - return ENC_TYPE_WEP; - if(authmode == AUTH_WPA_PSK) - return ENC_TYPE_TKIP; - if(authmode == AUTH_WPA2_PSK) - return ENC_TYPE_CCMP; - if(authmode == AUTH_WPA_WPA2_PSK) - return ENC_TYPE_AUTO; - return -1; -} - -/** - * Return Connection status. - * @return one of the value defined in wl_status_t - * - */ -wl_status_t ESP8266WiFiClass::status() { - int status = wifi_station_get_connect_status(); - - if(status == STATION_GOT_IP) - return WL_CONNECTED; - else if(status == STATION_NO_AP_FOUND) - return WL_NO_SSID_AVAIL; - else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) - return WL_CONNECT_FAILED; - else if(status == STATION_IDLE) - return WL_IDLE_STATUS; - else - return WL_DISCONNECTED; -} void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { if(ipaddr) @@ -844,65 +1187,7 @@ void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback esp_schedule(); // resume the hostByName function } -/** - * Resolve the given hostname to an IP address. - * @param aHostname Name to be resolved - * @param aResult IPAddress structure to store the returned IP address - * @return 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ -int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { - ip_addr_t addr; - aResult = static_cast(0); - err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); - if(err == ERR_OK) { - aResult = addr.addr; - } else if(err == ERR_INPROGRESS) { - esp_yield(); - // will return here when dns_found_callback fires - } - return (aResult != 0) ? 1 : 0; -} - -/** - * Get ESP8266 station DHCP hostname - * @return hostname - */ -String ESP8266WiFiClass::hostname(void) { - return String(wifi_station_get_hostname()); -} - - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(char* aHostname) { - if(strlen(aHostname) > 32) { - return false; - } - return wifi_station_set_hostname(aHostname); -} - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(const char* aHostname) { - return hostname((char*) aHostname); -} - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(String aHostname) { - return hostname((char*) aHostname.c_str()); -} //-------------------------------------------------------------- @@ -930,100 +1215,9 @@ void wifi_wps_status_cb(wps_cb_status status) { esp_schedule(); // resume the beginWPSConfig function } -/** - * WPS config - * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - * @return ok - */ -bool ESP8266WiFiClass::beginWPSConfig(void) { - - _useClientMode = true; - - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } - - disconnect(); - - DEBUGV("wps begin\n"); - - if(!wifi_wps_disable()) { - DEBUGV("wps disable failed\n"); - return false; - } - - // so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - if(!wifi_wps_enable(WPS_TYPE_PBC)) { - DEBUGV("wps enable failed\n"); - return false; - } - - if(!wifi_set_wps_cb((wps_st_cb_t) &wifi_wps_status_cb)) { - DEBUGV("wps cb failed\n"); - return false; - } - - if(!wifi_wps_start()) { - DEBUGV("wps start failed\n"); - return false; - } - - esp_yield(); - // will return here when wifi_wps_status_cb fires - - return true; -} //-------------------------------------------------------------- -/** - * Start SmartConfig - */ -void ESP8266WiFiClass::beginSmartConfig() { - if(_smartConfigStarted) - return; - - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } - - _smartConfigStarted = true; - _smartConfigDone = false; - - //SC_TYPE_ESPTOUCH use ESPTOUCH for smartconfig, or use SC_TYPE_AIRKISS for AIRKISS - smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); -} - - -/** - * Stop SmartConfig - */ -void ESP8266WiFiClass::stopSmartConfig() { - if(!_smartConfigStarted) - return; - - smartconfig_stop(); - _smartConfigStarted = false; -} - -/** - * Query SmartConfig status, to decide when stop config - * @return smartConfig Done - */ -bool ESP8266WiFiClass::smartConfigDone() { - if(!_smartConfigStarted) - return false; - - return _smartConfigDone; -} void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { sc_status status = (sc_status) st; @@ -1042,39 +1236,6 @@ void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { //-------------------------------------------------------------- -/** - * set Sleep mode - * @param type sleep_type_t - * @return bool - */ -bool ESP8266WiFiClass::setSleepMode(WiFiSleepType_t type) { - return wifi_set_sleep_type((sleep_type_t) type); -} - -/** - * get Sleep mode - * @return sleep_type_t - */ -WiFiSleepType_t ESP8266WiFiClass::getSleepMode() { - return (WiFiSleepType_t) wifi_get_sleep_type(); -} - -/** - * set phy Mode - * @param mode phy_mode_t - * @return bool - */ -bool ESP8266WiFiClass::setPhyMode(WiFiPhyMode_t mode) { - return wifi_set_phy_mode((phy_mode_t) mode); -} - -/** - * get phy Mode - * @return phy_mode_t - */ -WiFiPhyMode_t ESP8266WiFiClass::getPhyMode() { - return (WiFiPhyMode_t) wifi_get_phy_mode(); -} //-------------------------------------------------------------- @@ -1088,50 +1249,6 @@ void ESP8266WiFiClass::_eventCallback(void* arg) { } -/** - * Output WiFi settings to an object derived from Print interface (like Serial). - * @param p Print interface - */ -void ESP8266WiFiClass::printDiag(Print& p) { - const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; - p.print("Mode: "); - p.println(modes[wifi_get_opmode()]); - - const char* phymodes[] = { "", "B", "G", "N" }; - p.print("PHY mode: "); - p.println(phymodes[(int) wifi_get_phy_mode()]); - - p.print("Channel: "); - p.println(wifi_get_channel()); - - p.print("AP id: "); - p.println(wifi_station_get_current_ap_id()); - - p.print("Status: "); - p.println(wifi_station_get_connect_status()); - - p.print("Auto connect: "); - p.println(wifi_station_get_auto_connect()); - - static struct station_config conf; - wifi_station_get_config(&conf); - - const char* ssid = reinterpret_cast(conf.ssid); - p.print("SSID ("); - p.print(strlen(ssid)); - p.print("): "); - p.println(ssid); - - const char* passphrase = reinterpret_cast(conf.password); - p.print("Passphrase ("); - p.print(strlen(passphrase)); - p.print("): "); - p.println(passphrase); - - p.print("BSSID set: "); - p.println(conf.bssid_set); - -} bool ESP8266WiFiClass::_scanAsync = false; bool ESP8266WiFiClass::_scanStarted = false; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index c3915a932..815cd675a 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -61,96 +61,82 @@ class ESP8266WiFiClass { void mode(WiFiMode); WiFiMode getMode(); + // ---------------------------------------------------------------------------------------------- + // ---------------------------------------- STA function ---------------------------------------- + // ---------------------------------------------------------------------------------------------- int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); int begin(); - uint8_t waitForConnectResult(); - - void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); - - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); - void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - - - int softAPdisconnect(bool wifioff = false); int disconnect(bool wifioff = false); + uint8_t waitForConnectResult(); + + // STA network info + IPAddress localIP(); uint8_t* macAddress(uint8_t* mac); String macAddress(void); - uint8_t* softAPmacAddress(uint8_t* mac); - String softAPmacAddress(void); - - - IPAddress localIP(); - IPAddress softAPIP(); - - IPAddress subnetMask(); IPAddress gatewayIP(); IPAddress dnsIP(uint8_t dns_no = 0); - - String SSID() const; - String psk() const; - - - uint8_t *BSSID(void); - String BSSIDstr(void); - int32_t channel(void); - - - int32_t RSSI(); - - - int8_t scanComplete(); - void scanDelete(); - - - int8_t scanNetworks(bool async = false, bool show_hidden = false); - - - String SSID(uint8_t networkItem); - uint8_t encryptionType(uint8_t networkItem); - int32_t RSSI(uint8_t networkItem); - uint8_t * BSSID(uint8_t networkItem); - - - String BSSIDstr(uint8_t networkItem); - int32_t channel(uint8_t networkItem); - bool isHidden(uint8_t networkItem); - bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); - - - wl_status_t status(); - - - int hostByName(const char* aHostname, IPAddress& aResult); - - String hostname(void); bool hostname(char* aHostname); bool hostname(const char* aHostname); bool hostname(String aHostname); + // STA WiFi info + wl_status_t status(); + String SSID() const; + String psk() const; - bool beginWPSConfig(void); + uint8_t *BSSID(void); + String BSSIDstr(void); - void printDiag(Print& dest); + int32_t RSSI(); + // ---------------------------------------------------------------------------------------------- + // ----------------------------------------- AP function ---------------------------------------- + // ---------------------------------------------------------------------------------------------- + void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); + void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + int softAPdisconnect(bool wifioff = false); - void beginSmartConfig(); - bool smartConfigDone(); - void stopSmartConfig(); + IPAddress softAPIP(); - friend class WiFiClient; - friend class WiFiServer; + uint8_t* softAPmacAddress(uint8_t* mac); + String softAPmacAddress(void); + // ---------------------------------------------------------------------------------------------- + // ----------------------------------------- scan function -------------------------------------- + // ---------------------------------------------------------------------------------------------- + + int8_t scanNetworks(bool async = false, bool show_hidden = false); + + int8_t scanComplete(); + void scanDelete(); + + // scan result + bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); + + String SSID(uint8_t networkItem); + uint8_t encryptionType(uint8_t networkItem); + int32_t RSSI(uint8_t networkItem); + uint8_t * BSSID(uint8_t networkItem); + String BSSIDstr(uint8_t networkItem); + int32_t channel(uint8_t networkItem); + bool isHidden(uint8_t networkItem); + + // ---------------------------------------------------------------------------------------------- + // -------------------------------------- Generic WiFi function --------------------------------- + // ---------------------------------------------------------------------------------------------- + + int32_t channel(void); bool setSleepMode(WiFiSleepType_t type); WiFiSleepType_t getSleepMode(); @@ -158,6 +144,34 @@ class ESP8266WiFiClass { bool setPhyMode(WiFiPhyMode_t mode); WiFiPhyMode_t getPhyMode(); + + // ---------------------------------------------------------------------------------------------- + // ------------------------------------ Generic Network function -------------------------------- + // ---------------------------------------------------------------------------------------------- + + int hostByName(const char* aHostname, IPAddress& aResult); + + + // ---------------------------------------------------------------------------------------------- + // ------------------------------------ STA remote configure ----------------------------------- + // ---------------------------------------------------------------------------------------------- + + bool beginWPSConfig(void); + + void beginSmartConfig(); + bool smartConfigDone(); + void stopSmartConfig(); + + + // ---------------------------------------------------------------------------------------------- + // ------------------------------------------- Debug -------------------------------------------- + // ---------------------------------------------------------------------------------------------- + + void printDiag(Print& dest); + + friend class WiFiClient; + friend class WiFiServer; + protected: void _mode(WiFiMode); static void _scanDone(void* result, int status); From 20de9a5673b5cf5de15afeb23ed0ee42ba3dd1be Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 17:38:58 +0100 Subject: [PATCH 06/38] reorder part two --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 523 +++++++++++----------- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 9 +- 2 files changed, 268 insertions(+), 264 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 65dc97564..ee52e8ab4 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -41,6 +41,71 @@ extern "C" { extern "C" void esp_schedule(); extern "C" void esp_yield(); + + +extern "C" { +typedef STAILQ_HEAD(, bss_info) +bss_info_head_t; +} + + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- Private functions ------------------------------------------------ +// ----------------------------------------------------------------------------------------------------------------------- + +static bool sta_config_equal(const station_config& lhs, const station_config& rhs); +static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs); + + +/** + * compare two STA configurations + * @param lhs station_config + * @param rhs station_config + * @return equal + */ +static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + return false; + + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + return false; + + if(lhs.bssid_set) { + if(!rhs.bssid_set) + return false; + + if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) + return false; + } else { + if(rhs.bssid_set) + return false; + } + + return true; +} + +/** + * compare two AP configurations + * @param lhs softap_config + * @param rhs softap_config + * @return equal + */ +static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + return false; + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + return false; + if(lhs.channel != rhs.channel) + return false; + if(lhs.ssid_hidden != rhs.ssid_hidden) + return false; + return true; +} + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- ESP8266WiFiClass ------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + ESP8266WiFiClass::ESP8266WiFiClass() : _smartConfigStarted(false), _smartConfigDone(false), _useStaticIp(false), _persistent(true) { uint8 m = wifi_get_opmode(); @@ -49,6 +114,22 @@ ESP8266WiFiClass::ESP8266WiFiClass() : wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiClass::_eventCallback); } +/** + * callback for WiFi events + * @param arg + */ +void ESP8266WiFiClass::_eventCallback(void* arg) { + System_Event_t* event = reinterpret_cast(arg); + DEBUGV("wifi evt: %d\r\n", event->event); + + if(event->event == EVENT_STAMODE_DISCONNECTED) { + WiFiClient::stopAll(); + } + + //TODO allow user to hook this event +} + + // ----------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------- STA function ----------------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- @@ -563,6 +644,12 @@ String ESP8266WiFiClass::softAPmacAddress(void) { // ----------------------------------------------------- scan function --------------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- +bool ESP8266WiFiClass::_scanAsync = false; +bool ESP8266WiFiClass::_scanStarted = false; +bool ESP8266WiFiClass::_scanComplete = false; + +size_t ESP8266WiFiClass::_scanCount = 0; +void* ESP8266WiFiClass::_scanResult = 0; /** * Start scan WiFi networks available @@ -741,7 +828,7 @@ uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { /** * return MAC / BSSID of scanned wifi - * @param networkItem specify from which network item want to get the information + * @param i specify from which network item want to get the information * @return String MAC / BSSID of scanned wifi */ String ESP8266WiFiClass::BSSIDstr(uint8_t i) { @@ -775,6 +862,60 @@ bool ESP8266WiFiClass::isHidden(uint8_t i) { return (it->is_hidden != 0); } +/** + * private + * scan callback + * @param result void *arg + * @param status STATUS + */ +void ESP8266WiFiClass::_scanDone(void* result, int status) { + if(status != OK) { + ESP8266WiFiClass::_scanCount = 0; + ESP8266WiFiClass::_scanResult = 0; + } else { + + int i = 0; + bss_info_head_t* head = reinterpret_cast(result); + + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) + ; + ESP8266WiFiClass::_scanCount = i; + if(i == 0) { + ESP8266WiFiClass::_scanResult = 0; + } else { + bss_info* copied_info = new bss_info[i]; + i = 0; + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) { + memcpy(copied_info + i, it, sizeof(bss_info)); + } + + ESP8266WiFiClass::_scanResult = copied_info; + } + + } + + ESP8266WiFiClass::_scanStarted = false; + ESP8266WiFiClass::_scanComplete = true; + + if(!ESP8266WiFiClass::_scanAsync) { + esp_schedule(); + } +} + +/** + * + * @param i specify from which network item want to get the information + * @return bss_info * + */ +void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { + //TODO why its void * and not bss_info * ? + if(!ESP8266WiFiClass::_scanResult || (size_t) i > ESP8266WiFiClass::_scanCount) { + return 0; + } + return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; +} + + // ----------------------------------------------------------------------------------------------------------------------- // ------------------------------------------------- Generic WiFi function ----------------------------------------------- @@ -823,10 +964,72 @@ WiFiPhyMode_t ESP8266WiFiClass::getPhyMode() { return (WiFiPhyMode_t) wifi_get_phy_mode(); } +/** + * store WiFi condif in SDK config area in flash + * @param persistent + */ +void ESP8266WiFiClass::persistent(bool persistent) { + _persistent = persistent; +} + + +/** + * set new mode + * @param m WiFiMode + */ +void ESP8266WiFiClass::mode(WiFiMode m) { + if(wifi_get_opmode() == (uint8) m) { + return; + } + + if((m & WIFI_AP)) { + _useApMode = true; + } else { + _useApMode = false; + } + + if((m & WIFI_STA)) { + _useClientMode = true; + } else { + _useClientMode = false; + } + + _mode(m); +} + +/** + * get WiFi mode + * @return WiFiMode + */ +WiFiMode ESP8266WiFiClass::getMode() { + return (WiFiMode) wifi_get_opmode(); +} + + +/** + * private + * internal mode handling. + * @param m WiFiMode + */ +void ESP8266WiFiClass::_mode(WiFiMode m) { + if(wifi_get_opmode() == (uint8) m) { + return; + } + + ETS_UART_INTR_DISABLE(); + if(_persistent) + wifi_set_opmode(m); + else + wifi_set_opmode_current(m); + ETS_UART_INTR_ENABLE(); + +} + // ----------------------------------------------------------------------------------------------------------------------- // ------------------------------------------------ Generic Network function --------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- +void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg); /** * Resolve the given hostname to an IP address. @@ -849,11 +1052,24 @@ int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { return (aResult != 0) ? 1 : 0; } +/** + * DNS callback + * @param name + * @param ipaddr + * @param callback_arg + */ +void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { + if(ipaddr) + (*reinterpret_cast(callback_arg)) = ipaddr->addr; + esp_schedule(); // resume the hostByName function +} + // ----------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------- STA remote configure ----------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- +void wifi_wps_status_cb(wps_cb_status status); /** * WPS config @@ -903,6 +1119,33 @@ bool ESP8266WiFiClass::beginWPSConfig(void) { return true; } +/** + * WPS callback + * @param status wps_cb_status + */ +void wifi_wps_status_cb(wps_cb_status status) { + DEBUGV("wps cb status: %d\r\n", status); + switch(status) { + case WPS_CB_ST_SUCCESS: + if(!wifi_wps_disable()) { + DEBUGV("wps disable failed\n"); + } + wifi_station_connect(); + break; + case WPS_CB_ST_FAILED: + DEBUGV("wps FAILED\n"); + break; + case WPS_CB_ST_TIMEOUT: + DEBUGV("wps TIMEOUT\n"); + break; + case WPS_CB_ST_WEP: + DEBUGV("wps WEP\n"); + break; + } + // TODO user function to get status + + esp_schedule(); // resume the beginWPSConfig function +} /** * Start SmartConfig @@ -950,6 +1193,27 @@ bool ESP8266WiFiClass::smartConfigDone() { } +/** + * _smartConfigCallback + * @param st + * @param result + */ +void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { + sc_status status = (sc_status) st; + if(status == SC_STATUS_LINK) { + station_config* sta_conf = reinterpret_cast(result); + + wifi_station_set_config(sta_conf); + wifi_station_disconnect(); + wifi_station_connect(); + + WiFi._smartConfigDone = true; + } else if(status == SC_STATUS_LINK_OVER) { + WiFi.stopSmartConfig(); + } +} + + // ----------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------- Debug ------------------------------------------------------ // ----------------------------------------------------------------------------------------------------------------------- @@ -1000,261 +1264,4 @@ void ESP8266WiFiClass::printDiag(Print& p) { } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void ESP8266WiFiClass::persistent(bool persistent) { - _persistent = persistent; -} - -void ESP8266WiFiClass::mode(WiFiMode m) { - if(wifi_get_opmode() == (uint8) m) { - return; - } - - if((m & WIFI_AP)) { - _useApMode = true; - } else { - _useApMode = false; - } - - if((m & WIFI_STA)) { - _useClientMode = true; - } else { - _useClientMode = false; - } - - _mode(m); -} - -WiFiMode ESP8266WiFiClass::getMode() { - return (WiFiMode) wifi_get_opmode(); -} - -void ESP8266WiFiClass::_mode(WiFiMode m) { - if(wifi_get_opmode() == (uint8) m) { - return; - } - - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_set_opmode(m); - else - wifi_set_opmode_current(m); - ETS_UART_INTR_ENABLE(); - -} - -static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) - return false; - - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) - return false; - - if(lhs.bssid_set) { - if(!rhs.bssid_set) - return false; - - if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) - return false; - } else { - if(rhs.bssid_set) - return false; - } - - return true; -} - - - - -static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) - return false; - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) - return false; - if(lhs.channel != rhs.channel) - return false; - if(lhs.ssid_hidden != rhs.ssid_hidden) - return false; - return true; -} - - - - - - - - - - - -extern "C" { -typedef STAILQ_HEAD(, bss_info) -bss_info_head_t; -} - -void ESP8266WiFiClass::_scanDone(void* result, int status) { - if(status != OK) { - ESP8266WiFiClass::_scanCount = 0; - ESP8266WiFiClass::_scanResult = 0; - } else { - - int i = 0; - bss_info_head_t* head = reinterpret_cast(result); - - for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) - ; - ESP8266WiFiClass::_scanCount = i; - if(i == 0) { - ESP8266WiFiClass::_scanResult = 0; - } else { - bss_info* copied_info = new bss_info[i]; - i = 0; - for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) { - memcpy(copied_info + i, it, sizeof(bss_info)); - } - - ESP8266WiFiClass::_scanResult = copied_info; - } - - } - - ESP8266WiFiClass::_scanStarted = false; - ESP8266WiFiClass::_scanComplete = true; - - if(!ESP8266WiFiClass::_scanAsync) { - esp_schedule(); - } -} - - -void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { - if(!ESP8266WiFiClass::_scanResult || (size_t) i > ESP8266WiFiClass::_scanCount) { - return 0; - } - - return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; -} - - - - - - - -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { - if(ipaddr) - (*reinterpret_cast(callback_arg)) = ipaddr->addr; - esp_schedule(); // resume the hostByName function -} - - - -//-------------------------------------------------------------- - -void wifi_wps_status_cb(wps_cb_status status) { - DEBUGV("wps cb status: %d\r\n", status); - switch(status) { - case WPS_CB_ST_SUCCESS: - if(!wifi_wps_disable()) { - DEBUGV("wps disable failed\n"); - } - wifi_station_connect(); - break; - case WPS_CB_ST_FAILED: - DEBUGV("wps FAILED\n"); - break; - case WPS_CB_ST_TIMEOUT: - DEBUGV("wps TIMEOUT\n"); - break; - case WPS_CB_ST_WEP: - DEBUGV("wps WEP\n"); - break; - } - // todo user function to get status - - esp_schedule(); // resume the beginWPSConfig function -} - - -//-------------------------------------------------------------- - - -void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { - sc_status status = (sc_status) st; - if(status == SC_STATUS_LINK) { - station_config* sta_conf = reinterpret_cast(result); - - wifi_station_set_config(sta_conf); - wifi_station_disconnect(); - wifi_station_connect(); - - WiFi._smartConfigDone = true; - } else if(status == SC_STATUS_LINK_OVER) { - WiFi.stopSmartConfig(); - } -} - -//-------------------------------------------------------------- - - -//-------------------------------------------------------------- - -void ESP8266WiFiClass::_eventCallback(void* arg) { - System_Event_t* event = reinterpret_cast(arg); - DEBUGV("wifi evt: %d\r\n", event->event); - - if(event->event == EVENT_STAMODE_DISCONNECTED) { - WiFiClient::stopAll(); - } -} - - - -bool ESP8266WiFiClass::_scanAsync = false; -bool ESP8266WiFiClass::_scanStarted = false; -bool ESP8266WiFiClass::_scanComplete = false; - -size_t ESP8266WiFiClass::_scanCount = 0; -void* ESP8266WiFiClass::_scanResult = 0; - ESP8266WiFiClass WiFi; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 815cd675a..9a9e433ac 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -53,14 +53,8 @@ typedef enum { class ESP8266WiFiClass { public: - ESP8266WiFiClass(); - void persistent(bool persistent); - - void mode(WiFiMode); - WiFiMode getMode(); - // ---------------------------------------------------------------------------------------------- // ---------------------------------------- STA function ---------------------------------------- // ---------------------------------------------------------------------------------------------- @@ -144,6 +138,9 @@ class ESP8266WiFiClass { bool setPhyMode(WiFiPhyMode_t mode); WiFiPhyMode_t getPhyMode(); + void persistent(bool persistent); + void mode(WiFiMode); + WiFiMode getMode(); // ---------------------------------------------------------------------------------------------- // ------------------------------------ Generic Network function -------------------------------- From d521cea2322e4ad61e94144b5a72d46c33ca9a53 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 17:55:38 +0100 Subject: [PATCH 07/38] reorder part 3 --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 15 ++++- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 72 ++++++++++++++++++----- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index ee52e8ab4..0207f2ea8 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -106,12 +106,21 @@ static bool softap_config_equal(const softap_config& lhs, const softap_config& r // ---------------------------------------------------- ESP8266WiFiClass ------------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- -ESP8266WiFiClass::ESP8266WiFiClass() : - _smartConfigStarted(false), _smartConfigDone(false), _useStaticIp(false), _persistent(true) { +ESP8266WiFiClass::ESP8266WiFiClass() { + + _useStaticIp = false; + uint8 m = wifi_get_opmode(); - _useClientMode = (m & WIFI_STA); _useApMode = (m & WIFI_AP); + _useClientMode = (m & WIFI_STA); + + _persistent = true; + + _smartConfigStarted = false; + _smartConfigDone = false; + wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiClass::_eventCallback); + } /** diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 9a9e433ac..bd2696213 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -52,12 +52,25 @@ typedef enum { } WiFiSleepType_t; class ESP8266WiFiClass { + + // ---------------------------------------------------------------------------------------------- + // -------------------------------------- ESP8266WiFiClass -------------------------------------- + // ---------------------------------------------------------------------------------------------- + public: + ESP8266WiFiClass(); + protected: + + static void _eventCallback(void *event); + // ---------------------------------------------------------------------------------------------- // ---------------------------------------- STA function ---------------------------------------- // ---------------------------------------------------------------------------------------------- + + public: + int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); int begin(); @@ -94,9 +107,16 @@ class ESP8266WiFiClass { int32_t RSSI(); + protected: + + bool _useStaticIp; + // ---------------------------------------------------------------------------------------------- // ----------------------------------------- AP function ---------------------------------------- // ---------------------------------------------------------------------------------------------- + + public: + void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); int softAPdisconnect(bool wifioff = false); @@ -106,10 +126,14 @@ class ESP8266WiFiClass { uint8_t* softAPmacAddress(uint8_t* mac); String softAPmacAddress(void); + protected: + // ---------------------------------------------------------------------------------------------- // ----------------------------------------- scan function -------------------------------------- // ---------------------------------------------------------------------------------------------- + public: + int8_t scanNetworks(bool async = false, bool show_hidden = false); int8_t scanComplete(); @@ -126,10 +150,24 @@ class ESP8266WiFiClass { int32_t channel(uint8_t networkItem); bool isHidden(uint8_t networkItem); + protected: + + static bool _scanAsync; + static bool _scanStarted; + static bool _scanComplete; + + static size_t _scanCount; + static void* _scanResult; + + static void _scanDone(void* result, int status); + void * _getScanInfoByIndex(int i); + // ---------------------------------------------------------------------------------------------- // -------------------------------------- Generic WiFi function --------------------------------- // ---------------------------------------------------------------------------------------------- + public: + int32_t channel(void); bool setSleepMode(WiFiSleepType_t type); @@ -142,49 +180,51 @@ class ESP8266WiFiClass { void mode(WiFiMode); WiFiMode getMode(); + protected: + bool _useApMode; + bool _useClientMode; + bool _persistent; + void _mode(WiFiMode); + // ---------------------------------------------------------------------------------------------- // ------------------------------------ Generic Network function -------------------------------- // ---------------------------------------------------------------------------------------------- + public: + int hostByName(const char* aHostname, IPAddress& aResult); + protected: // ---------------------------------------------------------------------------------------------- // ------------------------------------ STA remote configure ----------------------------------- // ---------------------------------------------------------------------------------------------- + public: + bool beginWPSConfig(void); void beginSmartConfig(); bool smartConfigDone(); void stopSmartConfig(); + protected: + + bool _smartConfigStarted; + bool _smartConfigDone; + static void _smartConfigCallback(uint32_t status, void* result); // ---------------------------------------------------------------------------------------------- // ------------------------------------------- Debug -------------------------------------------- // ---------------------------------------------------------------------------------------------- + public: + void printDiag(Print& dest); friend class WiFiClient; friend class WiFiServer; - protected: - void _mode(WiFiMode); - static void _scanDone(void* result, int status); - void * _getScanInfoByIndex(int i); - static void _smartConfigCallback(uint32_t status, void* result); - static void _eventCallback(void *event);bool _smartConfigStarted;bool _smartConfigDone; - - bool _useApMode;bool _useClientMode;bool _useStaticIp;bool _persistent; - - static bool _scanAsync; - static bool _scanStarted; - static bool _scanComplete; - - static size_t _scanCount; - static void* _scanResult; - }; extern ESP8266WiFiClass WiFi; From 64326f9573cfcb45f5d64e749433024734b4bdd3 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 19:30:56 +0100 Subject: [PATCH 08/38] rework mode management may fixes: #1138 --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 275 +++++++++++----------- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 12 +- 2 files changed, 151 insertions(+), 136 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 0207f2ea8..b8742d9be 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -17,6 +17,9 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Reworked on 28 Dec 2015 by Markus Sattler + */ #include "ESP8266WiFi.h" @@ -110,10 +113,6 @@ ESP8266WiFiClass::ESP8266WiFiClass() { _useStaticIp = false; - uint8 m = wifi_get_opmode(); - _useApMode = (m & WIFI_AP); - _useClientMode = (m & WIFI_STA); - _persistent = true; _smartConfigStarted = false; @@ -153,14 +152,10 @@ void ESP8266WiFiClass::_eventCallback(void* arg) { * @return */ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { - _useClientMode = true; - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); + if(!enableSTA(true)) { + // enable STA failed + return WL_CONNECT_FAILED; } if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) { @@ -197,10 +192,11 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch } ETS_UART_INTR_DISABLE(); - if(_persistent) + if(_persistent) { wifi_station_set_config(&conf); - else + } else { wifi_station_set_config_current(&conf); + } wifi_station_connect(); ETS_UART_INTR_ENABLE(); @@ -208,8 +204,10 @@ int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t ch wifi_set_channel(channel); } - if(!_useStaticIp) + if(!_useStaticIp) { wifi_station_dhcpc_start(); + } + return status(); } @@ -222,13 +220,20 @@ int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const * @return wl_status_t */ int ESP8266WiFiClass::begin() { + + if(!enableSTA(true)) { + // enable STA failed + return WL_CONNECT_FAILED; + } + ETS_UART_INTR_DISABLE(); wifi_station_connect(); ETS_UART_INTR_ENABLE(); // TODO is static ip not stored in SDK? - if(!_useStaticIp) + if(!_useStaticIp) { wifi_station_dhcpc_start(); + } return status(); } @@ -240,6 +245,11 @@ int ESP8266WiFiClass::begin() { * @param subnet Static Subnet mask */ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + + if(!enableSTA(true)) { + return; + } + struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); @@ -285,25 +295,20 @@ int ESP8266WiFiClass::disconnect(bool wifioff) { struct station_config conf; *conf.ssid = 0; *conf.password = 0; + ETS_UART_INTR_DISABLE(); - if(_persistent) + if(_persistent) { wifi_station_set_config(&conf); - else + } else { wifi_station_set_config_current(&conf); + } wifi_station_disconnect(); ETS_UART_INTR_ENABLE(); if(wifioff) { - _useClientMode = false; - - if(_useApMode) { - // turn on AP - _mode(WIFI_AP); - } else { - // turn wifi off - _mode(WIFI_OFF); - } + enableSTA(false); } + //TODO return with more meaning ? return 0; } @@ -436,16 +441,17 @@ bool ESP8266WiFiClass::hostname(String aHostname) { wl_status_t ESP8266WiFiClass::status() { int status = wifi_station_get_connect_status(); - if(status == STATION_GOT_IP) + if(status == STATION_GOT_IP) { return WL_CONNECTED; - else if(status == STATION_NO_AP_FOUND) + } else if(status == STATION_NO_AP_FOUND) { return WL_NO_SSID_AVAIL; - else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) + } else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) { return WL_CONNECT_FAILED; - else if(status == STATION_IDLE) + } else if(status == STATION_IDLE) { return WL_IDLE_STATUS; - else + } else { return WL_DISCONNECTED; + } } /** @@ -453,8 +459,7 @@ wl_status_t ESP8266WiFiClass::status() { * @return SSID */ String ESP8266WiFiClass::SSID() const { - // TODO why static, needs RAM for nothing? - static struct station_config conf; + struct station_config conf; wifi_station_get_config(&conf); return String(reinterpret_cast(conf.ssid)); } @@ -464,7 +469,7 @@ String ESP8266WiFiClass::SSID() const { * @return psk string */ String ESP8266WiFiClass::psk() const { - static struct station_config conf; + struct station_config conf; wifi_station_get_config(&conf); return String(reinterpret_cast(conf.password)); } @@ -484,7 +489,7 @@ uint8_t* ESP8266WiFiClass::BSSID(void) { * @return String bssid mac */ String ESP8266WiFiClass::BSSIDstr(void) { - static struct station_config conf; + struct station_config conf; char mac[18] = { 0 }; wifi_station_get_config(&conf); sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); @@ -512,13 +517,10 @@ int32_t ESP8266WiFiClass::RSSI(void) { * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) */ void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { - _useApMode = true; - if(_useClientMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_AP); + + if(!enableAP(true)) { + // enable AP failed + return; } if(!ssid || *ssid == 0 || strlen(ssid) > 31) { @@ -571,6 +573,12 @@ void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int chan * @param subnet subnet mask */ void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + + if(!enableAP(true)) { + // enable AP failed + return; + } + struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); @@ -599,15 +607,7 @@ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { ETS_UART_INTR_ENABLE(); if(wifioff) { - _useApMode = false; - - if(_useClientMode) { - // turn on STA - _mode(WIFI_STA); - } else { - // turn wifi off - _mode(WIFI_OFF); - } + enableAP(false); } //TODO return with more meaning ? @@ -673,17 +673,11 @@ int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { ESP8266WiFiClass::_scanAsync = async; - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); - } + enableSTA(true); int status = wifi_station_get_connect_status(); if(status != STATION_GOT_IP && status != STATION_IDLE) { - disconnect(); + disconnect(false); } scanDelete(); @@ -756,8 +750,9 @@ void ESP8266WiFiClass::scanDelete() { */ bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return false; + } ssid = (const char*) it->ssid; encType = encryptionType(i); @@ -777,8 +772,9 @@ bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, */ String ESP8266WiFiClass::SSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return ""; + } return String(reinterpret_cast(it->ssid)); } @@ -791,21 +787,24 @@ String ESP8266WiFiClass::SSID(uint8_t i) { */ uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return -1; + } - int authmode = it->authmode; - if(authmode == AUTH_OPEN) - return ENC_TYPE_NONE; - if(authmode == AUTH_WEP) - return ENC_TYPE_WEP; - if(authmode == AUTH_WPA_PSK) - return ENC_TYPE_TKIP; - if(authmode == AUTH_WPA2_PSK) - return ENC_TYPE_CCMP; - if(authmode == AUTH_WPA_WPA2_PSK) - return ENC_TYPE_AUTO; - return -1; + switch(it->authmode) { + case AUTH_OPEN: + return ENC_TYPE_NONE; + case AUTH_WEP: + return ENC_TYPE_WEP; + case AUTH_WPA_PSK: + return ENC_TYPE_TKIP; + case AUTH_WPA2_PSK: + return ENC_TYPE_CCMP; + case AUTH_WPA_WPA2_PSK: + return ENC_TYPE_AUTO; + default: + return -1; + } } /** @@ -815,9 +814,9 @@ uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { */ int32_t ESP8266WiFiClass::RSSI(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return 0; - + } return it->rssi; } @@ -829,9 +828,9 @@ int32_t ESP8266WiFiClass::RSSI(uint8_t i) { */ uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return 0; - + } return it->bssid; } @@ -843,18 +842,18 @@ uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { String ESP8266WiFiClass::BSSIDstr(uint8_t i) { char mac[18] = { 0 }; struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return String(""); - + } sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); return String(mac); } int32_t ESP8266WiFiClass::channel(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return 0; - + } return it->channel; } @@ -865,9 +864,9 @@ int32_t ESP8266WiFiClass::channel(uint8_t i) { */ bool ESP8266WiFiClass::isHidden(uint8_t i) { struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) + if(!it) { return false; - + } return (it->is_hidden != 0); } @@ -984,56 +983,77 @@ void ESP8266WiFiClass::persistent(bool persistent) { /** * set new mode - * @param m WiFiMode + * @param m WiFiMode_t */ -void ESP8266WiFiClass::mode(WiFiMode m) { +bool ESP8266WiFiClass::mode(WiFiMode_t m) { if(wifi_get_opmode() == (uint8) m) { - return; + return true; } - if((m & WIFI_AP)) { - _useApMode = true; + bool ret = false; + + ETS_UART_INTR_DISABLE(); + if(_persistent) { + ret = wifi_set_opmode(m); } else { - _useApMode = false; + ret = wifi_set_opmode_current(m); } + ETS_UART_INTR_ENABLE(); - if((m & WIFI_STA)) { - _useClientMode = true; - } else { - _useClientMode = false; - } - - _mode(m); + return ret; } /** * get WiFi mode * @return WiFiMode */ -WiFiMode ESP8266WiFiClass::getMode() { - return (WiFiMode) wifi_get_opmode(); +WiFiMode_t ESP8266WiFiClass::getMode() { + return (WiFiMode_t) wifi_get_opmode(); } - /** - * private - * internal mode handling. - * @param m WiFiMode + * control STA mode + * @param enable bool + * @return ok */ -void ESP8266WiFiClass::_mode(WiFiMode m) { - if(wifi_get_opmode() == (uint8) m) { - return; +bool ESP8266WiFiClass::enableSTA(bool enable) { + + WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + bool isEnabled = ((currentMode & WIFI_STA) != 0); + + if(isEnabled != enable) { + if(enable) { + return mode((WiFiMode_t)(currentMode & WIFI_STA)); + } else { + return mode((WiFiMode_t)(currentMode & (~WIFI_STA))); + } + } else { + return true; } - - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_set_opmode(m); - else - wifi_set_opmode_current(m); - ETS_UART_INTR_ENABLE(); - } +/** + * control AP mode + * @param enable bool + * @return ok + */ +bool ESP8266WiFiClass::enableAP(bool enable){ + + WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + bool isEnabled = ((currentMode & WIFI_AP) != 0); + + if(isEnabled != enable) { + if(enable) { + return mode((WiFiMode_t)(currentMode & WIFI_AP)); + } else { + return mode((WiFiMode_t)(currentMode & (~WIFI_AP))); + } + } else { + return true; + } +} + + // ----------------------------------------------------------------------------------------------------------------------- // ------------------------------------------------ Generic Network function --------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- @@ -1087,14 +1107,9 @@ void wifi_wps_status_cb(wps_cb_status status); */ bool ESP8266WiFiClass::beginWPSConfig(void) { - _useClientMode = true; - - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); + if(!enableSTA(true)) { + // enable STA failed + return false; } disconnect(); @@ -1163,18 +1178,14 @@ void ESP8266WiFiClass::beginSmartConfig() { if(_smartConfigStarted) return; - if(_useApMode) { - // turn on AP+STA mode - _mode(WIFI_AP_STA); - } else { - // turn on STA mode - _mode(WIFI_STA); + if(!enableSTA(true)) { + // enable STA failed + return; } _smartConfigStarted = true; _smartConfigDone = false; - //SC_TYPE_ESPTOUCH use ESPTOUCH for smartconfig, or use SC_TYPE_AIRKISS for AIRKISS smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); } @@ -1183,8 +1194,9 @@ void ESP8266WiFiClass::beginSmartConfig() { * Stop SmartConfig */ void ESP8266WiFiClass::stopSmartConfig() { - if(!_smartConfigStarted) + if(!_smartConfigStarted) { return; + } smartconfig_stop(); _smartConfigStarted = false; @@ -1195,8 +1207,9 @@ void ESP8266WiFiClass::stopSmartConfig() { * @return smartConfig Done */ bool ESP8266WiFiClass::smartConfigDone() { - if(!_smartConfigStarted) + if(!_smartConfigStarted) { return false; + } return _smartConfigDone; } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index bd2696213..3bd23b016 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -43,6 +43,8 @@ enum WiFiMode { WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 }; +typedef enum WiFiMode WiFiMode_t; + typedef enum { WIFI_PHY_MODE_11B = 1, WIFI_PHY_MODE_11G = 2, WIFI_PHY_MODE_11N = 3 } WiFiPhyMode_t; @@ -177,14 +179,14 @@ class ESP8266WiFiClass { WiFiPhyMode_t getPhyMode(); void persistent(bool persistent); - void mode(WiFiMode); - WiFiMode getMode(); + bool mode(WiFiMode_t); + WiFiMode_t getMode(); + + bool enableSTA(bool enable); + bool enableAP(bool enable); protected: - bool _useApMode; - bool _useClientMode; bool _persistent; - void _mode(WiFiMode); // ---------------------------------------------------------------------------------------------- // ------------------------------------ Generic Network function -------------------------------- From cee4ef307856858eb624a2dcd9f236ef3ca9ab50 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 19:46:20 +0100 Subject: [PATCH 09/38] less static stuff --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 8 ++++---- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 1 + tools/sdk/include/user_interface.h | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index b8742d9be..ee38217ef 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -230,7 +230,6 @@ int ESP8266WiFiClass::begin() { wifi_station_connect(); ETS_UART_INTR_ENABLE(); - // TODO is static ip not stored in SDK? if(!_useStaticIp) { wifi_station_dhcpc_start(); } @@ -600,10 +599,11 @@ int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); - if(_persistent) + if(_persistent) { wifi_softap_set_config(&conf); - else + } else { wifi_softap_set_config_current(&conf); + } ETS_UART_INTR_ENABLE(); if(wifioff) { @@ -1266,7 +1266,7 @@ void ESP8266WiFiClass::printDiag(Print& p) { p.print("Auto connect: "); p.println(wifi_station_get_auto_connect()); - static struct station_config conf; + struct station_config conf; wifi_station_get_config(&conf); const char* ssid = reinterpret_cast(conf.ssid); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index 3bd23b016..ebdfe4b65 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -179,6 +179,7 @@ class ESP8266WiFiClass { WiFiPhyMode_t getPhyMode(); void persistent(bool persistent); + bool mode(WiFiMode_t); WiFiMode_t getMode(); diff --git a/tools/sdk/include/user_interface.h b/tools/sdk/include/user_interface.h index c29443e54..5ecf3a868 100644 --- a/tools/sdk/include/user_interface.h +++ b/tools/sdk/include/user_interface.h @@ -164,7 +164,7 @@ bool wifi_set_opmode_current(uint8 opmode); uint8 wifi_get_broadcast_if(void); bool wifi_set_broadcast_if(uint8 interface); -struct bss_info { +typedef struct bss_info { STAILQ_ENTRY(bss_info) next; uint8 bssid[6]; @@ -177,7 +177,7 @@ struct bss_info { sint16 freq_offset; sint16 freqcal_val; uint8 *esp_mesh_ie; -}; +} bss_info_t; typedef struct _scaninfo { STAILQ_HEAD(, bss_info) *pbss; From 6f00503bc37acd89fd4305151ac02e817fd06124 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 28 Dec 2015 20:19:36 +0100 Subject: [PATCH 10/38] add reconnect function for STA --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 12 ++++++++++++ libraries/ESP8266WiFi/src/ESP8266WiFi.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index ee38217ef..870e99cec 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -284,6 +284,18 @@ void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress s _useStaticIp = true; } +/** + * will force a disconnect an then start reconnecting to AP + * @return ok + */ +bool ESP8266WiFiClass::reconnect() { + if((getMode() & WIFI_STA) != 0) { + if(wifi_station_disconnect()) { + return wifi_station_connect(); + } + } + return false; +} /** * Disconnect from the network diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index ebdfe4b65..dbadb135e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -80,6 +80,8 @@ class ESP8266WiFiClass { void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); + + bool reconnect(); int disconnect(bool wifioff = false); uint8_t waitForConnectResult(); From fd443d4e17ea7f896c7968153ca30795244c3c0d Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 14:03:15 +0100 Subject: [PATCH 11/38] split ESP8266WiFiClass in different sub classes for better overview. --- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 1209 ----------------- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 202 +-- libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 211 +++ libraries/ESP8266WiFi/src/ESP8266WiFiAP.h | 52 + .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 244 ++++ .../ESP8266WiFi/src/ESP8266WiFiGeneric.h | 73 + libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 606 +++++++++ libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h | 101 ++ libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp | 323 +++++ libraries/ESP8266WiFi/src/ESP8266WiFiScan.h | 70 + libraries/ESP8266WiFi/src/ESP8266WiFiType.h | 52 + 11 files changed, 1753 insertions(+), 1390 deletions(-) create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiAP.h create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiScan.h create mode 100644 libraries/ESP8266WiFi/src/ESP8266WiFiType.h diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 870e99cec..5ce0dab93 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -37,1217 +37,8 @@ extern "C" { #include "lwip/dns.h" } -#include "WiFiClient.h" -#include "WiFiUdp.h" #include "debug.h" -extern "C" void esp_schedule(); -extern "C" void esp_yield(); - - - -extern "C" { -typedef STAILQ_HEAD(, bss_info) -bss_info_head_t; -} - - -// ----------------------------------------------------------------------------------------------------------------------- -// ---------------------------------------------------- Private functions ------------------------------------------------ -// ----------------------------------------------------------------------------------------------------------------------- - -static bool sta_config_equal(const station_config& lhs, const station_config& rhs); -static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs); - - -/** - * compare two STA configurations - * @param lhs station_config - * @param rhs station_config - * @return equal - */ -static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) - return false; - - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) - return false; - - if(lhs.bssid_set) { - if(!rhs.bssid_set) - return false; - - if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) - return false; - } else { - if(rhs.bssid_set) - return false; - } - - return true; -} - -/** - * compare two AP configurations - * @param lhs softap_config - * @param rhs softap_config - * @return equal - */ -static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) - return false; - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) - return false; - if(lhs.channel != rhs.channel) - return false; - if(lhs.ssid_hidden != rhs.ssid_hidden) - return false; - return true; -} - -// ----------------------------------------------------------------------------------------------------------------------- -// ---------------------------------------------------- ESP8266WiFiClass ------------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -ESP8266WiFiClass::ESP8266WiFiClass() { - - _useStaticIp = false; - - _persistent = true; - - _smartConfigStarted = false; - _smartConfigDone = false; - - wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiClass::_eventCallback); - -} - -/** - * callback for WiFi events - * @param arg - */ -void ESP8266WiFiClass::_eventCallback(void* arg) { - System_Event_t* event = reinterpret_cast(arg); - DEBUGV("wifi evt: %d\r\n", event->event); - - if(event->event == EVENT_STAMODE_DISCONNECTED) { - WiFiClient::stopAll(); - } - - //TODO allow user to hook this event -} - - -// ----------------------------------------------------------------------------------------------------------------------- -// ---------------------------------------------------- STA function ----------------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -/** - * Start Wifi connection - * if passphrase is set the most secure supported mode will be automatically selected - * @param ssid const char* Pointer to the SSID string. - * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). - * @param bssid uint8_t[6] Optional. BSSID / MAC of AP - * @param channel Optional. Channel of AP - * @return - */ -int ESP8266WiFiClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { - - if(!enableSTA(true)) { - // enable STA failed - return WL_CONNECT_FAILED; - } - - if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) { - // fail SSID too long or missing! - return WL_CONNECT_FAILED; - } - - if(passphrase && strlen(passphrase) > 63) { - // fail passphrase too long! - return WL_CONNECT_FAILED; - } - - struct station_config conf; - strcpy(reinterpret_cast(conf.ssid), ssid); - - if(passphrase) { - strcpy(reinterpret_cast(conf.password), passphrase); - } else { - *conf.password = 0; - } - - if(bssid) { - conf.bssid_set = 1; - memcpy((void *) &conf.bssid[0], (void *) bssid, 6); - } else { - conf.bssid_set = 0; - } - - struct station_config current_conf; - wifi_station_get_config(¤t_conf); - if(sta_config_equal(current_conf, conf)) { - DEBUGV("sta config unchanged"); - return status(); - } - - ETS_UART_INTR_DISABLE(); - if(_persistent) { - wifi_station_set_config(&conf); - } else { - wifi_station_set_config_current(&conf); - } - wifi_station_connect(); - ETS_UART_INTR_ENABLE(); - - if(channel > 0 && channel <= 13) { - wifi_set_channel(channel); - } - - if(!_useStaticIp) { - wifi_station_dhcpc_start(); - } - - return status(); -} - -int ESP8266WiFiClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { - return begin((const char*) ssid, (const char*) passphrase, channel, bssid); -} - -/** - * Use to connect to SDK config. - * @return wl_status_t - */ -int ESP8266WiFiClass::begin() { - - if(!enableSTA(true)) { - // enable STA failed - return WL_CONNECT_FAILED; - } - - ETS_UART_INTR_DISABLE(); - wifi_station_connect(); - ETS_UART_INTR_ENABLE(); - - if(!_useStaticIp) { - wifi_station_dhcpc_start(); - } - return status(); -} - - -/** - * Change IP configuration settings disabling the dhcp client - * @param local_ip Static ip configuration - * @param gateway Static gateway configuration - * @param subnet Static Subnet mask - */ -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { - - if(!enableSTA(true)) { - return; - } - - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); - - _useStaticIp = true; -} - -/** - * Change IP configuration settings disabling the dhcp client - * @param local_ip Static ip configuration - * @param gateway Static gateway configuration - * @param subnet Static Subnet mask - * @param dns Static DNS server - */ -void ESP8266WiFiClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); - - // Set DNS-Server - ip_addr_t d; - d.addr = static_cast(dns); - dns_setserver(0, &d); - - _useStaticIp = true; -} - -/** - * will force a disconnect an then start reconnecting to AP - * @return ok - */ -bool ESP8266WiFiClass::reconnect() { - if((getMode() & WIFI_STA) != 0) { - if(wifi_station_disconnect()) { - return wifi_station_connect(); - } - } - return false; -} - -/** - * Disconnect from the network - * @param wifioff - * @return one value of wl_status_t enum - */ -int ESP8266WiFiClass::disconnect(bool wifioff) { - struct station_config conf; - *conf.ssid = 0; - *conf.password = 0; - - ETS_UART_INTR_DISABLE(); - if(_persistent) { - wifi_station_set_config(&conf); - } else { - wifi_station_set_config_current(&conf); - } - wifi_station_disconnect(); - ETS_UART_INTR_ENABLE(); - - if(wifioff) { - enableSTA(false); - } - - //TODO return with more meaning ? - return 0; -} - -/** - * Wait for WiFi connection to reach a result - * returns the status reached or disconnect if STA is off - * @return wl_status_t - */ -uint8_t ESP8266WiFiClass::waitForConnectResult() { - //1 and 3 have STA enabled - if((wifi_get_opmode() & 1) == 0) { - return WL_DISCONNECTED; - } - while(status() == WL_DISCONNECTED) { - delay(100); - } - return status(); -} - -/** - * Get the station interface IP address. - * @return IPAddress station IP - */ -IPAddress ESP8266WiFiClass::localIP() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.ip.addr); -} - - -/** - * Get the station interface MAC address. - * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * @return pointer to uint8_t * - */ -uint8_t* ESP8266WiFiClass::macAddress(uint8_t* mac) { - wifi_get_macaddr(STATION_IF, mac); - return mac; -} - -/** - * Get the station interface MAC address. - * @return String mac - */ -String ESP8266WiFiClass::macAddress(void) { - uint8_t mac[6]; - char macStr[18] = { 0 }; - wifi_get_macaddr(STATION_IF, mac); - - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return String(macStr); -} - -/** - * Get the interface subnet mask address. - * @return IPAddress subnetMask - */ -IPAddress ESP8266WiFiClass::subnetMask() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.netmask.addr); -} - -/** - * Get the gateway ip address. - * @return IPAddress gatewayIP - */ -IPAddress ESP8266WiFiClass::gatewayIP() { - struct ip_info ip; - wifi_get_ip_info(STATION_IF, &ip); - return IPAddress(ip.gw.addr); -} - -/** - * Get the DNS ip address. - * @param dns_no - * @return IPAddress DNS Server IP - */ -IPAddress ESP8266WiFiClass::dnsIP(uint8_t dns_no) { - ip_addr_t dns_ip = dns_getserver(dns_no); - return IPAddress(dns_ip.addr); -} - - -/** - * Get ESP8266 station DHCP hostname - * @return hostname - */ -String ESP8266WiFiClass::hostname(void) { - return String(wifi_station_get_hostname()); -} - - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(char* aHostname) { - if(strlen(aHostname) > 32) { - return false; - } - return wifi_station_set_hostname(aHostname); -} - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(const char* aHostname) { - return hostname((char*) aHostname); -} - -/** - * Set ESP8266 station DHCP hostname - * @param aHostname max length:32 - * @return ok - */ -bool ESP8266WiFiClass::hostname(String aHostname) { - return hostname((char*) aHostname.c_str()); -} - -/** - * Return Connection status. - * @return one of the value defined in wl_status_t - * - */ -wl_status_t ESP8266WiFiClass::status() { - int status = wifi_station_get_connect_status(); - - if(status == STATION_GOT_IP) { - return WL_CONNECTED; - } else if(status == STATION_NO_AP_FOUND) { - return WL_NO_SSID_AVAIL; - } else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) { - return WL_CONNECT_FAILED; - } else if(status == STATION_IDLE) { - return WL_IDLE_STATUS; - } else { - return WL_DISCONNECTED; - } -} - -/** - * Return the current SSID associated with the network - * @return SSID - */ -String ESP8266WiFiClass::SSID() const { - struct station_config conf; - wifi_station_get_config(&conf); - return String(reinterpret_cast(conf.ssid)); -} - -/** - * Return the current pre shared key associated with the network - * @return psk string - */ -String ESP8266WiFiClass::psk() const { - struct station_config conf; - wifi_station_get_config(&conf); - return String(reinterpret_cast(conf.password)); -} - -/** - * Return the current bssid / mac associated with the network if configured - * @return bssid uint8_t * - */ -uint8_t* ESP8266WiFiClass::BSSID(void) { - static struct station_config conf; - wifi_station_get_config(&conf); - return reinterpret_cast(conf.bssid); -} - -/** - * Return the current bssid / mac associated with the network if configured - * @return String bssid mac - */ -String ESP8266WiFiClass::BSSIDstr(void) { - struct station_config conf; - char mac[18] = { 0 }; - wifi_station_get_config(&conf); - sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); - return String(mac); -} - -/** - * Return the current network RSSI. - * @return RSSI value - */ -int32_t ESP8266WiFiClass::RSSI(void) { - return wifi_station_get_rssi(); -} - -// ----------------------------------------------------------------------------------------------------------------------- -// ----------------------------------------------------- AP function ----------------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - - -/** - * Set up an access point - * @param ssid Pointer to the SSID (max 63 char). - * @param passphrase (for WPA2 min 8 char, for open use NULL) - * @param channel WiFi channel number, 1 - 13. - * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) - */ -void ESP8266WiFiClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { - - if(!enableAP(true)) { - // enable AP failed - return; - } - - if(!ssid || *ssid == 0 || strlen(ssid) > 31) { - // fail SSID too long or missing! - return; - } - - if(passphrase && strlen(passphrase) > 63) { - // fail passphrase to long! - return; - } - - struct softap_config conf; - wifi_softap_get_config(&conf); - strcpy(reinterpret_cast(conf.ssid), ssid); - conf.channel = channel; - conf.ssid_len = strlen(ssid); - conf.ssid_hidden = ssid_hidden; - conf.max_connection = 4; - conf.beacon_interval = 100; - - if(!passphrase || strlen(passphrase) == 0) { - conf.authmode = AUTH_OPEN; - *conf.password = 0; - } else { - conf.authmode = AUTH_WPA2_PSK; - strcpy(reinterpret_cast(conf.password), passphrase); - } - - struct softap_config conf_current; - wifi_softap_get_config(&conf_current); - if(softap_config_equal(conf, conf_current)) { - DEBUGV("softap config unchanged"); - return; - } - - ETS_UART_INTR_DISABLE(); - if(_persistent) - wifi_softap_set_config(&conf); - else - wifi_softap_set_config_current(&conf); - ETS_UART_INTR_ENABLE(); -} - - -/** - * Configure access point - * @param local_ip access point IP - * @param gateway gateway IP - * @param subnet subnet mask - */ -void ESP8266WiFiClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { - - if(!enableAP(true)) { - // enable AP failed - return; - } - - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - wifi_softap_dhcps_stop(); - wifi_set_ip_info(SOFTAP_IF, &info); - wifi_softap_dhcps_start(); -} - - - -/** - * Disconnect from the network (close AP) - * @param wifioff disable mode? - * @return one value of wl_status_t enum - */ -int ESP8266WiFiClass::softAPdisconnect(bool wifioff) { - struct softap_config conf; - *conf.ssid = 0; - *conf.password = 0; - ETS_UART_INTR_DISABLE(); - if(_persistent) { - wifi_softap_set_config(&conf); - } else { - wifi_softap_set_config_current(&conf); - } - ETS_UART_INTR_ENABLE(); - - if(wifioff) { - enableAP(false); - } - - //TODO return with more meaning ? - return 0; -} - -/** - * Get the softAP interface IP address. - * @return IPAddress softAP IP - */ -IPAddress ESP8266WiFiClass::softAPIP() { - struct ip_info ip; - wifi_get_ip_info(SOFTAP_IF, &ip); - return IPAddress(ip.ip.addr); -} - - -/** - * Get the softAP interface MAC address. - * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - * @return pointer to uint8_t* - */ -uint8_t* ESP8266WiFiClass::softAPmacAddress(uint8_t* mac) { - wifi_get_macaddr(SOFTAP_IF, mac); - return mac; -} - -/** - * Get the softAP interface MAC address. - * @return String mac - */ -String ESP8266WiFiClass::softAPmacAddress(void) { - uint8_t mac[6]; - char macStr[18] = { 0 }; - wifi_get_macaddr(SOFTAP_IF, mac); - - sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return String(macStr); -} - - -// ----------------------------------------------------------------------------------------------------------------------- -// ----------------------------------------------------- scan function --------------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -bool ESP8266WiFiClass::_scanAsync = false; -bool ESP8266WiFiClass::_scanStarted = false; -bool ESP8266WiFiClass::_scanComplete = false; - -size_t ESP8266WiFiClass::_scanCount = 0; -void* ESP8266WiFiClass::_scanResult = 0; - -/** - * Start scan WiFi networks available - * @param async run in async mode - * @param show_hidden show hidden networks - * @return Number of discovered networks - */ -int8_t ESP8266WiFiClass::scanNetworks(bool async, bool show_hidden) { - if(ESP8266WiFiClass::_scanStarted) { - return WIFI_SCAN_RUNNING; - } - - ESP8266WiFiClass::_scanAsync = async; - - enableSTA(true); - - int status = wifi_station_get_connect_status(); - if(status != STATION_GOT_IP && status != STATION_IDLE) { - disconnect(false); - } - - scanDelete(); - - struct scan_config config; - config.ssid = 0; - config.bssid = 0; - config.channel = 0; - config.show_hidden = show_hidden; - if(wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiClass::_scanDone))) { - ESP8266WiFiClass::_scanComplete = false; - ESP8266WiFiClass::_scanStarted = true; - - if(ESP8266WiFiClass::_scanAsync) { - delay(0); // time for the OS to trigger the scan - return WIFI_SCAN_RUNNING; - } - - esp_yield(); - return ESP8266WiFiClass::_scanCount; - } else { - return WIFI_SCAN_FAILED; - } - -} - - -/** - * called to get the scan state in Async mode - * @return scan result or status - * -1 if scan not fin - * -2 if scan not triggered - */ -int8_t ESP8266WiFiClass::scanComplete() { - - if(_scanStarted) { - return WIFI_SCAN_RUNNING; - } - - if(_scanComplete) { - return ESP8266WiFiClass::_scanCount; - } - - return WIFI_SCAN_FAILED; -} - -/** - * delete last scan result from RAM - */ -void ESP8266WiFiClass::scanDelete() { - if(ESP8266WiFiClass::_scanResult) { - delete[] reinterpret_cast(ESP8266WiFiClass::_scanResult); - ESP8266WiFiClass::_scanResult = 0; - ESP8266WiFiClass::_scanCount = 0; - } - _scanComplete = false; -} - - -/** - * loads all infos from a scanned wifi in to the ptr parameters - * @param networkItem uint8_t - * @param ssid const char** - * @param encryptionType uint8_t * - * @param RSSI int32_t * - * @param BSSID uint8_t ** - * @param channel int32_t * - * @param isHidden bool * - * @return (true if ok) - */ -bool ESP8266WiFiClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return false; - } - - ssid = (const char*) it->ssid; - encType = encryptionType(i); - rssi = it->rssi; - bssid = it->bssid; // move ptr - channel = it->channel; - isHidden = (it->is_hidden != 0); - - return true; -} - - -/** - * Return the SSID discovered during the network scan. - * @param i specify from which network item want to get the information - * @return ssid string of the specified item on the networks scanned list - */ -String ESP8266WiFiClass::SSID(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return ""; - } - - return String(reinterpret_cast(it->ssid)); -} - - -/** - * Return the encryption type of the networks discovered during the scanNetworks - * @param i specify from which network item want to get the information - * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ -uint8_t ESP8266WiFiClass::encryptionType(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return -1; - } - - switch(it->authmode) { - case AUTH_OPEN: - return ENC_TYPE_NONE; - case AUTH_WEP: - return ENC_TYPE_WEP; - case AUTH_WPA_PSK: - return ENC_TYPE_TKIP; - case AUTH_WPA2_PSK: - return ENC_TYPE_CCMP; - case AUTH_WPA_WPA2_PSK: - return ENC_TYPE_AUTO; - default: - return -1; - } -} - -/** - * Return the RSSI of the networks discovered during the scanNetworks - * @param i specify from which network item want to get the information - * @return signed value of RSSI of the specified item on the networks scanned list - */ -int32_t ESP8266WiFiClass::RSSI(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return 0; - } - return it->rssi; -} - - -/** - * return MAC / BSSID of scanned wifi - * @param i specify from which network item want to get the information - * @return uint8_t * MAC / BSSID of scanned wifi - */ -uint8_t * ESP8266WiFiClass::BSSID(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return 0; - } - return it->bssid; -} - -/** - * return MAC / BSSID of scanned wifi - * @param i specify from which network item want to get the information - * @return String MAC / BSSID of scanned wifi - */ -String ESP8266WiFiClass::BSSIDstr(uint8_t i) { - char mac[18] = { 0 }; - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return String(""); - } - sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); - return String(mac); -} - -int32_t ESP8266WiFiClass::channel(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return 0; - } - return it->channel; -} - -/** - * return if the scanned wifi is Hidden (no SSID) - * @param networkItem specify from which network item want to get the information - * @return bool (true == hidden) - */ -bool ESP8266WiFiClass::isHidden(uint8_t i) { - struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); - if(!it) { - return false; - } - return (it->is_hidden != 0); -} - -/** - * private - * scan callback - * @param result void *arg - * @param status STATUS - */ -void ESP8266WiFiClass::_scanDone(void* result, int status) { - if(status != OK) { - ESP8266WiFiClass::_scanCount = 0; - ESP8266WiFiClass::_scanResult = 0; - } else { - - int i = 0; - bss_info_head_t* head = reinterpret_cast(result); - - for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) - ; - ESP8266WiFiClass::_scanCount = i; - if(i == 0) { - ESP8266WiFiClass::_scanResult = 0; - } else { - bss_info* copied_info = new bss_info[i]; - i = 0; - for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) { - memcpy(copied_info + i, it, sizeof(bss_info)); - } - - ESP8266WiFiClass::_scanResult = copied_info; - } - - } - - ESP8266WiFiClass::_scanStarted = false; - ESP8266WiFiClass::_scanComplete = true; - - if(!ESP8266WiFiClass::_scanAsync) { - esp_schedule(); - } -} - -/** - * - * @param i specify from which network item want to get the information - * @return bss_info * - */ -void * ESP8266WiFiClass::_getScanInfoByIndex(int i) { - //TODO why its void * and not bss_info * ? - if(!ESP8266WiFiClass::_scanResult || (size_t) i > ESP8266WiFiClass::_scanCount) { - return 0; - } - return reinterpret_cast(ESP8266WiFiClass::_scanResult) + i; -} - - - -// ----------------------------------------------------------------------------------------------------------------------- -// ------------------------------------------------- Generic WiFi function ----------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - - -/** - * Return the current channel associated with the network - * @return channel (1-13) - */ -int32_t ESP8266WiFiClass::channel(void) { - return wifi_get_channel(); -} - -/** - * set Sleep mode - * @param type sleep_type_t - * @return bool - */ -bool ESP8266WiFiClass::setSleepMode(WiFiSleepType_t type) { - return wifi_set_sleep_type((sleep_type_t) type); -} - -/** - * get Sleep mode - * @return sleep_type_t - */ -WiFiSleepType_t ESP8266WiFiClass::getSleepMode() { - return (WiFiSleepType_t) wifi_get_sleep_type(); -} - -/** - * set phy Mode - * @param mode phy_mode_t - * @return bool - */ -bool ESP8266WiFiClass::setPhyMode(WiFiPhyMode_t mode) { - return wifi_set_phy_mode((phy_mode_t) mode); -} - -/** - * get phy Mode - * @return phy_mode_t - */ -WiFiPhyMode_t ESP8266WiFiClass::getPhyMode() { - return (WiFiPhyMode_t) wifi_get_phy_mode(); -} - -/** - * store WiFi condif in SDK config area in flash - * @param persistent - */ -void ESP8266WiFiClass::persistent(bool persistent) { - _persistent = persistent; -} - - -/** - * set new mode - * @param m WiFiMode_t - */ -bool ESP8266WiFiClass::mode(WiFiMode_t m) { - if(wifi_get_opmode() == (uint8) m) { - return true; - } - - bool ret = false; - - ETS_UART_INTR_DISABLE(); - if(_persistent) { - ret = wifi_set_opmode(m); - } else { - ret = wifi_set_opmode_current(m); - } - ETS_UART_INTR_ENABLE(); - - return ret; -} - -/** - * get WiFi mode - * @return WiFiMode - */ -WiFiMode_t ESP8266WiFiClass::getMode() { - return (WiFiMode_t) wifi_get_opmode(); -} - -/** - * control STA mode - * @param enable bool - * @return ok - */ -bool ESP8266WiFiClass::enableSTA(bool enable) { - - WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); - bool isEnabled = ((currentMode & WIFI_STA) != 0); - - if(isEnabled != enable) { - if(enable) { - return mode((WiFiMode_t)(currentMode & WIFI_STA)); - } else { - return mode((WiFiMode_t)(currentMode & (~WIFI_STA))); - } - } else { - return true; - } -} - -/** - * control AP mode - * @param enable bool - * @return ok - */ -bool ESP8266WiFiClass::enableAP(bool enable){ - - WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); - bool isEnabled = ((currentMode & WIFI_AP) != 0); - - if(isEnabled != enable) { - if(enable) { - return mode((WiFiMode_t)(currentMode & WIFI_AP)); - } else { - return mode((WiFiMode_t)(currentMode & (~WIFI_AP))); - } - } else { - return true; - } -} - - -// ----------------------------------------------------------------------------------------------------------------------- -// ------------------------------------------------ Generic Network function --------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg); - -/** - * Resolve the given hostname to an IP address. - * @param aHostname Name to be resolved - * @param aResult IPAddress structure to store the returned IP address - * @return 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ -int ESP8266WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) { - ip_addr_t addr; - aResult = static_cast(0); - err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); - if(err == ERR_OK) { - aResult = addr.addr; - } else if(err == ERR_INPROGRESS) { - esp_yield(); - // will return here when dns_found_callback fires - } - - return (aResult != 0) ? 1 : 0; -} - -/** - * DNS callback - * @param name - * @param ipaddr - * @param callback_arg - */ -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { - if(ipaddr) - (*reinterpret_cast(callback_arg)) = ipaddr->addr; - esp_schedule(); // resume the hostByName function -} - - -// ----------------------------------------------------------------------------------------------------------------------- -// -------------------------------------------------- STA remote configure ----------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -void wifi_wps_status_cb(wps_cb_status status); - -/** - * WPS config - * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - * @return ok - */ -bool ESP8266WiFiClass::beginWPSConfig(void) { - - if(!enableSTA(true)) { - // enable STA failed - return false; - } - - disconnect(); - - DEBUGV("wps begin\n"); - - if(!wifi_wps_disable()) { - DEBUGV("wps disable failed\n"); - return false; - } - - // so far only WPS_TYPE_PBC is supported (SDK 1.2.0) - if(!wifi_wps_enable(WPS_TYPE_PBC)) { - DEBUGV("wps enable failed\n"); - return false; - } - - if(!wifi_set_wps_cb((wps_st_cb_t) &wifi_wps_status_cb)) { - DEBUGV("wps cb failed\n"); - return false; - } - - if(!wifi_wps_start()) { - DEBUGV("wps start failed\n"); - return false; - } - - esp_yield(); - // will return here when wifi_wps_status_cb fires - - return true; -} - -/** - * WPS callback - * @param status wps_cb_status - */ -void wifi_wps_status_cb(wps_cb_status status) { - DEBUGV("wps cb status: %d\r\n", status); - switch(status) { - case WPS_CB_ST_SUCCESS: - if(!wifi_wps_disable()) { - DEBUGV("wps disable failed\n"); - } - wifi_station_connect(); - break; - case WPS_CB_ST_FAILED: - DEBUGV("wps FAILED\n"); - break; - case WPS_CB_ST_TIMEOUT: - DEBUGV("wps TIMEOUT\n"); - break; - case WPS_CB_ST_WEP: - DEBUGV("wps WEP\n"); - break; - } - // TODO user function to get status - - esp_schedule(); // resume the beginWPSConfig function -} - -/** - * Start SmartConfig - */ -void ESP8266WiFiClass::beginSmartConfig() { - if(_smartConfigStarted) - return; - - if(!enableSTA(true)) { - // enable STA failed - return; - } - - _smartConfigStarted = true; - _smartConfigDone = false; - - smartconfig_start(reinterpret_cast(&ESP8266WiFiClass::_smartConfigCallback), 1); -} - - -/** - * Stop SmartConfig - */ -void ESP8266WiFiClass::stopSmartConfig() { - if(!_smartConfigStarted) { - return; - } - - smartconfig_stop(); - _smartConfigStarted = false; -} - -/** - * Query SmartConfig status, to decide when stop config - * @return smartConfig Done - */ -bool ESP8266WiFiClass::smartConfigDone() { - if(!_smartConfigStarted) { - return false; - } - - return _smartConfigDone; -} - - -/** - * _smartConfigCallback - * @param st - * @param result - */ -void ESP8266WiFiClass::_smartConfigCallback(uint32_t st, void* result) { - sc_status status = (sc_status) st; - if(status == SC_STATUS_LINK) { - station_config* sta_conf = reinterpret_cast(result); - - wifi_station_set_config(sta_conf); - wifi_station_disconnect(); - wifi_station_connect(); - - WiFi._smartConfigDone = true; - } else if(status == SC_STATUS_LINK_OVER) { - WiFi.stopSmartConfig(); - } -} - - // ----------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------- Debug ------------------------------------------------------ // ----------------------------------------------------------------------------------------------------------------------- diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index dbadb135e..4e6ce8e04 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -29,195 +29,35 @@ extern "C" { } #include "IPAddress.h" + +#include "ESP8266WiFiType.h" +#include "ESP8266WiFiSTA.h" +#include "ESP8266WiFiAP.h" +#include "ESP8266WiFiScan.h" +#include "ESP8266WiFiGeneric.h" + #include "WiFiClient.h" #include "WiFiServer.h" #include "WiFiClientSecure.h" -#define WIFI_SCAN_RUNNING (-1) -#define WIFI_SCAN_FAILED (-2) - -// Note: -// this enums need to be in sync with the SDK! - -enum WiFiMode { - WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 -}; - -typedef enum WiFiMode WiFiMode_t; - -typedef enum { - WIFI_PHY_MODE_11B = 1, WIFI_PHY_MODE_11G = 2, WIFI_PHY_MODE_11N = 3 -} WiFiPhyMode_t; - -typedef enum { - WIFI_NONE_SLEEP = 0, WIFI_LIGHT_SLEEP = 2, WIFI_MODEM_SLEEP = 3 -} WiFiSleepType_t; - -class ESP8266WiFiClass { - - // ---------------------------------------------------------------------------------------------- - // -------------------------------------- ESP8266WiFiClass -------------------------------------- - // ---------------------------------------------------------------------------------------------- - +class ESP8266WiFiClass : public ESP8266WiFiGenericClass, public ESP8266WiFiSTAClass, public ESP8266WiFiScanClass, public ESP8266WiFiAPClass { public: - ESP8266WiFiClass(); + // workaround same function name with different signature + using ESP8266WiFiGenericClass::channel; - protected: + using ESP8266WiFiSTAClass::SSID; + using ESP8266WiFiSTAClass::RSSI; + using ESP8266WiFiSTAClass::BSSID; + using ESP8266WiFiSTAClass::BSSIDstr; - static void _eventCallback(void *event); - - // ---------------------------------------------------------------------------------------------- - // ---------------------------------------- STA function ---------------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - int begin(); - - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); - - - bool reconnect(); - int disconnect(bool wifioff = false); - - uint8_t waitForConnectResult(); - - // STA network info - IPAddress localIP(); - - uint8_t* macAddress(uint8_t* mac); - String macAddress(void); - - IPAddress subnetMask(); - IPAddress gatewayIP(); - IPAddress dnsIP(uint8_t dns_no = 0); - - String hostname(void); - bool hostname(char* aHostname); - bool hostname(const char* aHostname); - bool hostname(String aHostname); - - // STA WiFi info - wl_status_t status(); - String SSID() const; - String psk() const; - - uint8_t *BSSID(void); - String BSSIDstr(void); - - int32_t RSSI(); - - protected: - - bool _useStaticIp; - - // ---------------------------------------------------------------------------------------------- - // ----------------------------------------- AP function ---------------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); - void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - int softAPdisconnect(bool wifioff = false); - - IPAddress softAPIP(); - - uint8_t* softAPmacAddress(uint8_t* mac); - String softAPmacAddress(void); - - protected: - - // ---------------------------------------------------------------------------------------------- - // ----------------------------------------- scan function -------------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - int8_t scanNetworks(bool async = false, bool show_hidden = false); - - int8_t scanComplete(); - void scanDelete(); - - // scan result - bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); - - String SSID(uint8_t networkItem); - uint8_t encryptionType(uint8_t networkItem); - int32_t RSSI(uint8_t networkItem); - uint8_t * BSSID(uint8_t networkItem); - String BSSIDstr(uint8_t networkItem); - int32_t channel(uint8_t networkItem); - bool isHidden(uint8_t networkItem); - - protected: - - static bool _scanAsync; - static bool _scanStarted; - static bool _scanComplete; - - static size_t _scanCount; - static void* _scanResult; - - static void _scanDone(void* result, int status); - void * _getScanInfoByIndex(int i); - - // ---------------------------------------------------------------------------------------------- - // -------------------------------------- Generic WiFi function --------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - int32_t channel(void); - - bool setSleepMode(WiFiSleepType_t type); - WiFiSleepType_t getSleepMode(); - - bool setPhyMode(WiFiPhyMode_t mode); - WiFiPhyMode_t getPhyMode(); - - void persistent(bool persistent); - - bool mode(WiFiMode_t); - WiFiMode_t getMode(); - - bool enableSTA(bool enable); - bool enableAP(bool enable); - - protected: - bool _persistent; - - // ---------------------------------------------------------------------------------------------- - // ------------------------------------ Generic Network function -------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - int hostByName(const char* aHostname, IPAddress& aResult); - - protected: - - // ---------------------------------------------------------------------------------------------- - // ------------------------------------ STA remote configure ----------------------------------- - // ---------------------------------------------------------------------------------------------- - - public: - - bool beginWPSConfig(void); - - void beginSmartConfig(); - bool smartConfigDone(); - void stopSmartConfig(); - - protected: - - bool _smartConfigStarted; - bool _smartConfigDone; - static void _smartConfigCallback(uint32_t status, void* result); + using ESP8266WiFiScanClass::SSID; + using ESP8266WiFiScanClass::encryptionType; + using ESP8266WiFiScanClass::RSSI; + using ESP8266WiFiScanClass::BSSID; + using ESP8266WiFiScanClass::BSSIDstr; + using ESP8266WiFiScanClass::channel; + using ESP8266WiFiScanClass::isHidden; // ---------------------------------------------------------------------------------------------- // ------------------------------------------- Debug -------------------------------------------- diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp new file mode 100644 index 000000000..05b6b1177 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -0,0 +1,211 @@ +/* + ESP8266WiFiSTA.cpp - WiFi library for esp8266 + + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Reworked on 28 Dec 2015 by Markus Sattler + + */ + +#include "ESP8266WiFi.h" +#include "ESP8266WiFiGeneric.h" +#include "ESP8266WiFiAP.h" + +extern "C" { +#include "c_types.h" +#include "ets_sys.h" +#include "os_type.h" +#include "osapi.h" +#include "mem.h" +#include "user_interface.h" +} + +#include "debug.h" + + + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- Private functions ------------------------------------------------ +// ----------------------------------------------------------------------------------------------------------------------- + +static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs); + + + +/** + * compare two AP configurations + * @param lhs softap_config + * @param rhs softap_config + * @return equal + */ +static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + return false; + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + return false; + if(lhs.channel != rhs.channel) + return false; + if(lhs.ssid_hidden != rhs.ssid_hidden) + return false; + return true; +} + +// ----------------------------------------------------------------------------------------------------------------------- +// ----------------------------------------------------- AP function ----------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + + +/** + * Set up an access point + * @param ssid Pointer to the SSID (max 63 char). + * @param passphrase (for WPA2 min 8 char, for open use NULL) + * @param channel WiFi channel number, 1 - 13. + * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) + */ +void ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { + + if(!WiFi.enableAP(true)) { + // enable AP failed + return; + } + + if(!ssid || *ssid == 0 || strlen(ssid) > 31) { + // fail SSID too long or missing! + return; + } + + if(passphrase && strlen(passphrase) > 63) { + // fail passphrase to long! + return; + } + + struct softap_config conf; + wifi_softap_get_config(&conf); + strcpy(reinterpret_cast(conf.ssid), ssid); + conf.channel = channel; + conf.ssid_len = strlen(ssid); + conf.ssid_hidden = ssid_hidden; + conf.max_connection = 4; + conf.beacon_interval = 100; + + if(!passphrase || strlen(passphrase) == 0) { + conf.authmode = AUTH_OPEN; + *conf.password = 0; + } else { + conf.authmode = AUTH_WPA2_PSK; + strcpy(reinterpret_cast(conf.password), passphrase); + } + + struct softap_config conf_current; + wifi_softap_get_config(&conf_current); + if(softap_config_equal(conf, conf_current)) { + DEBUGV("softap config unchanged"); + return; + } + + ETS_UART_INTR_DISABLE(); + if(WiFi._persistent) + wifi_softap_set_config(&conf); + else + wifi_softap_set_config_current(&conf); + ETS_UART_INTR_ENABLE(); +} + + +/** + * Configure access point + * @param local_ip access point IP + * @param gateway gateway IP + * @param subnet subnet mask + */ +void ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + + if(!WiFi.enableAP(true)) { + // enable AP failed + return; + } + + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + wifi_softap_dhcps_stop(); + wifi_set_ip_info(SOFTAP_IF, &info); + wifi_softap_dhcps_start(); +} + + + +/** + * Disconnect from the network (close AP) + * @param wifioff disable mode? + * @return one value of wl_status_t enum + */ +int ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) { + struct softap_config conf; + *conf.ssid = 0; + *conf.password = 0; + ETS_UART_INTR_DISABLE(); + if(WiFi._persistent) { + wifi_softap_set_config(&conf); + } else { + wifi_softap_set_config_current(&conf); + } + ETS_UART_INTR_ENABLE(); + + if(wifioff) { + WiFi.enableAP(false); + } + + //TODO return with more meaning ? + return 0; +} + +/** + * Get the softAP interface IP address. + * @return IPAddress softAP IP + */ +IPAddress ESP8266WiFiAPClass::softAPIP() { + struct ip_info ip; + wifi_get_ip_info(SOFTAP_IF, &ip); + return IPAddress(ip.ip.addr); +} + + +/** + * Get the softAP interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t* + */ +uint8_t* ESP8266WiFiAPClass::softAPmacAddress(uint8_t* mac) { + wifi_get_macaddr(SOFTAP_IF, mac); + return mac; +} + +/** + * Get the softAP interface MAC address. + * @return String mac + */ +String ESP8266WiFiAPClass::softAPmacAddress(void) { + uint8_t mac[6]; + char macStr[18] = { 0 }; + wifi_get_macaddr(SOFTAP_IF, mac); + + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return String(macStr); +} diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h new file mode 100644 index 000000000..e23878f66 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h @@ -0,0 +1,52 @@ +/* + ESP8266WiFiAP.h - esp8266 Wifi support. + Based on WiFi.h from Ardiono WiFi shield library. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 + Reworked by Markus Sattler, December 2015 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef ESP8266WIFIAP_H_ +#define ESP8266WIFIAP_H_ + + +#include "ESP8266WiFiType.h" +#include "ESP8266WiFiGeneric.h" + + +class ESP8266WiFiAPClass { + + // ---------------------------------------------------------------------------------------------- + // ----------------------------------------- AP function ---------------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + + void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); + void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + int softAPdisconnect(bool wifioff = false); + + IPAddress softAPIP(); + + uint8_t* softAPmacAddress(uint8_t* mac); + String softAPmacAddress(void); + + protected: + +}; + +#endif /* ESP8266WIFIAP_H_*/ diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp new file mode 100644 index 000000000..89eb38078 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -0,0 +1,244 @@ +/* + ESP8266WiFiGeneric.cpp - WiFi library for esp8266 + + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Reworked on 28 Dec 2015 by Markus Sattler + + */ + +#include "ESP8266WiFi.h" +#include "ESP8266WiFiGeneric.h" + +extern "C" { +#include "c_types.h" +#include "ets_sys.h" +#include "os_type.h" +#include "osapi.h" +#include "mem.h" +#include "user_interface.h" + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/dns.h" +} + +#include "WiFiClient.h" +#include "WiFiUdp.h" + +#include "debug.h" + +extern "C" void esp_schedule(); +extern "C" void esp_yield(); + +// ----------------------------------------------------------------------------------------------------------------------- +// ------------------------------------------------- Generic WiFi function ----------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +bool ESP8266WiFiGenericClass::_persistent = true; + + + +ESP8266WiFiGenericClass::ESP8266WiFiGenericClass() { + wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiGenericClass::_eventCallback); +} + +/** + * callback for WiFi events + * @param arg + */ +void ESP8266WiFiGenericClass::_eventCallback(void* arg) { + System_Event_t* event = reinterpret_cast(arg); + DEBUGV("wifi evt: %d\r\n", event->event); + + if(event->event == EVENT_STAMODE_DISCONNECTED) { + WiFiClient::stopAll(); + } + + //TODO allow user to hook this event +} + + + +/** + * Return the current channel associated with the network + * @return channel (1-13) + */ +int32_t ESP8266WiFiGenericClass::channel(void) { + return wifi_get_channel(); +} + +/** + * set Sleep mode + * @param type sleep_type_t + * @return bool + */ +bool ESP8266WiFiGenericClass::setSleepMode(WiFiSleepType_t type) { + return wifi_set_sleep_type((sleep_type_t) type); +} + +/** + * get Sleep mode + * @return sleep_type_t + */ +WiFiSleepType_t ESP8266WiFiGenericClass::getSleepMode() { + return (WiFiSleepType_t) wifi_get_sleep_type(); +} + +/** + * set phy Mode + * @param mode phy_mode_t + * @return bool + */ +bool ESP8266WiFiGenericClass::setPhyMode(WiFiPhyMode_t mode) { + return wifi_set_phy_mode((phy_mode_t) mode); +} + +/** + * get phy Mode + * @return phy_mode_t + */ +WiFiPhyMode_t ESP8266WiFiGenericClass::getPhyMode() { + return (WiFiPhyMode_t) wifi_get_phy_mode(); +} + +/** + * store WiFi config in SDK flash area + * @param persistent + */ +void ESP8266WiFiGenericClass::persistent(bool persistent) { + _persistent = persistent; +} + + +/** + * set new mode + * @param m WiFiMode_t + */ +bool ESP8266WiFiGenericClass::mode(WiFiMode_t m) { + if(wifi_get_opmode() == (uint8) m) { + return true; + } + + bool ret = false; + + ETS_UART_INTR_DISABLE(); + if(_persistent) { + ret = wifi_set_opmode(m); + } else { + ret = wifi_set_opmode_current(m); + } + ETS_UART_INTR_ENABLE(); + + return ret; +} + +/** + * get WiFi mode + * @return WiFiMode + */ +WiFiMode_t ESP8266WiFiGenericClass::getMode() { + return (WiFiMode_t) wifi_get_opmode(); +} + +/** + * control STA mode + * @param enable bool + * @return ok + */ +bool ESP8266WiFiGenericClass::enableSTA(bool enable) { + + WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + bool isEnabled = ((currentMode & WIFI_STA) != 0); + + if(isEnabled != enable) { + if(enable) { + return mode((WiFiMode_t)(currentMode & WIFI_STA)); + } else { + return mode((WiFiMode_t)(currentMode & (~WIFI_STA))); + } + } else { + return true; + } +} + +/** + * control AP mode + * @param enable bool + * @return ok + */ +bool ESP8266WiFiGenericClass::enableAP(bool enable){ + + WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + bool isEnabled = ((currentMode & WIFI_AP) != 0); + + if(isEnabled != enable) { + if(enable) { + return mode((WiFiMode_t)(currentMode & WIFI_AP)); + } else { + return mode((WiFiMode_t)(currentMode & (~WIFI_AP))); + } + } else { + return true; + } +} + + + + + +// ----------------------------------------------------------------------------------------------------------------------- +// ------------------------------------------------ Generic Network function --------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg); + +/** + * Resolve the given hostname to an IP address. + * @param aHostname Name to be resolved + * @param aResult IPAddress structure to store the returned IP address + * @return 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ +int ESP8266WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult) { + ip_addr_t addr; + aResult = static_cast(0); + err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); + if(err == ERR_OK) { + aResult = addr.addr; + } else if(err == ERR_INPROGRESS) { + esp_yield(); + // will return here when dns_found_callback fires + } + + return (aResult != 0) ? 1 : 0; +} + +/** + * DNS callback + * @param name + * @param ipaddr + * @param callback_arg + */ +void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { + if(ipaddr) + (*reinterpret_cast(callback_arg)) = ipaddr->addr; + esp_schedule(); // resume the hostByName function +} + + diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h new file mode 100644 index 000000000..c2df1026d --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -0,0 +1,73 @@ +/* + ESP8266WiFiGeneric.h - esp8266 Wifi support. + Based on WiFi.h from Ardiono WiFi shield library. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 + Reworked by Markus Sattler, December 2015 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef ESP8266WIFIGENERIC_H_ +#define ESP8266WIFIGENERIC_H_ + +#include "ESP8266WiFiType.h" + +class ESP8266WiFiGenericClass { + // ---------------------------------------------------------------------------------------------- + // -------------------------------------- Generic WiFi function --------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + ESP8266WiFiGenericClass(); + + int32_t channel(void); + + bool setSleepMode(WiFiSleepType_t type); + WiFiSleepType_t getSleepMode(); + + bool setPhyMode(WiFiPhyMode_t mode); + WiFiPhyMode_t getPhyMode(); + + void persistent(bool persistent); + + bool mode(WiFiMode_t); + WiFiMode_t getMode(); + + bool enableSTA(bool enable); + bool enableAP(bool enable); + + protected: + static bool _persistent; + + static void _eventCallback(void *event); + + // ---------------------------------------------------------------------------------------------- + // ------------------------------------ Generic Network function -------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + + int hostByName(const char* aHostname, IPAddress& aResult); + + protected: + + friend class ESP8266WiFiSTAClass; + friend class ESP8266WiFiScanClass; + friend class ESP8266WiFiAPClass; +}; + + +#endif /* ESP8266WIFIGENERIC_H_ */ diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp new file mode 100644 index 000000000..218247ca6 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -0,0 +1,606 @@ +/* + ESP8266WiFiSTA.cpp - WiFi library for esp8266 + + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Reworked on 28 Dec 2015 by Markus Sattler + + */ + +#include "ESP8266WiFi.h" +#include "ESP8266WiFiGeneric.h" +#include "ESP8266WiFiSTA.h" + +extern "C" { +#include "c_types.h" +#include "ets_sys.h" +#include "os_type.h" +#include "osapi.h" +#include "mem.h" +#include "user_interface.h" +#include "smartconfig.h" +#include "lwip/err.h" +#include "lwip/dns.h" +} + +#include "debug.h" + +extern "C" void esp_schedule(); +extern "C" void esp_yield(); + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- Private functions ------------------------------------------------ +// ----------------------------------------------------------------------------------------------------------------------- + +static bool sta_config_equal(const station_config& lhs, const station_config& rhs); + + +/** + * compare two STA configurations + * @param lhs station_config + * @param rhs station_config + * @return equal + */ +static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + return false; + + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + return false; + + if(lhs.bssid_set) { + if(!rhs.bssid_set) + return false; + + if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) + return false; + } else { + if(rhs.bssid_set) + return false; + } + + return true; +} + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- STA function ----------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +bool ESP8266WiFiSTAClass::_useStaticIp = false; + +/** + * Start Wifi connection + * if passphrase is set the most secure supported mode will be automatically selected + * @param ssid const char* Pointer to the SSID string. + * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). + * @param bssid uint8_t[6] Optional. BSSID / MAC of AP + * @param channel Optional. Channel of AP + * @return + */ +int ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { + + if(!WiFi.enableSTA(true)) { + // enable STA failed + return WL_CONNECT_FAILED; + } + + if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) { + // fail SSID too long or missing! + return WL_CONNECT_FAILED; + } + + if(passphrase && strlen(passphrase) > 63) { + // fail passphrase too long! + return WL_CONNECT_FAILED; + } + + struct station_config conf; + strcpy(reinterpret_cast(conf.ssid), ssid); + + if(passphrase) { + strcpy(reinterpret_cast(conf.password), passphrase); + } else { + *conf.password = 0; + } + + if(bssid) { + conf.bssid_set = 1; + memcpy((void *) &conf.bssid[0], (void *) bssid, 6); + } else { + conf.bssid_set = 0; + } + + struct station_config current_conf; + wifi_station_get_config(¤t_conf); + if(sta_config_equal(current_conf, conf)) { + DEBUGV("sta config unchanged"); + return status(); + } + + ETS_UART_INTR_DISABLE(); + if(WiFi._persistent) { + wifi_station_set_config(&conf); + } else { + wifi_station_set_config_current(&conf); + } + wifi_station_connect(); + ETS_UART_INTR_ENABLE(); + + if(channel > 0 && channel <= 13) { + wifi_set_channel(channel); + } + + if(!_useStaticIp) { + wifi_station_dhcpc_start(); + } + + return status(); +} + +int ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { + return begin((const char*) ssid, (const char*) passphrase, channel, bssid); +} + +/** + * Use to connect to SDK config. + * @return wl_status_t + */ +int ESP8266WiFiSTAClass::begin() { + + if(!WiFi.enableSTA(true)) { + // enable STA failed + return WL_CONNECT_FAILED; + } + + ETS_UART_INTR_DISABLE(); + wifi_station_connect(); + ETS_UART_INTR_ENABLE(); + + if(!_useStaticIp) { + wifi_station_dhcpc_start(); + } + return status(); +} + + +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + */ +void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { + + if(!WiFi.enableSTA(true)) { + return; + } + + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + + wifi_station_dhcpc_stop(); + wifi_set_ip_info(STATION_IF, &info); + + _useStaticIp = true; +} + +/** + * Change IP configuration settings disabling the dhcp client + * @param local_ip Static ip configuration + * @param gateway Static gateway configuration + * @param subnet Static Subnet mask + * @param dns Static DNS server + */ +void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { + struct ip_info info; + info.ip.addr = static_cast(local_ip); + info.gw.addr = static_cast(gateway); + info.netmask.addr = static_cast(subnet); + + wifi_station_dhcpc_stop(); + wifi_set_ip_info(STATION_IF, &info); + + // Set DNS-Server + ip_addr_t d; + d.addr = static_cast(dns); + dns_setserver(0, &d); + + _useStaticIp = true; +} + +/** + * will force a disconnect an then start reconnecting to AP + * @return ok + */ +bool ESP8266WiFiSTAClass::reconnect() { + if((WiFi.getMode() & WIFI_STA) != 0) { + if(wifi_station_disconnect()) { + return wifi_station_connect(); + } + } + return false; +} + +/** + * Disconnect from the network + * @param wifioff + * @return one value of wl_status_t enum + */ +int ESP8266WiFiSTAClass::disconnect(bool wifioff) { + struct station_config conf; + *conf.ssid = 0; + *conf.password = 0; + + ETS_UART_INTR_DISABLE(); + if(WiFi._persistent) { + wifi_station_set_config(&conf); + } else { + wifi_station_set_config_current(&conf); + } + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); + + if(wifioff) { + WiFi.enableSTA(false); + } + + //TODO return with more meaning ? + return 0; +} + +/** + * Wait for WiFi connection to reach a result + * returns the status reached or disconnect if STA is off + * @return wl_status_t + */ +uint8_t ESP8266WiFiSTAClass::waitForConnectResult() { + //1 and 3 have STA enabled + if((wifi_get_opmode() & 1) == 0) { + return WL_DISCONNECTED; + } + while(status() == WL_DISCONNECTED) { + delay(100); + } + return status(); +} + +/** + * Get the station interface IP address. + * @return IPAddress station IP + */ +IPAddress ESP8266WiFiSTAClass::localIP() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.ip.addr); +} + + +/** + * Get the station interface MAC address. + * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + * @return pointer to uint8_t * + */ +uint8_t* ESP8266WiFiSTAClass::macAddress(uint8_t* mac) { + wifi_get_macaddr(STATION_IF, mac); + return mac; +} + +/** + * Get the station interface MAC address. + * @return String mac + */ +String ESP8266WiFiSTAClass::macAddress(void) { + uint8_t mac[6]; + char macStr[18] = { 0 }; + wifi_get_macaddr(STATION_IF, mac); + + sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return String(macStr); +} + +/** + * Get the interface subnet mask address. + * @return IPAddress subnetMask + */ +IPAddress ESP8266WiFiSTAClass::subnetMask() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.netmask.addr); +} + +/** + * Get the gateway ip address. + * @return IPAddress gatewayIP + */ +IPAddress ESP8266WiFiSTAClass::gatewayIP() { + struct ip_info ip; + wifi_get_ip_info(STATION_IF, &ip); + return IPAddress(ip.gw.addr); +} + +/** + * Get the DNS ip address. + * @param dns_no + * @return IPAddress DNS Server IP + */ +IPAddress ESP8266WiFiSTAClass::dnsIP(uint8_t dns_no) { + ip_addr_t dns_ip = dns_getserver(dns_no); + return IPAddress(dns_ip.addr); +} + + +/** + * Get ESP8266 station DHCP hostname + * @return hostname + */ +String ESP8266WiFiSTAClass::hostname(void) { + return String(wifi_station_get_hostname()); +} + + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiSTAClass::hostname(char* aHostname) { + if(strlen(aHostname) > 32) { + return false; + } + return wifi_station_set_hostname(aHostname); +} + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiSTAClass::hostname(const char* aHostname) { + return hostname((char*) aHostname); +} + +/** + * Set ESP8266 station DHCP hostname + * @param aHostname max length:32 + * @return ok + */ +bool ESP8266WiFiSTAClass::hostname(String aHostname) { + return hostname((char*) aHostname.c_str()); +} + +/** + * Return Connection status. + * @return one of the value defined in wl_status_t + * + */ +wl_status_t ESP8266WiFiSTAClass::status() { + int status = wifi_station_get_connect_status(); + + if(status == STATION_GOT_IP) { + return WL_CONNECTED; + } else if(status == STATION_NO_AP_FOUND) { + return WL_NO_SSID_AVAIL; + } else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) { + return WL_CONNECT_FAILED; + } else if(status == STATION_IDLE) { + return WL_IDLE_STATUS; + } else { + return WL_DISCONNECTED; + } +} + +/** + * Return the current SSID associated with the network + * @return SSID + */ +String ESP8266WiFiSTAClass::SSID() const { + struct station_config conf; + wifi_station_get_config(&conf); + return String(reinterpret_cast(conf.ssid)); +} + +/** + * Return the current pre shared key associated with the network + * @return psk string + */ +String ESP8266WiFiSTAClass::psk() const { + struct station_config conf; + wifi_station_get_config(&conf); + return String(reinterpret_cast(conf.password)); +} + +/** + * Return the current bssid / mac associated with the network if configured + * @return bssid uint8_t * + */ +uint8_t* ESP8266WiFiSTAClass::BSSID(void) { + static struct station_config conf; + wifi_station_get_config(&conf); + return reinterpret_cast(conf.bssid); +} + +/** + * Return the current bssid / mac associated with the network if configured + * @return String bssid mac + */ +String ESP8266WiFiSTAClass::BSSIDstr(void) { + struct station_config conf; + char mac[18] = { 0 }; + wifi_station_get_config(&conf); + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", conf.bssid[0], conf.bssid[1], conf.bssid[2], conf.bssid[3], conf.bssid[4], conf.bssid[5]); + return String(mac); +} + +/** + * Return the current network RSSI. + * @return RSSI value + */ +int32_t ESP8266WiFiSTAClass::RSSI(void) { + return wifi_station_get_rssi(); +} + + + +// ----------------------------------------------------------------------------------------------------------------------- +// -------------------------------------------------- STA remote configure ----------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +void wifi_wps_status_cb(wps_cb_status status); + +/** + * WPS config + * so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + * @return ok + */ +bool ESP8266WiFiSTAClass::beginWPSConfig(void) { + + if(!WiFi.enableSTA(true)) { + // enable STA failed + return false; + } + + disconnect(); + + DEBUGV("wps begin\n"); + + if(!wifi_wps_disable()) { + DEBUGV("wps disable failed\n"); + return false; + } + + // so far only WPS_TYPE_PBC is supported (SDK 1.2.0) + if(!wifi_wps_enable(WPS_TYPE_PBC)) { + DEBUGV("wps enable failed\n"); + return false; + } + + if(!wifi_set_wps_cb((wps_st_cb_t) &wifi_wps_status_cb)) { + DEBUGV("wps cb failed\n"); + return false; + } + + if(!wifi_wps_start()) { + DEBUGV("wps start failed\n"); + return false; + } + + esp_yield(); + // will return here when wifi_wps_status_cb fires + + return true; +} + +/** + * WPS callback + * @param status wps_cb_status + */ +void wifi_wps_status_cb(wps_cb_status status) { + DEBUGV("wps cb status: %d\r\n", status); + switch(status) { + case WPS_CB_ST_SUCCESS: + if(!wifi_wps_disable()) { + DEBUGV("wps disable failed\n"); + } + wifi_station_connect(); + break; + case WPS_CB_ST_FAILED: + DEBUGV("wps FAILED\n"); + break; + case WPS_CB_ST_TIMEOUT: + DEBUGV("wps TIMEOUT\n"); + break; + case WPS_CB_ST_WEP: + DEBUGV("wps WEP\n"); + break; + } + // TODO user function to get status + + esp_schedule(); // resume the beginWPSConfig function +} + + + +bool ESP8266WiFiSTAClass::_smartConfigStarted = false; +bool ESP8266WiFiSTAClass::_smartConfigDone = false; + +/** + * Start SmartConfig + */ +void ESP8266WiFiSTAClass::beginSmartConfig() { + if(_smartConfigStarted) + return; + + if(!WiFi.enableSTA(true)) { + // enable STA failed + return; + } + + _smartConfigStarted = true; + _smartConfigDone = false; + + smartconfig_start(reinterpret_cast(&ESP8266WiFiSTAClass::_smartConfigCallback), 1); +} + + +/** + * Stop SmartConfig + */ +void ESP8266WiFiSTAClass::stopSmartConfig() { + if(!_smartConfigStarted) { + return; + } + + smartconfig_stop(); + _smartConfigStarted = false; +} + +/** + * Query SmartConfig status, to decide when stop config + * @return smartConfig Done + */ +bool ESP8266WiFiSTAClass::smartConfigDone() { + if(!_smartConfigStarted) { + return false; + } + + return _smartConfigDone; +} + + +/** + * _smartConfigCallback + * @param st + * @param result + */ +void ESP8266WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) { + sc_status status = (sc_status) st; + if(status == SC_STATUS_LINK) { + station_config* sta_conf = reinterpret_cast(result); + + wifi_station_set_config(sta_conf); + wifi_station_disconnect(); + wifi_station_connect(); + + WiFi._smartConfigDone = true; + } else if(status == SC_STATUS_LINK_OVER) { + WiFi.stopSmartConfig(); + } +} + diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h new file mode 100644 index 000000000..409577707 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h @@ -0,0 +1,101 @@ +/* + ESP8266WiFiSTA.h - esp8266 Wifi support. + Based on WiFi.h from Ardiono WiFi shield library. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 + Reworked by Markus Sattler, December 2015 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef ESP8266WIFISTA_H_ +#define ESP8266WIFISTA_H_ + + +#include "ESP8266WiFiType.h" +#include "ESP8266WiFiGeneric.h" + + +class ESP8266WiFiSTAClass { + // ---------------------------------------------------------------------------------------------- + // ---------------------------------------- STA function ---------------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + + int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + int begin(); + + void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); + + bool reconnect(); + int disconnect(bool wifioff = false); + + uint8_t waitForConnectResult(); + + // STA network info + IPAddress localIP(); + + uint8_t * macAddress(uint8_t* mac); + String macAddress(); + + IPAddress subnetMask(); + IPAddress gatewayIP(); + IPAddress dnsIP(uint8_t dns_no = 0); + + String hostname(); + bool hostname(char* aHostname); + bool hostname(const char* aHostname); + bool hostname(String aHostname); + + // STA WiFi info + wl_status_t status(); + String SSID() const; + String psk() const; + + uint8_t * BSSID(); + String BSSIDstr(); + + int32_t RSSI(); + + protected: + + static bool _useStaticIp; + + // ---------------------------------------------------------------------------------------------- + // ------------------------------------ STA remote configure ----------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + + bool beginWPSConfig(void); + + void beginSmartConfig(); + bool smartConfigDone(); + void stopSmartConfig(); + + + protected: + + static bool _smartConfigStarted; + static bool _smartConfigDone; + static void _smartConfigCallback(uint32_t status, void* result); + +}; + + +#endif /* ESP8266WIFISTA_H_ */ diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp new file mode 100644 index 000000000..223f4ae26 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp @@ -0,0 +1,323 @@ +/* + ESP8266WiFiScan.cpp - WiFi library for esp8266 + + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Reworked on 28 Dec 2015 by Markus Sattler + + */ + +#include "ESP8266WiFi.h" +#include "ESP8266WiFiGeneric.h" +#include "ESP8266WiFiScan.h" + +extern "C" { +#include "c_types.h" +#include "ets_sys.h" +#include "os_type.h" +#include "osapi.h" +#include "mem.h" +#include "user_interface.h" +} + +#include "debug.h" + +extern "C" void esp_schedule(); +extern "C" void esp_yield(); + +// ----------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------- Private functions ------------------------------------------------ +// ----------------------------------------------------------------------------------------------------------------------- + + + + +// ----------------------------------------------------------------------------------------------------------------------- +// ----------------------------------------------------- scan function --------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------------------- + +bool ESP8266WiFiScanClass::_scanAsync = false; +bool ESP8266WiFiScanClass::_scanStarted = false; +bool ESP8266WiFiScanClass::_scanComplete = false; + +size_t ESP8266WiFiScanClass::_scanCount = 0; +void* ESP8266WiFiScanClass::_scanResult = 0; + +/** + * Start scan WiFi networks available + * @param async run in async mode + * @param show_hidden show hidden networks + * @return Number of discovered networks + */ +int8_t ESP8266WiFiScanClass::scanNetworks(bool async, bool show_hidden) { + if(ESP8266WiFiScanClass::_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + ESP8266WiFiScanClass::_scanAsync = async; + + WiFi.enableSTA(true); + + int status = wifi_station_get_connect_status(); + if(status != STATION_GOT_IP && status != STATION_IDLE) { + WiFi.disconnect(false); + } + + scanDelete(); + + struct scan_config config; + config.ssid = 0; + config.bssid = 0; + config.channel = 0; + config.show_hidden = show_hidden; + if(wifi_station_scan(&config, reinterpret_cast(&ESP8266WiFiScanClass::_scanDone))) { + ESP8266WiFiScanClass::_scanComplete = false; + ESP8266WiFiScanClass::_scanStarted = true; + + if(ESP8266WiFiScanClass::_scanAsync) { + delay(0); // time for the OS to trigger the scan + return WIFI_SCAN_RUNNING; + } + + esp_yield(); + return ESP8266WiFiScanClass::_scanCount; + } else { + return WIFI_SCAN_FAILED; + } + +} + + +/** + * called to get the scan state in Async mode + * @return scan result or status + * -1 if scan not fin + * -2 if scan not triggered + */ +int8_t ESP8266WiFiScanClass::scanComplete() { + + if(_scanStarted) { + return WIFI_SCAN_RUNNING; + } + + if(_scanComplete) { + return ESP8266WiFiScanClass::_scanCount; + } + + return WIFI_SCAN_FAILED; +} + +/** + * delete last scan result from RAM + */ +void ESP8266WiFiScanClass::scanDelete() { + if(ESP8266WiFiScanClass::_scanResult) { + delete[] reinterpret_cast(ESP8266WiFiScanClass::_scanResult); + ESP8266WiFiScanClass::_scanResult = 0; + ESP8266WiFiScanClass::_scanCount = 0; + } + _scanComplete = false; +} + + +/** + * loads all infos from a scanned wifi in to the ptr parameters + * @param networkItem uint8_t + * @param ssid const char** + * @param encryptionType uint8_t * + * @param RSSI int32_t * + * @param BSSID uint8_t ** + * @param channel int32_t * + * @param isHidden bool * + * @return (true if ok) + */ +bool ESP8266WiFiScanClass::getNetworkInfo(uint8_t i, String &ssid, uint8_t &encType, int32_t &rssi, uint8_t* &bssid, int32_t &channel, bool &isHidden) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return false; + } + + ssid = (const char*) it->ssid; + encType = encryptionType(i); + rssi = it->rssi; + bssid = it->bssid; // move ptr + channel = it->channel; + isHidden = (it->is_hidden != 0); + + return true; +} + + +/** + * Return the SSID discovered during the network scan. + * @param i specify from which network item want to get the information + * @return ssid string of the specified item on the networks scanned list + */ +String ESP8266WiFiScanClass::SSID(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return ""; + } + + return String(reinterpret_cast(it->ssid)); +} + + +/** + * Return the encryption type of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ +uint8_t ESP8266WiFiScanClass::encryptionType(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return -1; + } + + switch(it->authmode) { + case AUTH_OPEN: + return ENC_TYPE_NONE; + case AUTH_WEP: + return ENC_TYPE_WEP; + case AUTH_WPA_PSK: + return ENC_TYPE_TKIP; + case AUTH_WPA2_PSK: + return ENC_TYPE_CCMP; + case AUTH_WPA_WPA2_PSK: + return ENC_TYPE_AUTO; + default: + return -1; + } +} + +/** + * Return the RSSI of the networks discovered during the scanNetworks + * @param i specify from which network item want to get the information + * @return signed value of RSSI of the specified item on the networks scanned list + */ +int32_t ESP8266WiFiScanClass::RSSI(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return 0; + } + return it->rssi; +} + + +/** + * return MAC / BSSID of scanned wifi + * @param i specify from which network item want to get the information + * @return uint8_t * MAC / BSSID of scanned wifi + */ +uint8_t * ESP8266WiFiScanClass::BSSID(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return 0; + } + return it->bssid; +} + +/** + * return MAC / BSSID of scanned wifi + * @param i specify from which network item want to get the information + * @return String MAC / BSSID of scanned wifi + */ +String ESP8266WiFiScanClass::BSSIDstr(uint8_t i) { + char mac[18] = { 0 }; + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return String(""); + } + sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", it->bssid[0], it->bssid[1], it->bssid[2], it->bssid[3], it->bssid[4], it->bssid[5]); + return String(mac); +} + +int32_t ESP8266WiFiScanClass::channel(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return 0; + } + return it->channel; +} + +/** + * return if the scanned wifi is Hidden (no SSID) + * @param networkItem specify from which network item want to get the information + * @return bool (true == hidden) + */ +bool ESP8266WiFiScanClass::isHidden(uint8_t i) { + struct bss_info* it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return false; + } + return (it->is_hidden != 0); +} + +/** + * private + * scan callback + * @param result void *arg + * @param status STATUS + */ +void ESP8266WiFiScanClass::_scanDone(void* result, int status) { + if(status != OK) { + ESP8266WiFiScanClass::_scanCount = 0; + ESP8266WiFiScanClass::_scanResult = 0; + } else { + + int i = 0; + bss_info_head_t* head = reinterpret_cast(result); + + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) + ; + ESP8266WiFiScanClass::_scanCount = i; + if(i == 0) { + ESP8266WiFiScanClass::_scanResult = 0; + } else { + bss_info* copied_info = new bss_info[i]; + i = 0; + for(bss_info* it = STAILQ_FIRST(head); it; it = STAILQ_NEXT(it, next), ++i) { + memcpy(copied_info + i, it, sizeof(bss_info)); + } + + ESP8266WiFiScanClass::_scanResult = copied_info; + } + + } + + ESP8266WiFiScanClass::_scanStarted = false; + ESP8266WiFiScanClass::_scanComplete = true; + + if(!ESP8266WiFiScanClass::_scanAsync) { + esp_schedule(); + } +} + +/** + * + * @param i specify from which network item want to get the information + * @return bss_info * + */ +void * ESP8266WiFiScanClass::_getScanInfoByIndex(int i) { + //TODO why its void * and not bss_info * ? + if(!ESP8266WiFiScanClass::_scanResult || (size_t) i > ESP8266WiFiScanClass::_scanCount) { + return 0; + } + return reinterpret_cast(ESP8266WiFiScanClass::_scanResult) + i; +} + diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h new file mode 100644 index 000000000..21c65774f --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h @@ -0,0 +1,70 @@ +/* + ESP8266WiFiScan.h - esp8266 Wifi support. + Based on WiFi.h from Ardiono WiFi shield library. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 + Reworked by Markus Sattler, December 2015 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef ESP8266WIFISCAN_H_ +#define ESP8266WIFISCAN_H_ + +#include "ESP8266WiFiType.h" +#include "ESP8266WiFiGeneric.h" + +class ESP8266WiFiScanClass { + + // ---------------------------------------------------------------------------------------------- + // ----------------------------------------- scan function -------------------------------------- + // ---------------------------------------------------------------------------------------------- + + public: + + int8_t scanNetworks(bool async = false, bool show_hidden = false); + + int8_t scanComplete(); + void scanDelete(); + + // scan result + bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden); + + String SSID(uint8_t networkItem); + uint8_t encryptionType(uint8_t networkItem); + int32_t RSSI(uint8_t networkItem); + uint8_t * BSSID(uint8_t networkItem); + String BSSIDstr(uint8_t networkItem); + int32_t channel(uint8_t networkItem); + bool isHidden(uint8_t networkItem); + + protected: + + static bool _scanAsync; + static bool _scanStarted; + static bool _scanComplete; + + static size_t _scanCount; + static void* _scanResult; + + static void _scanDone(void* result, int status); + void * _getScanInfoByIndex(int i); + + friend class ESP8266WiFiClass; + +}; + + +#endif /* ESP8266WIFISCAN_H_ */ diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiType.h b/libraries/ESP8266WiFi/src/ESP8266WiFiType.h new file mode 100644 index 000000000..2774277d7 --- /dev/null +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiType.h @@ -0,0 +1,52 @@ +/* + ESP8266WiFiType.h - esp8266 Wifi support. + Copyright (c) 2011-2014 Arduino. All right reserved. + Modified by Ivan Grokhotkov, December 2014 + Reworked by Markus Sattler, December 2015 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef ESP8266WIFITYPE_H_ +#define ESP8266WIFITYPE_H_ + +#include + +#define WIFI_SCAN_RUNNING (-1) +#define WIFI_SCAN_FAILED (-2) + +// Note: +// this enums need to be in sync with the SDK! + +typedef enum WiFiMode { + WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 +} WiFiMode_t; + +typedef enum { + WIFI_PHY_MODE_11B = 1, WIFI_PHY_MODE_11G = 2, WIFI_PHY_MODE_11N = 3 +} WiFiPhyMode_t; + +typedef enum { + WIFI_NONE_SLEEP = 0, WIFI_LIGHT_SLEEP = 2, WIFI_MODEM_SLEEP = 3 +} WiFiSleepType_t; + + +extern "C" { +typedef STAILQ_HEAD(, bss_info) +bss_info_head_t; +} + +#endif /* ESP8266WIFITYPE_H_ */ From 373da3df6b27420efadc3c25ddac83cafe443429 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 14:33:10 +0100 Subject: [PATCH 12/38] allow hook WiFi events from sketch --- .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 20 +++++++++++++------ .../ESP8266WiFi/src/ESP8266WiFiGeneric.h | 11 +++++++--- libraries/ESP8266WiFi/src/ESP8266WiFiScan.h | 4 +--- libraries/ESP8266WiFi/src/ESP8266WiFiType.h | 14 +++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 89eb38078..01e137190 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -51,13 +51,20 @@ extern "C" void esp_yield(); // ----------------------------------------------------------------------------------------------------------------------- bool ESP8266WiFiGenericClass::_persistent = true; - - +WiFiEventCb ESP8266WiFiGenericClass::_cbEvent = NULL; ESP8266WiFiGenericClass::ESP8266WiFiGenericClass() { wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiGenericClass::_eventCallback); } +/** + * set callback function + * @param cbEvent WiFiEventCb + */ +void ESP8266WiFiGenericClass::onEvent(WiFiEventCb cbEvent) { + _cbEvent = cbEvent; +} + /** * callback for WiFi events * @param arg @@ -70,11 +77,11 @@ void ESP8266WiFiGenericClass::_eventCallback(void* arg) { WiFiClient::stopAll(); } - //TODO allow user to hook this event + if(_cbEvent) { + _cbEvent((WiFiEvent_t) event->event); + } } - - /** * Return the current channel associated with the network * @return channel (1-13) @@ -236,8 +243,9 @@ int ESP8266WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResul * @param callback_arg */ void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) { - if(ipaddr) + if(ipaddr) { (*reinterpret_cast(callback_arg)) = ipaddr->addr; + } esp_schedule(); // resume the hostByName function } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h index c2df1026d..26381b43b 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -25,14 +25,19 @@ #include "ESP8266WiFiType.h" +typedef void (*WiFiEventCb)(WiFiEvent_t event); + class ESP8266WiFiGenericClass { // ---------------------------------------------------------------------------------------------- // -------------------------------------- Generic WiFi function --------------------------------- // ---------------------------------------------------------------------------------------------- public: + ESP8266WiFiGenericClass(); + void onEvent(WiFiEventCb cbEvent); + int32_t channel(void); bool setSleepMode(WiFiSleepType_t type); @@ -50,9 +55,10 @@ class ESP8266WiFiGenericClass { bool enableAP(bool enable); protected: - static bool _persistent; + static bool _persistent; + static WiFiEventCb _cbEvent; - static void _eventCallback(void *event); + static void _eventCallback(void *event); // ---------------------------------------------------------------------------------------------- // ------------------------------------ Generic Network function -------------------------------- @@ -69,5 +75,4 @@ class ESP8266WiFiGenericClass { friend class ESP8266WiFiAPClass; }; - #endif /* ESP8266WIFIGENERIC_H_ */ diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h index 21c65774f..9d0c964a2 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.h @@ -60,9 +60,7 @@ class ESP8266WiFiScanClass { static void* _scanResult; static void _scanDone(void* result, int status); - void * _getScanInfoByIndex(int i); - - friend class ESP8266WiFiClass; + static void * _getScanInfoByIndex(int i); }; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiType.h b/libraries/ESP8266WiFi/src/ESP8266WiFiType.h index 2774277d7..a5b10e93e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiType.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiType.h @@ -44,6 +44,20 @@ typedef enum { } WiFiSleepType_t; +typedef enum { + WIFI_EVENT_STAMODE_CONNECTED = 0, + WIFI_EVENT_STAMODE_DISCONNECTED, + WIFI_EVENT_STAMODE_AUTHMODE_CHANGE, + WIFI_EVENT_STAMODE_GOT_IP, + WIFI_EVENT_STAMODE_DHCP_TIMEOUT, + WIFI_EVENT_SOFTAPMODE_STACONNECTED, + WIFI_EVENT_SOFTAPMODE_STADISCONNECTED, + WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED, + WIFI_EVENT_MAX +} WiFiEvent_t; + + + extern "C" { typedef STAILQ_HEAD(, bss_info) bss_info_head_t; From 0ed104f028fc160f4bf06cdc9aa6bf2e67b55c52 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 14:38:13 +0100 Subject: [PATCH 13/38] add WiFi Event example --- .../WiFiClientEvents/WiFiClientEvents.ino | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 libraries/ESP8266WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino diff --git a/libraries/ESP8266WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino b/libraries/ESP8266WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino new file mode 100644 index 000000000..bdad5be30 --- /dev/null +++ b/libraries/ESP8266WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino @@ -0,0 +1,48 @@ +/* + * This sketch shows the WiFi event usage + * + */ + +#include + +const char* ssid = "your-ssid"; +const char* password = "your-password"; + + +void WiFiEvent(WiFiEvent_t event) { + Serial.printf("[WiFi-event] event: %d\n", event); + + switch(event) { + case WIFI_EVENT_STAMODE_GOT_IP: + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + break; + case WIFI_EVENT_STAMODE_DISCONNECTED: + Serial.println("WiFi lost connection"); + break; + } +} + +void setup() { + Serial.begin(115200); + + // delete old config + WiFi.disconnect(true); + + delay(1000); + + WiFi.onEvent(WiFiEvent); + + WiFi.begin(ssid, password); + + Serial.println(); + Serial.println(); + Serial.println("Wait for WiFi... "); +} + + +void loop() { + delay(1000); +} + From 640d0bb65e2e891162f4fed617324d4ede59913e Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 15:00:47 +0100 Subject: [PATCH 14/38] improve error handling and return values --- libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 46 +++++----- libraries/ESP8266WiFi/src/ESP8266WiFiAP.h | 6 +- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 95 ++++++++++++-------- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h | 17 ++-- tools/sdk/include/user_interface.h | 6 +- 5 files changed, 97 insertions(+), 73 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index 05b6b1177..b598707c7 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -77,25 +77,24 @@ static bool softap_config_equal(const softap_config& lhs, const softap_config& r * @param channel WiFi channel number, 1 - 13. * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) */ -void ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { +bool ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden) { if(!WiFi.enableAP(true)) { // enable AP failed - return; + return false; } if(!ssid || *ssid == 0 || strlen(ssid) > 31) { // fail SSID too long or missing! - return; + return false; } if(passphrase && strlen(passphrase) > 63) { // fail passphrase to long! - return; + return false; } struct softap_config conf; - wifi_softap_get_config(&conf); strcpy(reinterpret_cast(conf.ssid), ssid); conf.channel = channel; conf.ssid_len = strlen(ssid); @@ -115,15 +114,20 @@ void ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int ch wifi_softap_get_config(&conf_current); if(softap_config_equal(conf, conf_current)) { DEBUGV("softap config unchanged"); - return; + return true; } + bool ret; + ETS_UART_INTR_DISABLE(); - if(WiFi._persistent) - wifi_softap_set_config(&conf); - else - wifi_softap_set_config_current(&conf); + if(WiFi._persistent) { + ret = wifi_softap_set_config(&conf); + } else { + ret = wifi_softap_set_config_current(&conf); + } ETS_UART_INTR_ENABLE(); + + return ret; } @@ -133,11 +137,11 @@ void ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int ch * @param gateway gateway IP * @param subnet subnet mask */ -void ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { +bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { if(!WiFi.enableAP(true)) { // enable AP failed - return; + return false; } struct ip_info info; @@ -145,8 +149,10 @@ void ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA info.gw.addr = static_cast(gateway); info.netmask.addr = static_cast(subnet); wifi_softap_dhcps_stop(); - wifi_set_ip_info(SOFTAP_IF, &info); - wifi_softap_dhcps_start(); + if(wifi_set_ip_info(SOFTAP_IF, &info)) { + return wifi_softap_dhcps_start(); + } + return false; } @@ -156,24 +162,24 @@ void ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA * @param wifioff disable mode? * @return one value of wl_status_t enum */ -int ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) { +bool ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) { + bool ret; struct softap_config conf; *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); if(WiFi._persistent) { - wifi_softap_set_config(&conf); + ret = wifi_softap_set_config(&conf); } else { - wifi_softap_set_config_current(&conf); + ret = wifi_softap_set_config_current(&conf); } ETS_UART_INTR_ENABLE(); if(wifioff) { - WiFi.enableAP(false); + ret = WiFi.enableAP(false); } - //TODO return with more meaning ? - return 0; + return ret; } /** diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h index e23878f66..4b378200a 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h @@ -36,9 +36,9 @@ class ESP8266WiFiAPClass { public: - void softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); - void softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - int softAPdisconnect(bool wifioff = false); + bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0); + bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + bool softAPdisconnect(bool wifioff = false); IPAddress softAPIP(); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index 218247ca6..1419e34a8 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -92,7 +92,7 @@ bool ESP8266WiFiSTAClass::_useStaticIp = false; * @param channel Optional. Channel of AP * @return */ -int ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { +wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { if(!WiFi.enableSTA(true)) { // enable STA failed @@ -152,7 +152,7 @@ int ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t return status(); } -int ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { +wl_status_t ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { return begin((const char*) ssid, (const char*) passphrase, channel, bssid); } @@ -160,7 +160,7 @@ int ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, co * Use to connect to SDK config. * @return wl_status_t */ -int ESP8266WiFiSTAClass::begin() { +wl_status_t ESP8266WiFiSTAClass::begin() { if(!WiFi.enableSTA(true)) { // enable STA failed @@ -184,10 +184,10 @@ int ESP8266WiFiSTAClass::begin() { * @param gateway Static gateway configuration * @param subnet Static Subnet mask */ -void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { +bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { if(!WiFi.enableSTA(true)) { - return; + return false; } struct ip_info info; @@ -196,9 +196,11 @@ void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddres info.netmask.addr = static_cast(subnet); wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); - - _useStaticIp = true; + if(wifi_set_ip_info(STATION_IF, &info)) { + _useStaticIp = true; + return true; + } + return false; } /** @@ -208,21 +210,30 @@ void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddres * @param subnet Static Subnet mask * @param dns Static DNS server */ -void ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { +bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { + + if(!WiFi.enableSTA(true)) { + return false; + } + struct ip_info info; info.ip.addr = static_cast(local_ip); info.gw.addr = static_cast(gateway); info.netmask.addr = static_cast(subnet); wifi_station_dhcpc_stop(); - wifi_set_ip_info(STATION_IF, &info); + if(wifi_set_ip_info(STATION_IF, &info)) { + _useStaticIp = true; + } else { + return false; + } // Set DNS-Server ip_addr_t d; d.addr = static_cast(dns); dns_setserver(0, &d); - _useStaticIp = true; + return true; } /** @@ -243,7 +254,8 @@ bool ESP8266WiFiSTAClass::reconnect() { * @param wifioff * @return one value of wl_status_t enum */ -int ESP8266WiFiSTAClass::disconnect(bool wifioff) { +bool ESP8266WiFiSTAClass::disconnect(bool wifioff) { + bool ret; struct station_config conf; *conf.ssid = 0; *conf.password = 0; @@ -254,15 +266,14 @@ int ESP8266WiFiSTAClass::disconnect(bool wifioff) { } else { wifi_station_set_config_current(&conf); } - wifi_station_disconnect(); + ret = wifi_station_disconnect(); ETS_UART_INTR_ENABLE(); if(wifioff) { WiFi.enableSTA(false); } - //TODO return with more meaning ? - return 0; + return ret; } /** @@ -391,18 +402,20 @@ bool ESP8266WiFiSTAClass::hostname(String aHostname) { * */ wl_status_t ESP8266WiFiSTAClass::status() { - int status = wifi_station_get_connect_status(); + station_status_t status = wifi_station_get_connect_status(); - if(status == STATION_GOT_IP) { - return WL_CONNECTED; - } else if(status == STATION_NO_AP_FOUND) { - return WL_NO_SSID_AVAIL; - } else if(status == STATION_CONNECT_FAIL || status == STATION_WRONG_PASSWORD) { - return WL_CONNECT_FAILED; - } else if(status == STATION_IDLE) { - return WL_IDLE_STATUS; - } else { - return WL_DISCONNECTED; + switch(status) { + case STATION_GOT_IP: + return WL_CONNECTED; + case STATION_NO_AP_FOUND: + return WL_NO_SSID_AVAIL; + case STATION_CONNECT_FAIL: + case STATION_WRONG_PASSWORD: + return WL_CONNECT_FAILED; + case STATION_IDLE: + return WL_IDLE_STATUS; + default: + return WL_DISCONNECTED; } } @@ -543,32 +556,38 @@ bool ESP8266WiFiSTAClass::_smartConfigDone = false; /** * Start SmartConfig */ -void ESP8266WiFiSTAClass::beginSmartConfig() { - if(_smartConfigStarted) - return; +bool ESP8266WiFiSTAClass::beginSmartConfig() { + if(_smartConfigStarted) { + return false; + } if(!WiFi.enableSTA(true)) { // enable STA failed - return; + return false; } - _smartConfigStarted = true; - _smartConfigDone = false; - - smartconfig_start(reinterpret_cast(&ESP8266WiFiSTAClass::_smartConfigCallback), 1); + if(smartconfig_start(reinterpret_cast(&ESP8266WiFiSTAClass::_smartConfigCallback), 1)) { + _smartConfigStarted = true; + _smartConfigDone = false; + return true; + } + return false; } /** * Stop SmartConfig */ -void ESP8266WiFiSTAClass::stopSmartConfig() { +bool ESP8266WiFiSTAClass::stopSmartConfig() { if(!_smartConfigStarted) { - return; + return true; } - smartconfig_stop(); - _smartConfigStarted = false; + if(smartconfig_stop()) { + _smartConfigStarted = false; + return true; + } + return false; } /** diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h index 409577707..cfc15af3a 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h @@ -35,15 +35,15 @@ class ESP8266WiFiSTAClass { public: - int begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - int begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - int begin(); + wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + wl_status_t begin(); - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); + bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); + bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); bool reconnect(); - int disconnect(bool wifioff = false); + bool disconnect(bool wifioff = false); uint8_t waitForConnectResult(); @@ -84,10 +84,9 @@ class ESP8266WiFiSTAClass { bool beginWPSConfig(void); - void beginSmartConfig(); + bool beginSmartConfig(); + bool stopSmartConfig(); bool smartConfigDone(); - void stopSmartConfig(); - protected: diff --git a/tools/sdk/include/user_interface.h b/tools/sdk/include/user_interface.h index 5ecf3a868..470556c70 100644 --- a/tools/sdk/include/user_interface.h +++ b/tools/sdk/include/user_interface.h @@ -222,21 +222,21 @@ bool wifi_station_set_auto_connect(uint8 set); bool wifi_station_set_reconnect_policy(bool set); -enum { +typedef enum { STATION_IDLE = 0, STATION_CONNECTING, STATION_WRONG_PASSWORD, STATION_NO_AP_FOUND, STATION_CONNECT_FAIL, STATION_GOT_IP -}; +} station_status_t; enum dhcp_status { DHCP_STOPPED, DHCP_STARTED }; -uint8 wifi_station_get_connect_status(void); +station_status_t wifi_station_get_connect_status(void); uint8 wifi_station_get_current_ap_id(void); bool wifi_station_ap_change(uint8 current_ap_id); From 7edcda4a0f9beb23101e710643e1a1d001d1b082 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 15:26:14 +0100 Subject: [PATCH 15/38] IPAddress allow uint32_t compare --- cores/esp8266/IPAddress.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h index b563c7044..4876358fc 100644 --- a/cores/esp8266/IPAddress.h +++ b/cores/esp8266/IPAddress.h @@ -56,6 +56,9 @@ class IPAddress: public Printable { bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; } + bool operator==(uint32_t addr) const { + return _address.dword == addr; + } bool operator==(const uint8_t* addr) const; // Overloaded index operator to allow getting and setting individual octets of the address From 293e55c6903f5f9de3e5c3d69016c86af3b41398 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 15:28:29 +0100 Subject: [PATCH 16/38] check for WiFi pass < 8 (not allowed for WPA2) simplify STA config and allow setting of second DNS server for fallback code style --- libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 16 +++-- .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 6 +- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 67 +++++++------------ libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h | 4 +- libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp | 1 - 5 files changed, 41 insertions(+), 53 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index b598707c7..8a0626530 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -54,14 +54,18 @@ static bool softap_config_equal(const softap_config& lhs, const softap_config& r * @return equal */ static bool softap_config_equal(const softap_config& lhs, const softap_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) { return false; - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + } + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) { return false; - if(lhs.channel != rhs.channel) + } + if(lhs.channel != rhs.channel) { return false; - if(lhs.ssid_hidden != rhs.ssid_hidden) + } + if(lhs.ssid_hidden != rhs.ssid_hidden) { return false; + } return true; } @@ -89,8 +93,8 @@ bool ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int ch return false; } - if(passphrase && strlen(passphrase) > 63) { - // fail passphrase to long! + if(passphrase && (strlen(passphrase) > 63 || strlen(passphrase) < 8)) { + // fail passphrase to long or short! return false; } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 01e137190..3b13549f7 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -71,7 +71,7 @@ void ESP8266WiFiGenericClass::onEvent(WiFiEventCb cbEvent) { */ void ESP8266WiFiGenericClass::_eventCallback(void* arg) { System_Event_t* event = reinterpret_cast(arg); - DEBUGV("wifi evt: %d\r\n", event->event); + DEBUGV("wifi evt: %d\n", event->event); if(event->event == EVENT_STAMODE_DISCONNECTED) { WiFiClient::stopAll(); @@ -170,7 +170,7 @@ WiFiMode_t ESP8266WiFiGenericClass::getMode() { */ bool ESP8266WiFiGenericClass::enableSTA(bool enable) { - WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + WiFiMode_t currentMode = getMode(); bool isEnabled = ((currentMode & WIFI_STA) != 0); if(isEnabled != enable) { @@ -191,7 +191,7 @@ bool ESP8266WiFiGenericClass::enableSTA(bool enable) { */ bool ESP8266WiFiGenericClass::enableAP(bool enable){ - WiFiMode_t currentMode = (WiFiMode_t) wifi_get_opmode(); + WiFiMode_t currentMode = getMode(); bool isEnabled = ((currentMode & WIFI_AP) != 0); if(isEnabled != enable) { diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index 1419e34a8..822ba21f8 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -57,21 +57,22 @@ static bool sta_config_equal(const station_config& lhs, const station_config& rh * @return equal */ static bool sta_config_equal(const station_config& lhs, const station_config& rhs) { - if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) + if(strcmp(reinterpret_cast(lhs.ssid), reinterpret_cast(rhs.ssid)) != 0) { return false; + } - if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) + if(strcmp(reinterpret_cast(lhs.password), reinterpret_cast(rhs.password)) != 0) { return false; + } + + if(lhs.bssid_set != rhs.bssid_set) { + return false; + } if(lhs.bssid_set) { - if(!rhs.bssid_set) - return false; - - if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) - return false; - } else { - if(rhs.bssid_set) + if(memcmp(lhs.bssid, rhs.bssid, 6) != 0) { return false; + } } return true; @@ -178,39 +179,15 @@ wl_status_t ESP8266WiFiSTAClass::begin() { } -/** - * Change IP configuration settings disabling the dhcp client - * @param local_ip Static ip configuration - * @param gateway Static gateway configuration - * @param subnet Static Subnet mask - */ -bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { - - if(!WiFi.enableSTA(true)) { - return false; - } - - struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - wifi_station_dhcpc_stop(); - if(wifi_set_ip_info(STATION_IF, &info)) { - _useStaticIp = true; - return true; - } - return false; -} - /** * Change IP configuration settings disabling the dhcp client * @param local_ip Static ip configuration * @param gateway Static gateway configuration * @param subnet Static Subnet mask - * @param dns Static DNS server + * @param dns1 Static DNS server 1 + * @param dns2 Static DNS server 2 */ -bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns) { +bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2) { if(!WiFi.enableSTA(true)) { return false; @@ -227,11 +204,19 @@ bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddres } else { return false; } - - // Set DNS-Server ip_addr_t d; - d.addr = static_cast(dns); - dns_setserver(0, &d); + + if(dns1 != (uint32_t)0x00000000) { + // Set DNS1-Server + d.addr = static_cast(dns1); + dns_setserver(0, &d); + } + + if(dns2 != (uint32_t)0x00000000) { + // Set DNS2-Server + d.addr = static_cast(dns2); + dns_setserver(1, &d); + } return true; } @@ -617,7 +602,7 @@ void ESP8266WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) { wifi_station_disconnect(); wifi_station_connect(); - WiFi._smartConfigDone = true; + _smartConfigDone = true; } else if(status == SC_STATUS_LINK_OVER) { WiFi.stopSmartConfig(); } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h index cfc15af3a..d854db5c4 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h @@ -39,8 +39,7 @@ class ESP8266WiFiSTAClass { wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); wl_status_t begin(); - bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet); - bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns); + bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000); bool reconnect(); bool disconnect(bool wifioff = false); @@ -92,6 +91,7 @@ class ESP8266WiFiSTAClass { static bool _smartConfigStarted; static bool _smartConfigDone; + static void _smartConfigCallback(uint32_t status, void* result); }; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp index 223f4ae26..bf9edd261 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp @@ -314,7 +314,6 @@ void ESP8266WiFiScanClass::_scanDone(void* result, int status) { * @return bss_info * */ void * ESP8266WiFiScanClass::_getScanInfoByIndex(int i) { - //TODO why its void * and not bss_info * ? if(!ESP8266WiFiScanClass::_scanResult || (size_t) i > ESP8266WiFiScanClass::_scanCount) { return 0; } From 8943ac402cbdf16364864af7a442b7088dae061a Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 15:40:54 +0100 Subject: [PATCH 17/38] add softAPgetStationNum --- libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 9 +++++++++ libraries/ESP8266WiFi/src/ESP8266WiFiAP.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index 8a0626530..6c911263a 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -186,6 +186,15 @@ bool ESP8266WiFiAPClass::softAPdisconnect(bool wifioff) { return ret; } + +/** + * Get the count of the Station / client that are connected to the softAP interface + * @return Stations count + */ +uint8_t ESP8266WiFiAPClass::softAPgetStationNum() { + return wifi_softap_get_station_num(); +} + /** * Get the softAP interface IP address. * @return IPAddress softAP IP diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h index 4b378200a..e248d81f8 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.h @@ -40,6 +40,8 @@ class ESP8266WiFiAPClass { bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet); bool softAPdisconnect(bool wifioff = false); + uint8_t softAPgetStationNum(); + IPAddress softAPIP(); uint8_t* softAPmacAddress(uint8_t* mac); From bbeaeaad54c4295e8f94a7d61f866f910a95d3a2 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 15:56:53 +0100 Subject: [PATCH 18/38] add WiFi TX power control --- .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 17 +++++++++++++++++ libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h | 2 ++ 2 files changed, 19 insertions(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 3b13549f7..78c55f76f 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -124,6 +124,23 @@ WiFiPhyMode_t ESP8266WiFiGenericClass::getPhyMode() { return (WiFiPhyMode_t) wifi_get_phy_mode(); } +/** + * set the output power of WiFi + * @param dBm max: +20.5dBm min: 0dBm + */ +void ESP8266WiFiGenericClass::setOutputPower(float_t dBm) { + + if(dBm > 20.5) { + dBm = 20.5; + } else if(dBm < 0) { + dBm = 0; + } + + uint8_t val = (dBm*4.0f); + system_phy_set_max_tpw(val); +} + + /** * store WiFi config in SDK flash area * @param persistent diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h index 26381b43b..2232941c9 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -46,6 +46,8 @@ class ESP8266WiFiGenericClass { bool setPhyMode(WiFiPhyMode_t mode); WiFiPhyMode_t getPhyMode(); + void setOutputPower(float_t dBm); + void persistent(bool persistent); bool mode(WiFiMode_t); From 61440d9e2b7b0a1d4fce83e970a7c9ff6daccdba Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 16:14:27 +0100 Subject: [PATCH 19/38] add WiFi sleep management Note: testing needed --- .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 39 ++++++++++++++++++- .../ESP8266WiFi/src/ESP8266WiFiGeneric.h | 6 ++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 78c55f76f..241206148 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -52,6 +52,7 @@ extern "C" void esp_yield(); bool ESP8266WiFiGenericClass::_persistent = true; WiFiEventCb ESP8266WiFiGenericClass::_cbEvent = NULL; +WiFiMode_t ESP8266WiFiGenericClass::_forceSleepLastMode = WIFI_OFF; ESP8266WiFiGenericClass::ESP8266WiFiGenericClass() { wifi_set_event_handler_cb((wifi_event_handler_cb_t) &ESP8266WiFiGenericClass::_eventCallback); @@ -128,7 +129,7 @@ WiFiPhyMode_t ESP8266WiFiGenericClass::getPhyMode() { * set the output power of WiFi * @param dBm max: +20.5dBm min: 0dBm */ -void ESP8266WiFiGenericClass::setOutputPower(float_t dBm) { +void ESP8266WiFiGenericClass::setOutputPower(float dBm) { if(dBm > 20.5) { dBm = 20.5; @@ -223,7 +224,43 @@ bool ESP8266WiFiGenericClass::enableAP(bool enable){ } +/** + * Disable WiFi for x us when value is not 0 + * @param sleep_time_in_us + * @return ok + */ +bool ESP8266WiFiGenericClass::forceSleepBegin(uint32 sleepUs) { + _forceSleepLastMode = getMode(); + if(!mode(WIFI_OFF)) { + return false; + } + if(sleepUs == 0) { + sleepUs = 0xFFFFFFF; + } + + wifi_fpm_set_sleep_type(MODEM_SLEEP_T); + wifi_fpm_open(); + return (wifi_fpm_do_sleep(sleepUs) == 0); +} + +/** + * wake up WiFi Modem + * @return ok + */ +bool ESP8266WiFiGenericClass::forceSleepWake() { + wifi_fpm_do_wakeup(); + wifi_fpm_close(); + + // restore last mode + if(mode(_forceSleepLastMode)) { + if((_forceSleepLastMode & WIFI_STA) != 0){ + wifi_station_connect(); + } + return true; + } + return false; +} // ----------------------------------------------------------------------------------------------------------------------- diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h index 2232941c9..83b4c3fc5 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -46,7 +46,7 @@ class ESP8266WiFiGenericClass { bool setPhyMode(WiFiPhyMode_t mode); WiFiPhyMode_t getPhyMode(); - void setOutputPower(float_t dBm); + void setOutputPower(float dBm); void persistent(bool persistent); @@ -56,9 +56,13 @@ class ESP8266WiFiGenericClass { bool enableSTA(bool enable); bool enableAP(bool enable); + bool forceSleepBegin(uint32 sleepUs = 0); + bool forceSleepWake(); + protected: static bool _persistent; static WiFiEventCb _cbEvent; + static WiFiMode_t _forceSleepLastMode; static void _eventCallback(void *event); From 85905c12f2f84298977c4000ed004187cbd32582 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 17:31:57 +0100 Subject: [PATCH 20/38] allow multiple event callbacks and add filter option --- cores/esp8266/Arduino.h | 4 ++ .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 46 +++++++++++++++++-- .../ESP8266WiFi/src/ESP8266WiFiGeneric.h | 9 +++- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 10c6ebd44..2a88be9dc 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -247,8 +247,12 @@ void optimistic_yield(uint32_t interval_us); #include "Updater.h" #include "debug.h" +#ifndef _GLIBCXX_VECTOR +// arduino is not compatible with std::vector #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) +#endif + #define _min(a,b) ((a)<(b)?(a):(b)) #define _max(a,b) ((a)>(b)?(a):(b)) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 241206148..2d1b10818 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -43,6 +43,10 @@ extern "C" { #include "debug.h" +#undef min +#undef max +#include + extern "C" void esp_schedule(); extern "C" void esp_yield(); @@ -50,8 +54,10 @@ extern "C" void esp_yield(); // ------------------------------------------------- Generic WiFi function ----------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- +// arduino dont like std::vectors move static here +static std::vector cbEventList; + bool ESP8266WiFiGenericClass::_persistent = true; -WiFiEventCb ESP8266WiFiGenericClass::_cbEvent = NULL; WiFiMode_t ESP8266WiFiGenericClass::_forceSleepLastMode = WIFI_OFF; ESP8266WiFiGenericClass::ESP8266WiFiGenericClass() { @@ -61,9 +67,34 @@ ESP8266WiFiGenericClass::ESP8266WiFiGenericClass() { /** * set callback function * @param cbEvent WiFiEventCb + * @param event optional filter (WIFI_EVENT_MAX is all events) */ -void ESP8266WiFiGenericClass::onEvent(WiFiEventCb cbEvent) { - _cbEvent = cbEvent; +void ESP8266WiFiGenericClass::onEvent(WiFiEventCb cbEvent, WiFiEvent_t event) { + if(!cbEvent) { + return; + } + WiFiEventCbList_t newEventHandler; + newEventHandler.cb = cbEvent; + newEventHandler.event = event; + cbEventList.push_back(newEventHandler); +} + +/** + * removes a callback form event handler + * @param cbEvent WiFiEventCb + * @param event optional filter (WIFI_EVENT_MAX is all events) + */ +void ESP8266WiFiGenericClass::removeEvent(WiFiEventCb cbEvent, WiFiEvent_t event) { + if(!cbEvent) { + return; + } + + for(uint32_t i = 0; i < cbEventList.size(); i++) { + WiFiEventCbList_t entry = cbEventList[i]; + if(entry.cb == cbEvent && entry.event == event) { + cbEventList.erase(cbEventList.begin() + i); + } + } } /** @@ -78,8 +109,13 @@ void ESP8266WiFiGenericClass::_eventCallback(void* arg) { WiFiClient::stopAll(); } - if(_cbEvent) { - _cbEvent((WiFiEvent_t) event->event); + for(uint32_t i = 0; i < cbEventList.size(); i++) { + WiFiEventCbList_t entry = cbEventList[i]; + if(entry.cb) { + if(entry.event == (WiFiEvent_t) event->event || entry.event == WIFI_EVENT_MAX) { + entry.cb((WiFiEvent_t) event->event); + } + } } } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h index 83b4c3fc5..80a7c946f 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -27,6 +27,11 @@ typedef void (*WiFiEventCb)(WiFiEvent_t event); +typedef struct { + WiFiEventCb cb; + WiFiEvent_t event; +} WiFiEventCbList_t; + class ESP8266WiFiGenericClass { // ---------------------------------------------------------------------------------------------- // -------------------------------------- Generic WiFi function --------------------------------- @@ -36,7 +41,8 @@ class ESP8266WiFiGenericClass { ESP8266WiFiGenericClass(); - void onEvent(WiFiEventCb cbEvent); + void onEvent(WiFiEventCb cbEvent, WiFiEvent_t event = WIFI_EVENT_MAX); + void removeEvent(WiFiEventCb cbEvent, WiFiEvent_t event = WIFI_EVENT_MAX); int32_t channel(void); @@ -61,7 +67,6 @@ class ESP8266WiFiGenericClass { protected: static bool _persistent; - static WiFiEventCb _cbEvent; static WiFiMode_t _forceSleepLastMode; static void _eventCallback(void *event); From d9a7a816d51535b21fec38cb5db30cc8511075c3 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 17:44:00 +0100 Subject: [PATCH 21/38] include core_esp8266_features.h in arduino.h for easier usage, and add WIFI_HAS_EVENT_CALLBACK --- cores/esp8266/Arduino.h | 1 + cores/esp8266/core_esp8266_features.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 2a88be9dc..b6f442e5c 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -37,6 +37,7 @@ extern "C" { #include "binary.h" #include "esp8266_peri.h" #include "twi.h" +#include "core_esp8266_features.h" #define HIGH 0x1 #define LOW 0x0 diff --git a/cores/esp8266/core_esp8266_features.h b/cores/esp8266/core_esp8266_features.h index ae5d58539..0dc202383 100644 --- a/cores/esp8266/core_esp8266_features.h +++ b/cores/esp8266/core_esp8266_features.h @@ -28,6 +28,8 @@ #define CORE_HAS_LIBB64 #define CORE_HAS_BASE64_CLASS +#define WIFI_HAS_EVENT_CALLBACK + #endif From 4a68612af862e0f11ea226bd57927e6aee1d991d Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Tue, 29 Dec 2015 21:01:48 +0100 Subject: [PATCH 22/38] add API for connect / reconnect management --- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 46 ++++++++++++++++++-- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h | 9 +++- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index 822ba21f8..522776061 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -91,9 +91,10 @@ bool ESP8266WiFiSTAClass::_useStaticIp = false; * @param passphrase const char * Optional. Passphrase. Valid characters in a passphrase must be between ASCII 32-126 (decimal). * @param bssid uint8_t[6] Optional. BSSID / MAC of AP * @param channel Optional. Channel of AP + * @param connect Optional. call connect * @return */ -wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) { +wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) { if(!WiFi.enableSTA(true)) { // enable STA failed @@ -134,12 +135,17 @@ wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, } ETS_UART_INTR_DISABLE(); + if(WiFi._persistent) { wifi_station_set_config(&conf); } else { wifi_station_set_config_current(&conf); } - wifi_station_connect(); + + if(connect) { + wifi_station_connect(); + } + ETS_UART_INTR_ENABLE(); if(channel > 0 && channel <= 13) { @@ -153,8 +159,8 @@ wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, return status(); } -wl_status_t ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) { - return begin((const char*) ssid, (const char*) passphrase, channel, bssid); +wl_status_t ESP8266WiFiSTAClass::begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) { + return begin((const char*) ssid, (const char*) passphrase, channel, bssid, connect); } /** @@ -261,6 +267,38 @@ bool ESP8266WiFiSTAClass::disconnect(bool wifioff) { return ret; } +/** + * Setting the ESP8266 station to connect to the AP (which is recorded) + * automatically or not when powered on. Enable auto-connect by default. + * @param autoConnect bool + * @return if saved + */ +bool ESP8266WiFiSTAClass::setAutoConnect(bool autoConnect) { + bool ret; + ETS_UART_INTR_DISABLE(); + ret = wifi_station_set_auto_connect(autoConnect); + ETS_UART_INTR_ENABLE(); + return ret; +} + +/** + * Checks if ESP8266 station mode will connect to AP + * automatically or not when it is powered on. + * @return auto connect + */ +bool ESP8266WiFiSTAClass::getAutoConnect() { + return (wifi_station_get_auto_connect() != 0); +} + +/** + * Set whether reconnect or not when the ESP8266 station is disconnected from AP. + * @param autoReconnect + * @return + */ +bool ESP8266WiFiSTAClass::setAutoReconnect(bool autoReconnect) { + return wifi_station_set_reconnect_policy(autoReconnect); +} + /** * Wait for WiFi connection to reach a result * returns the status reached or disconnect if STA is off diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h index d854db5c4..c4d10046f 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h @@ -35,8 +35,8 @@ class ESP8266WiFiSTAClass { public: - wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); - wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL); + wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); + wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); wl_status_t begin(); bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000); @@ -44,6 +44,11 @@ class ESP8266WiFiSTAClass { bool reconnect(); bool disconnect(bool wifioff = false); + bool setAutoConnect(bool autoConnect); + bool getAutoConnect(); + + bool setAutoReconnect(bool autoReconnect); + uint8_t waitForConnectResult(); // STA network info From db4076fd41c21f97792425ce068e0f6de21d9fe1 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 30 Dec 2015 17:40:36 +0100 Subject: [PATCH 23/38] add more debug for disconnect add isConnected function for easier usage --- libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 1 + libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 9 +++++++++ libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h | 2 ++ 3 files changed, 12 insertions(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 2d1b10818..79f80c1af 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -106,6 +106,7 @@ void ESP8266WiFiGenericClass::_eventCallback(void* arg) { DEBUGV("wifi evt: %d\n", event->event); if(event->event == EVENT_STAMODE_DISCONNECTED) { + DEBUGV("STA disconnect: %d\n", event->event_info.disconnected.reason); WiFiClient::stopAll(); } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index 522776061..0d34a5a64 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -267,6 +267,15 @@ bool ESP8266WiFiSTAClass::disconnect(bool wifioff) { return ret; } +/** + * is STA interface connected? + * @return true if STA is connected to an AD + */ +bool ESP8266WiFiSTAClass::isConnected() { + return (status() == WL_CONNECTED); +} + + /** * Setting the ESP8266 station to connect to the AP (which is recorded) * automatically or not when powered on. Enable auto-connect by default. diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h index c4d10046f..4e87f8826 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h @@ -44,6 +44,8 @@ class ESP8266WiFiSTAClass { bool reconnect(); bool disconnect(bool wifioff = false); + bool isConnected(); + bool setAutoConnect(bool autoConnect); bool getAutoConnect(); From cc0037682bc4d94391ea51eb629a5b4087377123 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 30 Dec 2015 19:38:06 +0100 Subject: [PATCH 24/38] add CHUNKED encoding support too http client (#1324) HTTP Client - fix examples increase default timeout to 5000ms --- .../examples/Authorization/Authorization.ino | 2 +- .../BasicHttpClient/BasicHttpClient.ino | 2 +- .../ReuseConnection/ReuseConnection.ino | 2 +- .../StreamHttpClient/StreamHttpClient.ino | 2 +- .../src/ESP8266HTTPClient.cpp | 178 +++++++++++++----- .../ESP8266HTTPClient/src/ESP8266HTTPClient.h | 15 +- 6 files changed, 146 insertions(+), 55 deletions(-) diff --git a/libraries/ESP8266HTTPClient/examples/Authorization/Authorization.ino b/libraries/ESP8266HTTPClient/examples/Authorization/Authorization.ino index 79a4c3fdf..64955e56b 100644 --- a/libraries/ESP8266HTTPClient/examples/Authorization/Authorization.ino +++ b/libraries/ESP8266HTTPClient/examples/Authorization/Authorization.ino @@ -63,7 +63,7 @@ void loop() { int httpCode = http.GET(); // httpCode will be negative on error - if(httpCode) { + if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); diff --git a/libraries/ESP8266HTTPClient/examples/BasicHttpClient/BasicHttpClient.ino b/libraries/ESP8266HTTPClient/examples/BasicHttpClient/BasicHttpClient.ino index d3a5fbc7d..577926716 100644 --- a/libraries/ESP8266HTTPClient/examples/BasicHttpClient/BasicHttpClient.ino +++ b/libraries/ESP8266HTTPClient/examples/BasicHttpClient/BasicHttpClient.ino @@ -51,7 +51,7 @@ void loop() { int httpCode = http.GET(); // httpCode will be negative on error - if(httpCode) { + if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); diff --git a/libraries/ESP8266HTTPClient/examples/ReuseConnection/ReuseConnection.ino b/libraries/ESP8266HTTPClient/examples/ReuseConnection/ReuseConnection.ino index 631b9494d..c390515bf 100644 --- a/libraries/ESP8266HTTPClient/examples/ReuseConnection/ReuseConnection.ino +++ b/libraries/ESP8266HTTPClient/examples/ReuseConnection/ReuseConnection.ino @@ -48,7 +48,7 @@ void loop() { //http.begin("192.168.1.12", 80, "/test.html"); int httpCode = http.GET(); - if(httpCode) { + if(httpCode > 0) { USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server diff --git a/libraries/ESP8266HTTPClient/examples/StreamHttpClient/StreamHttpClient.ino b/libraries/ESP8266HTTPClient/examples/StreamHttpClient/StreamHttpClient.ino index 2e7f4487d..7fa118254 100644 --- a/libraries/ESP8266HTTPClient/examples/StreamHttpClient/StreamHttpClient.ino +++ b/libraries/ESP8266HTTPClient/examples/StreamHttpClient/StreamHttpClient.ino @@ -50,7 +50,7 @@ void loop() { USE_SERIAL.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); - if(httpCode) { + if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 36545fcbb..2a40793d6 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -40,6 +40,8 @@ HTTPClient::HTTPClient() { _port = 0; _reuse = false; + _tcpTimeout = HTTPCLIENT_DEFAULT_TCP_TIMEOUT; + _https = false; _userAgent = "ESP8266HTTPClient"; @@ -50,7 +52,7 @@ HTTPClient::HTTPClient() { _returnCode = 0; _size = -1; _canReuse = false; - _tcpTimeout = HTTPCLIENT_DEFAULT_TCP_TIMEOUT; + _transferEncoding = HTTPC_TE_IDENTITY; } @@ -468,61 +470,36 @@ int HTTPClient::writeToStream(Stream * stream) { // get length of document (is -1 when Server sends no Content-Length header) int len = _size; - int bytesWritten = 0; + int ret = 0; - size_t buff_size = HTTP_TCP_BUFFER_SIZE; + if(_transferEncoding == HTTPC_TE_IDENTITY) { + ret = writeToStreamDataBlock(stream, len); + } else if(_transferEncoding == HTTPC_TE_CHUNKED) { + while(1) { + String chunkHeader = _tcp->readStringUntil('\n'); + chunkHeader.trim(); // remove \r - // if possible create smaller buffer then HTTP_TCP_BUFFER_SIZE - if((len > 0) && (len < HTTP_TCP_BUFFER_SIZE)) { - buff_size = len; - } - - // create buffer for read - uint8_t * buff = (uint8_t *) malloc(buff_size); - - if(buff) { - // read all data from server - while(connected() && (len > 0 || len == -1)) { - - // get available data size - size_t size = _tcp->available(); - - if(size) { - int c = _tcp->readBytes(buff, ((size > buff_size) ? buff_size : size)); - - // write it to Stream - int w = stream->write(buff, c); - bytesWritten += w; - if(w != c) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] short write asked for %d but got %d\n", c, w); - break; + // read size of chunk + len = (uint32_t) strtol((const char *) chunkHeader.c_str(), NULL, 16); + DEBUG_HTTPCLIENT("[HTTP-Client] read chunk len: %d\n", len); + if(len > 0) { + int r = writeToStreamDataBlock(stream, len); + if(r < 0) { + // error in writeToStreamDataBlock + return r; } - - if(len > 0) { - len -= c; - } - - delay(0); + ret += r; } else { - delay(1); + break; } + delay(0); } - - free(buff); - - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] connection closed or file end (written: %d).\n", bytesWritten); - - if(_size && _size != bytesWritten) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] bytesWritten %d and size %d mismatch!.\n", bytesWritten, _size); - } - } else { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); - return HTTPC_ERROR_TOO_LESS_RAM; + return HTTPC_ERROR_ENCODING; } end(); - return bytesWritten; + return ret; } /** @@ -567,6 +544,8 @@ String HTTPClient::errorToString(int error) { return String("no HTTP server"); case HTTPC_ERROR_TOO_LESS_RAM: return String("too less ram"); + case HTTPC_ERROR_ENCODING: + return String("Transfer-Encoding not supported"); default: return String(); } @@ -706,6 +685,7 @@ bool HTTPClient::sendHeader(const char * type) { String header = String(type) + " " + _url + " HTTP/1.1\r\n" "Host: " + _host + "\r\n" "User-Agent: " + _userAgent + "\r\n" + "Accept-Encoding: identity;q=1 chunked;q=0.1 *;q=0\r\n" "Connection: "; if(_reuse) { @@ -733,9 +713,10 @@ int HTTPClient::handleHeaderResponse() { if(!connected()) { return HTTPC_ERROR_NOT_CONNECTED; } - + String transferEncoding; _returnCode = -1; _size = -1; + _transferEncoding = HTTPC_TE_IDENTITY; while(connected()) { size_t len = _tcp->available(); @@ -759,6 +740,10 @@ int HTTPClient::handleHeaderResponse() { _canReuse = headerValue.equalsIgnoreCase("keep-alive"); } + if(headerName.equalsIgnoreCase("Transfer-Encoding")) { + transferEncoding = headerValue; + } + for(size_t i = 0; i < _headerKeysCount; i++) { if(_currentHeaders[i].key.equalsIgnoreCase(headerName)) { _currentHeaders[i].value = headerValue; @@ -769,9 +754,22 @@ int HTTPClient::handleHeaderResponse() { if(headerLine == "") { DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] code: %d\n", _returnCode); - if(_size) { + + if(_size > 0) { DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] size: %d\n", _size); } + + if(transferEncoding.length() > 0) { + DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] Transfer-Encoding: %s\n", transferEncoding.c_str()); + if(transferEncoding.equalsIgnoreCase("chunked")) { + _transferEncoding = HTTPC_TE_CHUNKED; + } else { + return HTTPC_ERROR_ENCODING; + } + } else { + _transferEncoding = HTTPC_TE_IDENTITY; + } + if(_returnCode) { return _returnCode; } else { @@ -787,3 +785,87 @@ int HTTPClient::handleHeaderResponse() { return HTTPC_ERROR_CONNECTION_LOST; } + + + +/** + * + * @param stream + * @param len + * @return + */ +int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { + int buff_size = HTTP_TCP_BUFFER_SIZE; + int len = size; + int bytesWritten = 0; + + // if possible create smaller buffer then HTTP_TCP_BUFFER_SIZE + if((len > 0) && (len < HTTP_TCP_BUFFER_SIZE)) { + buff_size = len; + } + + // create buffer for read + uint8_t * buff = (uint8_t *) malloc(buff_size); + + if(buff) { + // read all data from server + while(connected() && (len > 0 || len == -1)) { + + // get available data size + size_t sizeAvailable = _tcp->available(); + + if(sizeAvailable) { + + int readBytes = sizeAvailable; + + // read only the asked bytes + if(readBytes > len) { + readBytes = len; + } + + // not read more the buffer can handle + if(readBytes > buff_size) { + readBytes = buff_size; + } + + // read data + int c = _tcp->readBytes(buff, readBytes); + + // write it to Stream + int w = stream->write(buff, c); + bytesWritten += w; + if(w != c) { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] short write asked for %d but got %d\n", c, w); + break; + } + + if(stream->getWriteError()) { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); + break; + } + + if(len > 0) { + len -= c; + } + + delay(0); + } else { + delay(1); + } + } + + free(buff); + + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] connection closed or file end (written: %d).\n", bytesWritten); + + if((size > 0) && (size != bytesWritten)) { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); + } + + } else { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); + return HTTPC_ERROR_TOO_LESS_RAM; + } + + return bytesWritten; +} diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 43c6b19ac..6b32974e1 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -25,13 +25,13 @@ #ifndef ESP8266HTTPClient_H_ #define ESP8266HTTPClient_H_ -//#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) +#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_HTTPCLIENT #define DEBUG_HTTPCLIENT(...) #endif -#define HTTPCLIENT_DEFAULT_TCP_TIMEOUT (1000) +#define HTTPCLIENT_DEFAULT_TCP_TIMEOUT (5000) /// HTTP client errors #define HTTPC_ERROR_CONNECTION_REFUSED (-1) @@ -42,6 +42,8 @@ #define HTTPC_ERROR_NO_STREAM (-6) #define HTTPC_ERROR_NO_HTTP_SERVER (-7) #define HTTPC_ERROR_TOO_LESS_RAM (-8) +#define HTTPC_ERROR_ENCODING (-9) + /// size for the stream handling #define HTTP_TCP_BUFFER_SIZE (1460) @@ -108,6 +110,11 @@ typedef enum { HTTP_CODE_NETWORK_AUTHENTICATION_REQUIRED = 511 } t_http_codes; +typedef enum { + HTTPC_TE_IDENTITY, + HTTPC_TE_CHUNKED +} transferEncoding_t; + class HTTPClient { public: HTTPClient(); @@ -188,11 +195,13 @@ class HTTPClient { int _returnCode; int _size; bool _canReuse; + transferEncoding_t _transferEncoding; + bool connect(void); bool sendHeader(const char * type); int handleHeaderResponse(); - + int writeToStreamDataBlock(Stream * stream, int len); }; From 288e879a13f7fee1ac283b31a75052f89ad40074 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Wed, 30 Dec 2015 21:21:30 +0100 Subject: [PATCH 25/38] disable debug --- libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 6b32974e1..6b65ed526 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -25,7 +25,7 @@ #ifndef ESP8266HTTPClient_H_ #define ESP8266HTTPClient_H_ -#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) +//#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_HTTPCLIENT #define DEBUG_HTTPCLIENT(...) From c488bfb84e550f9672f51967d3b483dcca861490 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 00:12:41 +0100 Subject: [PATCH 26/38] fix WiFi mode change typo --- libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 79f80c1af..86bbb7091 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -230,7 +230,7 @@ bool ESP8266WiFiGenericClass::enableSTA(bool enable) { if(isEnabled != enable) { if(enable) { - return mode((WiFiMode_t)(currentMode & WIFI_STA)); + return mode((WiFiMode_t)(currentMode | WIFI_STA)); } else { return mode((WiFiMode_t)(currentMode & (~WIFI_STA))); } @@ -251,7 +251,7 @@ bool ESP8266WiFiGenericClass::enableAP(bool enable){ if(isEnabled != enable) { if(enable) { - return mode((WiFiMode_t)(currentMode & WIFI_AP)); + return mode((WiFiMode_t)(currentMode | WIFI_AP)); } else { return mode((WiFiMode_t)(currentMode & (~WIFI_AP))); } From 939e3430de598d32f6c6f59c4ccc28828289f4f7 Mon Sep 17 00:00:00 2001 From: Buzz Burrowes Date: Wed, 30 Dec 2015 23:30:15 -0500 Subject: [PATCH 27/38] Fixed crash bug with mDNS where a string buffer could be used uninitialized. --- libraries/ESP8266mDNS/ESP8266mDNS.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 2e5c711fb..34fdd4757 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -290,7 +290,8 @@ void MDNSResponder::_parsePacket(){ uint16_t servicePort = 0; char protoName[32]; - uint8_t protoNameLen; + protoName[0] = 0; + uint8_t protoNameLen = 0; uint16_t packetHeader[6]; @@ -330,7 +331,7 @@ void MDNSResponder::_parsePacket(){ serviceName[serviceNameLen] = '\0'; if(serviceName[0] == '_'){ - memcpy(serviceName, serviceName+1, serviceNameLen); + memmove(serviceName, serviceName+1, serviceNameLen); serviceNameLen--; serviceParsed = true; } else if(serviceNameLen == 5 && strcmp("local", serviceName) == 0){ @@ -362,7 +363,7 @@ void MDNSResponder::_parsePacket(){ _conn_readS(protoName, protoNameLen); protoName[protoNameLen] = '\0'; if(protoNameLen == 4 && protoName[0] == '_'){ - memcpy(protoName, protoName+1, protoNameLen); + memmove(protoName, protoName+1, protoNameLen); protoNameLen--; protoParsed = true; } else { From bd7d915bcd812a408559263d203bf0e5ceca1f05 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 12:00:26 +0100 Subject: [PATCH 28/38] rework error handling and detection add retry for short write remove compiler warnings --- .../src/ESP8266HTTPClient.cpp | 111 +++++++++++++++--- .../ESP8266HTTPClient/src/ESP8266HTTPClient.h | 7 +- 2 files changed, 97 insertions(+), 21 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 2a40793d6..715a4b4d1 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -298,7 +298,7 @@ int HTTPClient::POST(String payload) { int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size) { // connect to server if(!connect()) { - return HTTPC_ERROR_CONNECTION_REFUSED; + return returnError(HTTPC_ERROR_CONNECTION_REFUSED); } if(payload && size > 0) { @@ -307,18 +307,18 @@ int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size) { // send Header if(!sendHeader(type)) { - return HTTPC_ERROR_SEND_HEADER_FAILED; + return returnError(HTTPC_ERROR_SEND_HEADER_FAILED); } // send Payload if needed if(payload && size > 0) { if(_tcp->write(&payload[0], size) != size) { - return HTTPC_ERROR_SEND_PAYLOAD_FAILED; + return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); } } // handle Server Response (Header) - return handleHeaderResponse(); + return returnError(handleHeaderResponse()); } /** @@ -348,7 +348,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { return HTTPC_ERROR_SEND_HEADER_FAILED; } - size_t buff_size = HTTP_TCP_BUFFER_SIZE; + int buff_size = HTTP_TCP_BUFFER_SIZE; int len = size; int bytesWritten = 0; @@ -371,7 +371,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) { // get available data size - size_t s = stream->available(); + int s = stream->available(); if(len) { s = ((s > len) ? len : s); @@ -461,11 +461,11 @@ WiFiClient * HTTPClient::getStreamPtr(void) { int HTTPClient::writeToStream(Stream * stream) { if(!stream) { - return HTTPC_ERROR_NO_STREAM; + return returnError(HTTPC_ERROR_NO_STREAM); } if(!connected()) { - return HTTPC_ERROR_NOT_CONNECTED; + return returnError(HTTPC_ERROR_NOT_CONNECTED); } // get length of document (is -1 when Server sends no Content-Length header) @@ -474,28 +474,56 @@ int HTTPClient::writeToStream(Stream * stream) { if(_transferEncoding == HTTPC_TE_IDENTITY) { ret = writeToStreamDataBlock(stream, len); + + // have we an error? + if(ret < 0) { + return returnError(ret); + } } else if(_transferEncoding == HTTPC_TE_CHUNKED) { + int size = 0; while(1) { + if(!connected()) { + return returnError(HTTPC_ERROR_CONNECTION_LOST); + } String chunkHeader = _tcp->readStringUntil('\n'); + + if(chunkHeader.length() <= 0) { + return returnError(HTTPC_ERROR_READ_TIMEOUT); + } + chunkHeader.trim(); // remove \r // read size of chunk len = (uint32_t) strtol((const char *) chunkHeader.c_str(), NULL, 16); + size += len; DEBUG_HTTPCLIENT("[HTTP-Client] read chunk len: %d\n", len); + + // data left? if(len > 0) { int r = writeToStreamDataBlock(stream, len); if(r < 0) { // error in writeToStreamDataBlock - return r; + return returnError(r); } ret += r; } else { + + // if no length Header use global chunk size + if(_size <= 0) { + _size = size; + } + + // check if we have write all data out + if(ret != _size) { + return returnError(HTTPC_ERROR_STREAM_WRITE); + } break; } + delay(0); } } else { - return HTTPC_ERROR_ENCODING; + return returnError(HTTPC_ERROR_ENCODING); } end(); @@ -546,6 +574,10 @@ String HTTPClient::errorToString(int error) { return String("too less ram"); case HTTPC_ERROR_ENCODING: return String("Transfer-Encoding not supported"); + case HTTPC_ERROR_STREAM_WRITE: + return String("Stream write error"); + case HTTPC_ERROR_READ_TIMEOUT: + return String("read Timeout"); default: return String(); } @@ -829,23 +861,50 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { } // read data - int c = _tcp->readBytes(buff, readBytes); + int bytesRead = _tcp->readBytes(buff, readBytes); // write it to Stream - int w = stream->write(buff, c); - bytesWritten += w; - if(w != c) { - DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] short write asked for %d but got %d\n", c, w); - break; + int bytesWrite = stream->write(buff, bytesRead); + bytesWritten += bytesWrite; + + // are all Bytes a writen to stream ? + if(bytesWrite != bytesRead) { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] short write asked for %d but got %d retry...\n", bytesRead, bytesWrite); + + // check for write error + if(stream->getWriteError()) { + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); + + //reset write error for retry + stream->clearWriteError(); + } + + // some time for the stream + delay(1); + + int leftBytes = (readBytes - bytesWrite); + + // retry to send the missed bytes + bytesWrite = stream->write((buff + bytesWrite), leftBytes); + bytesWritten += bytesWrite; + + if(bytesWrite != leftBytes) { + // failed again + DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] short write asked for %d but got %d failed.\n", leftBytes, bytesWrite); + free(buff); + return HTTPC_ERROR_STREAM_WRITE; + } } + // check for write error if(stream->getWriteError()) { DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); - break; + return HTTPC_ERROR_STREAM_WRITE; } + // count bytes to read left if(len > 0) { - len -= c; + len -= readBytes; } delay(0); @@ -869,3 +928,19 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { return bytesWritten; } + +/** + * called to handle error return, may disconnect the connection if still exists + * @param error + * @return error + */ +int HTTPClient::returnError(int error) { + if(error < 0) { + DEBUG_HTTPCLIENT("[HTTP-Client][returnError] error(%d): %s\n", error, errorToString(error).c_str()); + if(connected()) { + DEBUG_HTTPCLIENT("[HTTP-Client][returnError] tcp stop\n"); + _tcp->stop(); + } + } + return error; +} diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 6b65ed526..024a27064 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -25,7 +25,7 @@ #ifndef ESP8266HTTPClient_H_ #define ESP8266HTTPClient_H_ -//#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) +#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_HTTPCLIENT #define DEBUG_HTTPCLIENT(...) @@ -43,7 +43,8 @@ #define HTTPC_ERROR_NO_HTTP_SERVER (-7) #define HTTPC_ERROR_TOO_LESS_RAM (-8) #define HTTPC_ERROR_ENCODING (-9) - +#define HTTPC_ERROR_STREAM_WRITE (-10) +#define HTTPC_ERROR_READ_TIMEOUT (-11) /// size for the stream handling #define HTTP_TCP_BUFFER_SIZE (1460) @@ -197,7 +198,7 @@ class HTTPClient { bool _canReuse; transferEncoding_t _transferEncoding; - + int returnError(int error); bool connect(void); bool sendHeader(const char * type); int handleHeaderResponse(); From 53287f457310162abc6777d8172d661e46becdb2 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 12:14:46 +0100 Subject: [PATCH 29/38] rework sendRequest stream too --- .../src/ESP8266HTTPClient.cpp | 84 ++++++++++++++----- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 715a4b4d1..d95242238 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -331,12 +331,12 @@ int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size) { int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { if(!stream) { - return HTTPC_ERROR_NO_STREAM; + return returnError(HTTPC_ERROR_NO_STREAM); } // connect to server if(!connect()) { - return HTTPC_ERROR_CONNECTION_REFUSED; + return returnError(HTTPC_ERROR_CONNECTION_REFUSED); } if(size > 0) { @@ -345,7 +345,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { // send Header if(!sendHeader(type)) { - return HTTPC_ERROR_SEND_HEADER_FAILED; + return returnError(HTTPC_ERROR_SEND_HEADER_FAILED); } int buff_size = HTTP_TCP_BUFFER_SIZE; @@ -371,25 +371,68 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) { // get available data size - int s = stream->available(); + int sizeAvailable = stream->available(); - if(len) { - s = ((s > len) ? len : s); - } + if(sizeAvailable) { - if(s) { - int c = stream->readBytes(buff, ((s > buff_size) ? buff_size : s)); + int readBytes = sizeAvailable; - // write it to Stream - int w = _tcp->write((const uint8_t *) buff, c); - bytesWritten += w; - if(w != c) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write asked for %d but got %d\n", c, w); - break; + // read only the asked bytes + if(len > 0 && readBytes > len) { + readBytes = len; } + // not read more the buffer can handle + if(readBytes > buff_size) { + readBytes = buff_size; + } + + // read data + int bytesRead = stream->readBytes(buff, readBytes); + + // write it to Stream + int bytesWrite = _tcp->write((const uint8_t *) buff, bytesRead); + bytesWritten += bytesWrite; + + // are all Bytes a writen to stream ? + if(bytesWrite != bytesRead) { + DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d retry...\n", bytesRead, bytesWrite); + + // check for write error + if(_tcp->getWriteError()) { + DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError()); + + //reset write error for retry + _tcp->clearWriteError(); + } + + // some time for the stream + delay(1); + + int leftBytes = (readBytes - bytesWrite); + + // retry to send the missed bytes + bytesWrite = _tcp->write((const uint8_t *) (buff + bytesWrite), leftBytes); + bytesWritten += bytesWrite; + + if(bytesWrite != leftBytes) { + // failed again + DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d failed.\n", leftBytes, bytesWrite); + free(buff); + return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); + } + } + + // check for write error + if(_tcp->getWriteError()) { + DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError()); + free(buff); + return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); + } + + // count bytes to read left if(len > 0) { - len -= c; + len -= readBytes; } delay(0); @@ -403,18 +446,18 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { if(size && (int) size != bytesWritten) { DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!"); - return HTTPC_ERROR_SEND_PAYLOAD_FAILED; + return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); } else { DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten); } } else { DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); - return HTTPC_ERROR_TOO_LESS_RAM; + return returnError(HTTPC_ERROR_TOO_LESS_RAM); } // handle Server Response (Header) - return handleHeaderResponse(); + return returnError(handleHeaderResponse()); } /** @@ -851,7 +894,7 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { int readBytes = sizeAvailable; // read only the asked bytes - if(readBytes > len) { + if(len > 0 && readBytes > len) { readBytes = len; } @@ -899,6 +942,7 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { // check for write error if(stream->getWriteError()) { DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); + free(buff); return HTTPC_ERROR_STREAM_WRITE; } From b828f34348d9b1d9af7db1d1997cc7dc2a53a3ed Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 12:16:22 +0100 Subject: [PATCH 30/38] some docu --- libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index d95242238..79923893a 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -864,10 +864,10 @@ int HTTPClient::handleHeaderResponse() { /** - * - * @param stream - * @param len - * @return + * write one Data Block to Stream + * @param stream Stream * + * @param size int + * @return < 0 = error >= 0 = size written */ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { int buff_size = HTTP_TCP_BUFFER_SIZE; From ef748e369a57cde938ab29689843a14a4087227b Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 14:02:00 +0100 Subject: [PATCH 31/38] allow downgrade to HTTP 1.0 use HTTP/1.0 for update since the update handler not support any transfer Encoding --- .../src/ESP8266HTTPClient.cpp | 26 +++++++++++++++++-- .../ESP8266HTTPClient/src/ESP8266HTTPClient.h | 3 +++ .../src/ESP8266httpUpdate.cpp | 3 +++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 79923893a..b1558f3b6 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -41,6 +41,7 @@ HTTPClient::HTTPClient() { _reuse = false; _tcpTimeout = HTTPCLIENT_DEFAULT_TCP_TIMEOUT; + _useHTTP10 = false; _https = false; @@ -266,6 +267,16 @@ void HTTPClient::setTimeout(uint16_t timeout) { } } + + +/** + * use HTTP1.0 + * @param timeout + */ +void HTTPClient::useHTTP10(bool useHTTP10) { + _useHTTP10 = useHTTP10; +} + /** * send a GET request * @return http code @@ -757,10 +768,17 @@ bool HTTPClient::sendHeader(const char * type) { return false; } - String header = String(type) + " " + _url + " HTTP/1.1\r\n" + String header = String(type) + " " + _url + " HTTP/1."; + + if(_useHTTP10) { + header += "0"; + } else { + header += "1"; + } + + header += "\r\n" "Host: " + _host + "\r\n" "User-Agent: " + _userAgent + "\r\n" - "Accept-Encoding: identity;q=1 chunked;q=0.1 *;q=0\r\n" "Connection: "; if(_reuse) { @@ -770,6 +788,10 @@ bool HTTPClient::sendHeader(const char * type) { } header += "\r\n"; + if(!_useHTTP10) { + header += "Accept-Encoding: identity;q=1 chunked;q=0.1 *;q=0\r\n"; + } + if(_base64Authorization.length()) { header += "Authorization: Basic " + _base64Authorization + "\r\n"; } diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 024a27064..aff0ff1ed 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -137,6 +137,8 @@ class HTTPClient { void setAuthorization(const char * auth); void setTimeout(uint16_t timeout); + void useHTTP10(bool usehttp10 = true); + /// request handling int GET(); int POST(uint8_t * payload, size_t size); @@ -180,6 +182,7 @@ class HTTPClient { uint16_t _port; bool _reuse; uint16_t _tcpTimeout; + bool _useHTTP10; String _url; bool _https; diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index f45846440..05b42ea8d 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -146,6 +146,9 @@ t_httpUpdate_return ESP8266HTTPUpdate::handleUpdate(HTTPClient * http, const cha t_httpUpdate_return ret = HTTP_UPDATE_FAILED; + // use HTTP/1.0 for update since the update handler not support any transfer Encoding + http->useHTTP10(true); + http->setTimeout(8000); http->setUserAgent("ESP8266-http-Update"); http->addHeader("x-ESP8266-STA-MAC", WiFi.macAddress()); http->addHeader("x-ESP8266-AP-MAC", WiFi.softAPmacAddress()); From 1ab74c1c76372ac1c9a5801800fd10d98d2c1329 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 15:00:00 +0100 Subject: [PATCH 32/38] add missing return HTTPC_ERROR_STREAM_WRITE --- libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index b1558f3b6..705a5925b 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -985,6 +985,7 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) { if((size > 0) && (size != bytesWritten)) { DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); + return HTTPC_ERROR_STREAM_WRITE; } } else { From 9b06b889c9399247ccbd185f9b07df0263fd1b0d Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 31 Dec 2015 17:10:38 +0100 Subject: [PATCH 33/38] disable HTTP client debug --- libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index aff0ff1ed..bcd1cc3a1 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -25,7 +25,7 @@ #ifndef ESP8266HTTPClient_H_ #define ESP8266HTTPClient_H_ -#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) +//#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) #ifndef DEBUG_HTTPCLIENT #define DEBUG_HTTPCLIENT(...) From 9b369dbae40a0bc220ec298db9351481aef2bb6f Mon Sep 17 00:00:00 2001 From: Buzz Burrowes Date: Fri, 1 Jan 2016 00:14:41 -0500 Subject: [PATCH 34/38] empty committ for pull request --- libraries/ESP8266mDNS/ESP8266mDNS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 34fdd4757..a690bdf22 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -495,7 +495,7 @@ void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint1 size_t hostNameLen = hostName.length(); char underscore[] = "_"; - + // build service name with _ char serviceName[os_strlen(service)+2]; os_strcpy(serviceName,underscore); From 2b23b005aab605f1fb74bd2bbd388728b69ead86 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 2 Jan 2016 12:24:05 +0100 Subject: [PATCH 35/38] allow control of enabling debug and debug level from IDE --- boards.txt | 26 ++++++++++ cores/esp8266/core_esp8266_main.cpp | 3 ++ cores/esp8266/debug.h | 4 +- .../ESP8266HTTPClient/src/ESP8266HTTPClient.h | 6 ++- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 13 +++-- libraries/ESP8266WebServer/src/Parsing.cpp | 50 ++++++++++--------- .../ESP8266WiFi/src/WiFiClientSecure.cpp | 4 +- .../ESP8266httpUpdate/src/ESP8266httpUpdate.h | 6 ++- platform.txt | 6 +-- 9 files changed, 84 insertions(+), 34 deletions(-) diff --git a/boards.txt b/boards.txt index d59c254ee..cea94eeeb 100644 --- a/boards.txt +++ b/boards.txt @@ -6,6 +6,8 @@ menu.FlashFreq=Flash Frequency menu.UploadTool=Upload Using menu.ResetMethod=Reset Method menu.ESPModule=Module +menu.Debug=Debug port +menu.DebugLevel=Debug Level ############################################################## generic.name=Generic ESP8266 Module @@ -26,6 +28,8 @@ generic.build.core=esp8266 generic.build.variant=generic generic.build.flash_mode=qio generic.build.spiffs_pagesize=256 +generic.build.debug_port= +generic.build.debug_level= generic.menu.UploadTool.esptool=Serial generic.menu.UploadTool.esptool.upload.tool=esptool @@ -166,6 +170,28 @@ generic.menu.ResetMethod.ck.upload.resetmethod=ck generic.menu.ResetMethod.nodemcu=nodemcu generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu +generic.menu.Debug.Disabled=Disabled +generic.menu.Debug.Disabled.build.debug_port= +generic.menu.Debug.Serial=Serial +generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial +generic.menu.Debug.Serial1=Serial1 +generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1 + +generic.menu.DebugLevel.None=None +generic.menu.DebugLevel.None.build.debug_level= +generic.menu.DebugLevel.Core=Core +generic.menu.DebugLevel.Core.build.debug_level=-DDEBUG_ESP_CORE +generic.menu.DebugLevel.SSL=Core + SSL +generic.menu.DebugLevel.SSL.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL +generic.menu.DebugLevel.HTTPClient=HTTPClient +generic.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT +generic.menu.DebugLevel.HTTPUpdate=HTTPUpdate +generic.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE +generic.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate +generic.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE +generic.menu.DebugLevel.HTTPServer=HTTPServer +generic.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER + # disabled because espressif's bootloader refuses to write above 4M # generic.menu.FlashSize.8M=8M (7M SPIFFS) # generic.menu.FlashSize.8M.build.flash_size=1M diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index f4a122415..0c1eb02bf 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -101,6 +101,9 @@ static void loop_wrapper() { preloop_update_frequency(); if(!setup_done) { setup(); +#ifdef DEBUG_ESP_PORT + DEBUG_ESP_PORT.setDebugOutput(true); +#endif setup_done = true; } loop(); diff --git a/cores/esp8266/debug.h b/cores/esp8266/debug.h index 98bdaf03c..89d18c05b 100644 --- a/cores/esp8266/debug.h +++ b/cores/esp8266/debug.h @@ -4,7 +4,9 @@ #include #include -//#define DEBUGV(...) ets_printf(__VA_ARGS__) +#ifdef DEBUG_ESP_CORE +#define DEBUGV(...) ets_printf(__VA_ARGS__) +#endif #ifndef DEBUGV #define DEBUGV(...) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index bcd1cc3a1..704841a8c 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -25,7 +25,11 @@ #ifndef ESP8266HTTPClient_H_ #define ESP8266HTTPClient_H_ -//#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ ) +#ifdef DEBUG_ESP_HTTP_CLIENT +#ifdef DEBUG_ESP_PORT +#define DEBUG_HTTPCLIENT(...) DEBUG_ESP_PORT.printf( __VA_ARGS__ ) +#endif +#endif #ifndef DEBUG_HTTPCLIENT #define DEBUG_HTTPCLIENT(...) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index a2c8a9866..77e59af6a 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -28,8 +28,13 @@ #include "ESP8266WebServer.h" #include "FS.h" #include "detail/RequestHandlersImpl.h" -// #define DEBUG + +//#define DEBUG_ESP_HTTP_SERVER +#ifdef DEBUG_ESP_PORT +#define DEBUG_OUTPUT DEBUG_ESP_PORT +#else #define DEBUG_OUTPUT Serial +#endif const char * AUTHORIZATION_HEADER = "Authorization"; @@ -155,7 +160,7 @@ void ESP8266WebServer::handleClient() { return; } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.println("New client"); #endif @@ -416,13 +421,13 @@ void ESP8266WebServer::onNotFound(THandlerFunction fn) { void ESP8266WebServer::_handleRequest() { bool handled = false; if (!_currentHandler){ -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.println("request handler not found"); #endif } else { handled = _currentHandler->handle(*this, _currentMethod, _currentUri); -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER if (!handled) { DEBUG_OUTPUT.println("request handler failed to handle request"); } diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 26304946b..7eac20def 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -24,8 +24,12 @@ #include "WiFiClient.h" #include "ESP8266WebServer.h" -//#define DEBUG +//#define DEBUG_ESP_HTTP_SERVER +#ifdef DEBUG_ESP_PORT +#define DEBUG_OUTPUT DEBUG_ESP_PORT +#else #define DEBUG_OUTPUT Serial +#endif bool ESP8266WebServer::_parseRequest(WiFiClient& client) { // Read the first line of HTTP request @@ -41,7 +45,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { int addr_start = req.indexOf(' '); int addr_end = req.indexOf(' ', addr_start + 1); if (addr_start == -1 || addr_end == -1) { -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Invalid request: "); DEBUG_OUTPUT.println(req); #endif @@ -72,7 +76,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { } _currentMethod = method; -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("method: "); DEBUG_OUTPUT.print(methodStr); DEBUG_OUTPUT.print(" url: "); @@ -111,7 +115,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { headerValue.trim(); _collectHeader(headerName.c_str(),headerValue.c_str()); - #ifdef DEBUG + #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("headerName: "); DEBUG_OUTPUT.println(headerName); DEBUG_OUTPUT.print("headerValue: "); @@ -142,7 +146,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { char *plainBuf = (char*)malloc(plainLen+1); client.readBytes(plainBuf, plainLen); plainBuf[plainLen] = '\0'; -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); #endif @@ -177,7 +181,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { headerValue = req.substring(headerDiv + 2); _collectHeader(headerName.c_str(),headerValue.c_str()); - #ifdef DEBUG + #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("headerName: "); DEBUG_OUTPUT.println(headerName); DEBUG_OUTPUT.print("headerValue: "); @@ -192,7 +196,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { } client.flush(); -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Request: "); DEBUG_OUTPUT.println(url); DEBUG_OUTPUT.print(" Arguments: "); @@ -213,7 +217,7 @@ bool ESP8266WebServer::_collectHeader(const char* headerName, const char* header } void ESP8266WebServer::_parseArguments(String data) { -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("args: "); DEBUG_OUTPUT.println(data); #endif @@ -233,7 +237,7 @@ void ESP8266WebServer::_parseArguments(String data) { ++i; ++_currentArgCount; } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("args count: "); DEBUG_OUTPUT.println(_currentArgCount); #endif @@ -244,7 +248,7 @@ void ESP8266WebServer::_parseArguments(String data) { for (iarg = 0; iarg < _currentArgCount;) { int equal_sign_index = data.indexOf('=', pos); int next_arg_index = data.indexOf('&', pos); -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("pos "); DEBUG_OUTPUT.print(pos); DEBUG_OUTPUT.print("=@ "); @@ -253,7 +257,7 @@ void ESP8266WebServer::_parseArguments(String data) { DEBUG_OUTPUT.println(next_arg_index); #endif if ((equal_sign_index == -1) || ((equal_sign_index > next_arg_index) && (next_arg_index != -1))) { -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("arg missing value: "); DEBUG_OUTPUT.println(iarg); #endif @@ -265,7 +269,7 @@ void ESP8266WebServer::_parseArguments(String data) { RequestArgument& arg = _currentArgs[iarg]; arg.key = data.substring(pos, equal_sign_index); arg.value = urlDecode(data.substring(equal_sign_index + 1, next_arg_index)); -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("arg "); DEBUG_OUTPUT.print(iarg); DEBUG_OUTPUT.print(" key: "); @@ -279,7 +283,7 @@ void ESP8266WebServer::_parseArguments(String data) { pos = next_arg_index + 1; } _currentArgCount = iarg; -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("args count: "); DEBUG_OUTPUT.println(_currentArgCount); #endif @@ -308,7 +312,7 @@ uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t len){ -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Parse Form: Boundary: "); DEBUG_OUTPUT.print(boundary); DEBUG_OUTPUT.print(" Length: "); @@ -346,14 +350,14 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t argFilename = argName.substring(nameStart+2, argName.length() - 1); argName = argName.substring(0, argName.indexOf('"')); argIsFile = true; -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("PostArg FileName: "); DEBUG_OUTPUT.println(argFilename); #endif //use GET to set the filename if uploading using blob if (argFilename == "blob" && hasArg("filename")) argFilename = arg("filename"); } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("PostArg Name: "); DEBUG_OUTPUT.println(argName); #endif @@ -366,7 +370,7 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t client.readStringUntil('\r'); client.readStringUntil('\n'); } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("PostArg Type: "); DEBUG_OUTPUT.println(argType); #endif @@ -378,7 +382,7 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t if (argValue.length() > 0) argValue += "\n"; argValue += line; } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("PostArg Value: "); DEBUG_OUTPUT.println(argValue); DEBUG_OUTPUT.println(); @@ -389,7 +393,7 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t arg.value = argValue; if (line == ("--"+boundary+"--")){ -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.println("Done Parsing POST"); #endif break; @@ -401,7 +405,7 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t _currentUpload.type = argType; _currentUpload.totalSize = 0; _currentUpload.currentSize = 0; -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Start File: "); DEBUG_OUTPUT.print(_currentUpload.filename); DEBUG_OUTPUT.print(" Type: "); @@ -450,7 +454,7 @@ readfile: _currentUpload.status = UPLOAD_FILE_END; if(_currentHandler && _currentHandler->canUpload(_currentUri)) _currentHandler->upload(*this, _currentUri, _currentUpload); -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("End File: "); DEBUG_OUTPUT.print(_currentUpload.filename); DEBUG_OUTPUT.print(" Type: "); @@ -461,7 +465,7 @@ readfile: line = client.readStringUntil(0x0D); client.readStringUntil(0x0A); if (line == "--"){ -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.println("Done Parsing POST"); #endif break; @@ -507,7 +511,7 @@ readfile: if (postArgs) delete[] postArgs; return true; } -#ifdef DEBUG +#ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Error: line: "); DEBUG_OUTPUT.println(line); #endif diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp index 484a23fc0..1c6b3bb37 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecure.cpp @@ -41,7 +41,9 @@ extern "C" #include "include/ClientContext.h" #include "c_types.h" -//#define DEBUG_SSL +#ifdef DEBUG_ESP_SSL +#define DEBUG_SSL +#endif #ifdef DEBUG_SSL #define SSL_DEBUG_OPTS SSL_DISPLAY_STATES diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index ddfefb44b..81f03385f 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -32,7 +32,11 @@ #include #include -//#define DEBUG_HTTP_UPDATE(...) Serial1.printf( __VA_ARGS__ ) +#ifdef DEBUG_ESP_HTTP_UPDATE +#ifdef DEBUG_ESP_PORT +#define DEBUG_HTTP_UPDATE(...) DEBUG_ESP_PORT.printf( __VA_ARGS__ ) +#endif +#endif #ifndef DEBUG_HTTP_UPDATE #define DEBUG_HTTP_UPDATE(...) diff --git a/platform.txt b/platform.txt index efeb816e9..52c5eac5e 100644 --- a/platform.txt +++ b/platform.txt @@ -61,13 +61,13 @@ compiler.objcopy.eep.extra_flags= compiler.elf2hex.extra_flags= ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files -recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" +recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files -recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" +recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}" From 995f02f43730a3f4f98189b67c47bc6460b0da52 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 2 Jan 2016 12:54:34 +0100 Subject: [PATCH 36/38] add more debug levels --- boards.txt | 10 ++++++++++ cores/esp8266/Updater.h | 6 +++++- libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h | 6 +++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/boards.txt b/boards.txt index cea94eeeb..389aee3b2 100644 --- a/boards.txt +++ b/boards.txt @@ -183,14 +183,24 @@ generic.menu.DebugLevel.Core=Core generic.menu.DebugLevel.Core.build.debug_level=-DDEBUG_ESP_CORE generic.menu.DebugLevel.SSL=Core + SSL generic.menu.DebugLevel.SSL.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL +generic.menu.DebugLevel.WiFic=Core + WiFi +generic.menu.DebugLevel.WiFic.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI +generic.menu.DebugLevel.WiFi=WiFi +generic.menu.DebugLevel.WiFi.build.debug_level=-DDEBUG_ESP_WIFI generic.menu.DebugLevel.HTTPClient=HTTPClient generic.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT generic.menu.DebugLevel.HTTPUpdate=HTTPUpdate generic.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE generic.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate generic.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE +generic.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater +generic.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER generic.menu.DebugLevel.HTTPServer=HTTPServer generic.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER +generic.menu.DebugLevel.UPDATER=Updater (OTA) +generic.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER +generic.menu.DebugLevel.all=All +generic.menu.DebugLevel.all.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER # disabled because espressif's bootloader refuses to write above 4M # generic.menu.FlashSize.8M=8M (7M SPIFFS) diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index 48fe8560f..49a1c4504 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -22,7 +22,11 @@ #define U_SPIFFS 100 #define U_AUTH 200 -//#define DEBUG_UPDATER Serial +#ifdef DEBUG_ESP_UPDATER +#ifdef DEBUG_ESP_PORT +#define DEBUG_UPDATER DEBUG_ESP_PORT +#endif +#endif class UpdaterClass { public: diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h index 63c180c31..1b4b75020 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h @@ -32,7 +32,11 @@ #undef max #include -//#define DEBUG_WIFI_MULTI(...) Serial1.printf( __VA_ARGS__ ) +#ifdef DEBUG_ESP_WIFI +#ifdef DEBUG_ESP_PORT +#define DEBUG_WIFI_MULTI(...) DEBUG_ESP_PORT.printf( __VA_ARGS__ ) +#endif +#endif #ifndef DEBUG_WIFI_MULTI #define DEBUG_WIFI_MULTI(...) From 137c50757eacf4423d35ea9cde65dcae8db93337 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 2 Jan 2016 12:58:56 +0100 Subject: [PATCH 37/38] add OTA debug level --- boards.txt | 8 ++++++-- libraries/ArduinoOTA/ArduinoOTA.cpp | 31 +++++++++++++++++------------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/boards.txt b/boards.txt index 389aee3b2..9e80cefa9 100644 --- a/boards.txt +++ b/boards.txt @@ -197,10 +197,14 @@ generic.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater generic.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER generic.menu.DebugLevel.HTTPServer=HTTPServer generic.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER -generic.menu.DebugLevel.UPDATER=Updater (OTA) +generic.menu.DebugLevel.UPDATER=Updater generic.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER +generic.menu.DebugLevel.OTA=OTA +generic.menu.DebugLevel.OTA.build.debug_level=-DDEBUG_ESP_OTA +generic.menu.DebugLevel.OTA2=OTA + Updater +generic.menu.DebugLevel.OTA2.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER generic.menu.DebugLevel.all=All -generic.menu.DebugLevel.all.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER +generic.menu.DebugLevel.all.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA # disabled because espressif's bootloader refuses to write above 4M # generic.menu.FlashSize.8M=8M (7M SPIFFS) diff --git a/libraries/ArduinoOTA/ArduinoOTA.cpp b/libraries/ArduinoOTA/ArduinoOTA.cpp index 52041b94d..386e230e8 100644 --- a/libraries/ArduinoOTA/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/ArduinoOTA.cpp @@ -18,7 +18,12 @@ extern "C" { #include "include/UdpContext.h" #include -//#define OTA_DEBUG 1 + +#ifdef DEBUG_ESP_OTA +#ifdef DEBUG_ESP_PORT +#define OTA_DEBUG DEBUG_ESP_PORT +#endif +#endif ArduinoOTAClass::ArduinoOTAClass() : _port(0) @@ -109,8 +114,8 @@ void ArduinoOTAClass::begin() { } _initialized = true; _state = OTA_IDLE; -#if OTA_DEBUG - Serial.printf("OTA server at: %s.local:%u\n", _hostname.c_str(), _port); +#ifdef OTA_DEBUG + OTA_DEBUG.printf("OTA server at: %s.local:%u\n", _hostname.c_str(), _port); #endif } @@ -226,8 +231,8 @@ void ArduinoOTAClass::_onRx(){ void ArduinoOTAClass::_runUpdate() { if (!Update.begin(_size, _cmd)) { -#if OTA_DEBUG - Serial.println("Update Begin Error"); +#ifdef OTA_DEBUG + OTA_DEBUG.println("Update Begin Error"); #endif if (_error_callback) { _error_callback(OTA_BEGIN_ERROR); @@ -249,8 +254,8 @@ void ArduinoOTAClass::_runUpdate() { WiFiClient client; if (!client.connect(_ota_ip, _ota_port)) { -#if OTA_DEBUG - Serial.printf("Connect Failed\n"); +#ifdef OTA_DEBUG + OTA_DEBUG.printf("Connect Failed\n"); #endif _udp_ota->listen(*IP_ADDR_ANY, _port); if (_error_callback) { @@ -265,8 +270,8 @@ void ArduinoOTAClass::_runUpdate() { while (!client.available() && waited--) delay(1); if (!waited){ -#if OTA_DEBUG - Serial.printf("Receive Failed\n"); +#ifdef OTA_DEBUG + OTA_DEBUG.printf("Receive Failed\n"); #endif _udp_ota->listen(*IP_ADDR_ANY, _port); if (_error_callback) { @@ -288,8 +293,8 @@ void ArduinoOTAClass::_runUpdate() { client.print("OK"); client.stop(); delay(10); -#if OTA_DEBUG - Serial.printf("Update Success\nRebooting...\n"); +#ifdef OTA_DEBUG + OTA_DEBUG.printf("Update Success\nRebooting...\n"); #endif if (_end_callback) { _end_callback(); @@ -301,8 +306,8 @@ void ArduinoOTAClass::_runUpdate() { _error_callback(OTA_END_ERROR); } Update.printError(client); -#if OTA_DEBUG - Update.printError(Serial); +#ifdef OTA_DEBUG + Update.printError(OTA_DEBUG); #endif _state = OTA_IDLE; } From dca03db4ecccff1c677ed188ba57deb1c004e785 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sat, 2 Jan 2016 19:30:03 +0100 Subject: [PATCH 38/38] add default value for all Boards --- boards.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/boards.txt b/boards.txt index 9e80cefa9..9377b4f71 100644 --- a/boards.txt +++ b/boards.txt @@ -240,6 +240,8 @@ espduino.build.variant=espduino espduino.build.flash_mode=dio espduino.build.flash_size=4M espduino.build.flash_freq=40 +espduino.build.debug_port= +espduino.build.debug_level= espduino.menu.CpuFrequency.80=80 MHz espduino.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -307,6 +309,8 @@ huzzah.build.variant=adafruit huzzah.build.flash_mode=qio huzzah.build.flash_size=4M huzzah.build.flash_freq=40 +huzzah.build.debug_port= +huzzah.build.debug_level= huzzah.menu.CpuFrequency.80=80 MHz huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -364,6 +368,8 @@ nodemcu.build.variant=nodemcu nodemcu.build.flash_mode=qio nodemcu.build.flash_size=4M nodemcu.build.flash_freq=40 +nodemcu.build.debug_port= +nodemcu.build.debug_level= nodemcu.menu.CpuFrequency.80=80 MHz nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -430,6 +436,8 @@ nodemcuv2.build.variant=nodemcu nodemcuv2.build.flash_mode=dio nodemcuv2.build.flash_size=4M nodemcuv2.build.flash_freq=40 +nodemcuv2.build.debug_port= +nodemcuv2.build.debug_level= nodemcuv2.menu.CpuFrequency.80=80 MHz nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -505,6 +513,8 @@ modwifi.build.spiffs_start=0x100000 modwifi.build.spiffs_end=0x1FB000 modwifi.build.spiffs_pagesize=256 modwifi.build.spiffs_blocksize=8192 +modwifi.build.debug_port= +modwifi.build.debug_level= modwifi.menu.CpuFrequency.80=80 MHz modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -561,6 +571,8 @@ thing.build.spiffs_start=0x6B000 thing.build.spiffs_end=0x7B000 thing.build.spiffs_blocksize=4096 thing.build.spiffs_pagesize=256 +thing.build.debug_port= +thing.build.debug_level= thing.menu.CpuFrequency.80=80 MHz thing.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -610,6 +622,8 @@ esp210.build.variant=generic esp210.build.flash_mode=qio esp210.build.flash_size=4M esp210.build.flash_freq=40 +esp210.build.debug_port= +esp210.build.debug_level= esp210.menu.CpuFrequency.80=80 MHz esp210.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -703,6 +717,8 @@ d1_mini.build.variant=d1_mini d1_mini.build.flash_mode=dio d1_mini.build.flash_size=4M d1_mini.build.flash_freq=40 +d1_mini.build.debug_port= +d1_mini.build.debug_level= d1_mini.menu.CpuFrequency.80=80 MHz d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -774,6 +790,8 @@ d1.build.variant=d1 d1.build.flash_mode=dio d1.build.flash_size=4M d1.build.flash_freq=40 +d1.build.debug_port= +d1.build.debug_level= d1.menu.CpuFrequency.80=80 MHz d1.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -847,6 +865,8 @@ espino.build.flash_mode=qio espino.build.flash_size=4M espino.build.flash_freq=40 espino.build.spiffs_pagesize=256 +espino.build.debug_port= +espino.build.debug_level= espino.menu.UploadTool.esptool=Serial espino.menu.UploadTool.esptool.upload.tool=esptool @@ -924,6 +944,8 @@ wifinfo.build.variant=wifinfo wifinfo.build.flash_mode=qio wifinfo.build.board=ESP8266_ESP12 wifinfo.build.spiffs_pagesize=256 +wifinfo.build.debug_port= +wifinfo.build.debug_level= #wifinfo.menu.ESPModule.ESP07512=ESP07 (1M/512K SPIFFS) #wifinfo.menu.ESPModule.ESP07512.build.board=ESP8266_ESP07