From 06c47f3e5bb64f5e368f6e87385087c72d1529fd Mon Sep 17 00:00:00 2001 From: Khoi Hoang <57012152+khoih-prog@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:10:11 -0500 Subject: [PATCH] v1.0.0 for ESP32 using `LwIP W6100 Ethernet` #### Releases v1.0.0 1. Initial coding to port [ESP_WiFiManager](https://github.com/khoih-prog/ESP_WiFiManager) to ESP32 boards using `LwIP W6100 Ethernet`. 2. Use `allman astyle` --- .codespellrc | 7 + CONTRIBUTING.md | 84 + Images/Configuration_AIO_MQTT.png | Bin 0 -> 36319 bytes Images/Configuration_Standard.png | Bin 0 -> 17154 bytes Images/Info.png | Bin 0 -> 61948 bytes Images/Main.png | Bin 0 -> 13218 bytes Images/Saved.png | Bin 0 -> 2478 bytes Images/W6100.png | Bin 0 -> 118672 bytes LICENSE | 21 + changelog.md | 33 + .../ConfigOnDoubleReset.ino | 726 ++++++++ .../ConfigOnDoubleReset_TZ.ino | 755 ++++++++ examples/ConfigOnSwitch/ConfigOnSwitch.ino | 913 ++++++++++ .../ConfigOnSwitchFS/ConfigOnSwitchFS.ino | 1120 ++++++++++++ .../ConfigPortalParamsOnSwitch.ino | 1016 +++++++++++ .../ESP32_FSWebServer/ESP32_FSWebServer.ino | 1067 ++++++++++++ examples/ESP32_FSWebServer/README.md | 69 + .../ESP32_FSWebServer/data/CanadaFlag_1.png | Bin 0 -> 41214 bytes .../ESP32_FSWebServer/data/CanadaFlag_2.png | Bin 0 -> 8311 bytes .../ESP32_FSWebServer/data/CanadaFlag_3.jpg | Bin 0 -> 11156 bytes examples/ESP32_FSWebServer/data/edit.htm.gz | Bin 0 -> 4116 bytes examples/ESP32_FSWebServer/data/favicon.ico | Bin 0 -> 1150 bytes examples/ESP32_FSWebServer/data/graphs.js.gz | Bin 0 -> 1971 bytes examples/ESP32_FSWebServer/data/index.htm | 97 ++ .../pics/async-esp32fs.local.png | Bin 0 -> 20520 bytes .../pics/async-esp32fs.local_edit.png | Bin 0 -> 76964 bytes .../ESP32_FSWebServer_DRD.ino | 1121 ++++++++++++ examples/ESP32_FSWebServer_DRD/README.md | 69 + .../data/CanadaFlag_1.png | Bin 0 -> 41214 bytes .../data/CanadaFlag_2.png | Bin 0 -> 8311 bytes .../data/CanadaFlag_3.jpg | Bin 0 -> 11156 bytes .../ESP32_FSWebServer_DRD/data/edit.htm.gz | Bin 0 -> 4116 bytes .../ESP32_FSWebServer_DRD/data/favicon.ico | Bin 0 -> 1150 bytes .../ESP32_FSWebServer_DRD/data/graphs.js.gz | Bin 0 -> 1971 bytes examples/ESP32_FSWebServer_DRD/data/index.htm | 97 ++ .../pics/async-esp32fs.local.png | Bin 0 -> 20520 bytes .../pics/async-esp32fs.local_edit.png | Bin 0 -> 76964 bytes keywords.txt | 92 + library.json | 44 + library.properties | 12 + platformio/platformio.ini | 96 ++ src/ESP32_W6100_Manager.h | 30 + src/ESP32_W6100_Manager.hpp | 627 +++++++ src/ESP32_W6100_Manager_Debug.h | 89 + src/ESP32_W6100_Manager_Impl.h | 1211 +++++++++++++ src/utils/TZ.h | 1526 +++++++++++++++++ travis/common.sh | 51 + utils/astyle_library.conf | 70 + utils/restyle.sh | 6 + 49 files changed, 11049 insertions(+) create mode 100644 .codespellrc create mode 100644 CONTRIBUTING.md create mode 100644 Images/Configuration_AIO_MQTT.png create mode 100644 Images/Configuration_Standard.png create mode 100644 Images/Info.png create mode 100644 Images/Main.png create mode 100644 Images/Saved.png create mode 100644 Images/W6100.png create mode 100644 LICENSE create mode 100644 changelog.md create mode 100644 examples/ConfigOnDoubleReset/ConfigOnDoubleReset.ino create mode 100644 examples/ConfigOnDoubleReset_TZ/ConfigOnDoubleReset_TZ.ino create mode 100644 examples/ConfigOnSwitch/ConfigOnSwitch.ino create mode 100644 examples/ConfigOnSwitchFS/ConfigOnSwitchFS.ino create mode 100644 examples/ConfigPortalParamsOnSwitch/ConfigPortalParamsOnSwitch.ino create mode 100644 examples/ESP32_FSWebServer/ESP32_FSWebServer.ino create mode 100644 examples/ESP32_FSWebServer/README.md create mode 100644 examples/ESP32_FSWebServer/data/CanadaFlag_1.png create mode 100644 examples/ESP32_FSWebServer/data/CanadaFlag_2.png create mode 100644 examples/ESP32_FSWebServer/data/CanadaFlag_3.jpg create mode 100644 examples/ESP32_FSWebServer/data/edit.htm.gz create mode 100644 examples/ESP32_FSWebServer/data/favicon.ico create mode 100644 examples/ESP32_FSWebServer/data/graphs.js.gz create mode 100644 examples/ESP32_FSWebServer/data/index.htm create mode 100644 examples/ESP32_FSWebServer/pics/async-esp32fs.local.png create mode 100644 examples/ESP32_FSWebServer/pics/async-esp32fs.local_edit.png create mode 100644 examples/ESP32_FSWebServer_DRD/ESP32_FSWebServer_DRD.ino create mode 100644 examples/ESP32_FSWebServer_DRD/README.md create mode 100644 examples/ESP32_FSWebServer_DRD/data/CanadaFlag_1.png create mode 100644 examples/ESP32_FSWebServer_DRD/data/CanadaFlag_2.png create mode 100644 examples/ESP32_FSWebServer_DRD/data/CanadaFlag_3.jpg create mode 100644 examples/ESP32_FSWebServer_DRD/data/edit.htm.gz create mode 100644 examples/ESP32_FSWebServer_DRD/data/favicon.ico create mode 100644 examples/ESP32_FSWebServer_DRD/data/graphs.js.gz create mode 100644 examples/ESP32_FSWebServer_DRD/data/index.htm create mode 100644 examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local.png create mode 100644 examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local_edit.png create mode 100644 keywords.txt create mode 100644 library.json create mode 100644 library.properties create mode 100644 platformio/platformio.ini create mode 100644 src/ESP32_W6100_Manager.h create mode 100644 src/ESP32_W6100_Manager.hpp create mode 100644 src/ESP32_W6100_Manager_Debug.h create mode 100644 src/ESP32_W6100_Manager_Impl.h create mode 100644 src/utils/TZ.h create mode 100644 travis/common.sh create mode 100644 utils/astyle_library.conf create mode 100644 utils/restyle.sh diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..00fe362 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,7 @@ +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = , +check-filenames = +check-hidden = +skip = ./.git,./src,./examples,./Packages_Patches,./LibraryPatches diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..b1d028b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,84 @@ +## Contributing to ESP32_W6100_Manager + +### Reporting Bugs + +Please report bugs in ESP32_W6100_Manager if you find them. + +However, before reporting a bug please check through the following: + +* [Existing Open Issues](https://github.com/khoih-prog/ESP32_W6100_Manager/issues) - someone might have already encountered this. + +If you don't find anything, please [open a new issue](https://github.com/khoih-prog/ESP32_W6100_Manager/issues/new). + +--- + +### How to submit a bug report + +Please ensure to specify the following: + +* Arduino IDE version (e.g. 1.8.19) or Platform.io version +* Board type (e.g. ESP32_DEV) +* Board Core Version (e.g. ESP32 core v2.0.6) +* Contextual information (e.g. what you were trying to achieve) +* Simplest possible steps to reproduce +* Anything that might be relevant in your opinion, such as: + * Operating system (Windows, Ubuntu, etc.) and the output of `uname -a` + * Network configuration + + +Please be educated, civilized and constructive as you've always been. Disrespective posts against [GitHub Code of Conduct](https://docs.github.com/en/site-policy/github-terms/github-event-code-of-conduct) will be ignored and deleted. + +--- + +### Example + +``` +Arduino IDE version: 1.8.19 +ESP32_DEV board +ESP32 core v2.0.6 +OS: Ubuntu 20.04 LTS +Linux xy-Inspiron-3593 5.15.0-58-generic #64~20.04.1-Ubuntu SMP Fri Jan 6 16:42:31 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux + +Context: +I encountered a crash while using this library +Steps to reproduce: +1. ... +2. ... +3. ... +4. ... +``` +--- + +### Additional context + +Add any other context about the problem here. + +--- + +### Sending Feature Requests + +Feel free to post feature requests. It's helpful if you can explain exactly why the feature would be useful. + +There are usually some outstanding feature requests in the [existing issues list](https://github.com/khoih-prog/ESP32_W6100_Manager/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement), feel free to add comments to them. + +--- + +### Sending Pull Requests + +Pull Requests with changes and fixes are also welcome! + +Please use the `astyle` to reformat the updated library code as follows (demo for Ubuntu Linux) + +1. Change directory to the library GitHub + +``` +xy@xy-Inspiron-3593:~$ cd Arduino/xy/ESP32_W6100_Manager_GitHub/ +xy@xy-Inspiron-3593:~/Arduino/xy/ESP32_W6100_Manager_GitHub$ +``` + +2. Issue astyle command + +``` +xy@xy-Inspiron-3593:~/Arduino/xy/ESP32_W6100_Manager_GitHub$ bash utils/restyle.sh +``` + diff --git a/Images/Configuration_AIO_MQTT.png b/Images/Configuration_AIO_MQTT.png new file mode 100644 index 0000000000000000000000000000000000000000..75ad6cae61aee038fffedbb4181e0538c6f26ded GIT binary patch literal 36319 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 literal 0 HcmV?d00001 diff --git a/Images/Info.png b/Images/Info.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4262a116a6f731fa6eea967655c0eaa613597d GIT binary patch literal 61948 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%0Ac2KLwa_jsCBzQibf*c&p?jIF8SKf;~q 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 z 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

rE@(!@#tN?)g zjAA&sERqa0TKsVb#aQDV4?c+mHhyP8hQL_N6bwWcfdLkJzB2(&hEF!#a1+ej)&7nL zegcmekxUe5WnE5jdwE4$vBP`qUf`C2^E}KlT#rsyolp*yWT zWtyZVx^^?2;83O`ug=qr)3$|ur36|{-6Hnj(Pvvmrj0)@ZVEd_8e5IT-V&h@>)JC< zG^*93$~DmjThGv-{g`s|rYGBz{%W$2P1`0*;gu0 zO%*LsZ~*9BtoplVcS?C9sx}JCO+xt2Kk`O#T=g@O8l9H;JC4Jf?R{&G-@GKtGu0U7 zUHGF4DKM|R;wTw!KNZ5XtZI5*6|jw2BQ!su0FuL|6XMy!D6hpdb@RcO->wI;JnM5t$LtBmZ6h5gk(Z>F93VdkphWW8>d4zqRW6eNA*`1|ALN z17x6MBu`~Uoq!k+S}aZ~4-oVYKGk909|w&7)cAgn-8V2_szZc*28r#lV(mX@G#D`%Y4% zbBDY~nfLYL2jm8pozCQzV&bA%C!3Ji*eK0prKEL9S!? zafrGk+~V?ic7E6ORy~2_n2EaJ%C7kjOLIe3h-Iu##3&C3D2aoOX^yX@_3xiPYwfaG z!UBkaif+QU0n;&Cr|NRS3BQCN9%)}iW=+-M0HYa?8js@sQjMdyuA7^amh5S-XzJc% z@WCh}r&4bkctSsS1_U`a=E)NE$d=FaCG+k$aCvW6H<$3a%EAFS8lqBLOX+o;C%a?>5i(;C$O z22f*5wBxg95z4syst*$}P>Cu?MR?2*8h%hh2N6vqQOZC;i)1pSI33Wj8yc`0`3deX zq6Q{`?Zh2oOfGOW0As0Q1!)DpYbyJh@~Z%nLMdKW+K-iK@N2k$d-xpG zQJC9wdB`4u;^C%!^m6+feU+DegOqPE6bg5+vHj=#AF$*<$jN`elK+kX{6A2H|6T0A z0WLv|BrJ*WJw=7IgB`D(H=ALr@VE3(Ac6$L#W%n0G<7r8|Lk6Lj0~_-^RPkrNFIgTa$f}Ur&(cSLwESW;H{-rDXp7n-|>~=yZZTwB7Nl0 z9W?qRlSj-1{_6fAz>$=b6xW<^3U!u+1vaN1bCps_5B$ct zQw1l$;OZjJ(Qp&CLa%c}=Q6cJ0VtYK`X!Lir1mPqj^4Zbq)UjbYTxd4_>X1wm;=Xo zt&=#%C#jOcODlR;?#pA<$=!PV)OYowr=)`15*vIW*xkCLI>+5sD5;d1F(vbYa}7() zV(riOZxBYnarMgQ8FY$4hBQ)%@ts^GHh}~K4h&gagl8!I58{kLgvkeZs+40w}R*{-6mvFs@EAu~5gDx2sTqpMBsio?y!dqRBcEiS+3%93o7Ng3`@e z5m_Vjwy94G$)xDk2RBLa%#vCBmm@TO<6- z`cHYsWLG!&9;AslfXrcbPws$N!qxPw1$JHu0wRkcbMLELq)q|p|Id?L8A$O=9g5< zBwi@9O?w=L{hl+3>VWQzM{Iyy;A)Omgg32ul7O3hY`_sKr{~+lZn$f|-!3MG0&rB+ zy&>Bz5wKz&G=4peR3_zAp;H=`O}6*a@n`T>BkD(+GwG_5%xk;559y7wV1UrRCy1L( zr+^RVP*|MVS)G0!K<_AzV>FNgLVSL;H8Hc-$L8Jsl+09tzsXH^#4VD2dsS`uy*E?3 zM=7*~e@5B*D)f?5j3GOn+v4Svp6{1vZd!&XN24`!^i(nkQ~RmNal_xi923Go5~J z783V~ea~b(e(j=_ubK;wVmAcjwrlTV>@RyXVh3s6s%cIOk1HF6WNRyK|D?f%c(W6k z$SmAddpSmOS-nuh46+8V;QuqO$Kie}$=N?K1HkARW3~MNF_vK#`n6qbHN_5Azk) z$5*?q8V{hZPc)6EH7{xNxlr^3lm*%#EnvJvb63-krEohK(ejfhl$ zQ6C`>QJ0lTpowJ-Oq*M|^`n;Pk$%;D7fV%ei$b=%3@;xfvfN;*wwPpi|G69A4m^n7gy<3{o}V#l9uk+HH6ihCaJ%?T*UNwoQi!9@Rg* zt;1?MNrT(tt_$-0y3Qm1&a#g+jrM(B0CT-7-NJz{Wxlgry_~4POr3Et=#v{wQ3qrt ziV#oT%`9MFFBrCKNqmJu%(LB&ML5a)5@l~mB{@lVI!p6-24>2r0GGhfZ)CpG1wuEU zEGdza!#?Uz3F{!j-)$A6Tir7}kmQ&rGci2n)?MbLFLyt`=I4!N-?LTX-(YPU{LpmB5;G{Z!Mvf- zSj_v;^|eJV6w+gMM#(ReW)$P>%Wb2=f4va>5!dBiz@*8*S1>wso zf7j2T>AXk3?OeC5P#cAHqQ3BV>X5r>jQ)n z7C6+RWkO&@hnY5NR<^G}8pJ5^@QnyM6r@6IIFOQM>?nUgolPJ+K-0f4*1 zD_K7m4Qpkve37075q#6sr)lkFtFw!@uvc=I;=bU$>A1 zE-KH&-Y*uV&;EQ&~*HI%W5SG~$V#E?Bgcu#)^Rs|H z1##DtCX%3gXR9E)JyvlM7Wka=F&eas^yO;jw+hpI3svW59i>6{O$19(oUAszhaVEK zP~-hLv(bCtl0jw34v_I}xwo$AZVM@M%=fuRr) zyO3*?<>$-^oh58_(kCmGeLFDragD;lvF4MUU3%4}{N)DI`MrX>jN4F|krh%W7Vk8rq1h)scyFuA4xFt_|m2*rN^r z*e1Vl`8-mq{bD`s_;7bm_R!tAIpeeW3qMR)62Ly{7|aIuL6?|tF{;Y}`0vGTty5E! z5JxoY*2tEY@y|iYQY;!ph_3cjbRn`h7aU$wIVtoeys?B+#jA!#q)FY(sV>S1j;C@? zf@KDGR3cItHGry&JqPb9Rjh1OXw2pi^e-8H^=nJQ(;bcjqVG|PqWW}*$ zY(2OJxG@rhSVPbO;390vH}l>Zh5Z9AI+h46_hU%(BJOnO{SMS`f$qJGg>SsHAKB`@ zteY0gL|>?}adXCzT8*nzW}trN)!7kuL6Sj`)rJE|NX5CC;IeMP3Q9A0m+=5?2nNSmxJeS57sssZkh5OAY|;t_x< zy`*57^(8I7jtLuOirAh3=yU=zWh=34Z-%I{n zSi*OzZUu%gz-Xf+=V9SG#z+=MR;kQw7jh#CaK4V=hGvPP*_=P!ZV^2Zpl6Wl;UGi> zCeKt1LWZT+JN_6pMvQh?RVog;!PG^!)UW`RQqJYF=DT z;$vZSrX8n0vCs5_DC_Nt3}7o!0yBe+irc+N_XM4L_@)sLB0&uoeM(6}G|*5*W3W(% z$!`HtJOu9Rs@H*Y4RP!k=`+M0iTDsEx$<`0cAqyfr+wM`AvTQ7N12ZxSRlStZgIi# z)*PVb^U(Jjfl0nBdvJMp^E$)V=d-Dp&o?+qKsYLc_3%_jlRPu??gfp?BuCJxpPk|(5K@SixBSi(*Tn{!I>)L=bAsDuG_x)Y z><3j15Z-qxlT4;oys8)Upt7FgNAY8y$>l$Vzu4YBQBs3w?|s~9aHu@VUH2i(D|DhTx=djR@Q53A<^;LGVMD zcCxzj35VN7eR+nQ9L?`EGR6=d5o6+KM&hZPu2fC(?_FRA&8nL4%MON7C#)3WET{ek zJt0SfsvLsZ`3n`}!B={Ty5i*<*ap23We<%b78-o-oCpw-ll{cre{Me~~hf-#uXy@Q}$2 zQ%SvairZTu)ElMu#NzQjdAXeTCnQi+TZYY;MbCmtgBf5#D=mh5)w_SMO=a!R3FxZHa^RPSCtOqcB|xI==iU0)I?mr zMBGv2r;>XTbxEih?+Rw~`lh7xsC_IqM!DPZ(Y|en-Qf5%2>+0i>~z{Uip$YbXqbvp zb@MZaaRVkCI&s=(U-r~;=EPUKJtZEfv?jiZk$%WwrF*Kup%d*Pn8({n2#hr@dEM3X zm2Pf2YpHGsP3sFFw=#f~(nSrsv|_)~BVhEM#`(7| z-^~W}X3>uGjHQ9H0>)mpup$yD6*K+y9*h<)t;WdnT`t?q-J1$isW?7@Jt$kO@nJ&D zD?sU5-@%aQ(N;d&Uxp0M8I3uRKBo%=cW3CTzO{J@FQI8@W(FM_ z74g_yvdb~EWJC_sc$U{?dY99c;YiMF^e2y5HOrIjB}i)v)+R zXhZ7~ms)0n4FF*tmZ4cb+UbR%YlPvsFP%bZuT+VFU>SBlABM`23;Vq=&a0)ye#=C2f8#@MSCLPs^(%P}SF_Ij{6M>~zg(Gtz?Bud zXOkinp)-MvD)u?8c`b3jB=6Os*XWOXf-^4R%noRE_}aCd@r*{`Mke!$zilh_vG891 z4vE4|avS%-Kxu4M5mxZ*DX~Pno2FGOmJkWY*6PSA_EI3_W!Cvz@TJ`RXe-qY=IxWa z)=ML0KUtm9z3qm^YmxHk;_dJ^(L>3$n7+mI7cL`lEV)CSWQW|eD*e^jZ~q3o?8_k3 lE5-h=SeXBBct_OaMYQjYNvC%s;~4m*FW{s-rcqICcO literal 0 HcmV?d00001 diff --git a/Images/Main.png b/Images/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..6d570d3509eee5e005258bea12d8c076bfbcaf65 GIT binary patch literal 13218 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 literal 0 HcmV?d00001 diff --git a/Images/Saved.png b/Images/Saved.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c89cb9d7076c3e3c9a8e06ba0bd14673eaf9b5 GIT binary patch literal 2478 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 Fe*ystmM8!K literal 0 HcmV?d00001 diff --git a/Images/W6100.png b/Images/W6100.png new file mode 100644 index 0000000000000000000000000000000000000000..867119addd8cc0cce0efa1346a65fd6b977f1c22 GIT binary patch literal 118672 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\>cQ_|&5X~0gOmfu)F{5y2FdkK)Hb(| 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%0AH@AP`nGZcX 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

-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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab72b02 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Khoi Hoang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..a4b390c --- /dev/null +++ b/changelog.md @@ -0,0 +1,33 @@ +# ESP32_W6100_Manager Library + +[![arduino-library-badge](https://www.ardu-badge.com/badge/ESP32_W6100_Manager.svg?)](https://www.ardu-badge.com/ESP32_W6100_Manager) +[![GitHub release](https://img.shields.io/github/release/khoih-prog/ESP32_W6100_Manager.svg)](https://github.com/khoih-prog/ESP32_W6100_Manager/releases) +[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/khoih-prog/ESP32_W6100_Manager/blob/main/LICENSE) +[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](#Contributing) +[![GitHub issues](https://img.shields.io/github/issues/khoih-prog/ESP32_W6100_Manager.svg)](http://github.com/khoih-prog/ESP32_W6100_Manager/issues) + +Donate to my libraries using BuyMeACoffee + + + +--- +--- + +## Table of contents + +* [Changelog](#changelog) + * [Releases v1.0.0](#releases-v100) + + + +--- +--- + +## Changelog + +#### Releases v1.0.0 + +1. Initial coding to port [ESP_WiFiManager](https://github.com/khoih-prog/ESP_WiFiManager) to ESP32 boards using `LwIP W6100 Ethernet`. +2. Use `allman astyle` + + diff --git a/examples/ConfigOnDoubleReset/ConfigOnDoubleReset.ino b/examples/ConfigOnDoubleReset/ConfigOnDoubleReset.ino new file mode 100644 index 0000000..2725284 --- /dev/null +++ b/examples/ConfigOnDoubleReset/ConfigOnDoubleReset.ino @@ -0,0 +1,726 @@ +/**************************************************************************************************************************** + ConfigOnDoubleReset.ino + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + WebServer_ESP32_W6100 is a library for the ESP32 with Ethernet W6100 to run WebServer + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + *****************************************************************************************************************************/ +/**************************************************************************************************************************** + This example will open a configuration portal when the reset button is pressed twice. + This method works well on Wemos boards which have a single reset button on board. It avoids using a pin for launching the configuration portal. + + Settings + There are two values to be set in the sketch. + + DRD_TIMEOUT - Number of seconds to wait for the second reset. Set to 10 in the example. + DRD_ADDRESS - The address in ESP8266 RTC RAM to store the flag. This memory must not be used for other purposes in the same sketch. Set to 0 in the example. + + This example, originally relied on the Double Reset Detector library from https://github.com/datacute/DoubleResetDetector + To support ESP32, use ESP_DoubleResetDetector library from //https://github.com/khoih-prog/ESP_DoubleResetDetector + *****************************************************************************************************************************/ + +#if !( defined(ESP32) ) + #error This code is intended to run on the (ESP32 + LwIP W6100) platform! Please check your Tools->Board setting. +#endif + +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _ESP32_ETH_MGR_LOGLEVEL_ 4 + +// To not display stored SSIDs and PWDs on Config Portal, select false. Default is true +// Even the stored Credentials are not display, just leave them all blank to reconnect and reuse the stored Credentials +//#define DISPLAY_STORED_CREDENTIALS_IN_CP false + +////////////////////////////////////////////////////////////// + +// Enter a MAC address and IP address for your controller below. +#define NUMBER_OF_MAC 20 + +byte mac[][NUMBER_OF_MAC] = +{ + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 }, +}; + +// Select the IP address according to your local network +//IPAddress myIP(192, 168, 2, 232); +//IPAddress myGW(192, 168, 2, 1); +//IPAddress mySN(255, 255, 255, 0); + +// Google DNS Server IP +//IPAddress myDNS(8, 8, 8, 8); + +////////////////////////////////////////////////////////// + +// Optional values to override default settings +// Don't change unless you know what you're doing +//#define ETH_SPI_HOST SPI3_HOST +//#define SPI_CLOCK_MHZ 25 + +// Must connect INT to GPIOxx or not working +//#define INT_GPIO 4 + +//#define MISO_GPIO 19 +//#define MOSI_GPIO 23 +//#define SCK_GPIO 18 +//#define CS_GPIO 5 + +////////////////////////////////////////////////////////// + +#include + +//Ported to ESP32 +#include + +// LittleFS has higher priority than SPIFFS +#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #define USE_LITTLEFS true + #define USE_SPIFFS false +#elif defined(ARDUINO_ESP32C3_DEV) + // For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS + #define USE_LITTLEFS false + #define USE_SPIFFS true +#endif + +#if USE_LITTLEFS + // Use LittleFS + #include "FS.h" + + // Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h + //#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.6 or 2.0.0+ + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS + + FS* filesystem = &LittleFS; + #define FileFS LittleFS + #define FS_Name "LittleFS" + #else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/lorol/LITTLEFS + + FS* filesystem = &LITTLEFS; + #define FileFS LITTLEFS + #define FS_Name "LittleFS" + #endif + +#elif USE_SPIFFS + #include + FS* filesystem = &SPIFFS; + #define FileFS SPIFFS + #define FS_Name "SPIFFS" +#else + // +Use FFat + #include + FS* filesystem = &FFat; + #define FileFS FFat + #define FS_Name "FFat" +#endif +////// + +#define LED_BUILTIN 2 +#define LED_ON HIGH +#define LED_OFF LOW + +// These defines must be put before #include +// to select where to store DoubleResetDetector's variable. +// For ESP32, You must select one to be true (EEPROM or SPIFFS) +// Otherwise, library will use default EEPROM storage + +// These defines must be put before #include +// to select where to store DoubleResetDetector's variable. +// For ESP32, You must select one to be true (EEPROM or SPIFFS) +// Otherwise, library will use default EEPROM storage +#if USE_LITTLEFS + #define ESP_DRD_USE_LITTLEFS true + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM false +#elif USE_SPIFFS + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS true + #define ESP_DRD_USE_EEPROM false +#else + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM true +#endif + +#define DOUBLERESETDETECTOR_DEBUG true //false + +#include //https://github.com/khoih-prog/ESP_DoubleResetDetector + +// Number of seconds after reset during which a +// subseqent reset will be considered a double reset. +#define DRD_TIMEOUT 10 + +// RTC Memory Address for the DoubleResetDetector to use +#define DRD_ADDRESS 0 + +//DoubleResetDetector drd(DRD_TIMEOUT, DRD_ADDRESS); +DoubleResetDetector* drd;////// + +// Onboard LED I/O pin on NodeMCU board +const int PIN_LED = 2; // D4 on NodeMCU and WeMos. GPIO2/ADC12 of ESP32. Controls the onboard LED. + +// You only need to format the filesystem once +//#define FORMAT_FILESYSTEM true +#define FORMAT_FILESYSTEM false + +// Assuming max 49 chars +#define TZNAME_MAX_LEN 50 +#define TIMEZONE_MAX_LEN 50 + +typedef struct +{ + char TZ_Name[TZNAME_MAX_LEN]; // "America/Toronto" + char TZ[TIMEZONE_MAX_LEN]; // "EST5EDT,M3.2.0,M11.1.0" + uint16_t checksum; +} EthConfig; + +EthConfig Ethconfig; + +#define CONFIG_FILENAME F("/eth_cred.dat") +////// + +// Indicates whether ESP has credentials saved from previous session, or double reset detected +bool initialConfig = false; + +// Use false if you don't like to display Available Pages in Information Page of Config Portal +// Comment out or use true to display Available Pages in Information Page of Config Portal +// Must be placed before #include +#define USE_AVAILABLE_PAGES true //false + +// To permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa +// You have to explicitly specify false to disable the feature. +//#define USE_STATIC_IP_CONFIG_IN_CP false + +// Use false to disable NTP config. Advisable when using Cellphone, Tablet to access Config Portal. +// See Issue 23: On Android phone ConfigPortal is unresponsive (https://github.com/khoih-prog/ESP_WiFiManager/issues/23) +#define USE_ESP_ETH_MANAGER_NTP true //false + +// Just use enough to save memory. On ESP8266, can cause blank ConfigPortal screen +// if using too much memory +#define USING_AFRICA false +#define USING_AMERICA true +#define USING_ANTARCTICA false +#define USING_ASIA false +#define USING_ATLANTIC false +#define USING_AUSTRALIA false +#define USING_EUROPE false +#define USING_INDIAN false +#define USING_PACIFIC false +#define USING_ETC_GMT false + +// Use true to enable CloudFlare NTP service. System can hang if you don't have Internet access while accessing CloudFlare +// See Issue #21: CloudFlare link in the default portal (https://github.com/khoih-prog/ESP_WiFiManager/issues/21) +#define USE_CLOUDFLARE_NTP false + +#define USING_CORS_FEATURE true + +//////////////////////////////////////////// + +// Use USE_DHCP_IP == true for dynamic DHCP IP, false to use static IP which you have to change accordingly to your network +#if (defined(USE_STATIC_IP_CONFIG_IN_CP) && !USE_STATIC_IP_CONFIG_IN_CP) + // Force DHCP to be true + #if defined(USE_DHCP_IP) + #undef USE_DHCP_IP + #endif + #define USE_DHCP_IP true +#else + // You can select DHCP or Static IP here + //#define USE_DHCP_IP true + #define USE_DHCP_IP false +#endif + +#if ( USE_DHCP_IP ) + // Use DHCP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using DHCP IP + #endif + + IPAddress stationIP = IPAddress(0, 0, 0, 0); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); + +#else + // Use static IP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using static IP + #endif + + IPAddress stationIP = IPAddress(192, 168, 2, 232); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); +#endif + +//////////////////////////////////////////// + + +#define USE_CONFIGURABLE_DNS true + +IPAddress dns1IP = gatewayIP; +IPAddress dns2IP = IPAddress(8, 8, 8, 8); + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +#define HTTP_PORT 80 + +/////////////////////////////////////////// +/****************************************** + // Defined in ESP32_W6100_Manager.hpp + typedef struct + { + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + #if USE_CONFIGURABLE_DNS + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; + #endif + } ETH_STA_IPConfig; +******************************************/ + +ETH_STA_IPConfig EthSTA_IPconfig; + +void initSTAIPConfigStruct(ETH_STA_IPConfig &in_EthSTA_IPconfig) +{ + in_EthSTA_IPconfig._sta_static_ip = stationIP; + in_EthSTA_IPconfig._sta_static_gw = gatewayIP; + in_EthSTA_IPconfig._sta_static_sn = netMask; +#if USE_CONFIGURABLE_DNS + in_EthSTA_IPconfig._sta_static_dns1 = dns1IP; + in_EthSTA_IPconfig._sta_static_dns2 = dns2IP; +#endif +} + +void displayIPConfigStruct(ETH_STA_IPConfig in_EthSTA_IPconfig) +{ + LOGERROR3(F("stationIP ="), in_EthSTA_IPconfig._sta_static_ip, ", gatewayIP =", in_EthSTA_IPconfig._sta_static_gw); + LOGERROR1(F("netMask ="), in_EthSTA_IPconfig._sta_static_sn); +#if USE_CONFIGURABLE_DNS + LOGERROR3(F("dns1IP ="), in_EthSTA_IPconfig._sta_static_dns1, ", dns2IP =", in_EthSTA_IPconfig._sta_static_dns2); +#endif +} + +#if USE_ESP_ETH_MANAGER_NTP + +void printLocalTime() +{ + struct tm timeinfo; + + getLocalTime( &timeinfo ); + + // Valid only if year > 2000. + // You can get from timeinfo : tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec + if (timeinfo.tm_year > 100 ) + { + Serial.print("Local Date/Time: "); + Serial.print( asctime( &timeinfo ) ); + } +} + +#endif + +void heartBeatPrint() +{ +#if USE_ESP_ETH_MANAGER_NTP + printLocalTime(); +#else + static int num = 1; + + if (ESP32_W6100_isConnected()) + Serial.print(F("H")); // H means connected to Ethernet + else + Serial.print(F("F")); // F means not connected to Ethernet + + if (num == 80) + { + Serial.println(); + num = 1; + } + else if (num++ % 10 == 0) + { + Serial.print(F(" ")); + } + +#endif +} + +void check_status() +{ + static ulong checkstatus_timeout = 0; + + static ulong current_millis; + +#if USE_ESP_ETH_MANAGER_NTP +#define HEARTBEAT_INTERVAL 60000L +#else +#define HEARTBEAT_INTERVAL 10000L +#endif + + current_millis = millis(); + + // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. + if ((current_millis > checkstatus_timeout) || (checkstatus_timeout == 0)) + { + heartBeatPrint(); + checkstatus_timeout = current_millis + HEARTBEAT_INTERVAL; + } +} + +int calcChecksum(uint8_t* address, uint16_t sizeToCalc) +{ + uint16_t checkSum = 0; + + for (uint16_t index = 0; index < sizeToCalc; index++) + { + checkSum += * ( ( (byte*) address ) + index); + } + + return checkSum; +} + +bool loadConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "r"); + LOGERROR(F("LoadCfgFile ")); + + memset((void *) &Ethconfig, 0, sizeof(Ethconfig)); + memset((void *) &EthSTA_IPconfig, 0, sizeof(EthSTA_IPconfig)); + + if (file) + { + file.readBytes((char *) &Ethconfig, sizeof(Ethconfig)); + file.readBytes((char *) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + + if ( Ethconfig.checksum != calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ) ) + { + LOGERROR(F("Ethconfig checksum wrong")); + + return false; + } + + displayIPConfigStruct(EthSTA_IPconfig); + + return true; + } + else + { + LOGERROR(F("failed")); + + return false; + } +} + +void saveConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "w"); + LOGERROR(F("SaveCfgFile ")); + + if (file) + { + Ethconfig.checksum = calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ); + + file.write((uint8_t*) &Ethconfig, sizeof(Ethconfig)); + + displayIPConfigStruct(EthSTA_IPconfig); + + file.write((uint8_t*) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + } + else + { + LOGERROR(F("failed")); + } +} + +void beginEthernet() +{ + LOGWARN(F("Default SPI pinout:")); + LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST); + LOGWARN1(F("MOSI:"), MOSI_GPIO); + LOGWARN1(F("MISO:"), MISO_GPIO); + LOGWARN1(F("SCK:"), SCK_GPIO); + LOGWARN1(F("CS:"), CS_GPIO); + LOGWARN1(F("INT:"), INT_GPIO); + LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ); + LOGWARN(F("=========================")); + + /////////////////////////////////// + + // To be called before ETH.begin() + ESP32_W6100_onEvent(); + + // start the ethernet connection and the server: + // Use DHCP dynamic IP and random mac + uint16_t index = millis() % NUMBER_OF_MAC; + + //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, + // int SPI_HOST, uint8_t *W6100_Mac = W6100_Default_Mac); + //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST ); + ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[index] ); +} + +void initEthernet() +{ +#if !( USE_DHCP_IP ) + displayIPConfigStruct(EthSTA_IPconfig); + + // Static IP, leave without this line to get IP via DHCP + //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0); + //ETH.config(stationIP, gatewayIP, netMask, dns1IP, dns2IP); + ETH.config(EthSTA_IPconfig._sta_static_ip, EthSTA_IPconfig._sta_static_gw, EthSTA_IPconfig._sta_static_sn, + EthSTA_IPconfig._sta_static_dns1); +#endif + + ESP32_W6100_waitForConnect(); +} + +void setup() +{ + // put your setup code here, to run once: + // initialize the LED digital pin as an output. + pinMode(PIN_LED, OUTPUT); + + Serial.begin(115200); + + while (!Serial && millis() < 5000); + + delay(200); + + Serial.print(F("\nStarting ConfigOnDoubleReset using ")); + Serial.print(FS_Name); + Serial.print(F(" on ")); + Serial.print(ARDUINO_BOARD); + Serial.print(F(" with ")); + Serial.println(SHIELD_TYPE); + Serial.println(ESP32_W6100_MANAGER_VERSION); + Serial.println(ESP_DOUBLE_RESET_DETECTOR_VERSION); + + Serial.setDebugOutput(false); + + if (FORMAT_FILESYSTEM) + FileFS.format(); + + // Format FileFS if not yet + if (!FileFS.begin(true)) + { + Serial.println(F("SPIFFS/LittleFS failed! Already tried formatting.")); + + if (!FileFS.begin()) + { + // prevents debug info from the library to hide err message. + delay(100); + +#if USE_LITTLEFS + Serial.println(F("LittleFS failed!. Please use SPIFFS or EEPROM. Stay forever")); +#else + Serial.println(F("SPIFFS failed!. Please use LittleFS or EEPROM. Stay forever")); +#endif + + while (true) + { + delay(1); + } + } + } + + drd = new DoubleResetDetector(DRD_TIMEOUT, DRD_ADDRESS); + + unsigned long startedAt = millis(); + + beginEthernet(); + + initSTAIPConfigStruct(EthSTA_IPconfig); + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnDoubleReset"); + +#if !USE_DHCP_IP + // Set (static IP, Gateway, Subnetmask, DNS1 and DNS2) or (IP, Gateway, Subnetmask) + ESP32_W6100_manager.setSTAStaticIPConfig(EthSTA_IPconfig); +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + +#if USE_ESP_ETH_MANAGER_NTP + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + Serial.println(F("Current Timezone is not set. Enter Config Portal to set.")); + } + +#endif + } + + ////////////////////////////////// + + // Connect ETH now if using STA + initEthernet(); + + ////////////////////////////////// + + if (drd->detectDoubleReset()) + { + // DRD, disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(0); + + Serial.println(F("Open Config Portal without Timeout: Double Reset Detected")); + initialConfig = true; + } + + if (initialConfig) + { + Serial.print(F("Starting configuration portal @ ")); + Serial.println(ETH.localIP()); + + digitalWrite(PIN_LED, LED_ON); // turn the LED on by making the voltage LOW to tell us we are in configuration mode. + + //sets timeout in seconds until configuration portal gets turned off. + //If not specified device will remain in configuration mode until + //switched off via webserver or device is restarted. + //ESP32_W6100_manager.setConfigPortalTimeout(600); + + // Starts an access point + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + } + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + +#if !USE_DHCP_IP + + // Reset to use new Static IP, if different from current ETH.localIP() + if (ETH.localIP() != EthSTA_IPconfig._sta_static_ip) + { + Serial.print(F("Current IP = ")); + Serial.print(ETH.localIP()); + Serial.print(F(". Reset to take new IP = ")); + Serial.println(EthSTA_IPconfig._sta_static_ip); + + ESP.restart(); + delay(2000); + } + +#endif + } + + digitalWrite(PIN_LED, LED_OFF); // Turn led off as we are not in configuration mode. + + startedAt = millis(); + + Serial.print(F("After waiting ")); + Serial.print((float) (millis() - startedAt) / 1000); + Serial.print(F(" secs more in setup(), connection result is ")); + + if (ESP32_W6100_isConnected()) + { + Serial.print(F("connected. Local IP: ")); + Serial.println(ETH.localIP()); + } +} + +void loop() +{ + // Call the double reset detector loop method every so often, + // so that it can recognise when the timeout expires. + // You can also call drd.stop() when you wish to no longer + // consider the next reset as a double reset. + drd->loop(); + + // put your main code here, to run repeatedly + check_status(); +} diff --git a/examples/ConfigOnDoubleReset_TZ/ConfigOnDoubleReset_TZ.ino b/examples/ConfigOnDoubleReset_TZ/ConfigOnDoubleReset_TZ.ino new file mode 100644 index 0000000..281ffc3 --- /dev/null +++ b/examples/ConfigOnDoubleReset_TZ/ConfigOnDoubleReset_TZ.ino @@ -0,0 +1,755 @@ +/**************************************************************************************************************************** + ConfigOnDoubleReset_TZ.ino + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + WebServer_ESP32_W6100 is a library for the ESP32 with Ethernet W6100 to run WebServer + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + *****************************************************************************************************************************/ +/**************************************************************************************************************************** + This example will open a configuration portal when the reset button is pressed twice. + This method works well on Wemos boards which have a single reset button on board. It avoids using a pin for launching the configuration portal. + + Settings + There are two values to be set in the sketch. + + DRD_TIMEOUT - Number of seconds to wait for the second reset. Set to 10 in the example. + DRD_ADDRESS - The address in ESP8266 RTC RAM to store the flag. This memory must not be used for other purposes in the same sketch. Set to 0 in the example. + + This example, originally relied on the Double Reset Detector library from https://github.com/datacute/DoubleResetDetector + To support ESP32, use ESP_DoubleResetDetector library from //https://github.com/khoih-prog/ESP_DoubleResetDetector + *****************************************************************************************************************************/ + +#if !( defined(ESP32) ) + #error This code is intended to run on the (ESP32 + LwIP W6100) platform! Please check your Tools->Board setting. +#endif + +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _ESP32_ETH_MGR_LOGLEVEL_ 4 + +// To not display stored SSIDs and PWDs on Config Portal, select false. Default is true +// Even the stored Credentials are not display, just leave them all blank to reconnect and reuse the stored Credentials +//#define DISPLAY_STORED_CREDENTIALS_IN_CP false + +////////////////////////////////////////////////////////////// + +// Enter a MAC address and IP address for your controller below. +#define NUMBER_OF_MAC 20 + +byte mac[][NUMBER_OF_MAC] = +{ + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 }, +}; + +// Select the IP address according to your local network +//IPAddress myIP(192, 168, 2, 232); +//IPAddress myGW(192, 168, 2, 1); +//IPAddress mySN(255, 255, 255, 0); + +// Google DNS Server IP +//IPAddress myDNS(8, 8, 8, 8); + +////////////////////////////////////////////////////////// + +// Optional values to override default settings +// Don't change unless you know what you're doing +//#define ETH_SPI_HOST SPI3_HOST +//#define SPI_CLOCK_MHZ 25 + +// Must connect INT to GPIOxx or not working +//#define INT_GPIO 4 + +//#define MISO_GPIO 19 +//#define MOSI_GPIO 23 +//#define SCK_GPIO 18 +//#define CS_GPIO 5 + +////////////////////////////////////////////////////////// + +#include + +//Ported to ESP32 +#include + +// LittleFS has higher priority than SPIFFS +#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #define USE_LITTLEFS true + #define USE_SPIFFS false +#elif defined(ARDUINO_ESP32C3_DEV) + // For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS + #define USE_LITTLEFS false + #define USE_SPIFFS true +#endif + +#if USE_LITTLEFS + // Use LittleFS + #include "FS.h" + + // Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h + //#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.6 or 2.0.0+ + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS + + FS* filesystem = &LittleFS; + #define FileFS LittleFS + #define FS_Name "LittleFS" + #else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/lorol/LITTLEFS + + FS* filesystem = &LITTLEFS; + #define FileFS LITTLEFS + #define FS_Name "LittleFS" + #endif + +#elif USE_SPIFFS + #include + FS* filesystem = &SPIFFS; + #define FileFS SPIFFS + #define FS_Name "SPIFFS" +#else + // +Use FFat + #include + FS* filesystem = &FFat; + #define FileFS FFat + #define FS_Name "FFat" +#endif + +////////////////////////////////////////////////////////////// + +#define LED_BUILTIN 2 +#define LED_ON HIGH +#define LED_OFF LOW + +////////////////////////////////////////////////////////////// + +// These defines must be put before #include +// to select where to store DoubleResetDetector's variable. +// For ESP32, You must select one to be true (EEPROM or SPIFFS) +// For ESP8266, You must select one to be true (RTC, EEPROM, SPIFFS or LITTLEFS) +// Otherwise, library will use default EEPROM storage + +// These defines must be put before #include +// to select where to store DoubleResetDetector's variable. +// For ESP32, You must select one to be true (EEPROM or SPIFFS) +// Otherwise, library will use default EEPROM storage +#if USE_LITTLEFS + #define ESP_DRD_USE_LITTLEFS true + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM false +#elif USE_SPIFFS + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS true + #define ESP_DRD_USE_EEPROM false +#else + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM true +#endif + +#define DOUBLERESETDETECTOR_DEBUG true //false + +#include //https://github.com/khoih-prog/ESP_DoubleResetDetector + +// Number of seconds after reset during which a +// subseqent reset will be considered a double reset. +#define DRD_TIMEOUT 10 + +// RTC Memory Address for the DoubleResetDetector to use +#define DRD_ADDRESS 0 + +//DoubleResetDetector drd(DRD_TIMEOUT, DRD_ADDRESS); +DoubleResetDetector* drd;////// + +// Onboard LED I/O pin on NodeMCU board +const int PIN_LED = 2; // D4 on NodeMCU and WeMos. GPIO2/ADC12 of ESP32. Controls the onboard LED. + +// You only need to format the filesystem once +//#define FORMAT_FILESYSTEM true +#define FORMAT_FILESYSTEM false + +////////////////////////////////////////////////////////////// + +// Assuming max 49 chars +#define TZNAME_MAX_LEN 50 +#define TIMEZONE_MAX_LEN 50 + +typedef struct +{ + char TZ_Name[TZNAME_MAX_LEN]; // "America/Toronto" + char TZ[TIMEZONE_MAX_LEN]; // "EST5EDT,M3.2.0,M11.1.0" + uint16_t checksum; +} EthConfig; + +EthConfig Ethconfig; + +#define CONFIG_FILENAME F("/eth_cred.dat") + +////////////////////////////////////////////////////////////// + +// Indicates whether ESP has credentials saved from previous session, or double reset detected +bool initialConfig = false; + +// Use false if you don't like to display Available Pages in Information Page of Config Portal +// Comment out or use true to display Available Pages in Information Page of Config Portal +// Must be placed before #include +#define USE_AVAILABLE_PAGES true //false + +// From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa +// You have to explicitly specify false to disable the feature. +//#define USE_STATIC_IP_CONFIG_IN_CP false + +// Use false to disable NTP config. Advisable when using Cellphone, Tablet to access Config Portal. +// See Issue 23: On Android phone ConfigPortal is unresponsive (https://github.com/khoih-prog/ESP_WiFiManager/issues/23) +#define USE_ESP_ETH_MANAGER_NTP true + +// Just use enough to save memory. On ESP8266, can cause blank ConfigPortal screen +// if using too much memory +#define USING_AFRICA false +#define USING_AMERICA true +#define USING_ANTARCTICA false +#define USING_ASIA false +#define USING_ATLANTIC false +#define USING_AUSTRALIA false +#define USING_EUROPE false +#define USING_INDIAN false +#define USING_PACIFIC false +#define USING_ETC_GMT false + +// Use true to enable CloudFlare NTP service. System can hang if you don't have Internet access while accessing CloudFlare +// See Issue #21: CloudFlare link in the default portal (https://github.com/khoih-prog/ESP_WiFiManager/issues/21) +#define USE_CLOUDFLARE_NTP false + +// New in v1.0.11 +#define USING_CORS_FEATURE true + +////////////////////////////////////////////////////////////// + +// Use USE_DHCP_IP == true for dynamic DHCP IP, false to use static IP which you have to change accordingly to your network +#if (defined(USE_STATIC_IP_CONFIG_IN_CP) && !USE_STATIC_IP_CONFIG_IN_CP) + // Force DHCP to be true + #if defined(USE_DHCP_IP) + #undef USE_DHCP_IP + #endif + #define USE_DHCP_IP true +#else + // You can select DHCP or Static IP here + #define USE_DHCP_IP true + //#define USE_DHCP_IP false +#endif + +#if ( USE_DHCP_IP ) + // Use DHCP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using DHCP IP + #endif + + IPAddress stationIP = IPAddress(0, 0, 0, 0); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); + +#else + // Use static IP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using static IP + #endif + + IPAddress stationIP = IPAddress(192, 168, 2, 232); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); +#endif + +////////////////////////////////////////////////////////////// + +#define USE_CONFIGURABLE_DNS true + +IPAddress dns1IP = gatewayIP; +IPAddress dns2IP = IPAddress(8, 8, 8, 8); + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +#define HTTP_PORT 80 + +////////////////////////////////////////////////////////////// + +/****************************************** + // Defined in ESP32_W6100_Manager.hpp + typedef struct + { + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + #if USE_CONFIGURABLE_DNS + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; + #endif + } ETH_STA_IPConfig; +******************************************/ + +ETH_STA_IPConfig EthSTA_IPconfig; + +////////////////////////////////////////////////////////////// + +void initSTAIPConfigStruct(ETH_STA_IPConfig &in_EthSTA_IPconfig) +{ + in_EthSTA_IPconfig._sta_static_ip = stationIP; + in_EthSTA_IPconfig._sta_static_gw = gatewayIP; + in_EthSTA_IPconfig._sta_static_sn = netMask; +#if USE_CONFIGURABLE_DNS + in_EthSTA_IPconfig._sta_static_dns1 = dns1IP; + in_EthSTA_IPconfig._sta_static_dns2 = dns2IP; +#endif +} + +////////////////////////////////////////////////////////////// + +void displayIPConfigStruct(ETH_STA_IPConfig in_EthSTA_IPconfig) +{ + LOGERROR3(F("stationIP ="), in_EthSTA_IPconfig._sta_static_ip, ", gatewayIP =", in_EthSTA_IPconfig._sta_static_gw); + LOGERROR1(F("netMask ="), in_EthSTA_IPconfig._sta_static_sn); +#if USE_CONFIGURABLE_DNS + LOGERROR3(F("dns1IP ="), in_EthSTA_IPconfig._sta_static_dns1, ", dns2IP =", in_EthSTA_IPconfig._sta_static_dns2); +#endif +} + +////////////////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP +void printLocalTime() +{ + struct tm timeinfo; + + getLocalTime( &timeinfo ); + + // Valid only if year > 2000. + // You can get from timeinfo : tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec + if (timeinfo.tm_year > 100 ) + { + Serial.print("Local Date/Time: "); + Serial.print( asctime( &timeinfo ) ); + } +} +#endif + +////////////////////////////////////////////////////////////// + +void heartBeatPrint() +{ +#if USE_ESP_ETH_MANAGER_NTP + printLocalTime(); +#else + static int num = 1; + + if (ESP32_W6100_isConnected()) + Serial.print(F("H")); // H means connected to Ethernet + else + Serial.print(F("F")); // F means not connected to Ethernet + + if (num == 80) + { + Serial.println(); + num = 1; + } + else if (num++ % 10 == 0) + { + Serial.print(F(" ")); + } + +#endif +} + +////////////////////////////////////////////////////////////// + +void check_status() +{ + static ulong checkstatus_timeout = 0; + + static ulong current_millis; + +#if USE_ESP_ETH_MANAGER_NTP +#define HEARTBEAT_INTERVAL 60000L +#else +#define HEARTBEAT_INTERVAL 10000L +#endif + + current_millis = millis(); + + // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. + if ((current_millis > checkstatus_timeout) || (checkstatus_timeout == 0)) + { + heartBeatPrint(); + checkstatus_timeout = current_millis + HEARTBEAT_INTERVAL; + } +} + +////////////////////////////////////////////////////////////// + +int calcChecksum(uint8_t* address, uint16_t sizeToCalc) +{ + uint16_t checkSum = 0; + + for (uint16_t index = 0; index < sizeToCalc; index++) + { + checkSum += * ( ( (byte*) address ) + index); + } + + return checkSum; +} + +////////////////////////////////////////////////////////////// + +bool loadConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "r"); + LOGERROR(F("LoadCfgFile ")); + + memset((void *) &Ethconfig, 0, sizeof(Ethconfig)); + memset((void *) &EthSTA_IPconfig, 0, sizeof(EthSTA_IPconfig)); + + if (file) + { + file.readBytes((char *) &Ethconfig, sizeof(Ethconfig)); + file.readBytes((char *) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + + if ( Ethconfig.checksum != calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ) ) + { + LOGERROR(F("Ethconfig checksum wrong")); + + return false; + } + + displayIPConfigStruct(EthSTA_IPconfig); + + return true; + } + else + { + LOGERROR(F("failed")); + + return false; + } +} + +////////////////////////////////////////////////////////////// + +void saveConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "w"); + LOGERROR(F("SaveCfgFile ")); + + if (file) + { + Ethconfig.checksum = calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ); + + file.write((uint8_t*) &Ethconfig, sizeof(Ethconfig)); + + displayIPConfigStruct(EthSTA_IPconfig); + + file.write((uint8_t*) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + } + else + { + LOGERROR(F("failed")); + } +} + +////////////////////////////////////////////////////////////// + +void beginEthernet() +{ + LOGWARN(F("Default SPI pinout:")); + LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST); + LOGWARN1(F("MOSI:"), MOSI_GPIO); + LOGWARN1(F("MISO:"), MISO_GPIO); + LOGWARN1(F("SCK:"), SCK_GPIO); + LOGWARN1(F("CS:"), CS_GPIO); + LOGWARN1(F("INT:"), INT_GPIO); + LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ); + LOGWARN(F("=========================")); + + /////////////////////////////////// + + // To be called before ETH.begin() + ESP32_W6100_onEvent(); + + // start the ethernet connection and the server: + // Use DHCP dynamic IP and random mac + uint16_t index = millis() % NUMBER_OF_MAC; + + //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, + // int SPI_HOST, uint8_t *W6100_Mac = W6100_Default_Mac); + //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST ); + ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[index] ); +} + +////////////////////////////////////////////////////////////// + +void initEthernet() +{ +#if !( USE_DHCP_IP ) + displayIPConfigStruct(EthSTA_IPconfig); + + // Static IP, leave without this line to get IP via DHCP + //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0); + //ETH.config(stationIP, gatewayIP, netMask, dns1IP, dns2IP); + ETH.config(EthSTA_IPconfig._sta_static_ip, EthSTA_IPconfig._sta_static_gw, EthSTA_IPconfig._sta_static_sn, + EthSTA_IPconfig._sta_static_dns1); +#endif + + ESP32_W6100_waitForConnect(); +} + +////////////////////////////////////////////////////////////// + +void setup() +{ + // put your setup code here, to run once: + // initialize the LED digital pin as an output. + pinMode(PIN_LED, OUTPUT); + + Serial.begin(115200); + + while (!Serial && millis() < 5000); + + delay(200); + + Serial.print(F("\nStarting ConfigOnDoubleReset_TZ using ")); + Serial.print(FS_Name); + Serial.print(F(" on ")); + Serial.print(ARDUINO_BOARD); + Serial.print(F(" with ")); + Serial.println(SHIELD_TYPE); + Serial.println(ESP32_W6100_MANAGER_VERSION); + Serial.println(ESP_DOUBLE_RESET_DETECTOR_VERSION); + + Serial.setDebugOutput(false); + + if (FORMAT_FILESYSTEM) + FileFS.format(); + + // Format FileFS if not yet +#ifdef ESP32 + + if (!FileFS.begin(true)) +#else + if (!FileFS.begin()) +#endif + { +#ifdef ESP8266 + FileFS.format(); +#endif + + Serial.println(F("SPIFFS/LittleFS failed! Already tried formatting.")); + + if (!FileFS.begin()) + { + // prevents debug info from the library to hide err message. + delay(100); + +#if USE_LITTLEFS + Serial.println(F("LittleFS failed!. Please use SPIFFS or EEPROM. Stay forever")); +#else + Serial.println(F("SPIFFS failed!. Please use LittleFS or EEPROM. Stay forever")); +#endif + + while (true) + { + delay(1); + } + } + } + + drd = new DoubleResetDetector(DRD_TIMEOUT, DRD_ADDRESS); + + unsigned long startedAt = millis(); + + beginEthernet(); + + initSTAIPConfigStruct(EthSTA_IPconfig); + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnDoubleReset_TZ"); + +#if !USE_DHCP_IP + // Set (static IP, Gateway, Subnetmask, DNS1 and DNS2) or (IP, Gateway, Subnetmask) + ESP32_W6100_manager.setSTAStaticIPConfig(EthSTA_IPconfig); +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + +#if USE_ESP_ETH_MANAGER_NTP + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + Serial.println(F("Current Timezone is not set. Enter Config Portal to set.")); + } + +#endif + } + else + { + // Enter CP only if no stored Credentials on flash and file + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + ////////////////////////////////// + + // Connect ETH now if using STA + initEthernet(); + + ////////////////////////////////// + + if (drd->detectDoubleReset()) + { + // DRD, disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(0); + + Serial.println(F("Open Config Portal without Timeout: Double Reset Detected")); + initialConfig = true; + } + + if (initialConfig) + { + Serial.print(F("Starting configuration portal @ ")); + Serial.println(ETH.localIP()); + + digitalWrite(LED_BUILTIN, LED_ON); // Turn led on as we are in configuration mode. + + //sets timeout in seconds until configuration portal gets turned off. + //If not specified device will remain in configuration mode until + //switched off via webserver or device is restarted. + //ESP32_W6100_manager.setConfigPortalTimeout(600); + + // Starts an access point + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + } + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + } + + digitalWrite(PIN_LED, LED_OFF); // Turn led off as we are not in configuration mode. + + startedAt = millis(); + + Serial.print(F("After waiting ")); + Serial.print((float) (millis() - startedAt) / 1000); + Serial.print(F(" secs more in setup(), connection result is ")); + + if (ESP32_W6100_isConnected()) + { + Serial.print(F("connected. Local IP: ")); + Serial.println(ETH.localIP()); + } +} + +////////////////////////////////////////////////////////////// + +void loop() +{ + // Call the double reset detector loop method every so often, + // so that it can recognise when the timeout expires. + // You can also call drd.stop() when you wish to no longer + // consider the next reset as a double reset. + drd->loop(); + + // put your main code here, to run repeatedly + check_status(); +} diff --git a/examples/ConfigOnSwitch/ConfigOnSwitch.ino b/examples/ConfigOnSwitch/ConfigOnSwitch.ino new file mode 100644 index 0000000..7677940 --- /dev/null +++ b/examples/ConfigOnSwitch/ConfigOnSwitch.ino @@ -0,0 +1,913 @@ +/**************************************************************************************************************************** + ConfigOnSwitch.ino + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + WebServer_ESP32_W6100 is a library for the ESP32 with Ethernet W6100 to run WebServer + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + *****************************************************************************************************************************/ +/**************************************************************************************************************************** + This example will open a configuration portal when no configuration has been previously entered or when a button is pushed. + It is the easiest scenario for configuration but requires a pin and a button on the ESP8266 device. + The Flash button is convenient for this on NodeMCU devices. + + Also in this example a password is required to connect to the configuration portal + network. This is inconvenient but means that only those who know the password or those + already connected to the target network can access the configuration portal and + the network credentials will be sent from the browser over an encrypted connection and + can not be read by observers. + *****************************************************************************************************************************/ + +#if !( defined(ESP32) ) + #error This code is intended to run on the (ESP32 + LwIP W6100) platform! Please check your Tools->Board setting. +#endif + +////////////////////////////////////////////////////////////// + +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _ESP32_ETH_MGR_LOGLEVEL_ 4 + +// To not display stored SSIDs and PWDs on Config Portal, select false. Default is true +// Even the stored Credentials are not display, just leave them all blank to reconnect and reuse the stored Credentials +//#define DISPLAY_STORED_CREDENTIALS_IN_CP false + +////////////////////////////////////////////////////////////// + +// Enter a MAC address and IP address for your controller below. +#define NUMBER_OF_MAC 20 + +byte mac[][NUMBER_OF_MAC] = +{ + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 }, +}; + +// Select the IP address according to your local network +//IPAddress myIP(192, 168, 2, 232); +//IPAddress myGW(192, 168, 2, 1); +//IPAddress mySN(255, 255, 255, 0); + +// Google DNS Server IP +//IPAddress myDNS(8, 8, 8, 8); + +////////////////////////////////////////////////////////// + +// Optional values to override default settings +// Don't change unless you know what you're doing +//#define ETH_SPI_HOST SPI3_HOST +//#define SPI_CLOCK_MHZ 25 + +// Must connect INT to GPIOxx or not working +//#define INT_GPIO 4 + +//#define MISO_GPIO 19 +//#define MOSI_GPIO 23 +//#define SCK_GPIO 18 +//#define CS_GPIO 5 + +////////////////////////////////////////////////////////// + +//For ESP32, To use ESP32 Dev Module, QIO, Flash 4MB/80MHz, Upload 921600 + +//Ported to ESP32 +#include + +////////////////////////////////////////////////////////////// + +// LittleFS has higher priority than SPIFFS +#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #define USE_LITTLEFS true + #define USE_SPIFFS false +#elif defined(ARDUINO_ESP32C3_DEV) + // For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS + #define USE_LITTLEFS false + #define USE_SPIFFS true +#endif + +#if USE_LITTLEFS + // Use LittleFS + #include "FS.h" + + // Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h + //#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.6 or 2.0.0+ + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS + + FS* filesystem = &LittleFS; + #define FileFS LittleFS + #define FS_Name "LittleFS" + #else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/lorol/LITTLEFS + + FS* filesystem = &LITTLEFS; + #define FileFS LITTLEFS + #define FS_Name "LittleFS" + #endif + +#elif USE_SPIFFS + #include + FS* filesystem = &SPIFFS; + #define FileFS SPIFFS + #define FS_Name "SPIFFS" +#else + // Use FFat + #include + FS* filesystem = &FFat; + #define FileFS FFat + #define FS_Name "FFat" +#endif + +////////////////////////////////////////////////////////////// + +#define LED_BUILTIN 2 +#define LED_ON HIGH +#define LED_OFF LOW + +//See file .../hardware/espressif/esp32/variants/(esp32|doitESP32devkitV1)/pins_arduino.h +#define LED_BUILTIN 2 // Pin D2 mapped to pin GPIO2/ADC12 of ESP32, control on-board LED +#define LED_BUILTIN 2 // Pin D2 mapped to pin GPIO2/ADC12 of ESP32, control on-board LED + +#define PIN_D0 0 // Pin D0 mapped to pin GPIO0/BOOT/ADC11/TOUCH1 of ESP32 +#define PIN_D1 1 // Pin D1 mapped to pin GPIO1/TX0 of ESP32 +#define PIN_D2 2 // Pin D2 mapped to pin GPIO2/ADC12/TOUCH2 of ESP32 +#define PIN_D3 3 // Pin D3 mapped to pin GPIO3/RX0 of ESP32 +#define PIN_D4 4 // Pin D4 mapped to pin GPIO4/ADC10/TOUCH0 of ESP32 +#define PIN_D5 5 // Pin D5 mapped to pin GPIO5/SPISS/VSPI_SS of ESP32 +#define PIN_D6 6 // Pin D6 mapped to pin GPIO6/FLASH_SCK of ESP32 +#define PIN_D7 7 // Pin D7 mapped to pin GPIO7/FLASH_D0 of ESP32 +#define PIN_D8 8 // Pin D8 mapped to pin GPIO8/FLASH_D1 of ESP32 +#define PIN_D9 9 // Pin D9 mapped to pin GPIO9/FLASH_D2 of ESP32 + +#define PIN_D10 10 // Pin D10 mapped to pin GPIO10/FLASH_D3 of ESP32 +#define PIN_D11 11 // Pin D11 mapped to pin GPIO11/FLASH_CMD of ESP32 +#define PIN_D12 12 // Pin D12 mapped to pin GPIO12/HSPI_MISO/ADC15/TOUCH5/TDI of ESP32 +#define PIN_D13 13 // Pin D13 mapped to pin GPIO13/HSPI_MOSI/ADC14/TOUCH4/TCK of ESP32 +#define PIN_D14 14 // Pin D14 mapped to pin GPIO14/HSPI_SCK/ADC16/TOUCH6/TMS of ESP32 +#define PIN_D15 15 // Pin D15 mapped to pin GPIO15/HSPI_SS/ADC13/TOUCH3/TDO of ESP32 +#define PIN_D16 16 // Pin D16 mapped to pin GPIO16/TX2 of ESP32 +#define PIN_D17 17 // Pin D17 mapped to pin GPIO17/RX2 of ESP32 +#define PIN_D18 18 // Pin D18 mapped to pin GPIO18/VSPI_SCK of ESP32 +#define PIN_D19 19 // Pin D19 mapped to pin GPIO19/VSPI_MISO of ESP32 + +#define PIN_D21 21 // Pin D21 mapped to pin GPIO21/SDA of ESP32 +#define PIN_D22 22 // Pin D22 mapped to pin GPIO22/SCL of ESP32 +#define PIN_D23 23 // Pin D23 mapped to pin GPIO23/VSPI_MOSI of ESP32 +#define PIN_D24 24 // Pin D24 mapped to pin GPIO24 of ESP32 +#define PIN_D25 25 // Pin D25 mapped to pin GPIO25/ADC18/DAC1 of ESP32 +#define PIN_D26 26 // Pin D26 mapped to pin GPIO26/ADC19/DAC2 of ESP32 +#define PIN_D27 27 // Pin D27 mapped to pin GPIO27/ADC17/TOUCH7 of ESP32 + +#define PIN_D32 32 // Pin D32 mapped to pin GPIO32/ADC4/TOUCH9 of ESP32 +#define PIN_D33 33 // Pin D33 mapped to pin GPIO33/ADC5/TOUCH8 of ESP32 +#define PIN_D34 34 // Pin D34 mapped to pin GPIO34/ADC6 of ESP32 + +//Only GPIO pin < 34 can be used as output. Pins >= 34 can be only inputs +//See .../cores/esp32/esp32-hal-gpio.h/c +//#define digitalPinIsValid(pin) ((pin) < 40 && esp32_gpioMux[(pin)].reg) +//#define digitalPinCanOutput(pin) ((pin) < 34 && esp32_gpioMux[(pin)].reg) +//#define digitalPinToRtcPin(pin) (((pin) < 40)?esp32_gpioMux[(pin)].rtc:-1) +//#define digitalPinToAnalogChannel(pin) (((pin) < 40)?esp32_gpioMux[(pin)].adc:-1) +//#define digitalPinToTouchChannel(pin) (((pin) < 40)?esp32_gpioMux[(pin)].touch:-1) +//#define digitalPinToDacChannel(pin) (((pin) == 25)?0:((pin) == 26)?1:-1) + +#define PIN_D35 35 // Pin D35 mapped to pin GPIO35/ADC7 of ESP32 +#define PIN_D36 36 // Pin D36 mapped to pin GPIO36/ADC0/SVP of ESP32 +#define PIN_D39 39 // Pin D39 mapped to pin GPIO39/ADC3/SVN of ESP32 + +#define PIN_RX0 3 // Pin RX0 mapped to pin GPIO3/RX0 of ESP32 +#define PIN_TX0 1 // Pin TX0 mapped to pin GPIO1/TX0 of ESP32 + +#define PIN_SCL 22 // Pin SCL mapped to pin GPIO22/SCL of ESP32 +#define PIN_SDA 21 // Pin SDA mapped to pin GPIO21/SDA of ESP32 + +////////////////////////////////////////////////////////////// + +/* Trigger for inititating config mode is Pin D3 and also flash button on NodeMCU + Flash button is convenient to use but if it is pressed it will stuff up the serial port device driver + until the computer is rebooted on windows machines. +*/ +#if ( USING_ESP32_S2 || USING_ESP32_C3 ) + + const int TRIGGER_PIN = PIN_D3; // Pin D3 mapped to pin GPIO03/ADC1-2/TOUCH3 of ESP32-S2 + /* + Alternative trigger pin. Needs to be connected to a button to use this pin. It must be a momentary connection + not connected permanently to ground. Either trigger pin will work. + */ + const int TRIGGER_PIN2 = PIN_D4; // Pin D4 mapped to pin GPIO04/ADC1_3/TOUCH4 of ESP32-S2 + +#else + const int TRIGGER_PIN = PIN_D0; // Pin D0 mapped to pin GPIO0/BOOT/ADC11/TOUCH1 of ESP32 + /* + Alternative trigger pin. Needs to be connected to a button to use this pin. It must be a momentary connection + not connected permanently to ground. Either trigger pin will work. + */ + const int TRIGGER_PIN2 = PIN_D25; // Pin D25 mapped to pin GPIO25/ADC18/DAC1 of ESP32 +#endif + +////////////////////////////////////////////////////////////// + +// You only need to format the filesystem once +//#define FORMAT_FILESYSTEM true +#define FORMAT_FILESYSTEM false + +////////////////////////////////////////////////////////////// + +// Assuming max 49 chars +#define TZNAME_MAX_LEN 50 +#define TIMEZONE_MAX_LEN 50 + +typedef struct +{ + char TZ_Name[TZNAME_MAX_LEN]; // "America/Toronto" + char TZ[TIMEZONE_MAX_LEN]; // "EST5EDT,M3.2.0,M11.1.0" + uint16_t checksum; +} EthConfig; + +EthConfig Ethconfig; + +////////////////////////////////////////////////////////////// + +#define CONFIG_FILENAME F("/eth_cred.dat") + +////////////////////////////////////////////////////////////// + +// Indicates whether ESP has credentials saved from previous session, or double reset detected +bool initialConfig = false; + +// Use false if you don't like to display Available Pages in Information Page of Config Portal +// Comment out or use true to display Available Pages in Information Page of Config Portal +// Must be placed before #include +#define USE_AVAILABLE_PAGES true + +// From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa +// You have to explicitly specify false to disable the feature. +//#define USE_STATIC_IP_CONFIG_IN_CP false + +// Use false to disable NTP config. Advisable when using Cellphone, Tablet to access Config Portal. +// See Issue 23: On Android phone ConfigPortal is unresponsive (https://github.com/khoih-prog/ESP_WiFiManager/issues/23) +#define USE_ESP_ETH_MANAGER_NTP true + +// Just use enough to save memory. On ESP8266, can cause blank ConfigPortal screen +// if using too much memory +#define USING_AFRICA false +#define USING_AMERICA true +#define USING_ANTARCTICA false +#define USING_ASIA false +#define USING_ATLANTIC false +#define USING_AUSTRALIA false +#define USING_EUROPE false +#define USING_INDIAN false +#define USING_PACIFIC false +#define USING_ETC_GMT false + +// Use true to enable CloudFlare NTP service. System can hang if you don't have Internet access while accessing CloudFlare +// See Issue #21: CloudFlare link in the default portal (https://github.com/khoih-prog/ESP_WiFiManager/issues/21) +#define USE_CLOUDFLARE_NTP false + +// New in v1.0.11 +#define USING_CORS_FEATURE true + +////////////////////////////////////////////////////////////// + +// Use USE_DHCP_IP == true for dynamic DHCP IP, false to use static IP which you have to change accordingly to your network +#if (defined(USE_STATIC_IP_CONFIG_IN_CP) && !USE_STATIC_IP_CONFIG_IN_CP) + // Force DHCP to be true + #if defined(USE_DHCP_IP) + #undef USE_DHCP_IP + #endif + #define USE_DHCP_IP true +#else + // You can select DHCP or Static IP here + //#define USE_DHCP_IP true + #define USE_DHCP_IP false +#endif + +#if ( USE_DHCP_IP ) + // Use DHCP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using DHCP IP + #endif + + IPAddress stationIP = IPAddress(0, 0, 0, 0); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); + +#else + // Use static IP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using static IP + #endif + + IPAddress stationIP = IPAddress(192, 168, 2, 232); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); +#endif + +////////////////////////////////////////////////////////////// + +#define USE_CONFIGURABLE_DNS true + +IPAddress dns1IP = gatewayIP; +IPAddress dns2IP = IPAddress(8, 8, 8, 8); + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +#define HTTP_PORT 80 + +////////////////////////////////////////////////////////////// + +/****************************************** + // Defined in ESP32_W6100_Manager.hpp + typedef struct + { + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + #if USE_CONFIGURABLE_DNS + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; + #endif + } ETH_STA_IPConfig; +******************************************/ + +ETH_STA_IPConfig EthSTA_IPconfig; + +////////////////////////////////////////////////////////////// + +void initSTAIPConfigStruct(ETH_STA_IPConfig &in_EthSTA_IPconfig) +{ + in_EthSTA_IPconfig._sta_static_ip = stationIP; + in_EthSTA_IPconfig._sta_static_gw = gatewayIP; + in_EthSTA_IPconfig._sta_static_sn = netMask; +#if USE_CONFIGURABLE_DNS + in_EthSTA_IPconfig._sta_static_dns1 = dns1IP; + in_EthSTA_IPconfig._sta_static_dns2 = dns2IP; +#endif +} + +////////////////////////////////////////////////////////////// + +void displayIPConfigStruct(ETH_STA_IPConfig in_EthSTA_IPconfig) +{ + LOGERROR3(F("stationIP ="), in_EthSTA_IPconfig._sta_static_ip, ", gatewayIP =", in_EthSTA_IPconfig._sta_static_gw); + LOGERROR1(F("netMask ="), in_EthSTA_IPconfig._sta_static_sn); +#if USE_CONFIGURABLE_DNS + LOGERROR3(F("dns1IP ="), in_EthSTA_IPconfig._sta_static_dns1, ", dns2IP =", in_EthSTA_IPconfig._sta_static_dns2); +#endif +} + +////////////////////////////////////////////////////////////// + +void toggleLED() +{ + //toggle state + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); +} + +////////////////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP +void printLocalTime() +{ + struct tm timeinfo; + + getLocalTime( &timeinfo ); + + // Valid only if year > 2000. + // You can get from timeinfo : tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec + if (timeinfo.tm_year > 100 ) + { + Serial.print("Local Date/Time: "); + Serial.print( asctime( &timeinfo ) ); + } +} +#endif + +////////////////////////////////////////////////////////////// + +void heartBeatPrint() +{ +#if USE_ESP_ETH_MANAGER_NTP + printLocalTime(); +#else + static int num = 1; + + if (ESP32_W6100_isConnected()) + Serial.print(F("H")); // H means connected to Ethernet + else + Serial.print(F("F")); // F means not connected to Ethernet + + if (num == 80) + { + Serial.println(); + num = 1; + } + else if (num++ % 10 == 0) + { + Serial.print(F(" ")); + } + +#endif +} + +////////////////////////////////////////////////////////////// + +void check_status() +{ + static ulong checkstatus_timeout = 0; + static ulong LEDstatus_timeout = 0; + + static ulong current_millis; + +#if USE_ESP_ETH_MANAGER_NTP +#define HEARTBEAT_INTERVAL 60000L +#else +#define HEARTBEAT_INTERVAL 10000L +#endif + +#define LED_INTERVAL 2000L + + current_millis = millis(); + + if ((current_millis > LEDstatus_timeout) || (LEDstatus_timeout == 0)) + { + // Toggle LED at LED_INTERVAL = 2s + toggleLED(); + LEDstatus_timeout = current_millis + LED_INTERVAL; + } + + // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. + if ((current_millis > checkstatus_timeout) || (checkstatus_timeout == 0)) + { + heartBeatPrint(); + checkstatus_timeout = current_millis + HEARTBEAT_INTERVAL; + } +} + +////////////////////////////////////////////////////////////// + +int calcChecksum(uint8_t* address, uint16_t sizeToCalc) +{ + uint16_t checkSum = 0; + + for (uint16_t index = 0; index < sizeToCalc; index++) + { + checkSum += * ( ( (byte*) address ) + index); + } + + return checkSum; +} + +////////////////////////////////////////////////////////////// + +bool loadConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "r"); + LOGERROR(F("LoadCfgFile ")); + + memset((void *) &Ethconfig, 0, sizeof(Ethconfig)); + memset((void *) &EthSTA_IPconfig, 0, sizeof(EthSTA_IPconfig)); + + if (file) + { + file.readBytes((char *) &Ethconfig, sizeof(Ethconfig)); + file.readBytes((char *) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + + if ( Ethconfig.checksum != calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ) ) + { + LOGERROR(F("Ethconfig checksum wrong")); + + return false; + } + + displayIPConfigStruct(EthSTA_IPconfig); + + return true; + } + else + { + LOGERROR(F("failed")); + + return false; + } +} + +////////////////////////////////////////////////////////////// + +void saveConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "w"); + LOGERROR(F("SaveCfgFile ")); + + if (file) + { + Ethconfig.checksum = calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ); + + file.write((uint8_t*) &Ethconfig, sizeof(Ethconfig)); + + displayIPConfigStruct(EthSTA_IPconfig); + + file.write((uint8_t*) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + } + else + { + LOGERROR(F("failed")); + } +} + +////////////////////////////////////////////////////////////// + +void beginEthernet() +{ + LOGWARN(F("Default SPI pinout:")); + LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST); + LOGWARN1(F("MOSI:"), MOSI_GPIO); + LOGWARN1(F("MISO:"), MISO_GPIO); + LOGWARN1(F("SCK:"), SCK_GPIO); + LOGWARN1(F("CS:"), CS_GPIO); + LOGWARN1(F("INT:"), INT_GPIO); + LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ); + LOGWARN(F("=========================")); + + /////////////////////////////////// + + // To be called before ETH.begin() + ESP32_W6100_onEvent(); + + // start the ethernet connection and the server: + // Use DHCP dynamic IP and random mac + uint16_t index = millis() % NUMBER_OF_MAC; + + //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, + // int SPI_HOST, uint8_t *W6100_Mac = W6100_Default_Mac); + //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST ); + ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[index] ); +} + +////////////////////////////////////////////////////////////// + +void initEthernet() +{ +#if !( USE_DHCP_IP ) + displayIPConfigStruct(EthSTA_IPconfig); + + // Static IP, leave without this line to get IP via DHCP + //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0); + //ETH.config(stationIP, gatewayIP, netMask, dns1IP, dns2IP); + ETH.config(EthSTA_IPconfig._sta_static_ip, EthSTA_IPconfig._sta_static_gw, EthSTA_IPconfig._sta_static_sn, + EthSTA_IPconfig._sta_static_dns1); +#endif + + ESP32_W6100_waitForConnect(); +} + +////////////////////////////////////////////////////////////// + +void setup() +{ + //set led pin as output + pinMode(LED_BUILTIN, OUTPUT); + + pinMode(TRIGGER_PIN, INPUT_PULLUP); + pinMode(TRIGGER_PIN2, INPUT_PULLUP); + + Serial.begin(115200); + + while (!Serial && millis() < 5000); + + delay(200); + + Serial.print(F("\nStarting ConfigOnSwitch using ")); + Serial.print(FS_Name); + Serial.print(F(" on ")); + Serial.print(ARDUINO_BOARD); + Serial.print(F(" with ")); + Serial.println(SHIELD_TYPE); + Serial.println(ESP32_W6100_MANAGER_VERSION); + + Serial.setDebugOutput(false); + + if (FORMAT_FILESYSTEM) + FileFS.format(); + + // Format FileFS if not yet +#ifdef ESP32 + + if (!FileFS.begin(true)) +#else + if (!FileFS.begin()) +#endif + { +#ifdef ESP8266 + FileFS.format(); +#endif + + Serial.println(F("SPIFFS/LittleFS failed! Already tried formatting.")); + + if (!FileFS.begin()) + { + // prevents debug info from the library to hide err message. + delay(100); + +#if USE_LITTLEFS + Serial.println(F("LittleFS failed!. Please use SPIFFS or EEPROM. Stay forever")); +#else + Serial.println(F("SPIFFS failed!. Please use LittleFS or EEPROM. Stay forever")); +#endif + + while (true) + { + delay(1); + } + } + } + + unsigned long startedAt = millis(); + + beginEthernet(); + + initSTAIPConfigStruct(EthSTA_IPconfig); + + digitalWrite(LED_BUILTIN, LED_ON); // turn the LED on by making the voltage LOW to tell us we are in configuration mode. + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnSwitch"); + + ESP32_W6100_manager.setDebugOutput(true); + +#if !USE_DHCP_IP + // Set (static IP, Gateway, Subnetmask, DNS1 and DNS2) or (IP, Gateway, Subnetmask) + ESP32_W6100_manager.setSTAStaticIPConfig(EthSTA_IPconfig); +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + +#if USE_ESP_ETH_MANAGER_NTP + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + Serial.println(F("Current Timezone is not set. Enter Config Portal to set.")); + } + +#endif + } + else + { + // Enter CP only if no stored SSID on flash and file + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + ////////////////////////////////// + + // Connect ETH now if using STA + initEthernet(); + + ////////////////////////////////// + + if (initialConfig) + { + Serial.print(F("Starting configuration portal @ ")); + Serial.println(ETH.localIP()); + + digitalWrite(LED_BUILTIN, LED_ON); // Turn led on as we are in configuration mode. + + //sets timeout in seconds until configuration portal gets turned off. + //If not specified device will remain in configuration mode until + //switched off via webserver or device is restarted. + //ESP32_W6100_manager.setConfigPortalTimeout(600); + + // Starts an access point + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + } + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + } + + digitalWrite(LED_BUILTIN, LED_OFF); // Turn led off as we are not in configuration mode. + + startedAt = millis(); + + Serial.print(F("After waiting ")); + Serial.print((float) (millis() - startedAt) / 1000); + Serial.print(F(" secs more in setup(), connection result is ")); + + if (ESP32_W6100_isConnected()) + { + Serial.print(F("connected. Local IP: ")); + Serial.println(ETH.localIP()); + } +} + +////////////////////////////////////////////////////////////// + +void loop() +{ + // is configuration portal requested? + if ((digitalRead(TRIGGER_PIN) == LOW) || (digitalRead(TRIGGER_PIN2) == LOW)) + { + Serial.println(F("\nConfiguration portal requested.")); + digitalWrite(LED_BUILTIN, LED_ON); // turn the LED on by making the voltage LOW to tell us we are in configuration mode. + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnSwitch"); + +#if !USE_DHCP_IP +#if USE_CONFIGURABLE_DNS + // Set static IP, Gateway, Subnetmask, DNS1 and DNS2 + ESP32_W6100_manager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask, dns1IP, dns2IP); +#else + // Set static IP, Gateway, Subnetmask, Use auto DNS1 and DNS2. + ESP32_W6100_manager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask); +#endif +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + //Check if there is stored credentials. + //If not found, device will remain in configuration mode until switched off via webserver. + Serial.println(F("Opening configuration portal. ")); + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + } + else + { + // Enter CP only if no stored SSID on flash and file + ESP32_W6100_manager.setConfigPortalTimeout(0); + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + //Starts an access point + //and goes into a blocking loop awaiting configuration + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + Serial.print(F("Local IP: ")); + Serial.println(ETH.localIP()); + } + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + +#if !USE_DHCP_IP + + // Reset to use new Static IP, if different from current ETH.localIP() + if (ETH.localIP() != EthSTA_IPconfig._sta_static_ip) + { + Serial.print(F("Current IP = ")); + Serial.print(ETH.localIP()); + Serial.print(F(". Reset to take new IP = ")); + Serial.println(EthSTA_IPconfig._sta_static_ip); + + ESP.restart(); + delay(2000); + } + +#endif + + digitalWrite(LED_BUILTIN, LED_OFF); // Turn led off as we are not in configuration mode. + } + + // put your main code here, to run repeatedly + check_status(); +} diff --git a/examples/ConfigOnSwitchFS/ConfigOnSwitchFS.ino b/examples/ConfigOnSwitchFS/ConfigOnSwitchFS.ino new file mode 100644 index 0000000..e71a343 --- /dev/null +++ b/examples/ConfigOnSwitchFS/ConfigOnSwitchFS.ino @@ -0,0 +1,1120 @@ +/**************************************************************************************************************************** + ConfigOnSwitchFS.ino + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + WebServer_ESP32_W6100 is a library for the ESP32 with Ethernet W6100 to run WebServer + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + *****************************************************************************************************************************/ +/**************************************************************************************************************************** + This example will open a configuration portal when the reset button is pressed twice. + This method works well on Wemos boards which have a single reset button on board. It avoids using a pin for launching the configuration portal. + + Settings + There are two values to be set in the sketch. + + DRD_TIMEOUT - Number of seconds to wait for the second reset. Set to 10 in the example. + DRD_ADDRESS - The address in ESP8266 RTC RAM to store the flag. This memory must not be used for other purposes in the same sketch. Set to 0 in the example. + + This example, originally relied on the Double Reset Detector library from https://github.com/datacute/DoubleResetDetector + To support ESP32, use ESP_DoubleResetDetector library from //https://github.com/khoih-prog/ESP_DoubleResetDetector + *****************************************************************************************************************************/ +/**************************************************************************************************************************** + This example will open a configuration portal when no configuration has been previously entered or when a button is pushed. + It is the easiest scenario for configuration but requires a pin and a button on the ESP8266 device. + The Flash button is convenient for this on NodeMCU devices. + + Also in this example a password is required to connect to the configuration portal + network. This is inconvenient but means that only those who know the password or those + already connected to the target network can access the configuration portal and + the network credentials will be sent from the browser over an encrypted connection and + can not be read by observers. + *****************************************************************************************************************************/ + +#if !( defined(ESP32) ) + #error This code is intended to run on the (ESP32 + LwIP W6100) platform! Please check your Tools->Board setting. +#endif + +////////////////////////////////////////////////////////////// + +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _ESP32_ETH_MGR_LOGLEVEL_ 4 + +// To not display stored SSIDs and PWDs on Config Portal, select false. Default is true +// Even the stored Credentials are not display, just leave them all blank to reconnect and reuse the stored Credentials +//#define DISPLAY_STORED_CREDENTIALS_IN_CP false + +////////////////////////////////////////////////////////////// + +// Enter a MAC address and IP address for your controller below. +#define NUMBER_OF_MAC 20 + +byte mac[][NUMBER_OF_MAC] = +{ + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 }, +}; + +// Select the IP address according to your local network +//IPAddress myIP(192, 168, 2, 232); +//IPAddress myGW(192, 168, 2, 1); +//IPAddress mySN(255, 255, 255, 0); + +// Google DNS Server IP +//IPAddress myDNS(8, 8, 8, 8); + +////////////////////////////////////////////////////////// + +// Optional values to override default settings +// Don't change unless you know what you're doing +//#define ETH_SPI_HOST SPI3_HOST +//#define SPI_CLOCK_MHZ 25 + +// Must connect INT to GPIOxx or not working +//#define INT_GPIO 4 + +//#define MISO_GPIO 19 +//#define MOSI_GPIO 23 +//#define SCK_GPIO 18 +//#define CS_GPIO 5 + +////////////////////////////////////////////////////////// + +#include +// Now support ArduinoJson 6.0.0+ ( tested with v6.14.1 ) +#include // get it from https://arduinojson.org/ or install via Arduino library manager + +//For ESP32, To use ESP32 Dev Module, QIO, Flash 4MB/80MHz, Upload 921600 +//Ported to ESP32 +#include + +////////////////////////////////////////////////////////////// + +// LittleFS has higher priority than SPIFFS +#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #define USE_LITTLEFS true + #define USE_SPIFFS false +#elif defined(ARDUINO_ESP32C3_DEV) + // For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS + #define USE_LITTLEFS false + #define USE_SPIFFS true +#endif + +#if USE_LITTLEFS + // Use LittleFS + #include "FS.h" + + // Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h + //#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.6 or 2.0.0+ + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS + + FS* filesystem = &LittleFS; + #define FileFS LittleFS + #define FS_Name "LittleFS" + #else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/lorol/LITTLEFS + + FS* filesystem = &LITTLEFS; + #define FileFS LITTLEFS + #define FS_Name "LittleFS" + #endif + +#elif USE_SPIFFS + #include + FS* filesystem = &SPIFFS; + #define FileFS SPIFFS + #define FS_Name "SPIFFS" +#else + // +Use FFat + #include + FS* filesystem = &FFat; + #define FileFS FFat + #define FS_Name "FFat" +#endif + +////////////////////////////////////////////////////////////// + +#define LED_BUILTIN 2 +#define LED_ON HIGH +#define LED_OFF LOW + +////////////////////////////////////////////////////////////// + +//See file .../hardware/espressif/esp32/variants/(esp32|doitESP32devkitV1)/pins_arduino.h +#define LED_BUILTIN 2 // Pin D2 mapped to pin GPIO2/ADC12 of ESP32, control on-board LED +#define PIN_LED 2 // Pin D2 mapped to pin GPIO2/ADC12 of ESP32, control on-board LED + +#define PIN_D0 0 // Pin D0 mapped to pin GPIO0/BOOT/ADC11/TOUCH1 of ESP32 +#define PIN_D1 1 // Pin D1 mapped to pin GPIO1/TX0 of ESP32 +#define PIN_D2 2 // Pin D2 mapped to pin GPIO2/ADC12/TOUCH2 of ESP32 +#define PIN_D3 3 // Pin D3 mapped to pin GPIO3/RX0 of ESP32 +#define PIN_D4 4 // Pin D4 mapped to pin GPIO4/ADC10/TOUCH0 of ESP32 +#define PIN_D5 5 // Pin D5 mapped to pin GPIO5/SPISS/VSPI_SS of ESP32 +#define PIN_D6 6 // Pin D6 mapped to pin GPIO6/FLASH_SCK of ESP32 +#define PIN_D7 7 // Pin D7 mapped to pin GPIO7/FLASH_D0 of ESP32 +#define PIN_D8 8 // Pin D8 mapped to pin GPIO8/FLASH_D1 of ESP32 +#define PIN_D9 9 // Pin D9 mapped to pin GPIO9/FLASH_D2 of ESP32 + +#define PIN_D10 10 // Pin D10 mapped to pin GPIO10/FLASH_D3 of ESP32 +#define PIN_D11 11 // Pin D11 mapped to pin GPIO11/FLASH_CMD of ESP32 +#define PIN_D12 12 // Pin D12 mapped to pin GPIO12/HSPI_MISO/ADC15/TOUCH5/TDI of ESP32 +#define PIN_D13 13 // Pin D13 mapped to pin GPIO13/HSPI_MOSI/ADC14/TOUCH4/TCK of ESP32 +#define PIN_D14 14 // Pin D14 mapped to pin GPIO14/HSPI_SCK/ADC16/TOUCH6/TMS of ESP32 +#define PIN_D15 15 // Pin D15 mapped to pin GPIO15/HSPI_SS/ADC13/TOUCH3/TDO of ESP32 +#define PIN_D16 16 // Pin D16 mapped to pin GPIO16/TX2 of ESP32 +#define PIN_D17 17 // Pin D17 mapped to pin GPIO17/RX2 of ESP32 +#define PIN_D18 18 // Pin D18 mapped to pin GPIO18/VSPI_SCK of ESP32 +#define PIN_D19 19 // Pin D19 mapped to pin GPIO19/VSPI_MISO of ESP32 + +#define PIN_D21 21 // Pin D21 mapped to pin GPIO21/SDA of ESP32 +#define PIN_D22 22 // Pin D22 mapped to pin GPIO22/SCL of ESP32 +#define PIN_D23 23 // Pin D23 mapped to pin GPIO23/VSPI_MOSI of ESP32 +#define PIN_D24 24 // Pin D24 mapped to pin GPIO24 of ESP32 +#define PIN_D25 25 // Pin D25 mapped to pin GPIO25/ADC18/DAC1 of ESP32 +#define PIN_D26 26 // Pin D26 mapped to pin GPIO26/ADC19/DAC2 of ESP32 +#define PIN_D27 27 // Pin D27 mapped to pin GPIO27/ADC17/TOUCH7 of ESP32 + +#define PIN_D32 32 // Pin D32 mapped to pin GPIO32/ADC4/TOUCH9 of ESP32 +#define PIN_D33 33 // Pin D33 mapped to pin GPIO33/ADC5/TOUCH8 of ESP32 +#define PIN_D34 34 // Pin D34 mapped to pin GPIO34/ADC6 of ESP32 + +//Only GPIO pin < 34 can be used as output. Pins >= 34 can be only inputs +//See .../cores/esp32/esp32-hal-gpio.h/c +//#define digitalPinIsValid(pin) ((pin) < 40 && esp32_gpioMux[(pin)].reg) +//#define digitalPinCanOutput(pin) ((pin) < 34 && esp32_gpioMux[(pin)].reg) +//#define digitalPinToRtcPin(pin) (((pin) < 40)?esp32_gpioMux[(pin)].rtc:-1) +//#define digitalPinToAnalogChannel(pin) (((pin) < 40)?esp32_gpioMux[(pin)].adc:-1) +//#define digitalPinToTouchChannel(pin) (((pin) < 40)?esp32_gpioMux[(pin)].touch:-1) +//#define digitalPinToDacChannel(pin) (((pin) == 25)?0:((pin) == 26)?1:-1) + +#define PIN_D35 35 // Pin D35 mapped to pin GPIO35/ADC7 of ESP32 +#define PIN_D36 36 // Pin D36 mapped to pin GPIO36/ADC0/SVP of ESP32 +#define PIN_D39 39 // Pin D39 mapped to pin GPIO39/ADC3/SVN of ESP32 + +#define PIN_RX0 3 // Pin RX0 mapped to pin GPIO3/RX0 of ESP32 +#define PIN_TX0 1 // Pin TX0 mapped to pin GPIO1/TX0 of ESP32 + +#define PIN_SCL 22 // Pin SCL mapped to pin GPIO22/SCL of ESP32 +#define PIN_SDA 21 // Pin SDA mapped to pin GPIO21/SDA of ESP32 + +////////////////////////////////////////////////////////////// + +/* Trigger for inititating config mode is Pin D3 and also flash button on NodeMCU + Flash button is convenient to use but if it is pressed it will stuff up the serial port device driver + until the computer is rebooted on windows machines. +*/ +const int TRIGGER_PIN = PIN_D0; // Pin D0 mapped to pin GPIO0/BOOT/ADC11/TOUCH1 of ESP32 +/* + Alternative trigger pin. Needs to be connected to a button to use this pin. It must be a momentary connection + not connected permanently to ground. Either trigger pin will work. +*/ +#if ( ARDUINO_ESP32C3_DEV ) + const int TRIGGER_PIN2 = PIN_D8; // Pin D8 mapped to pin GPIO8/FLASH_D1 of ESP32 +#else + const int TRIGGER_PIN2 = PIN_D25; // Pin D25 mapped to pin GPIO25/ADC18/DAC1 of ESP32 +#endif + +int pinSda = PIN_SDA; // Pin SDA mapped to pin GPIO21/SDA of ESP32 +int pinScl = PIN_SCL; // Pin SCL mapped to pin GPIO22/SCL of ESP32 + +////////////////////////////////////////////////////////////// + +const char* JSON_CONFIG_FILE = "/ConfigSW.json"; + +// Variables + +// Default configuration values +char thingspeakApiKey[17] = ""; +bool sensorDht22 = true; + +#define ThingSpeakAPI_Label "thingspeakApiKey" +#define SensorDht22_Label "SensorDHT22" +#define PinSDA_Label "PinSda" +#define PinSCL_Label "PinScl" + +////////////////////////////////////////////////////////////// + +// Function Prototypes + +bool readConfigFile(); +bool writeConfigFile(); + +// You only need to format the filesystem once +//#define FORMAT_FILESYSTEM true +#define FORMAT_FILESYSTEM false + +////////////////////////////////////////////////////////////// + +// Assuming max 49 chars +#define TZNAME_MAX_LEN 50 +#define TIMEZONE_MAX_LEN 50 + +typedef struct +{ + char TZ_Name[TZNAME_MAX_LEN]; // "America/Toronto" + char TZ[TIMEZONE_MAX_LEN]; // "EST5EDT,M3.2.0,M11.1.0" + uint16_t checksum; +} EthConfig; + +EthConfig Ethconfig; + +#define CONFIG_FILENAME F("/eth_cred.dat") + +////////////////////////////////////////////////////////////// + +// Indicates whether ESP has credentials saved from previous session +bool initialConfig = false; + +// Use false if you don't like to display Available Pages in Information Page of Config Portal +// Comment out or use true to display Available Pages in Information Page of Config Portal +// Must be placed before #include +#define USE_AVAILABLE_PAGES true + +// From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa +// You have to explicitly specify false to disable the feature. +//#define USE_STATIC_IP_CONFIG_IN_CP false + +// Use false to disable NTP config. Advisable when using Cellphone, Tablet to access Config Portal. +// See Issue 23: On Android phone ConfigPortal is unresponsive (https://github.com/khoih-prog/ESP_WiFiManager/issues/23) +#define USE_ESP_ETH_MANAGER_NTP true + +// Just use enough to save memory. On ESP8266, can cause blank ConfigPortal screen +// if using too much memory +#define USING_AFRICA false +#define USING_AMERICA true +#define USING_ANTARCTICA false +#define USING_ASIA false +#define USING_ATLANTIC false +#define USING_AUSTRALIA false +#define USING_EUROPE false +#define USING_INDIAN false +#define USING_PACIFIC false +#define USING_ETC_GMT false + +// Use true to enable CloudFlare NTP service. System can hang if you don't have Internet access while accessing CloudFlare +// See Issue #21: CloudFlare link in the default portal (https://github.com/khoih-prog/ESP_WiFiManager/issues/21) +#define USE_CLOUDFLARE_NTP false + +// New in v1.0.11 +#define USING_CORS_FEATURE true + +////////////////////////////////////////////////////////////// + +// Use USE_DHCP_IP == true for dynamic DHCP IP, false to use static IP which you have to change accordingly to your network +#if (defined(USE_STATIC_IP_CONFIG_IN_CP) && !USE_STATIC_IP_CONFIG_IN_CP) + // Force DHCP to be true + #if defined(USE_DHCP_IP) + #undef USE_DHCP_IP + #endif + #define USE_DHCP_IP true +#else + // You can select DHCP or Static IP here + //#define USE_DHCP_IP true + #define USE_DHCP_IP false +#endif + +#if ( USE_DHCP_IP ) + // Use DHCP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using DHCP IP + #endif + + IPAddress stationIP = IPAddress(0, 0, 0, 0); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); + +#else + // Use static IP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using static IP + #endif + + IPAddress stationIP = IPAddress(192, 168, 2, 232); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); +#endif + +////////////////////////////////////////////////////////////// + +#define USE_CONFIGURABLE_DNS true + +IPAddress dns1IP = gatewayIP; +IPAddress dns2IP = IPAddress(8, 8, 8, 8); + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +#define HTTP_PORT 80 + +////////////////////////////////////////////////////////////// + +/****************************************** + // Defined in ESP32_W6100_Manager.hpp + typedef struct + { + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + #if USE_CONFIGURABLE_DNS + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; + #endif + } ETH_STA_IPConfig; +******************************************/ + +ETH_STA_IPConfig EthSTA_IPconfig; + +////////////////////////////////////////////////////////////// + +void initSTAIPConfigStruct(ETH_STA_IPConfig &in_EthSTA_IPconfig) +{ + in_EthSTA_IPconfig._sta_static_ip = stationIP; + in_EthSTA_IPconfig._sta_static_gw = gatewayIP; + in_EthSTA_IPconfig._sta_static_sn = netMask; +#if USE_CONFIGURABLE_DNS + in_EthSTA_IPconfig._sta_static_dns1 = dns1IP; + in_EthSTA_IPconfig._sta_static_dns2 = dns2IP; +#endif +} + +////////////////////////////////////////////////////////////// + +void displayIPConfigStruct(ETH_STA_IPConfig in_EthSTA_IPconfig) +{ + LOGERROR3(F("stationIP ="), in_EthSTA_IPconfig._sta_static_ip, ", gatewayIP =", in_EthSTA_IPconfig._sta_static_gw); + LOGERROR1(F("netMask ="), in_EthSTA_IPconfig._sta_static_sn); +#if USE_CONFIGURABLE_DNS + LOGERROR3(F("dns1IP ="), in_EthSTA_IPconfig._sta_static_dns1, ", dns2IP =", in_EthSTA_IPconfig._sta_static_dns2); +#endif +} + +////////////////////////////////////////////////////////////// + +void toggleLED() +{ + //toggle state + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); +} + +////////////////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP +void printLocalTime() +{ + struct tm timeinfo; + + getLocalTime( &timeinfo ); + + // Valid only if year > 2000. + // You can get from timeinfo : tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec + if (timeinfo.tm_year > 100 ) + { + Serial.print("Local Date/Time: "); + Serial.print( asctime( &timeinfo ) ); + } +} +#endif + +////////////////////////////////////////////////////////////// + +void heartBeatPrint() +{ +#if USE_ESP_ETH_MANAGER_NTP + printLocalTime(); +#else + static int num = 1; + + if (ESP32_W6100_isConnected()) + Serial.print(F("H")); // H means connected to Ethernet + else + Serial.print(F("F")); // F means not connected to Ethernet + + if (num == 80) + { + Serial.println(); + num = 1; + } + else if (num++ % 10 == 0) + { + Serial.print(F(" ")); + } + +#endif +} + +////////////////////////////////////////////////////////////// + +void check_status() +{ + static ulong checkstatus_timeout = 0; + static ulong LEDstatus_timeout = 0; + + static ulong current_millis; + +#if USE_ESP_ETH_MANAGER_NTP +#define HEARTBEAT_INTERVAL 60000L +#else +#define HEARTBEAT_INTERVAL 10000L +#endif + +#define LED_INTERVAL 2000L + + current_millis = millis(); + + if ((current_millis > LEDstatus_timeout) || (LEDstatus_timeout == 0)) + { + // Toggle LED at LED_INTERVAL = 2s + toggleLED(); + LEDstatus_timeout = current_millis + LED_INTERVAL; + } + + // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. + if ((current_millis > checkstatus_timeout) || (checkstatus_timeout == 0)) + { + heartBeatPrint(); + checkstatus_timeout = current_millis + HEARTBEAT_INTERVAL; + } +} + +////////////////////////////////////////////////////////////// + +int calcChecksum(uint8_t* address, uint16_t sizeToCalc) +{ + uint16_t checkSum = 0; + + for (uint16_t index = 0; index < sizeToCalc; index++) + { + checkSum += * ( ( (byte*) address ) + index); + } + + return checkSum; +} + +////////////////////////////////////////////////////////////// + +bool loadConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "r"); + LOGERROR(F("LoadCfgFile ")); + + memset((void *) &Ethconfig, 0, sizeof(Ethconfig)); + memset((void *) &EthSTA_IPconfig, 0, sizeof(EthSTA_IPconfig)); + + if (file) + { + file.readBytes((char *) &Ethconfig, sizeof(Ethconfig)); + file.readBytes((char *) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + + if ( Ethconfig.checksum != calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ) ) + { + LOGERROR(F("Ethconfig checksum wrong")); + + return false; + } + + displayIPConfigStruct(EthSTA_IPconfig); + + return true; + } + else + { + LOGERROR(F("failed")); + + return false; + } +} + +////////////////////////////////////////////////////////////// + +void saveConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "w"); + LOGERROR(F("SaveCfgFile ")); + + if (file) + { + Ethconfig.checksum = calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ); + + file.write((uint8_t*) &Ethconfig, sizeof(Ethconfig)); + + displayIPConfigStruct(EthSTA_IPconfig); + + file.write((uint8_t*) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + } + else + { + LOGERROR(F("failed")); + } +} + +////////////////////////////////////////////////////////////// + +bool readConfigFile() +{ + // this opens the config file in read-mode + File f = FileFS.open(JSON_CONFIG_FILE, "r"); + + if (!f) + { + Serial.println(F("Configuration file not found")); + + return false; + } + else + { + // we could open the file + size_t size = f.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size + 1]); + + // Read and store file contents in buf + f.readBytes(buf.get(), size); + // Closing file + f.close(); + // Using dynamic JSON buffer which is not the recommended memory model, but anyway + // See https://github.com/bblanchon/ArduinoJson/wiki/Memory%20model + +#if (ARDUINOJSON_VERSION_MAJOR >= 6) + DynamicJsonDocument json(1024); + auto deserializeError = deserializeJson(json, buf.get()); + + if ( deserializeError ) + { + Serial.println(F("JSON parseObject() failed")); + + return false; + } + + serializeJson(json, Serial); +#else + DynamicJsonBuffer jsonBuffer; + // Parse JSON string + JsonObject& json = jsonBuffer.parseObject(buf.get()); + + // Test if parsing succeeds. + if (!json.success()) + { + Serial.println(F("JSON parseObject() failed")); + return false; + } + + json.printTo(Serial); +#endif + + // Parse all config file parameters, override + // local config variables with parsed values + if (json.containsKey(ThingSpeakAPI_Label)) + { + strcpy(thingspeakApiKey, json[ThingSpeakAPI_Label]); + } + + if (json.containsKey(SensorDht22_Label)) + { + sensorDht22 = json[SensorDht22_Label]; + } + + if (json.containsKey(PinSDA_Label)) + { + pinSda = json[PinSDA_Label]; + } + + if (json.containsKey(PinSCL_Label)) + { + pinScl = json[PinSCL_Label]; + } + } + + Serial.println(F("\nConfig file was successfully parsed")); + + return true; +} + +////////////////////////////////////////////////////////////// + +bool writeConfigFile() +{ + Serial.println(F("Saving config file")); + +#if (ARDUINOJSON_VERSION_MAJOR >= 6) + DynamicJsonDocument json(1024); +#else + DynamicJsonBuffer jsonBuffer; + JsonObject& json = jsonBuffer.createObject(); +#endif + + // JSONify local configuration parameters + json[ThingSpeakAPI_Label] = thingspeakApiKey; + json[SensorDht22_Label] = sensorDht22; + json[PinSDA_Label] = pinSda; + json[PinSCL_Label] = pinScl; + + // Open file for writing + File f = FileFS.open(JSON_CONFIG_FILE, "w"); + + if (!f) + { + Serial.println(F("Failed to open config file for writing")); + + return false; + } + +#if (ARDUINOJSON_VERSION_MAJOR >= 6) + serializeJsonPretty(json, Serial); + // Write data to file and close it + serializeJson(json, f); +#else + json.prettyPrintTo(Serial); + // Write data to file and close it + json.printTo(f); +#endif + + f.close(); + + Serial.println(F("\nConfig file was successfully saved")); + + return true; +} + +////////////////////////////////////////////////////////////// + +void beginEthernet() +{ + LOGWARN(F("Default SPI pinout:")); + LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST); + LOGWARN1(F("MOSI:"), MOSI_GPIO); + LOGWARN1(F("MISO:"), MISO_GPIO); + LOGWARN1(F("SCK:"), SCK_GPIO); + LOGWARN1(F("CS:"), CS_GPIO); + LOGWARN1(F("INT:"), INT_GPIO); + LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ); + LOGWARN(F("=========================")); + + /////////////////////////////////// + + // To be called before ETH.begin() + ESP32_W6100_onEvent(); + + // start the ethernet connection and the server: + // Use DHCP dynamic IP and random mac + uint16_t index = millis() % NUMBER_OF_MAC; + + //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, + // int SPI_HOST, uint8_t *W6100_Mac = W6100_Default_Mac); + //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST ); + ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[index] ); +} + +////////////////////////////////////////////////////////////// + +void initEthernet() +{ +#if !( USE_DHCP_IP ) + displayIPConfigStruct(EthSTA_IPconfig); + + // Static IP, leave without this line to get IP via DHCP + //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0); + //ETH.config(stationIP, gatewayIP, netMask, dns1IP, dns2IP); + ETH.config(EthSTA_IPconfig._sta_static_ip, EthSTA_IPconfig._sta_static_gw, EthSTA_IPconfig._sta_static_sn, + EthSTA_IPconfig._sta_static_dns1); +#endif + + ESP32_W6100_waitForConnect(); +} + +////////////////////////////////////////////////////////////// + +void setup() +{ + //set led pin as output + pinMode(LED_BUILTIN, OUTPUT); + + // Put your setup code here, to run once + Serial.begin(115200); + + while (!Serial && millis() < 5000); + + delay(200); + + Serial.print(F("\nStarting ConfigOnSwichFS using ")); + Serial.print(FS_Name); + Serial.print(F(" on ")); + Serial.print(ARDUINO_BOARD); + Serial.print(F(" with ")); + Serial.println(SHIELD_TYPE); + Serial.println(ESP32_W6100_MANAGER_VERSION); + + // Initialize the LED digital pin as an output. + pinMode(PIN_LED, OUTPUT); + // Initialize trigger pins + pinMode(TRIGGER_PIN, INPUT_PULLUP); + pinMode(TRIGGER_PIN2, INPUT_PULLUP); + + if (FORMAT_FILESYSTEM) + { + Serial.println(F("Forced Formatting.")); + FileFS.format(); + } + + // Format FileFS if not yet +#ifdef ESP32 + + if (!FileFS.begin(true)) +#else + if (!FileFS.begin()) +#endif + { +#ifdef ESP8266 + FileFS.format(); +#endif + + Serial.println(F("SPIFFS/LittleFS failed! Already tried formatting.")); + + if (!FileFS.begin()) + { + // prevents debug info from the library to hide err message. + delay(100); + +#if USE_LITTLEFS + Serial.println(F("LittleFS failed!. Please use SPIFFS or EEPROM. Stay forever")); +#else + Serial.println(F("SPIFFS failed!. Please use LittleFS or EEPROM. Stay forever")); +#endif + + while (true) + { + delay(1); + } + } + } + + beginEthernet(); + + initSTAIPConfigStruct(EthSTA_IPconfig); + + if (!readConfigFile()) + { + Serial.println(F("Failed to read ConfigFile, using default values")); + } + + unsigned long startedAt = millis(); + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnSwitchFS"); + + ESP32_W6100_manager.setDebugOutput(true); + +#if !USE_DHCP_IP + // Set (static IP, Gateway, Subnetmask, DNS1 and DNS2) or (IP, Gateway, Subnetmask) + ESP32_W6100_manager.setSTAStaticIPConfig(EthSTA_IPconfig); +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + +#if USE_ESP_ETH_MANAGER_NTP + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + Serial.println(F("Current Timezone is not set. Enter Config Portal to set.")); + } + +#endif + } + else + { + // Enter CP only if no stored SSID on flash and file + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + + ////////////////////////////////// + + // Connect ETH now if using STA + initEthernet(); + + ////////////////////////////////// + + if (initialConfig) + { + Serial.print(F("Starting configuration portal @ ")); + Serial.println(ETH.localIP()); + + digitalWrite(LED_BUILTIN, LED_ON); // Turn led on as we are in configuration mode. + + //sets timeout in seconds until configuration portal gets turned off. + //If not specified device will remain in configuration mode until + //switched off via webserver or device is restarted. + //ESP32_W6100_manager.setConfigPortalTimeout(600); + + // Starts an access point + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + } + + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + } + + digitalWrite(LED_BUILTIN, LED_OFF); // Turn led off as we are not in configuration mode. + + startedAt = millis(); + + Serial.print(F("After waiting ")); + Serial.print((float) (millis() - startedAt) / 1000); + Serial.print(F(" secs more in setup(), connection result is ")); + + if (ESP32_W6100_isConnected()) + { + Serial.print(F("connected. Local IP: ")); + Serial.println(ETH.localIP()); + } +} + +////////////////////////////////////////////////////////////// + +void loop() +{ + // is configuration portal requested? + if ((digitalRead(TRIGGER_PIN) == LOW) || (digitalRead(TRIGGER_PIN2) == LOW)) + { + Serial.println(F("\nConfiguration portal requested.")); + digitalWrite(LED_BUILTIN, LED_ON); // turn the LED on by making the voltage LOW to tell us we are in configuration mode. + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ConfigOnSwitchFS"); + + //Check if there is stored credentials. + //If not found, device will remain in configuration mode until switched off via webserver. + Serial.println(F("Opening configuration portal. ")); + + if (loadConfigData()) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + } + else + { + // Enter CP only if no stored SSID on flash and file + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + // Extra parameters to be configured + // After connecting, parameter.getValue() will get you the configured value + // Format:

+ +

+ +Select `Information` to enter the Info page where the board info will be shown (long page) + +

+ +

+ + +Select `Configuration` to enter this page where you can select an AP and specify its WiFi Credentials + +

+ +

+ +Enter your credentials, then click `Save`. + +--- + +## How to use this ESP32_FSWebServer_DRD example? + +This shows you how to use this example in Ubuntu (but you can use similar commands in other OSes) + +### Download Data files + +1. For example, you already downloaded data files from [ESP32_FSWebServer_DRD data](https://github.com/khoih-prog/ESP32_W6100_Manager/tree/main/examples/ESP32_FSWebServer_DRD/data) to a local folder, for example: + +``` +~/Arduino/libraries/ESP32_W6100_Manager-main/examples/ESP32_FSWebServer_DRD/data +``` + +### HOWTO Upload files to ESP32 (SPIFFS or FFat) + +Use one of these methods (preferable first) + +1. Go to http://async-esp32fs.local/edit, then "Choose file" -> "Upload" +2. or Upload the contents of the data folder with MkSPIFFS Tool ("ESP8266 Sketch Data Upload" in Tools menu in Arduino IDE) +3. or upload the contents of a folder by running the following commands: +``` +Ubuntu$ cd ~/Arduino/libraries/ESP32_W6100_Manager-main/examples/ESP32_FSWebServer_DRD/data +Ubuntu$ for file in \`\ls -A1\`; do curl -F "file=@$PWD/$file" http://async-esp32fs.local/edit; done +``` + +--- + +### Demonstrating pictures + +

+ +

+ +4. Edit / Delete / Download any file in the the folder by going to http://async-esp32fs.local/edit + +

+ +

+ + diff --git a/examples/ESP32_FSWebServer/data/CanadaFlag_1.png b/examples/ESP32_FSWebServer/data/CanadaFlag_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3089877a83b0445506ccc764caed7922820b79c GIT binary patch literal 41214 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∾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 Sn()s7@S}?`(kh4F4F4adf8J^U literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer/data/CanadaFlag_2.png b/examples/ESP32_FSWebServer/data/CanadaFlag_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d51d229c29ce5c89f4e56ae44d06c6af925deca3 GIT binary patch literal 8311 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 Dvn_B_ literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer/data/edit.htm.gz b/examples/ESP32_FSWebServer/data/edit.htm.gz new file mode 100644 index 0000000000000000000000000000000000000000..69ce414f47f4b25a70160fc4985b2bd320c9b90a GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer/data/graphs.js.gz b/examples/ESP32_FSWebServer/data/graphs.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..72435445a7ef86e00fe6c66b3b71c47fdbd53a93 GIT binary patch literal 1971 zcmV;k2Tb@MiwFo@s$5k717~t!aAw-*8%!ep`yEM!aI@XpTRzN;M>CH`Bk93rb1y+*nfgVXr6{*O z+qWk+vpIfdbmRB&GiOD~!8-BI8jWLya*xm0`?Ns*u7@$U5b~-2FAtyY?VsHiJWiul z$g}Ci$m17Tz>sgbNBG!p6`3AIdmW5d-8e)$jYf;JJn?*ncK^L=>v4>q7o#|V#AXxo zd(ilSPVW5&A*9`%(ECk!Y+arKfe)*P?pEpRp~jzoF096?>r=Aoz97T=5)|h&-xQIu zg>l28ew8E08a6CBp`}c_5jC)_GP?DY`3f}-jd!TP&)0@aTI6>ySBJ(C^6Vjg_FCi? z4W)y8K|{N+7xu_b?5Q2tp*_aW9rTMaq?DSsrVu+rd~J}hE1ki{8Q_4DpSuf+7N=y0 z&lbmI*d0+cIw7C&8TouX>b8vuC7%rP5n-@XYJN3AXB2Qkjq~PBh|f&&!8{IOB&X(2 zH9yyb7aQ|uSdryo%OvNrl!(4VCh<(%jlKg>o+p(VLEZu+SU49}D`X?;9hV2J6#b@5xoQzr_H2o5@^1L}hMUELzT^@ZjjKOo0;;PSc-R=y16 zZ?GMY#vgK8*szEP4+cZTEn{%f2k_E z27Gde+C~f)Fg^jqZfsd{i2;6w@jVpRk!@);Z(!Q^0V_`j7DaAW9TdZ@cIt4a4szZaa^^aU29qDr;ABm46G?-=na2}Ferp=!isDL5 zZsRR-8*h`__!TcbYL6zj@e8?){|UK0{(#)d@5!y&&_(q^Zq+tjEH`wq+|b2RliLz5 zFqaQCU2wY8dG2R6eWA(3ua&TB6J>0#%pV>3Z zdyofc0!I`ut`SP$kiJ3WHi#-0<433_` z)YOv0bAAFn?dFnNRNv(ebZf$J9m~5X4;HB}|KgQLUj9wtTU0ot`o1rAx!kOPE}Fw8 zS~Q^pvJt_F1Mf4=n%)ASw`5Ik|GTcX!Dzk1YQ^WUvs*ob65M#*8Pl}n#sj~2z;Kp3 z#wt>!wBemdQe1%Fa@<6G*Tw3BO6(?)=)j$C-mo1S$t$oENe=yhLb-k<8_;yI4OzB} zRnJ39Vd(ZadQJ$E_Fo6+T+OyM?w0=_W4@|s1;9o}-pE(zujhQpQ&}rb!wtIwq}*=X z4FSKo$AySPF)Nk{6YIBX;rZfke?Eikq=c+ENp6^52>r$^5|&2ANW^K%_#LYXv7c8e z=vGa#hyxfcmO0B{UVkpiG+<$zvOo;WqJY`6)K6l6B8Kp~K2ezpCd|@8%tl_2EiSSo zFA^|v1uq>WUSe{a+%Cnisy&!<^nU5?i#QLL2@C+6O z9mvZ6hkhC(4R=nr5iF#GH6&3&)`F6DcbF}Sh6I^7IhzV|9hOnAbbP~0)_aTc?G-T zUOp0`CmZu63}>tmJ`@(Gu)SWMGnfEAsi4IU)bR<5*jr~_#!;-Z^EjQ<&VItC4B8MT z8B`^L%rDim_gH$+=1MruU~n)H8CPxfm(bCv7eR<84hDk()HUc0oPGxaFZ!1Rx^{U0 z&VK*U?e~RBheyXbhhXsb4|_d`A?>3*L0l+t&uz4z32}iM0zT**`+0@&e*in8G#?BP F000|7$0Ps% literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer/data/index.htm b/examples/ESP32_FSWebServer/data/index.htm new file mode 100644 index 0000000..9cb560c --- /dev/null +++ b/examples/ESP32_FSWebServer/data/index.htm @@ -0,0 +1,97 @@ + + + + + + ESP Monitor + + + + +
+ + + + +
+
+
+
+ + \ No newline at end of file diff --git a/examples/ESP32_FSWebServer/pics/async-esp32fs.local.png b/examples/ESP32_FSWebServer/pics/async-esp32fs.local.png new file mode 100644 index 0000000000000000000000000000000000000000..05e9f2474a25de0c6111edc9a26040d4b430b5d6 GIT binary patch literal 20520 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 T6qn6}hxb-a6;Lem;q(6mKu|tN literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer/pics/async-esp32fs.local_edit.png b/examples/ESP32_FSWebServer/pics/async-esp32fs.local_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..7deb17a4b9445b89f4c0e9836cdd83774429e06f GIT binary patch literal 76964 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 E1&k*zmjD0& literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/ESP32_FSWebServer_DRD.ino b/examples/ESP32_FSWebServer_DRD/ESP32_FSWebServer_DRD.ino new file mode 100644 index 0000000..f51b0ea --- /dev/null +++ b/examples/ESP32_FSWebServer_DRD/ESP32_FSWebServer_DRD.ino @@ -0,0 +1,1121 @@ +/**************************************************************************************************************************** + ESP32_FSWebServer_DRD - Example WebServer with SPIFFS backend for ESP32 + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + WebServer_ESP32_W6100 is a library for the ESP32 with Ethernet W6100 to run WebServer + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + *****************************************************************************************************************************/ +/***************************************************************************************************************************** + How To Upload Files: + 1) Go to http://async-esp32fs.local/edit, then "Choose file" -> "Upload" + 2) or Upload the contents of the data folder with MkSPIFFS Tool ("ESP8266 Sketch Data Upload" in Tools menu in Arduino IDE) + 3) or you can upload the contents of a folder if you CD in that folder and run the following command: + for file in `\ls -A1`; do curl -F "file=@$PWD/$file" esp8266fs.local/edit; done + + How To Use: + 1) access the sample web page at http://async-esp32fs.local + 2) edit the page by going to http://async-esp32fs.local/edit + 3. Use configurable user/password to login. Default is admin/admin +*****************************************************************************************************************************/ + +#if !( defined(ESP32) ) + #error This code is intended to run on the (ESP32 + LwIP W6100) platform! Please check your Tools->Board setting. +#endif + +////////////////////////////////////////////////////////////// + +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _ESP32_ETH_MGR_LOGLEVEL_ 4 + +// To not display stored SSIDs and PWDs on Config Portal, select false. Default is true +// Even the stored Credentials are not display, just leave them all blank to reconnect and reuse the stored Credentials +//#define DISPLAY_STORED_CREDENTIALS_IN_CP false + +////////////////////////////////////////////////////////////// + +// Enter a MAC address and IP address for your controller below. +#define NUMBER_OF_MAC 20 + +byte mac[][NUMBER_OF_MAC] = +{ + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 }, + { 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 }, +}; + +// Select the IP address according to your local network +//IPAddress myIP(192, 168, 2, 232); +//IPAddress myGW(192, 168, 2, 1); +//IPAddress mySN(255, 255, 255, 0); + +// Google DNS Server IP +//IPAddress myDNS(8, 8, 8, 8); + +////////////////////////////////////////////////////////////// + +// Optional values to override default settings +// Don't change unless you know what you're doing +//#define ETH_SPI_HOST SPI3_HOST +//#define SPI_CLOCK_MHZ 25 + +// Must connect INT to GPIOxx or not working +//#define INT_GPIO 4 + +//#define MISO_GPIO 19 +//#define MOSI_GPIO 23 +//#define SCK_GPIO 18 +//#define CS_GPIO 5 + +////////////////////////////////////////////////////////// + +#include + +#include + +////////////////////////////////////////////////////////////// + +// You only need to format the filesystem once +//#define FORMAT_FILESYSTEM true +#define FORMAT_FILESYSTEM false + +////////////////////////////////////////////////////////////// + +// LittleFS has higher priority than SPIFFS +#if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #define USE_LITTLEFS true + #define USE_SPIFFS false +#elif defined(ARDUINO_ESP32C3_DEV) + // For core v1.0.6-, ESP32-C3 only supporting SPIFFS and EEPROM. To use v2.0.0+ for LittleFS + #define USE_LITTLEFS false + #define USE_SPIFFS true +#endif + +#if USE_LITTLEFS + // Use LittleFS + #include "FS.h" + + // Check cores/esp32/esp_arduino_version.h and cores/esp32/core_version.h + //#if ( ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) ) //(ESP_ARDUINO_VERSION_MAJOR >= 2) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.6 or 2.0.0+ + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/espressif/arduino-esp32/tree/master/libraries/LittleFS + + FS* filesystem = &LittleFS; + #define FileFS LittleFS + #define FS_Name "LittleFS" + #else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32 Core 1.0.5-. You must install LITTLEFS library + #endif + + // The library has been merged into esp32 core from release 1.0.6 + #include // https://github.com/lorol/LITTLEFS + + FS* filesystem = &LITTLEFS; + #define FileFS LITTLEFS + #define FS_Name "LittleFS" + #endif + +#elif USE_SPIFFS + #include + FS* filesystem = &SPIFFS; + #define FileFS SPIFFS + #define FS_Name "SPIFFS" +#else + // Use FFat + #include + FS* filesystem = &FFat; + #define FileFS FFat + #define FS_Name "FFat" +#endif + +#define LED_BUILTIN 2 +#define LED_ON HIGH +#define LED_OFF LOW + +#include + +////////////////////////////////////////////////////////////// + +// These defines must be put before #include +// to select where to store DoubleResetDetector's variable. +// For ESP32, You must select one to be true (EEPROM or SPIFFS) +// Otherwise, library will use default EEPROM storage +#if USE_LITTLEFS + #define ESP_DRD_USE_LITTLEFS true + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM false +#elif USE_SPIFFS + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS true + #define ESP_DRD_USE_EEPROM false +#else + #define ESP_DRD_USE_LITTLEFS false + #define ESP_DRD_USE_SPIFFS false + #define ESP_DRD_USE_EEPROM true +#endif + +#define DOUBLERESETDETECTOR_DEBUG true //false + +#include //https://github.com/khoih-prog/ESP_DoubleResetDetector + +// Number of seconds after reset during which a +// subseqent reset will be considered a double reset. +#define DRD_TIMEOUT 10 + +// RTC Memory Address for the DoubleResetDetector to use +#define DRD_ADDRESS 0 + +//DoubleResetDetector drd(DRD_TIMEOUT, DRD_ADDRESS); +DoubleResetDetector* drd = NULL; + +////////////////////////////////////////////////////////////// + +// Assuming max 49 chars +#define TZNAME_MAX_LEN 50 +#define TIMEZONE_MAX_LEN 50 + +typedef struct +{ + char TZ_Name[TZNAME_MAX_LEN]; // "America/Toronto" + char TZ[TIMEZONE_MAX_LEN]; // "EST5EDT,M3.2.0,M11.1.0" + uint16_t checksum; +} EthConfig; + +EthConfig Ethconfig; + +#define CONFIG_FILENAME F("/eth_cred.dat") + +////////////////////////////////////////////////////////////// + +// Indicates whether ESP has credentials saved from previous session, or double reset detected +bool initialConfig = false; + +// Use false if you don't like to display Available Pages in Information Page of Config Portal +// Comment out or use true to display Available Pages in Information Page of Config Portal +// Must be placed before #include +#define USE_AVAILABLE_PAGES false + +// From v1.0.10 to permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa +// You have to explicitly specify false to disable the feature. +//#define USE_STATIC_IP_CONFIG_IN_CP false + +// Use false to disable NTP config. Advisable when using Cellphone, Tablet to access Config Portal. +// See Issue 23: On Android phone ConfigPortal is unresponsive (https://github.com/khoih-prog/ESP_WiFiManager/issues/23) +#define USE_ESP_ETH_MANAGER_NTP false + +// Just use enough to save memory. On ESP8266, can cause blank ConfigPortal screen +// if using too much memory +#define USING_AFRICA false +#define USING_AMERICA true +#define USING_ANTARCTICA false +#define USING_ASIA false +#define USING_ATLANTIC false +#define USING_AUSTRALIA false +#define USING_EUROPE false +#define USING_INDIAN false +#define USING_PACIFIC false +#define USING_ETC_GMT false + +// Use true to enable CloudFlare NTP service. System can hang if you don't have Internet access while accessing CloudFlare +// See Issue #21: CloudFlare link in the default portal (https://github.com/khoih-prog/ESP_WiFiManager/issues/21) +#define USE_CLOUDFLARE_NTP false + +#define USING_CORS_FEATURE true + +////////////////////////////////////////////////////////////// + +// Use USE_DHCP_IP == true for dynamic DHCP IP, false to use static IP which you have to change accordingly to your network +#if (defined(USE_STATIC_IP_CONFIG_IN_CP) && !USE_STATIC_IP_CONFIG_IN_CP) + // Force DHCP to be true + #if defined(USE_DHCP_IP) + #undef USE_DHCP_IP + #endif + #define USE_DHCP_IP true +#else + // You can select DHCP or Static IP here + //#define USE_DHCP_IP true + #define USE_DHCP_IP false +#endif + +#if ( USE_DHCP_IP ) + // Use DHCP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using DHCP IP + #endif + + IPAddress stationIP = IPAddress(0, 0, 0, 0); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); + +#else + // Use static IP + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using static IP + #endif + + IPAddress stationIP = IPAddress(192, 168, 2, 232); + IPAddress gatewayIP = IPAddress(192, 168, 2, 1); + IPAddress netMask = IPAddress(255, 255, 255, 0); +#endif + +////////////////////////////////////////////////////////////// + +#define USE_CONFIGURABLE_DNS true + +IPAddress dns1IP = gatewayIP; +IPAddress dns2IP = IPAddress(8, 8, 8, 8); + +////////////////////////////////////////////////////////////// + +// To eliminate WebServer.h conflicts when using AsyncWebServer +#define WEBSERVER_H + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +const char* host = "esp32-fs-browser"; + +#define HTTP_PORT 80 + +WebServer server(HTTP_PORT); + +//holds the current upload +File fsUploadFile; + +String http_username = "admin"; +String http_password = "admin"; + +String separatorLine = "==============================================================="; + +////////////////////////////////////////////////////////////// + +/****************************************** + // Defined in ESP32_W6100_Manager.hpp + typedef struct + { + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + #if USE_CONFIGURABLE_DNS + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; + #endif + } ETH_STA_IPConfig; +******************************************/ + +ETH_STA_IPConfig EthSTA_IPconfig; + +////////////////////////////////////////////////////////////// + +void initSTAIPConfigStruct(ETH_STA_IPConfig &in_EthSTA_IPconfig) +{ + in_EthSTA_IPconfig._sta_static_ip = stationIP; + in_EthSTA_IPconfig._sta_static_gw = gatewayIP; + in_EthSTA_IPconfig._sta_static_sn = netMask; +#if USE_CONFIGURABLE_DNS + in_EthSTA_IPconfig._sta_static_dns1 = dns1IP; + in_EthSTA_IPconfig._sta_static_dns2 = dns2IP; +#endif +} + +////////////////////////////////////////////////////////////// + +void displayIPConfigStruct(ETH_STA_IPConfig in_EthSTA_IPconfig) +{ + LOGERROR3(F("stationIP ="), in_EthSTA_IPconfig._sta_static_ip, ", gatewayIP =", in_EthSTA_IPconfig._sta_static_gw); + LOGERROR1(F("netMask ="), in_EthSTA_IPconfig._sta_static_sn); +#if USE_CONFIGURABLE_DNS + LOGERROR3(F("dns1IP ="), in_EthSTA_IPconfig._sta_static_dns1, ", dns2IP =", in_EthSTA_IPconfig._sta_static_dns2); +#endif +} + +////////////////////////////////////////////////////////////// + +//format bytes +String formatBytes(size_t bytes) +{ + if (bytes < 1024) + { + return String(bytes) + "B"; + } + else if (bytes < (1024 * 1024)) + { + return String(bytes / 1024.0) + "KB"; + } + else if (bytes < (1024 * 1024 * 1024)) + { + return String(bytes / 1024.0 / 1024.0) + "MB"; + } + else + { + return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB"; + } +} + + +String getContentType(String filename) +{ + if (server.hasArg("download")) + { + return "application/octet-stream"; + } + else if (filename.endsWith(".htm")) + { + return "text/html"; + } + else if (filename.endsWith(".html")) + { + return "text/html"; + } + else if (filename.endsWith(".css")) + { + return "text/css"; + } + else if (filename.endsWith(".js")) + { + return "application/javascript"; + } + else if (filename.endsWith(".png")) + { + return "image/png"; + } + else if (filename.endsWith(".gif")) + { + return "image/gif"; + } + else if (filename.endsWith(".jpg")) + { + return "image/jpeg"; + } + else if (filename.endsWith(".ico")) + { + return "image/x-icon"; + } + else if (filename.endsWith(".xml")) + { + return "text/xml"; + } + else if (filename.endsWith(".pdf")) + { + return "application/x-pdf"; + } + else if (filename.endsWith(".zip")) + { + return "application/x-zip"; + } + else if (filename.endsWith(".gz")) + { + return "application/x-gzip"; + } + + return "text/plain"; +} + +bool handleFileRead(String path) +{ + Serial.println("handleFileRead: " + path); + + if (path.endsWith("/")) + { + path += "index.htm"; + } + + String contentType = getContentType(path); + String pathWithGz = path + ".gz"; + + if (filesystem->exists(pathWithGz) || filesystem->exists(path)) + { + if (filesystem->exists(pathWithGz)) + { + path += ".gz"; + } + + File file = filesystem->open(path, "r"); + server.streamFile(file, contentType); + file.close(); + return true; + } + + return false; +} + +void handleFileUpload() +{ + if (server.uri() != "/edit") + { + return; + } + + HTTPUpload& upload = server.upload(); + + if (upload.status == UPLOAD_FILE_START) + { + String filename = upload.filename; + + if (!filename.startsWith("/")) + { + filename = "/" + filename; + } + + Serial.print(F("handleFileUpload Name: ")); + Serial.println(filename); + fsUploadFile = filesystem->open(filename, "w"); + filename.clear(); + } + else if (upload.status == UPLOAD_FILE_WRITE) + { + //Serial.print(F("handleFileUpload Data: ")); Serial.println(upload.currentSize); + if (fsUploadFile) + { + fsUploadFile.write(upload.buf, upload.currentSize); + } + } + else if (upload.status == UPLOAD_FILE_END) + { + if (fsUploadFile) + { + fsUploadFile.close(); + } + + Serial.print(F("handleFileUpload Size: ")); + Serial.println(upload.totalSize); + } +} + +void handleFileDelete() +{ + if (server.args() == 0) + { + return server.send(500, "text/plain", "BAD ARGS"); + } + + String path = server.arg(0); + Serial.println("handleFileDelete: " + path); + + if (path == "/") + { + return server.send(500, "text/plain", "BAD PATH"); + } + + if (!filesystem->exists(path)) + { + return server.send(404, "text/plain", "FileNotFound"); + } + + filesystem->remove(path); + server.send(200, "text/plain", ""); + path.clear(); +} + +void handleFileCreate() +{ + if (server.args() == 0) + { + return server.send(500, "text/plain", "BAD ARGS"); + } + + String path = server.arg(0); + Serial.println("handleFileCreate: " + path); + + if (path == "/") + { + return server.send(500, "text/plain", "BAD PATH"); + } + + if (filesystem->exists(path)) + { + return server.send(500, "text/plain", "FILE EXISTS"); + } + + File file = filesystem->open(path, "w"); + + if (file) + { + file.close(); + } + else + { + return server.send(500, "text/plain", "CREATE FAILED"); + } + + server.send(200, "text/plain", ""); + path.clear(); +} + +void handleFileList() +{ + if (!server.hasArg("dir")) + { + server.send(500, "text/plain", "BAD ARGS"); + return; + } + + String path = server.arg("dir"); + Serial.println("handleFileList: " + path); + + File root = filesystem->open(path); + path = String(); + + String output = "["; + + if (root.isDirectory()) + { + File file = root.openNextFile(); + + while (file) + { + if (output != "[") + { + output += ','; + } + + output += "{\"type\":\""; + output += (file.isDirectory()) ? "dir" : "file"; + output += "\",\"name\":\""; + //output += String(file.name()).substring(1); + output += String(file.name()).substring(0); + output += "\"}"; + file = root.openNextFile(); + } + } + + output += "]"; + + Serial.println("handleFileList: " + output); + + server.send(200, "text/json", output); +} + + +////////////////////////////////////////////////////////////// + +void toggleLED() +{ + //toggle state + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); +} + +////////////////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP +void printLocalTime() +{ + struct tm timeinfo; + + getLocalTime( &timeinfo ); + + // Valid only if year > 2000. + // You can get from timeinfo : tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec + if (timeinfo.tm_year > 100 ) + { + Serial.print("Local Date/Time: "); + Serial.print( asctime( &timeinfo ) ); + } +} +#endif + +////////////////////////////////////////////////////////////// + +void heartBeatPrint() +{ +#if USE_ESP_ETH_MANAGER_NTP + printLocalTime(); +#else + static int num = 1; + + if (ESP32_W6100_isConnected()) + Serial.print(F("H")); // H means connected to Ethernet + else + Serial.print(F("F")); // F means not connected to Ethernet + + if (num == 80) + { + Serial.println(); + num = 1; + } + else if (num++ % 10 == 0) + { + Serial.print(F(" ")); + } + +#endif +} + +////////////////////////////////////////////////////////////// + +void check_status() +{ + static ulong checkstatus_timeout = 0; + static ulong LEDstatus_timeout = 0; + + static ulong current_millis; + +#if USE_ESP_ETH_MANAGER_NTP +#define HEARTBEAT_INTERVAL 60000L +#else +#define HEARTBEAT_INTERVAL 10000L +#endif + +#define LED_INTERVAL 2000L + + current_millis = millis(); + + if ((current_millis > LEDstatus_timeout) || (LEDstatus_timeout == 0)) + { + // Toggle LED at LED_INTERVAL = 2s + toggleLED(); + LEDstatus_timeout = current_millis + LED_INTERVAL; + } + + // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. + if ((current_millis > checkstatus_timeout) || (checkstatus_timeout == 0)) + { + heartBeatPrint(); + checkstatus_timeout = current_millis + HEARTBEAT_INTERVAL; + } +} + +////////////////////////////////////////////////////////////// + +int calcChecksum(uint8_t* address, uint16_t sizeToCalc) +{ + uint16_t checkSum = 0; + + for (uint16_t index = 0; index < sizeToCalc; index++) + { + checkSum += * ( ( (byte*) address ) + index); + } + + return checkSum; +} + +////////////////////////////////////////////////////////////// + +bool loadConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "r"); + LOGERROR(F("LoadCfgFile ")); + + memset((void *) &Ethconfig, 0, sizeof(Ethconfig)); + memset((void *) &EthSTA_IPconfig, 0, sizeof(EthSTA_IPconfig)); + + if (file) + { + file.readBytes((char *) &Ethconfig, sizeof(Ethconfig)); + file.readBytes((char *) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + + if ( Ethconfig.checksum != calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ) ) + { + LOGERROR(F("Ethconfig checksum wrong")); + + return false; + } + + displayIPConfigStruct(EthSTA_IPconfig); + + return true; + } + else + { + LOGERROR(F("failed")); + + return false; + } +} + +////////////////////////////////////////////////////////////// + +void saveConfigData() +{ + File file = FileFS.open(CONFIG_FILENAME, "w"); + LOGERROR(F("SaveCfgFile ")); + + if (file) + { + Ethconfig.checksum = calcChecksum( (uint8_t*) &Ethconfig, sizeof(Ethconfig) - sizeof(Ethconfig.checksum) ); + + file.write((uint8_t*) &Ethconfig, sizeof(Ethconfig)); + + displayIPConfigStruct(EthSTA_IPconfig); + + file.write((uint8_t*) &EthSTA_IPconfig, sizeof(EthSTA_IPconfig)); + file.close(); + + LOGERROR(F("OK")); + } + else + { + LOGERROR(F("failed")); + } +} + +////////////////////////////////////////////////////////////// + +void beginEthernet() +{ + LOGWARN(F("Default SPI pinout:")); + LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST); + LOGWARN1(F("MOSI:"), MOSI_GPIO); + LOGWARN1(F("MISO:"), MISO_GPIO); + LOGWARN1(F("SCK:"), SCK_GPIO); + LOGWARN1(F("CS:"), CS_GPIO); + LOGWARN1(F("INT:"), INT_GPIO); + LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ); + LOGWARN(F("=========================")); + + /////////////////////////////////// + + // To be called before ETH.begin() + ESP32_W6100_onEvent(); + + // start the ethernet connection and the server: + // Use DHCP dynamic IP and random mac + uint16_t index = millis() % NUMBER_OF_MAC; + + //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, + // int SPI_HOST, uint8_t *W6100_Mac = W6100_Default_Mac); + //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST ); + ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[index] ); +} + +////////////////////////////////////////////////////////////// + +void initEthernet() +{ +#if !( USE_DHCP_IP ) + displayIPConfigStruct(EthSTA_IPconfig); + + // Static IP, leave without this line to get IP via DHCP + //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0); + //ETH.config(stationIP, gatewayIP, netMask, dns1IP, dns2IP); + ETH.config(EthSTA_IPconfig._sta_static_ip, EthSTA_IPconfig._sta_static_gw, EthSTA_IPconfig._sta_static_sn, + EthSTA_IPconfig._sta_static_dns1); +#endif + + ESP32_W6100_waitForConnect(); +} + +////////////////////////////////////////////////////////////// + +void setup() +{ + //set led pin as output + pinMode(LED_BUILTIN, OUTPUT); + + Serial.begin(115200); + + while (!Serial && millis() < 5000); + + delay(200); + + Serial.print(F("\nStarting ESP32_FSWebServer_DRD using ")); + Serial.print(FS_Name); + Serial.print(F(" on ")); + Serial.print(ARDUINO_BOARD); + Serial.print(F(" with ")); + Serial.println(SHIELD_TYPE); + Serial.println(ESP32_W6100_MANAGER_VERSION); + Serial.println(ESP_DOUBLE_RESET_DETECTOR_VERSION); + + Serial.setDebugOutput(false); + + if (FORMAT_FILESYSTEM) + FileFS.format(); + + // Format FileFS if not yet + if (!FileFS.begin(true)) + { + Serial.println(F("SPIFFS/LittleFS failed! Already tried formatting.")); + + if (!FileFS.begin()) + { + // prevents debug info from the library to hide err message. + delay(100); + +#if USE_LITTLEFS + Serial.println(F("LittleFS failed!. Please use SPIFFS or EEPROM. Stay forever")); +#else + Serial.println(F("SPIFFS failed!. Please use LittleFS or EEPROM. Stay forever")); +#endif + + while (true) + { + delay(1); + } + } + } + + File root = FileFS.open("/"); + File file = root.openNextFile(); + + while (file) + { + String fileName = file.name(); + size_t fileSize = file.size(); + Serial.printf("FS File: %s, size: %s\n", fileName.c_str(), formatBytes(fileSize).c_str()); + file = root.openNextFile(); + } + + Serial.println(); + + drd = new DoubleResetDetector(DRD_TIMEOUT, DRD_ADDRESS); + + if (!drd) + Serial.println(F("Can't instantiate. Disable DRD feature")); + + unsigned long startedAt = millis(); + + beginEthernet(); + + initSTAIPConfigStruct(EthSTA_IPconfig); + + digitalWrite(LED_BUILTIN, LED_ON); + + //Local intialization. Once its business is done, there is no need to keep it around + // Use this to default DHCP hostname to ESP32-XXXXXX + //ESP32_W6100_Manager ESP32_W6100_manager; + // Use this to personalize DHCP hostname (RFC952 conformed) + ESP32_W6100_Manager ESP32_W6100_manager("ESP32-FSWebServer_DRD"); + +#if !USE_DHCP_IP + // Set (static IP, Gateway, Subnetmask, DNS1 and DNS2) or (IP, Gateway, Subnetmask) + ESP32_W6100_manager.setSTAStaticIPConfig(EthSTA_IPconfig); +#endif + +#if USING_CORS_FEATURE + ESP32_W6100_manager.setCORSHeader("Your Access-Control-Allow-Origin"); +#endif + + bool configDataLoaded = loadConfigData(); + + ////////////////////////////////// + + // Connect ETH now if using STA + initEthernet(); + + ////////////////////////////////// + + if (configDataLoaded) + { + //If no access point name has been previously entered disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(120); + + Serial.println(F("Got stored Credentials. Timeout 120s for Config Portal")); + +#if USE_ESP_ETH_MANAGER_NTP + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + Serial.println(F("Current Timezone is not set. Enter Config Portal to set.")); + } + +#endif + } + else + { + // Enter CP only if no stored SSID on flash and file + Serial.println(F("Open Config Portal without Timeout: No stored Credentials.")); + initialConfig = true; + } + + if (drd->detectDoubleReset()) + { + // DRD, disable timeout. + ESP32_W6100_manager.setConfigPortalTimeout(0); + + Serial.println(F("Open Config Portal without Timeout: Double Reset Detected")); + initialConfig = true; + } + + if (initialConfig) + { + Serial.print(F("Starting configuration portal @ ")); + Serial.println(ETH.localIP()); + + //sets timeout in seconds until configuration portal gets turned off. + //If not specified device will remain in configuration mode until + //switched off via webserver or device is restarted. + //ESP32_W6100_manager.setConfigPortalTimeout(600); + + // Starts an access point + if (!ESP32_W6100_manager.startConfigPortal()) + Serial.println(F("Not connected to ETH network but continuing anyway.")); + else + { + Serial.println(F("ETH network connected...yeey :)")); + } + +#if USE_ESP_ETH_MANAGER_NTP + String tempTZ = ESP32_W6100_manager.getTimezoneName(); + + if (strlen(tempTZ.c_str()) < sizeof(Ethconfig.TZ_Name) - 1) + strcpy(Ethconfig.TZ_Name, tempTZ.c_str()); + else + strncpy(Ethconfig.TZ_Name, tempTZ.c_str(), sizeof(Ethconfig.TZ_Name) - 1); + + const char * TZ_Result = ESP32_W6100_manager.getTZ(Ethconfig.TZ_Name); + + if (strlen(TZ_Result) < sizeof(Ethconfig.TZ) - 1) + strcpy(Ethconfig.TZ, TZ_Result); + else + strncpy(Ethconfig.TZ, TZ_Result, sizeof(Ethconfig.TZ_Name) - 1); + + if ( strlen(Ethconfig.TZ_Name) > 0 ) + { + LOGERROR3(F("Saving current TZ_Name ="), Ethconfig.TZ_Name, F(", TZ = "), Ethconfig.TZ); + + //configTzTime(Ethconfig.TZ, "pool.ntp.org" ); + configTzTime(Ethconfig.TZ, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + } + else + { + LOGERROR(F("Current Timezone Name is not set. Enter Config Portal to set.")); + } + +#endif + + ESP32_W6100_manager.getSTAStaticIPConfig(EthSTA_IPconfig); + + saveConfigData(); + } + + startedAt = millis(); + + Serial.print(F("After waiting ")); + Serial.print((float) (millis() - startedAt) / 1000); + Serial.print(F(" secs more in setup(), connection result is ")); + + if (ESP32_W6100_isConnected()) + { + Serial.print(F("connected. Local IP: ")); + Serial.println(ETH.localIP()); + } + + //SERVER INIT + //list directory + server.on("/list", HTTP_GET, handleFileList); + + //load editor + server.on("/edit", HTTP_GET, []() + { + if (!handleFileRead("/edit.htm")) + { + server.send(404, "text/plain", "FileNotFound"); + } + }); + + //create file + server.on("/edit", HTTP_PUT, handleFileCreate); + + //delete file + server.on("/edit", HTTP_DELETE, handleFileDelete); + + //first callback is called after the request has ended with all parsed arguments + //second callback handles file uploads at that location + server.on("/edit", HTTP_POST, []() + { + server.send(200, "text/plain", ""); + }, handleFileUpload); + + //called when the url is not defined here + //use it to load content from SPIFFS + server.onNotFound([]() + { + if (!handleFileRead(server.uri())) + { + server.send(404, "text/plain", "FileNotFound"); + } + }); + + //get heap status, analog input value and all GPIO statuses in one json call + server.on("/all", HTTP_GET, []() + { + String json = "{"; + json += "\"heap\":" + String(ESP.getFreeHeap()); + json += ", \"analog\":" + String(analogRead(A0)); + json += ", \"gpio\":" + String((uint32_t)(0)); + json += "}"; + server.send(200, "text/json", json); + json = String(); + }); + + server.begin(); + + Serial.print(F("HTTP server started @ ")); + Serial.println(WiFi.localIP()); + + MDNS.begin(host); + // Add service to MDNS-SD + MDNS.addService("http", "tcp", HTTP_PORT); + + ////////////////////////////////////////////////////////////// + + Serial.print(F("HTTP server started @ ")); + Serial.println(ETH.localIP()); + + Serial.println(separatorLine); + Serial.print("Open http://"); + Serial.print(ETH.localIP()); + Serial.println("/edit to see the file browser"); + Serial.println("Using username = " + http_username + " and password = " + http_password); + Serial.println(separatorLine); + + digitalWrite(LED_BUILTIN, LED_OFF); +} + +////////////////////////////////////////////////////////////// + +void loop() +{ + // Call the double reset detector loop method every so often, + // so that it can recognise when the timeout expires. + // You can also call drd.stop() when you wish to no longer + // consider the next reset as a double reset. + drd->loop(); + + // this is just for checking if we are alive and connected to WiFi + check_status(); + + server.handleClient(); +} diff --git a/examples/ESP32_FSWebServer_DRD/README.md b/examples/ESP32_FSWebServer_DRD/README.md new file mode 100644 index 0000000..85f1c86 --- /dev/null +++ b/examples/ESP32_FSWebServer_DRD/README.md @@ -0,0 +1,69 @@ +# ESP32_FSWebServer_DRD Example + +## First, how Config Portal works? + +Connect to Config Portal @ the localIP address, e.g. `192.168.2.232` + + +You'll see this `Main` page: + +

+ +

+ +Select `Information` to enter the Info page where the board info will be shown (long page) + +

+ +

+ + +Select `Configuration` to enter this page where you can select an AP and specify its WiFi Credentials + +

+ +

+ +Enter your credentials, then click `Save`. + +--- + +## How to use this ESP32_FSWebServer_DRD example? + +This shows you how to use this example in Ubuntu (but you can use similar commands in other OSes) + +### Download Data files + +1. For example, you already downloaded data files from [ESP32_FSWebServer_DRD data](https://github.com/khoih-prog/ESP32_W6100_Manager/tree/main/examples/ESP32_FSWebServer_DRD/data) to a local folder, for example: + +``` +~/Arduino/libraries/ESP32_W6100_Manager-main/examples/ESP32_FSWebServer_DRD/data +``` + +### HOWTO Upload files to ESP32 (SPIFFS or FFat) + +Use one of these methods (preferable first) + +1. Go to http://async-esp32fs.local/edit, then "Choose file" -> "Upload" +2. or Upload the contents of the data folder with MkSPIFFS Tool ("ESP8266 Sketch Data Upload" in Tools menu in Arduino IDE) +3. or upload the contents of a folder by running the following commands: +``` +Ubuntu$ cd ~/Arduino/libraries/ESP32_W6100_Manager-main/examples/ESP32_FSWebServer_DRD/data +Ubuntu$ for file in \`\ls -A1\`; do curl -F "file=@$PWD/$file" http://async-esp32fs.local/edit; done +``` + +--- + +### Demonstrating pictures + +

+ +

+ +4. Edit / Delete / Download any file in the the folder by going to http://async-esp32fs.local/edit + +

+ +

+ + diff --git a/examples/ESP32_FSWebServer_DRD/data/CanadaFlag_1.png b/examples/ESP32_FSWebServer_DRD/data/CanadaFlag_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3089877a83b0445506ccc764caed7922820b79c GIT binary patch literal 41214 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∾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 Sn()s7@S}?`(kh4F4F4adf8J^U literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/data/CanadaFlag_2.png b/examples/ESP32_FSWebServer_DRD/data/CanadaFlag_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d51d229c29ce5c89f4e56ae44d06c6af925deca3 GIT binary patch literal 8311 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 Dvn_B_ literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/data/edit.htm.gz b/examples/ESP32_FSWebServer_DRD/data/edit.htm.gz new file mode 100644 index 0000000000000000000000000000000000000000..69ce414f47f4b25a70160fc4985b2bd320c9b90a GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/data/graphs.js.gz b/examples/ESP32_FSWebServer_DRD/data/graphs.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..72435445a7ef86e00fe6c66b3b71c47fdbd53a93 GIT binary patch literal 1971 zcmV;k2Tb@MiwFo@s$5k717~t!aAw-*8%!ep`yEM!aI@XpTRzN;M>CH`Bk93rb1y+*nfgVXr6{*O z+qWk+vpIfdbmRB&GiOD~!8-BI8jWLya*xm0`?Ns*u7@$U5b~-2FAtyY?VsHiJWiul z$g}Ci$m17Tz>sgbNBG!p6`3AIdmW5d-8e)$jYf;JJn?*ncK^L=>v4>q7o#|V#AXxo zd(ilSPVW5&A*9`%(ECk!Y+arKfe)*P?pEpRp~jzoF096?>r=Aoz97T=5)|h&-xQIu zg>l28ew8E08a6CBp`}c_5jC)_GP?DY`3f}-jd!TP&)0@aTI6>ySBJ(C^6Vjg_FCi? z4W)y8K|{N+7xu_b?5Q2tp*_aW9rTMaq?DSsrVu+rd~J}hE1ki{8Q_4DpSuf+7N=y0 z&lbmI*d0+cIw7C&8TouX>b8vuC7%rP5n-@XYJN3AXB2Qkjq~PBh|f&&!8{IOB&X(2 zH9yyb7aQ|uSdryo%OvNrl!(4VCh<(%jlKg>o+p(VLEZu+SU49}D`X?;9hV2J6#b@5xoQzr_H2o5@^1L}hMUELzT^@ZjjKOo0;;PSc-R=y16 zZ?GMY#vgK8*szEP4+cZTEn{%f2k_E z27Gde+C~f)Fg^jqZfsd{i2;6w@jVpRk!@);Z(!Q^0V_`j7DaAW9TdZ@cIt4a4szZaa^^aU29qDr;ABm46G?-=na2}Ferp=!isDL5 zZsRR-8*h`__!TcbYL6zj@e8?){|UK0{(#)d@5!y&&_(q^Zq+tjEH`wq+|b2RliLz5 zFqaQCU2wY8dG2R6eWA(3ua&TB6J>0#%pV>3Z zdyofc0!I`ut`SP$kiJ3WHi#-0<433_` z)YOv0bAAFn?dFnNRNv(ebZf$J9m~5X4;HB}|KgQLUj9wtTU0ot`o1rAx!kOPE}Fw8 zS~Q^pvJt_F1Mf4=n%)ASw`5Ik|GTcX!Dzk1YQ^WUvs*ob65M#*8Pl}n#sj~2z;Kp3 z#wt>!wBemdQe1%Fa@<6G*Tw3BO6(?)=)j$C-mo1S$t$oENe=yhLb-k<8_;yI4OzB} zRnJ39Vd(ZadQJ$E_Fo6+T+OyM?w0=_W4@|s1;9o}-pE(zujhQpQ&}rb!wtIwq}*=X z4FSKo$AySPF)Nk{6YIBX;rZfke?Eikq=c+ENp6^52>r$^5|&2ANW^K%_#LYXv7c8e z=vGa#hyxfcmO0B{UVkpiG+<$zvOo;WqJY`6)K6l6B8Kp~K2ezpCd|@8%tl_2EiSSo zFA^|v1uq>WUSe{a+%Cnisy&!<^nU5?i#QLL2@C+6O z9mvZ6hkhC(4R=nr5iF#GH6&3&)`F6DcbF}Sh6I^7IhzV|9hOnAbbP~0)_aTc?G-T zUOp0`CmZu63}>tmJ`@(Gu)SWMGnfEAsi4IU)bR<5*jr~_#!;-Z^EjQ<&VItC4B8MT z8B`^L%rDim_gH$+=1MruU~n)H8CPxfm(bCv7eR<84hDk()HUc0oPGxaFZ!1Rx^{U0 z&VK*U?e~RBheyXbhhXsb4|_d`A?>3*L0l+t&uz4z32}iM0zT**`+0@&e*in8G#?BP F000|7$0Ps% literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/data/index.htm b/examples/ESP32_FSWebServer_DRD/data/index.htm new file mode 100644 index 0000000..9cb560c --- /dev/null +++ b/examples/ESP32_FSWebServer_DRD/data/index.htm @@ -0,0 +1,97 @@ + + + + + + ESP Monitor + + + + +
+ + + + +
+
+
+
+ + \ No newline at end of file diff --git a/examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local.png b/examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local.png new file mode 100644 index 0000000000000000000000000000000000000000..05e9f2474a25de0c6111edc9a26040d4b430b5d6 GIT binary patch literal 20520 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 T6qn6}hxb-a6;Lem;q(6mKu|tN literal 0 HcmV?d00001 diff --git a/examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local_edit.png b/examples/ESP32_FSWebServer_DRD/pics/async-esp32fs.local_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..7deb17a4b9445b89f4c0e9836cdd83774429e06f GIT binary patch literal 76964 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
q(8#tZ`282vcnoZ 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 E1&k*zmjD0& literal 0 HcmV?d00001 diff --git a/keywords.txt b/keywords.txt new file mode 100644 index 0000000..e44df86 --- /dev/null +++ b/keywords.txt @@ -0,0 +1,92 @@ +########################################## +# Syntax Coloring Map For ESP_WifiManager +########################################## + +####################################### +# Datatypes (KEYWORD1) +####################################### + +ESP32_W6100_Manager KEYWORD1 +ESP32_EMParameter KEYWORD1 + +ETH_STA_IPConfig KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +getID KEYWORD2 +getValue KEYWORD2 +getPlaceholder KEYWORD2 +getValueLength KEYWORD2 +getLabelPlacement KEYWORD2 +getCustomHTML KEYWORD2 +startConfigPortal KEYWORD2 +setConfigPortalTimeout KEYWORD2 +setTimeout KEYWORD2 +setConnectTimeout KEYWORD2 +setDebugOutput KEYWORD2 +setSTAStaticIPConfig KEYWORD2 +getSTAStaticIPConfig KEYWORD2 +setSaveConfigCallback KEYWORD2 +addParameter KEYWORD2 +setBreakAfterConfig KEYWORD2 +setCustomHeadElement KEYWORD2 +setCORSHeader KEYWORD2 +getCORSHeader KEYWORD2 +getParameters KEYWORD2 +setHostname KEYWORD2 +getTimezoneName KEYWORD2 +setTimezoneName KEYWORD2 +getTZ KEYWORD2 + +####################################### + +getChipID KEYWORD2 +getChipOUI KEYWORD2 + +ESP_getChipId KEYWORD2 +ESP_getChipOUI KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +# LITERAL1 + +ESP32_W6100_MANAGER_VERSION LITERAL1 +ESP32_W6100_MANAGER_VERSION_MAJOR LITERAL1 +ESP32_W6100_MANAGER_VERSION_MINOR LITERAL1 +ESP32_W6100_MANAGER_VERSION_PATCH LITERAL1 +ESP32_W6100_MANAGER_VERSION_INT LITERAL1 + +EM_HTTP_200 LITERAL1 +EM_HTTP_HEAD_START LITERAL1 +EM_HTTP_STYLE LITERAL1 +EM_HTTP_SCRIPT LITERAL1 +EM_HTTP_SCRIPT_NTP_MSG LITERAL1 +EM_HTTP_SCRIPT_NTP_HIDDEN LITERAL1 +EM_HTTP_SCRIPT_NTP LITERAL1 +EM_HTTP_HEAD_END LITERAL1 +EM_FLDSET_START LITERAL1 +EM_FLDSET_END LITERAL1 +EM_HTTP_PORTAL_OPTIONS LITERAL1 +EM_HTTP_ITEM LITERAL1 +JSON_ITEM LITERAL1 +EM_HTTP_FORM_LABEL_BEFORE LITERAL1 +EM_HTTP_FORM_LABEL_AFTER LITERAL1 +EM_HTTP_FORM_LABEL LITERAL1 +EM_HTTP_FORM_PARAM LITERAL1 +EM_HTTP_FORM_END LITERAL1 +EM_HTTP_SAVED LITERAL1 +EM_HTTP_END LITERAL1 +EM_HTTP_HEAD_CL LITERAL1 +EM_HTTP_HEAD_CT LITERAL1 +EM_HTTP_HEAD_CT2 LITERAL1 +EM_HTTP_CACHE_CONTROL LITERAL1 +EM_HTTP_PRAGMA LITERAL1 +EM_HTTP_NO_CACHE LITERAL1 +EM_HTTP_EXPIRES LITERAL1 +EM_HTTP_CORS LITERAL1 +EM_HTTP_CORS_ALLOW_ALL LITERAL1 +EM_HTTP_AVAILABLE_PAGES LITERAL1 diff --git a/library.json b/library.json new file mode 100644 index 0000000..a0c87e0 --- /dev/null +++ b/library.json @@ -0,0 +1,44 @@ +{ + "name": "ESP32_W6100_Manager", + "version": "1.0.0", + "keywords": "ethernet, WiFiManager, esp8266, esp32, esp32-s2, esp32-s3, esp32-c3, WebServer, Communication, Credentials, Config-Portal, DoubleReset, MultiReset, littlefs, spiffs, dns-server, iot, eeprom", + "description": "ESP32 + LwIP W6100, including ESP32-S2, ESP32-S3 and ESP32-C3, Connection and Credentials Manager using AsyncWebServer, with enhanced GUI and fallback Web ConfigPortal. This Library is used for configuring ESP32 + LwIP W6100, including ESP32-S2, ESP32-S3 and ESP32-C3, Credentials Manager at runtime. You can also specify static DNS servers, personalized HostName, static or DHCP IP. With configurable CORS Header and auto-Timezone features. Using AsyncDNSServer instead of DNSServer now. Now using correct ESP32 chipIP", + "authors": + { + "name": "Khoi Hoang", + "url": "https://github.com/khoih-prog", + "maintainer": true + }, + "repository": + { + "type": "git", + "url": "https://github.com/khoih-prog/ESP32_W6100_Manager" + }, + "homepage": "https://github.com/khoih-prog/ESP32_W6100_Manager", + "export": { + "exclude": [ + "linux", + "extras", + "tests" + ] + }, + "dependencies": [ + { + "owner": "khoih-prog", + "name": "WebServer_ESP32_W6100", + "version": ">=1.5.3", + "platforms": ["espressif32"] + }, + { + "owner": "khoih-prog", + "name": "ESP_DoubleResetDetector", + "version": ">=1.3.2", + "platforms": ["espressif32"] + } + ], + "license": "MIT", + "frameworks": "*", + "platforms": ["espressif32"], + "examples": "examples/*/*/*.ino", + "headers": ["ESP32_W6100_Manager.h", "ESP32_W6100_Manager.hpp"] +} diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..fdbaa6c --- /dev/null +++ b/library.properties @@ -0,0 +1,12 @@ +name=ESP32_W6100_Manager +version=1.0.0 +author=Khoi Hoang +maintainer=Khoi Hoang +license=MIT +sentence=ESP32 + LwIP W6100 Connection and Credentials Manager using AsyncWebServer, with enhanced GUI and fallback Web ConfigPortal. +paragraph=This Library is used for configuring ESP32 + LwIP W6100 Credentials Manager at runtime. You can also specify static DNS servers, personalized HostName, static or DHCP IP. With configurable CORS Header and auto-Timezone features. Using AsyncDNSServer instead of DNSServer now. Now using correct ESP32 chipIP +category=Communication +url=https://github.com/khoih-prog/ESP32_W6100_Manager +architectures=esp32 +depends=ESP_DoubleResetDetector, WebServer_ESP32_W6100 +includes=ESP32_W6100_Manager.h, ESP32_W6100_Manager.hpp diff --git a/platformio/platformio.ini b/platformio/platformio.ini new file mode 100644 index 0000000..4be63d5 --- /dev/null +++ b/platformio/platformio.ini @@ -0,0 +1,96 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +; ============================================================ +; chose environment: +; ESP8266 +; ESP32 +; SAMD +; NRF52 +; STM32 +; ============================================================ +default_envs = ESP32 + +[env] +; ============================================================ +; Serial configuration +; choose upload speed, serial-monitor speed +; ============================================================ +upload_speed = 921600 +;upload_port = COM11 +;monitor_speed = 9600 +;monitor_port = COM11 + +; ============================================================ +; Checks for the compatibility with frameworks and dev/platforms +lib_compat_mode = strict +lib_ldf_mode = chain+ +;lib_ldf_mode = deep+ + +; ============================================================ +lib_deps = +; PlatformIO 4.x +; ESP_DoubleResetDetector@>=1.3.2 +; WebServer_ESP32_W6100@>=1.5.3 + +; PlatformIO 5.x + khoih-prog/ESP_DoubleResetDetector@>=1.3.2 + khoih-prog/WebServer_ESP32_W6100@>=1.5.3 + +; ============================================================ +build_flags = +; set your build_flags + +; ============================================================ +[env:ESP32] +platform = espressif32 +framework = arduino +; ============================================================ +; Board configuration +; choose your board by uncommenting one of the following lines +; ============================================================ +;board = esp32cam +;board = alksesp32 +;board = featheresp32 +;board = espea32 +;board = bpi-bit +;board = d-duino-32 +board = esp32doit-devkit-v1 +;board = pocket_32 +;board = fm-devkit +;board = pico32 +;board = esp32-evb +;board = esp32-gateway +;board = esp32-pro +;board = esp32-poe +;board = oroca_edubot +;board = onehorse32dev +;board = lopy +;board = lopy4 +;board = wesp32 +;board = esp32thing +;board = sparkfun_lora_gateway_1-channel +;board = ttgo-lora32-v1 +;board = ttgo-t-beam +;board = turta_iot_node +;board = lolin_d32 +;board = lolin_d32_pro +;board = lolin32 +;board = wemosbat +;board = widora-air +;board = xinabox_cw02 +;board = iotbusio +;board = iotbusproteus +;board = nina_w10 + +; ============================================================ +; Board configuration Many more Boards to be filled +; ============================================================ diff --git a/src/ESP32_W6100_Manager.h b/src/ESP32_W6100_Manager.h new file mode 100644 index 0000000..f0b53bc --- /dev/null +++ b/src/ESP32_W6100_Manager.h @@ -0,0 +1,30 @@ +/**************************************************************************************************************************** + ESP32_W6100_Manager.h + + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + + Version: 1.0.0 + + Version Modified By Date Comments + ------- ----------- ---------- ----------- + 1.0.0 K Hoang 14/01/2023 Initial coding for ESP32_W6100 (ESP32 + LwIP W6100) + *****************************************************************************************************************************/ + +#pragma once + +#ifndef ESP32_W6100_Manager_h +#define ESP32_W6100_Manager_h + +#include //https://github.com/khoih-prog/ESP32_W6100_Manager +#include //https://github.com/khoih-prog/ESP32_W6100_Manager + +#endif // ESP32_W6100_Manager_h + diff --git a/src/ESP32_W6100_Manager.hpp b/src/ESP32_W6100_Manager.hpp new file mode 100644 index 0000000..890a781 --- /dev/null +++ b/src/ESP32_W6100_Manager.hpp @@ -0,0 +1,627 @@ +/**************************************************************************************************************************** + ESP32_W6100_Manager.hpp + + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + + Version: 1.0.0 + + Version Modified By Date Comments + ------- ----------- ---------- ----------- + 1.0.0 K Hoang 14/01/2023 Initial coding for ESP32_W6100 (ESP32 + LwIP W6100) + *****************************************************************************************************************************/ + +#pragma once + +#ifndef ESP32_W6100_Manager_hpp +#define ESP32_W6100_Manager_hpp + +//////////////////////////////////////////////////// + +#if !( defined(ESP32) ) + #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting. +#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \ + ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \ + ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32_S2. To follow library instructions to install esp32-s2 core and WebServer Patch + #warning You have to select HUGE APP or 1.9-2.0 MB APP to be able to run Config Portal. Must use PSRAM + #endif + + #define USING_ESP32_S2 true + +#elif ( defined(ARDUINO_ESP32C3_DEV) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #if ( defined(ESP_ARDUINO_VERSION_MAJOR) && (ESP_ARDUINO_VERSION_MAJOR >= 2) ) + #warning Using ESP32_C3 using core v2.0.0+. Either LittleFS, SPIFFS or EEPROM OK + #else + #warning Using ESP32_C3 using core v1.0.6-. To follow library instructions to install esp32-c3 core. Only SPIFFS and EEPROM OK + #endif + + #warning You have to select Flash size 2MB and Minimal APP (1.3MB + 700KB) for some boards + + #endif + + #define USING_ESP32_C3 true + +#elif ( defined(ARDUINO_ESP32S3_DEV) || defined(ARDUINO_ESP32_S3_BOX) || defined(ARDUINO_TINYS3) || \ + defined(ARDUINO_PROS3) || defined(ARDUINO_FEATHERS3) ) + + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using ESP32_S3. To install esp32-s3-support branch if using core v2.0.2- + #endif + + #define USING_ESP32_S3 true +#endif + +//////////////////////////////////////////////////// + +#define ESP32_W6100_MANAGER_VERSION "ESP32_W6100_Manager v1.0.0" + +#define ESP32_W6100_MANAGER_VERSION_MAJOR 1 +#define ESP32_W6100_MANAGER_VERSION_MINOR 0 +#define ESP32_W6100_MANAGER_VERSION_PATCH 0 + +#define ESP32_W6100_MANAGER_VERSION_INT 1000000 + +//////////////////////////////////////////////////// + +#include "ESP32_W6100_Manager_Debug.h" + +//////////////////////////////////////////////////// + +#if ( defined(HTTP_PORT) && (HTTP_PORT < 65536) && (HTTP_PORT > 0) ) + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using custom HTTP_PORT + #endif + + #define HTTP_PORT_TO_USE HTTP_PORT +#else + #if (_ESP32_ETH_MGR_LOGLEVEL_ > 3) + #warning Using default HTTP_PORT = 80 + #endif + + #define HTTP_PORT_TO_USE 80 +#endif + +//////////////////////////////////////////////////// + +#include + +#include + +#include + +#include +#undef min +#undef max + +#include + +//////////////////////////////////////////////////// + +//KH, for ESP32 +#include + +uint32_t getChipID(); +uint32_t getChipOUI(); + +#if defined(ESP_getChipId) + #undef ESP_getChipId +#endif + +#define ESP_getChipId() getChipID() +#define ESP_getChipOUI() getChipOUI() + +//////////////////////////////////////////////////// + +// Thanks to @Amorphous for the feature and code +// (https://community.blynk.cc/t/esp-wifimanager-for-esp32-and-esp8266/42257/13) +// To enable to configure from sketch +#if !defined(USE_CONFIGURABLE_DNS) + #define USE_CONFIGURABLE_DNS false +#endif + +//////////////////////////////////////////////////// + +typedef struct +{ + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + IPAddress _sta_static_dns1; + IPAddress _sta_static_dns2; +} ETH_STA_IPConfig; + +//////////////////////////////////////////////////// + +#define WFM_LABEL_BEFORE 1 +#define WFM_LABEL_AFTER 2 +#define WFM_NO_LABEL 0 + +//////////////////////////////////////////////////// + +/** Handle CORS in pages */ +// Default false for using only whenever necessary to avoid security issue when using CORS (Cross-Origin Resource Sharing) +#ifndef USING_CORS_FEATURE + // Contributed by AlesSt (https://github.com/AlesSt) to solve AJAX CORS protection problem of API redirects on client side + // See more in https://github.com/khoih-prog/ESP_WiFiManager/issues/27 and https://en.wikipedia.org/wiki/Cross-origin_resource_sharing + #define USING_CORS_FEATURE false +#endif + +//////////////////////////////////////////////////// + +//KH +// Mofidy HTTP_HEAD to EM_HTTP_HEAD_START to avoid conflict in Arduino esp8266 core 2.6.0+ +const char EM_HTTP_200[] PROGMEM = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; +const char EM_HTTP_HEAD_START[] PROGMEM = "{v}"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_STYLE[] PROGMEM = ""; + +//////////////////////////////////////////////////// + +const char EM_HTTP_SCRIPT[] PROGMEM = ""; + +//////////////////////////////////////////////////// +//////////////////////////////////////////////////// + +// To permit disable or configure NTP from sketch +#ifndef USE_ESP_ETH_MANAGER_NTP + // To enable NTP config + #define USE_ESP_ETH_MANAGER_NTP true +#endif + +//////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP + +#include "utils/TZ.h" + +const char EM_HTTP_SCRIPT_NTP_MSG[] PROGMEM = "

Your Timezone is :

"; +const char EM_HTTP_SCRIPT_NTP_HIDDEN[] PROGMEM = "

"; + +//////////////////////////////////////////////////// + +// To permit disable or configure NTP from sketch +#ifndef USE_CLOUDFLARE_NTP + #define USE_CLOUDFLARE_NTP false +#endif + +//////////////////////////////////////////////////// + +#if USE_CLOUDFLARE_NTP +const char EM_HTTP_SCRIPT_NTP[] PROGMEM = ""; +#else +const char EM_HTTP_SCRIPT_NTP[] PROGMEM = ""; +#endif + +#else + const char EM_HTTP_SCRIPT_NTP_MSG[] PROGMEM = ""; + const char EM_HTTP_SCRIPT_NTP_HIDDEN[] PROGMEM = ""; + const char EM_HTTP_SCRIPT_NTP[] PROGMEM = ""; +#endif + +//////////////////////////////////////////////////// +//////////////////////////////////////////////////// + +const char EM_HTTP_HEAD_END[] PROGMEM = "
"; + +const char EM_FLDSET_START[] PROGMEM = "
"; +const char EM_FLDSET_END[] PROGMEM = "
"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_PORTAL_OPTIONS[] PROGMEM = "



"; +const char EM_HTTP_ITEM[] PROGMEM = "
{v} {r}%
"; +const char JSON_ITEM[] PROGMEM = "{\"SSID\":\"{v}\", \"Encryption\":{i}, \"Quality\":\"{r}\"}"; + +//////////////////////////////////////////////////// + +// To permit display stored Credentials on CP +#ifndef DISPLAY_STORED_CREDENTIALS_IN_CP + #define DISPLAY_STORED_CREDENTIALS_IN_CP true +#endif + +#if ( (_ESP32_ETH_MGR_LOGLEVEL_ > 3) && DISPLAY_STORED_CREDENTIALS_IN_CP ) + #warning Enable DISPLAY_STORED_CREDENTIALS_IN_CP +#endif + +#if DISPLAY_STORED_CREDENTIALS_IN_CP +const char EM_HTTP_FORM_START[] PROGMEM = "
"; +#else +const char EM_HTTP_FORM_START[] PROGMEM = ""; +#endif + +//////////////////////////////////////////////////// + +const char EM_HTTP_FORM_LABEL_BEFORE[] PROGMEM = "
"; +const char EM_HTTP_FORM_LABEL_AFTER[] PROGMEM = "
"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_FORM_LABEL[] PROGMEM = ""; +const char EM_HTTP_FORM_PARAM[] PROGMEM = ""; + +const char EM_HTTP_FORM_END[] PROGMEM = "
"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_SAVED[] PROGMEM = "
Credentials Saved
"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_END[] PROGMEM = "
"; + +//////////////////////////////////////////////////// + +const char EM_HTTP_HEAD_CL[] = "Content-Length"; +const char EM_HTTP_HEAD_CT[] = "text/html"; +const char EM_HTTP_HEAD_CT2[] = "text/plain"; + +const char EM_HTTP_HEAD_JSON[] ="application/json"; + +//KH Add repeatedly used const +const char EM_HTTP_CACHE_CONTROL[] = "Cache-Control"; +const char EM_HTTP_NO_STORE[] = "no-cache, no-store, must-revalidate"; +const char EM_HTTP_PRAGMA[] = "Pragma"; +const char EM_HTTP_NO_CACHE[] = "no-cache"; +const char EM_HTTP_EXPIRES[] = "Expires"; +const char EM_HTTP_CORS[] = "Access-Control-Allow-Origin"; +const char EM_HTTP_CORS_ALLOW_ALL[] = "*"; + +//////////////////////////////////////////////////// + +#if USE_AVAILABLE_PAGES + const char EM_HTTP_AVAILABLE_PAGES[] PROGMEM = "

Available Pages

PageFunction
/Menu page.
/ethEnter ETH Config Page
/ethsaveSave Config. Portal Info with supplied variables.
/closeClose the Config Portal.
/iThis Info page.
/rDelete ETH configuration and reboot.
/stateCurrent device state in JSON format. Interface for ETH configuration.
"; +#else + const char EM_HTTP_AVAILABLE_PAGES[] PROGMEM = ""; +#endif + +//////////////////////////////////////////////////// + +#define ETH_MANAGER_MAX_PARAMS 20 + +//////////////////////////////////////////////////// + +// To permit autoConnect() to use STA static IP or DHCP IP. +#ifndef AUTOCONNECT_NO_INVALIDATE + #define AUTOCONNECT_NO_INVALIDATE true +#endif + +//////////////////////////////////////////////////// + +typedef struct +{ + const char *_id; + const char *_placeholder; + char *_value; + int _length; + int _labelPlacement; +} EMParam_Data; + + +//////////////////////////////////////////////////// +//////////////////////////////////////////////////// + +class ESP32_EMParameter +{ + public: + + ESP32_EMParameter(const char *custom); + ESP32_EMParameter(const char *id, const char *placeholder, const char *defaultValue, const int& length, + const char *custom = "", const int& labelPlacement = WFM_LABEL_BEFORE); + + ESP32_EMParameter(const EMParam_Data& EMParam_data); + + ~ESP32_EMParameter(); + + void setEMParam_Data(const EMParam_Data& EMParam_data); + void getEMParam_Data(EMParam_Data& EMParam_data); + + const char *getID(); + const char *getValue(); + const char *getPlaceholder(); + int getValueLength(); + int getLabelPlacement(); + const char *getCustomHTML(); + + private: + + EMParam_Data _EMParam_data; + + const char *_customHTML; + + void init(const char *id, const char *placeholder, const char *defaultValue, const int& length, + const char *custom, const int& labelPlacement); + + friend class ESP32_W6100_Manager; +}; + +//////////////////////////////////////////////////// + +#define USE_DYNAMIC_PARAMS true +#define DEFAULT_PORTAL_TIMEOUT 60000L + +// To permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. +// You have to explicitly specify false to disable the feature. +#ifndef USE_STATIC_IP_CONFIG_IN_CP + #define USE_STATIC_IP_CONFIG_IN_CP true +#endif + +//////////////////////////////////////////////////// +//////////////////////////////////////////////////// + +class ESP32_W6100_Manager +{ + public: + + ESP32_W6100_Manager(const char *iHostname = ""); + + ~ESP32_W6100_Manager(); + + // If you want to start the config portal + bool startConfigPortal(); + + //sets timeout before webserver loop ends and exits even if there has been no setup. + //usefully for devices that failed to connect at some point and got stuck in a webserver loop + //in seconds setConfigPortalTimeout is a new name for setTimeout + void setConfigPortalTimeout(const unsigned long& seconds); + void setTimeout(const unsigned long& seconds); + + //sets timeout for which to attempt connecting, usefull if you get a lot of failed connects + void setConnectTimeout(const unsigned long& seconds); + + void setDebugOutput(bool debug); + + //sets config for a static IP + void setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn); + + void setSTAStaticIPConfig(const ETH_STA_IPConfig& EM_STA_IPconfig); + void getSTAStaticIPConfig(ETH_STA_IPConfig& EM_STA_IPconfig); + +#if USE_CONFIGURABLE_DNS + void setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn, + const IPAddress& dns_address_1, const IPAddress& dns_address_2); +#endif + + //called when settings have been changed and connection was successful + void setSaveConfigCallback(void(*func)()); + +#if USE_DYNAMIC_PARAMS + //adds a custom parameter + bool addParameter(ESP32_EMParameter *p); +#else + //adds a custom parameter + void addParameter(ESP32_EMParameter *p); +#endif + + //if this is set, it will exit after config, even if connection is unsucessful. + void setBreakAfterConfig(bool shouldBreak); + + //if this is set, try WPS setup when starting (this will delay config portal for up to 2 mins) + //TODO + //if this is set, customise style + void setCustomHeadElement(const char* element); + +//////////////////////////////////////////////////// + + // For configuring CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" +#if USING_CORS_FEATURE + void setCORSHeader(const char* CORSHeaders) + { + _CORS_Header = CORSHeaders; + + LOGWARN1(F("Set CORS Header to : "), _CORS_Header); + } + + /////////////////////////// + + inline const char* getCORSHeader() + { + return _CORS_Header; + } +#endif + + /////////////////////////// + + //returns the list of Parameters + ESP32_EMParameter** getParameters(); + + // returns the Parameters Count + int getParametersCount(); + + /////////////////////////// + + void setHostname() + { + if (RFC952_hostname[0] != 0) + { + ETH.setHostname(RFC952_hostname); + } + } + +//////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP + + inline String getTimezoneName() + { + return _timezoneName; + } + + /////////////////////////// + + inline void setTimezoneName(const String& inTimezoneName) + { + _timezoneName = inTimezoneName; + } + + /////////////////////////// + + //See: https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + // EST5EDT,M3.2.0,M11.1.0 (for America/New_York) + // EST5EDT is the name of the time zone + // EST is the abbreviation used when DST is off + // 6 hours is the time difference from GMT + // EDT is the abbreviation used when DST is on + // ,M3 is the third month + // .2 is the second occurrence of the day in the month + // .0 is Sunday + // ,M11 is the eleventh month + // .1 is the first occurrence of the day in the month + // .0 is Sunday + + const char * getTZ(const char * timezoneName) + { + //const char TZ_NAME[][TIMEZONE_MAX_LEN] + for (uint16_t index = 0; index < sizeof(TZ_NAME) / TIMEZONE_MAX_LEN; index++) + { + if ( !strncmp(timezoneName, (TZ_NAME[index]), strlen((TZ_NAME[index])) ) ) + { + yield(); + + return (ESP_TZ_NAME[index]); + } + } + + return ""; + } + + /////////////////////////// + + const char * getTZ(const String& timezoneName) + { + return getTZ(timezoneName.c_str()); + } + + /////////////////////////// + +#endif + + private: + + std::unique_ptr dnsServer; + + std::unique_ptr server; + + bool needInfo = true; + String pager; + wl_status_t ethStatus; + +#define RFC952_HOSTNAME_MAXLEN 24 + + char RFC952_hostname[RFC952_HOSTNAME_MAXLEN + 1]; + + char* getRFC952_hostname(const char* iHostname); + + void setupConfigPortal(); + void startWPS(); + + //////////////////////////////////////////////////// + +#if USE_ESP_ETH_MANAGER_NTP + // Timezone info + String _timezoneName = ""; +#endif + + //////////////////////////////////////////////////// + + unsigned long _configPortalTimeout = 0; + + unsigned long _connectTimeout = 0; + unsigned long _configPortalStart = 0; + + //////////////////////////////////////////////////// + + ETH_STA_IPConfig _ETH_STA_IPconfig = { IPAddress(0, 0, 0, 0), IPAddress(192, 168, 2, 1), IPAddress(255, 255, 255, 0), + IPAddress(192, 168, 2, 1), IPAddress(8, 8, 8, 8) }; + + //////////////////////////////////////////////////// + + int _paramsCount = 0; + int _minimumQuality = -1; + bool _removeDuplicateAPs = true; + bool _shouldBreakAfterConfig = false; + bool _tryWPS = false; + + const char* _customHeadElement = ""; + + int status = WL_IDLE_STATUS; + + // For configuring CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" +#if USING_CORS_FEATURE + const char* _CORS_Header = EM_HTTP_CORS_ALLOW_ALL; //"*"; +#endif + + wl_status_t waitForConnectResult(); + + void setInfo(); + String networkListAsString(); + + void handleRoot(); + void handleETH(); + void handleETHSave(); + void handleServerClose(); + void handleInfo(); + void handleState(); + void handleReset(); + void handleNotFound(); + bool captivePortal(); + + void reportStatus(String& page); + + // DNS server + const byte DNS_PORT = 53; + + //helpers + bool isIp(const String& str); + String toStringIp(const IPAddress& ip); + + bool connect; + bool stopConfigPortal = false; + + bool _debug = false; //true; + + void(*_savecallback)() = NULL; + + //////////////////////////////////////////////////// + +#if USE_DYNAMIC_PARAMS + int _max_params; + ESP32_EMParameter** _params; +#else + ESP32_EMParameter* _params[ETH_MANAGER_MAX_PARAMS]; +#endif + + //////////////////////////////////////////////////// + + template + auto optionalIPFromString(T *obj, const char *s) -> decltype(obj->fromString(s)) + { + return obj->fromString(s); + } + + /////////////////////////// + + auto optionalIPFromString(...) -> bool + { + LOGINFO("No IPAddress.fromString(), use ESP8266 core 2.1.0+ for Custom IP configuration to work."); + + return false; + } + + /////////////////////////// + +}; + +#endif // ESP32_W6100_Manager_hpp + diff --git a/src/ESP32_W6100_Manager_Debug.h b/src/ESP32_W6100_Manager_Debug.h new file mode 100644 index 0000000..d17cad7 --- /dev/null +++ b/src/ESP32_W6100_Manager_Debug.h @@ -0,0 +1,89 @@ +/**************************************************************************************************************************** + ESP32_W6100_Manager_Debug.h + + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + + Version: 1.0.0 + + Version Modified By Date Comments + ------- ----------- ---------- ----------- + 1.0.0 K Hoang 14/01/2023 Initial coding for ESP32_W6100 (ESP32 + LwIP W6100) + *****************************************************************************************************************************/ + +#pragma once + +#ifndef ESP32_W6100_Manager_Debug_H +#define ESP32_W6100_Manager_Debug_H + +#ifdef ESP32_ETH_MGR_DEBUG_PORT + #define DBG_PORT_ESP_EM ESP32_ETH_MGR_DEBUG_PORT +#else + #define DBG_PORT_ESP_EM Serial +#endif + +// Change _ESP32_ETH_MGR_LOGLEVEL_ to set tracing and logging verbosity +// 0: DISABLED: no logging +// 1: ERROR: errors +// 2: WARN: errors and warnings +// 3: INFO: errors, warnings and informational (default) +// 4: DEBUG: errors, warnings, informational and debug + +#ifndef _ESP32_ETH_MGR_LOGLEVEL_ + #define _ESP32_ETH_MGR_LOGLEVEL_ 1 +#endif + +///////////////////////////////////////////////////////// + +const char ESP_EM_MARK[] = "[EM] "; +const char ESP_EM_SP[] = " "; + +#define ESP_EM_PRINT DBG_PORT_ESP_EM.print +#define ESP_EM_PRINTLN DBG_PORT_ESP_EM.println + +#define ESP_EM_PRINT_MARK ESP_EM_PRINT(ESP_EM_MARK) +#define ESP_EM_PRINT_SP ESP_EM_PRINT(ESP_EM_SP) + +///////////////////////////////////////////////////////// + +#define LOGERROR(x) if(_ESP32_ETH_MGR_LOGLEVEL_>0) { ESP_EM_PRINT_MARK; ESP_EM_PRINTLN(x); } +#define LOGERROR0(x) if(_ESP32_ETH_MGR_LOGLEVEL_>0) { ESP_EM_PRINT(x); } +#define LOGERROR1(x,y) if(_ESP32_ETH_MGR_LOGLEVEL_>0) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(y); } +#define LOGERROR2(x,y,z) if(_ESP32_ETH_MGR_LOGLEVEL_>0) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(z); } +#define LOGERROR3(x,y,z,w) if(_ESP32_ETH_MGR_LOGLEVEL_>0) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINT(z); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(w); } + +///////////////////////////////////////////////////////// + +#define LOGWARN(x) if(_ESP32_ETH_MGR_LOGLEVEL_>1) { ESP_EM_PRINT_MARK; ESP_EM_PRINTLN(x); } +#define LOGWARN0(x) if(_ESP32_ETH_MGR_LOGLEVEL_>1) { ESP_EM_PRINT(x); } +#define LOGWARN1(x,y) if(_ESP32_ETH_MGR_LOGLEVEL_>1) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(y); } +#define LOGWARN2(x,y,z) if(_ESP32_ETH_MGR_LOGLEVEL_>1) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(z); } +#define LOGWARN3(x,y,z,w) if(_ESP32_ETH_MGR_LOGLEVEL_>1) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINT(z); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(w); } + +///////////////////////////////////////////////////////// + +#define LOGINFO(x) if(_ESP32_ETH_MGR_LOGLEVEL_>2) { ESP_EM_PRINT_MARK; ESP_EM_PRINTLN(x); } +#define LOGINFO0(x) if(_ESP32_ETH_MGR_LOGLEVEL_>2) { ESP_EM_PRINT(x); } +#define LOGINFO1(x,y) if(_ESP32_ETH_MGR_LOGLEVEL_>2) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(y); } +#define LOGINFO2(x,y,z) if(_ESP32_ETH_MGR_LOGLEVEL_>2) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(z); } +#define LOGINFO3(x,y,z,w) if(_ESP32_ETH_MGR_LOGLEVEL_>2) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINT(z); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(w); } + +///////////////////////////////////////////////////////// + +#define LOGDEBUG(x) if(_ESP32_ETH_MGR_LOGLEVEL_>3) { ESP_EM_PRINT_MARK; ESP_EM_PRINTLN(x); } +#define LOGDEBUG0(x) if(_ESP32_ETH_MGR_LOGLEVEL_>3) { ESP_EM_PRINT(x); } +#define LOGDEBUG1(x,y) if(_ESP32_ETH_MGR_LOGLEVEL_>3) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(y); } +#define LOGDEBUG2(x,y,z) if(_ESP32_ETH_MGR_LOGLEVEL_>3) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(z); } +#define LOGDEBUG3(x,y,z,w) if(_ESP32_ETH_MGR_LOGLEVEL_>3) { ESP_EM_PRINT_MARK; ESP_EM_PRINT(x); ESP_EM_PRINT_SP; ESP_EM_PRINT(y); ESP_EM_PRINT_SP; ESP_EM_PRINT(z); ESP_EM_PRINT_SP; ESP_EM_PRINTLN(w); } + +///////////////////////////////////////////////////////// + +#endif // ESP32_W6100_Manager_Debug_H + diff --git a/src/ESP32_W6100_Manager_Impl.h b/src/ESP32_W6100_Manager_Impl.h new file mode 100644 index 0000000..c1e4df7 --- /dev/null +++ b/src/ESP32_W6100_Manager_Impl.h @@ -0,0 +1,1211 @@ +/**************************************************************************************************************************** + ESP32_W6100_Manager_Impl.h + + For Ethernet shields using ESP32_W6100 (ESP32 + LwIP W6100) + + Modified from + 1. Tzapu (https://github.com/tzapu/WiFiManager) + 2. Ken Taylor (https://github.com/kentaylor) + 3. Khoi Hoang (https://github.com/khoih-prog/ESP_WiFiManager) + + Built by Khoi Hoang https://github.com/khoih-prog/ESP32_W6100_Manager + Licensed under MIT license + + Version: 1.0.0 + + Version Modified By Date Comments + ------- ----------- ---------- ----------- + 1.0.0 K Hoang 14/01/2023 Initial coding for ESP32_W6100 (ESP32 + LwIP W6100) + *****************************************************************************************************************************/ + +#pragma once + +#ifndef ESP32_W6100_Manager_Impl_h +#define ESP32_W6100_Manager_Impl_h + +////////////////////////////////////////// + +ESP32_EMParameter::ESP32_EMParameter(const char *custom) +{ + _EMParam_data._id = NULL; + _EMParam_data._placeholder = NULL; + _EMParam_data._length = 0; + _EMParam_data._value = NULL; + _EMParam_data._labelPlacement = WFM_LABEL_BEFORE; + + _customHTML = custom; +} + +////////////////////////////////////////// + +ESP32_EMParameter::ESP32_EMParameter(const char *id, const char *placeholder, const char *defaultValue, + const int& length, const char *custom, const int& labelPlacement) +{ + init(id, placeholder, defaultValue, length, custom, labelPlacement); +} + +////////////////////////////////////////// + +// KH, using struct +ESP32_EMParameter::ESP32_EMParameter(const EMParam_Data& EMParam_data) +{ + init(EMParam_data._id, EMParam_data._placeholder, EMParam_data._value, + EMParam_data._length, "", EMParam_data._labelPlacement); +} + +////////////////////////////////////////// + +void ESP32_EMParameter::init(const char *id, const char *placeholder, const char *defaultValue, + const int& length, const char *custom, const int& labelPlacement) +{ + _EMParam_data._id = id; + _EMParam_data._placeholder = placeholder; + _EMParam_data._length = length; + _EMParam_data._labelPlacement = labelPlacement; + + _EMParam_data._value = new char[_EMParam_data._length + 1]; + + if (_EMParam_data._value != NULL) + { + memset(_EMParam_data._value, 0, _EMParam_data._length + 1); + + if (defaultValue != NULL) + { + strncpy(_EMParam_data._value, defaultValue, _EMParam_data._length); + } + } + + _customHTML = custom; +} + +////////////////////////////////////////// + +ESP32_EMParameter::~ESP32_EMParameter() +{ + if (_EMParam_data._value != NULL) + { + delete[] _EMParam_data._value; + } +} + +////////////////////////////////////////// + +// Using Struct to get/set whole data at once +void ESP32_EMParameter::setEMParam_Data(const EMParam_Data& EMParam_data) +{ + LOGINFO(F("setEMParam_Data")); + + memcpy(&_EMParam_data, &EMParam_data, sizeof(_EMParam_data)); +} + +////////////////////////////////////////// + +void ESP32_EMParameter::getEMParam_Data(EMParam_Data& EMParam_data) +{ + LOGINFO(F("getEMParam_Data")); + + memcpy(&EMParam_data, &_EMParam_data, sizeof(EMParam_data)); +} + +////////////////////////////////////////// + +const char* ESP32_EMParameter::getValue() +{ + return _EMParam_data._value; +} + +////////////////////////////////////////// + +const char* ESP32_EMParameter::getID() +{ + return _EMParam_data._id; +} + +////////////////////////////////////////// + +const char* ESP32_EMParameter::getPlaceholder() +{ + return _EMParam_data._placeholder; +} + +////////////////////////////////////////// + +int ESP32_EMParameter::getValueLength() +{ + return _EMParam_data._length; +} + +////////////////////////////////////////// + +int ESP32_EMParameter::getLabelPlacement() +{ + return _EMParam_data._labelPlacement; +} + +////////////////////////////////////////// + +const char* ESP32_EMParameter::getCustomHTML() +{ + return _customHTML; +} + +////////////////////////////////////////// + +/** + [getParameters description] + @access public +*/ +ESP32_EMParameter** ESP32_W6100_Manager::getParameters() +{ + return _params; +} + +////////////////////////////////////////// +////////////////////////////////////////// + +/** + [getParametersCount description] + @access public +*/ +int ESP32_W6100_Manager::getParametersCount() +{ + return _paramsCount; +} + +////////////////////////////////////////// + +char* ESP32_W6100_Manager::getRFC952_hostname(const char* iHostname) +{ + memset(RFC952_hostname, 0, sizeof(RFC952_hostname)); + + size_t len = (RFC952_HOSTNAME_MAXLEN < strlen(iHostname)) ? RFC952_HOSTNAME_MAXLEN : strlen(iHostname); + + size_t j = 0; + + for (size_t i = 0; i < len - 1; i++) + { + if (isalnum(iHostname[i]) || iHostname[i] == '-') + { + RFC952_hostname[j] = iHostname[i]; + j++; + } + } + + // no '-' as last char + if (isalnum(iHostname[len - 1]) || (iHostname[len - 1] != '-')) + RFC952_hostname[j] = iHostname[len - 1]; + + return RFC952_hostname; +} + +////////////////////////////////////////// + +ESP32_W6100_Manager::ESP32_W6100_Manager(const char *iHostname) +{ + + //server = webserver; + //dnsServer = dnsserver; + +#if USE_DYNAMIC_PARAMS + _max_params = ETH_MANAGER_MAX_PARAMS; + _params = (ESP32_EMParameter**) malloc(_max_params * sizeof(ESP32_EMParameter*)); +#endif + + if (iHostname[0] == 0) + { + String _hostname = "ESP32-" + String(ESP_getChipId(), HEX); + + _hostname.toUpperCase(); + + getRFC952_hostname(_hostname.c_str()); + + } + else + { + // Prepare and store the hostname only not NULL + getRFC952_hostname(iHostname); + } + + LOGWARN1(F("RFC925 Hostname ="), RFC952_hostname); + + setHostname(); +} + +////////////////////////////////////////// + +ESP32_W6100_Manager::~ESP32_W6100_Manager() +{ +#if USE_DYNAMIC_PARAMS + + if (_params != NULL) + { + LOGINFO(F("freeing allocated params!")); + + free(_params); + } + +#endif +} + +////////////////////////////////////////// + +#if USE_DYNAMIC_PARAMS + bool ESP32_W6100_Manager::addParameter(ESP32_EMParameter *p) +#else + void ESP32_W6100_Manager::addParameter(ESP32_EMParameter *p) +#endif +{ +#if USE_DYNAMIC_PARAMS + + if (_paramsCount == _max_params) + { + // rezise the params array + _max_params += ETH_MANAGER_MAX_PARAMS; + + LOGINFO1(F("Increasing _max_params to:"), _max_params); + + ESP32_EMParameter** new_params = (ESP32_EMParameter**) realloc(_params, _max_params * sizeof(ESP32_EMParameter*)); + + if (new_params != NULL) + { + _params = new_params; + } + else + { + LOGINFO(F("ERROR: failed to realloc params, size not increased!")); + + return false; + } + } + + _params[_paramsCount] = p; + _paramsCount++; + + LOGINFO1(F("Adding parameter"), p->getID()); + + return true; + +#else + + // Danger here. Better to use Tzapu way here + if (_paramsCount < (ETH_MANAGER_MAX_PARAMS)) + { + _params[_paramsCount] = p; + _paramsCount++; + + LOGINFO1(F("Adding parameter"), p->getID()); + } + else + { + LOGINFO("Can't add parameter. Full"); + } + +#endif +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setupConfigPortal() +{ + stopConfigPortal = false; //Signal not to close config portal + + dnsServer.reset(new DNSServer()); + + server.reset(new WebServer(HTTP_PORT_TO_USE)); + + /* Setup the DNS server redirecting all the domains to the apIP */ + if (dnsServer) + { + dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + + // AsyncDNSServer started with "*" domain name, all DNS requests will be passsed to ETH.localIP() + if (! dnsServer->start(DNS_PORT, "*", ETH.localIP())) + { + // No socket available + LOGERROR(F("Can't start DNS Server. No available socket")); + } + } + else + { + // No space available + LOGERROR(F("Can't initiate DNS Server. No enough space")); + } + + _configPortalStart = millis(); + + LOGDEBUG1(F("_configPortalStart millis() ="), millis()); + + LOGWARN1(F("Config Portal IP address ="), ETH.localIP()); + + /* Setup web pages: root, eth config pages, SO captive portal detectors and not found. */ + + server->on("/", std::bind(&ESP32_W6100_Manager::handleRoot, this)); + server->on("/eth", std::bind(&ESP32_W6100_Manager::handleETH, this)); + server->on("/ethsave", std::bind(&ESP32_W6100_Manager::handleETHSave, this)); + server->on("/close", std::bind(&ESP32_W6100_Manager::handleServerClose, this)); + server->on("/i", std::bind(&ESP32_W6100_Manager::handleInfo, this)); + server->on("/r", std::bind(&ESP32_W6100_Manager::handleReset, this)); + server->on("/state", std::bind(&ESP32_W6100_Manager::handleState, this)); + //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. + server->on("/fwlink", std::bind(&ESP32_W6100_Manager::handleRoot, this)); + server->onNotFound( std::bind(&ESP32_W6100_Manager::handleNotFound, this)); + + server->begin(); // Web server start + + LOGWARN(F("HTTP server started")); +} + +////////////////////////////////////////// + +bool ESP32_W6100_Manager::startConfigPortal() +{ + connect = false; + + setupConfigPortal(); + + LOGINFO("startConfigPortal : Enter loop"); + + while (true) + { + //DNS + dnsServer->processNextRequest(); + //HTTP + server->handleClient(); + +#if ( USING_ESP32_S2 || USING_ESP32_C3 ) + // Fix ESP32-S2 issue with WebServer (https://github.com/espressif/arduino-esp32/issues/4348) + delay(1); +#endif + + if (connect) + { + if (_shouldBreakAfterConfig) + { + //flag set to exit after config after trying to connect + //notify that configuration has changed and any optional parameters should be saved + if (_savecallback != NULL) + { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + + LOGDEBUG("Stop ConfigPortal: _shouldBreakAfterConfig"); + + break; + } + } + + if (stopConfigPortal) + { + LOGERROR("stopConfigPortal"); + + stopConfigPortal = false; + + break; + } + + if (_configPortalTimeout > 0 && ( millis() > _configPortalStart + _configPortalTimeout) ) + { + //LOGDEBUG3("startConfigPortal: timeout, _configPortalTimeout =", _configPortalTimeout, "millis() =", millis()); + + stopConfigPortal = false; + + break; + } + +#define TIME_BETWEEN_CONFIG_PORTAL_LOOP 50 + + vTaskDelay(TIME_BETWEEN_CONFIG_PORTAL_LOOP / portTICK_PERIOD_MS); + } + + //LOGDEBUG3("startConfigPortal: exit, _configPortalTimeout =", _configPortalTimeout, "millis() =", millis()); + + server->stop(); + server.reset(); + dnsServer->stop(); + dnsServer.reset(); + + return (ESP32_W6100_isConnected()); +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setTimeout(const unsigned long& seconds) +{ + setConfigPortalTimeout(seconds); +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setConfigPortalTimeout(const unsigned long& seconds) +{ + _configPortalTimeout = seconds * 1000; +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setConnectTimeout(const unsigned long& seconds) +{ + _connectTimeout = seconds * 1000; +} + +void ESP32_W6100_Manager::setDebugOutput(bool debug) +{ + _debug = debug; +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setBreakAfterConfig(bool shouldBreak) +{ + _shouldBreakAfterConfig = shouldBreak; +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::reportStatus(String& page) +{ + page += FPSTR(EM_HTTP_SCRIPT_NTP_MSG); +} + + + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn) +{ + LOGINFO(F("setSTAStaticIPConfig")); + + _ETH_STA_IPconfig._sta_static_ip = ip; + _ETH_STA_IPconfig._sta_static_gw = gw; + _ETH_STA_IPconfig._sta_static_sn = sn; +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::setSTAStaticIPConfig(const ETH_STA_IPConfig& EM_STA_IPconfig) +{ + LOGINFO(F("setSTAStaticIPConfig")); + + memcpy((void *) &_ETH_STA_IPconfig, &EM_STA_IPconfig, sizeof(_ETH_STA_IPconfig)); +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::getSTAStaticIPConfig(ETH_STA_IPConfig& EM_STA_IPconfig) +{ + LOGINFO(F("getSTAStaticIPConfig")); + + memcpy((void *) &EM_STA_IPconfig, &_ETH_STA_IPconfig, sizeof(EM_STA_IPconfig)); +} + + +////////////////////////////////////////// + +#if USE_CONFIGURABLE_DNS +void ESP32_W6100_Manager::setSTAStaticIPConfig(const IPAddress& ip, const IPAddress& gw, const IPAddress& sn, + const IPAddress& dns_address_1, const IPAddress& dns_address_2) +{ + LOGINFO(F("setSTAStaticIPConfig for USE_CONFIGURABLE_DNS")); + + _ETH_STA_IPconfig._sta_static_ip = ip; + _ETH_STA_IPconfig._sta_static_gw = gw; + _ETH_STA_IPconfig._sta_static_sn = sn; + _ETH_STA_IPconfig._sta_static_dns1 = dns_address_1; //***** Added argument ***** + _ETH_STA_IPconfig._sta_static_dns2 = dns_address_2; //***** Added argument ***** +} +#endif + +////////////////////////////////////////// + +// Handle root or redirect to captive portal +void ESP32_W6100_Manager::handleRoot() +{ + LOGDEBUG(F("handleRoot")); + + // Disable _configPortalTimeout when someone accessing Portal to give some time to config + _configPortalTimeout = 0; + + if (captivePortal()) + { + LOGDEBUG(F("handleRoot: captive portal exit")); + + // If captive portal redirect instead of displaying the error page. + return; + } + + server->sendHeader(FPSTR(EM_HTTP_CACHE_CONTROL), FPSTR(EM_HTTP_NO_STORE)); + +#if USING_CORS_FEATURE + // For configure CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" + server->sendHeader(FPSTR(EM_HTTP_CORS), _CORS_Header); +#endif + + server->sendHeader(FPSTR(EM_HTTP_PRAGMA), FPSTR(EM_HTTP_NO_CACHE)); + server->sendHeader(FPSTR(EM_HTTP_EXPIRES), "-1"); + + String page = FPSTR(EM_HTTP_HEAD_START); + + page.replace("{v}", "Options"); + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_SCRIPT_NTP); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(EM_HTTP_HEAD_END); + + page += FPSTR(EM_HTTP_PORTAL_OPTIONS); + page += F("
"); + reportStatus(page); + page += F("
"); + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); +} + +////////////////////////////////////////// + +// ETH config page handler +void ESP32_W6100_Manager::handleETH() +{ + LOGDEBUG(F("Handle ETH")); + + // Disable _configPortalTimeout when someone accessing Portal to give some time to config + _configPortalTimeout = 0; + + server->sendHeader(FPSTR(EM_HTTP_CACHE_CONTROL), FPSTR(EM_HTTP_NO_STORE)); + +#if USING_CORS_FEATURE + // For configure CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" + server->sendHeader(FPSTR(EM_HTTP_CORS), _CORS_Header); +#endif + + server->sendHeader(FPSTR(EM_HTTP_PRAGMA), FPSTR(EM_HTTP_NO_CACHE)); + server->sendHeader(FPSTR(EM_HTTP_EXPIRES), "-1"); + + String page = FPSTR(EM_HTTP_HEAD_START); + + page.replace("{v}", "Config ESP"); + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_SCRIPT_NTP); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(EM_HTTP_HEAD_END); + page += F("

Configuration

"); + + page += FPSTR(EM_HTTP_FORM_START); + + char parLength[2]; + + page += FPSTR(EM_FLDSET_START); + + // add the extra parameters to the form + for (int i = 0; i < _paramsCount; i++) + { + if (_params[i] == NULL) + { + break; + } + + String pitem; + + switch (_params[i]->getLabelPlacement()) + { + case WFM_LABEL_BEFORE: + pitem = FPSTR(EM_HTTP_FORM_LABEL_BEFORE); + break; + + case WFM_LABEL_AFTER: + pitem = FPSTR(EM_HTTP_FORM_LABEL_AFTER); + break; + + default: + // WFM_NO_LABEL + pitem = FPSTR(EM_HTTP_FORM_PARAM); + break; + } + + if (_params[i]->getID() != NULL) + { + pitem.replace("{i}", _params[i]->getID()); + pitem.replace("{n}", _params[i]->getID()); + pitem.replace("{p}", _params[i]->getPlaceholder()); + + snprintf(parLength, 2, "%d", _params[i]->getValueLength()); + + pitem.replace("{l}", parLength); + pitem.replace("{v}", _params[i]->getValue()); + pitem.replace("{c}", _params[i]->getCustomHTML()); + } + else + { + pitem = _params[i]->getCustomHTML(); + } + + page += pitem; + } + + if (_paramsCount > 0) + { + page += FPSTR(EM_FLDSET_END); + } + + if (_params[0] != NULL) + { + page += "
"; + } + + LOGDEBUG1(F("Static IP ="), _ETH_STA_IPconfig._sta_static_ip.toString()); + + // KH, Comment out to permit changing from DHCP to static IP, or vice versa + // and add staticIP label in CP + + // To permit disable/enable StaticIP configuration in Config Portal from sketch. Valid only if DHCP is used. + // You'll loose the feature of dynamically changing from DHCP to static IP, or vice versa + // You have to explicitly specify false to disable the feature. + +#if !USE_STATIC_IP_CONFIG_IN_CP + + if (_ETH_STA_IPconfig._sta_static_ip) +#endif + { + page += FPSTR(EM_FLDSET_START); + + String item = FPSTR(EM_HTTP_FORM_LABEL); + + item += FPSTR(EM_HTTP_FORM_PARAM); + + item.replace("{i}", "ip"); + item.replace("{n}", "ip"); + item.replace("{p}", "Static IP"); + item.replace("{l}", "15"); + item.replace("{v}", _ETH_STA_IPconfig._sta_static_ip.toString()); + + page += item; + + item = FPSTR(EM_HTTP_FORM_LABEL); + item += FPSTR(EM_HTTP_FORM_PARAM); + + item.replace("{i}", "gw"); + item.replace("{n}", "gw"); + item.replace("{p}", "Gateway IP"); + item.replace("{l}", "15"); + item.replace("{v}", _ETH_STA_IPconfig._sta_static_gw.toString()); + + page += item; + + item = FPSTR(EM_HTTP_FORM_LABEL); + item += FPSTR(EM_HTTP_FORM_PARAM); + + item.replace("{i}", "sn"); + item.replace("{n}", "sn"); + item.replace("{p}", "Subnet"); + item.replace("{l}", "15"); + item.replace("{v}", _ETH_STA_IPconfig._sta_static_sn.toString()); + +#if USE_CONFIGURABLE_DNS + //***** Added for DNS address options ***** + page += item; + + item = FPSTR(EM_HTTP_FORM_LABEL); + item += FPSTR(EM_HTTP_FORM_PARAM); + + item.replace("{i}", "dns1"); + item.replace("{n}", "dns1"); + item.replace("{p}", "DNS1 IP"); + item.replace("{l}", "15"); + item.replace("{v}", _ETH_STA_IPconfig._sta_static_dns1.toString()); + + page += item; + + item = FPSTR(EM_HTTP_FORM_LABEL); + item += FPSTR(EM_HTTP_FORM_PARAM); + + item.replace("{i}", "dns2"); + item.replace("{n}", "dns2"); + item.replace("{p}", "DNS2 IP"); + item.replace("{l}", "15"); + item.replace("{v}", _ETH_STA_IPconfig._sta_static_dns2.toString()); + //***** End added for DNS address options ***** +#endif + + page += item; + + page += FPSTR(EM_FLDSET_END); + + page += "
"; + } + + page += FPSTR(EM_HTTP_SCRIPT_NTP_HIDDEN); + + page += FPSTR(EM_HTTP_FORM_END); + + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); + + LOGDEBUG(F("Sent config page")); +} + +////////////////////////////////////////// + +// Handle the WLAN save form and redirect to WLAN config page again +void ESP32_W6100_Manager::handleETHSave() +{ + LOGDEBUG(F("ETH save")); + +#if USING_CORS_FEATURE + // For configuring CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" + server->sendHeader(FPSTR(EM_HTTP_CORS), _CORS_Header); +#endif + +#if USE_ESP_ETH_MANAGER_NTP + + if (server->arg("timezone") != "") + { + _timezoneName = server->arg("timezone"); + LOGDEBUG1(F("TZ name ="), _timezoneName); + } + else + { + LOGDEBUG(F("No TZ arg")); + } + +#endif + + /////////////////////// + + //parameters + for (int i = 0; i < _paramsCount; i++) + { + if (_params[i] == NULL) + { + break; + } + + //read parameter + String value = server->arg(_params[i]->getID()).c_str(); + + //store it in array + value.toCharArray(_params[i]->_EMParam_data._value, _params[i]->_EMParam_data._length); + + LOGDEBUG2(F("Parameter and value :"), _params[i]->getID(), value); + } + + + if (server->arg("ip") != "") + { + String ip = server->arg("ip"); + + optionalIPFromString(&_ETH_STA_IPconfig._sta_static_ip, ip.c_str()); + + LOGDEBUG1(F("New Static IP ="), _ETH_STA_IPconfig._sta_static_ip.toString()); + } + + if (server->arg("gw") != "") + { + String gw = server->arg("gw"); + + optionalIPFromString(&_ETH_STA_IPconfig._sta_static_gw, gw.c_str()); + + LOGDEBUG1(F("New Static Gateway ="), _ETH_STA_IPconfig._sta_static_gw.toString()); + } + + if (server->arg("sn") != "") + { + String sn = server->arg("sn"); + + optionalIPFromString(&_ETH_STA_IPconfig._sta_static_sn, sn.c_str()); + + LOGDEBUG1(F("New Static Netmask ="), _ETH_STA_IPconfig._sta_static_sn.toString()); + } + +#if USE_CONFIGURABLE_DNS + + //***** Added for DNS Options ***** + if (server->arg("dns1") != "") + { + String dns1 = server->arg("dns1"); + + optionalIPFromString(&_ETH_STA_IPconfig._sta_static_dns1, dns1.c_str()); + + LOGDEBUG1(F("New Static DNS1 ="), _ETH_STA_IPconfig._sta_static_dns1.toString()); + } + + if (server->arg("dns2") != "") + { + String dns2 = server->arg("dns2"); + + optionalIPFromString(&_ETH_STA_IPconfig._sta_static_dns2, dns2.c_str()); + + LOGDEBUG1(F("New Static DNS2 ="), _ETH_STA_IPconfig._sta_static_dns2.toString()); + } + + //***** End added for DNS Options ***** +#endif + + String page = FPSTR(EM_HTTP_HEAD_START); + page.replace("{v}", "Credentials Saved"); + + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(EM_HTTP_HEAD_END); + page += FPSTR(EM_HTTP_SAVED); + + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); + + LOGDEBUG(F("Sent eth save page")); + + connect = true; //signal ready to connect/reset + + stopConfigPortal = true; //signal ready to shutdown config portal + + // Restore when Press Save WiFi + _configPortalTimeout = DEFAULT_PORTAL_TIMEOUT; +} + +////////////////////////////////////////// + +// Handle shut down the server page +void ESP32_W6100_Manager::handleServerClose() +{ + LOGDEBUG(F("Server Close")); + + server->sendHeader(FPSTR(EM_HTTP_CACHE_CONTROL), FPSTR(EM_HTTP_NO_STORE)); + + +#if USING_CORS_FEATURE + // For configuring CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" + server->sendHeader(FPSTR(EM_HTTP_CORS), _CORS_Header); +#endif + + server->sendHeader(FPSTR(EM_HTTP_PRAGMA), FPSTR(EM_HTTP_NO_CACHE)); + server->sendHeader(FPSTR(EM_HTTP_EXPIRES), "-1"); + + String page = FPSTR(EM_HTTP_HEAD_START); + + page.replace("{v}", "Close Server"); + + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(EM_HTTP_HEAD_END); + page += F("
"); + page += F("
"); + page += F("IP address is "); + page += ETH.localIP().toString(); + page += F("

"); + page += F("Portal closed...

"); + + //page += F("Push button on device to restart configuration server!"); + + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); + + stopConfigPortal = true; //signal ready to shutdown config portal + + LOGDEBUG(F("Sent server close page")); + + // Restore when Press Save WiFi + _configPortalTimeout = DEFAULT_PORTAL_TIMEOUT; +} + +////////////////////////////////////////// + +// Handle the info page +void ESP32_W6100_Manager::handleInfo() +{ + LOGDEBUG(F("Info")); + + // Disable _configPortalTimeout when someone accessing Portal to give some time to config + _configPortalTimeout = 0; + + server->sendHeader(FPSTR(EM_HTTP_CACHE_CONTROL), FPSTR(EM_HTTP_NO_STORE)); + +#if USING_CORS_FEATURE + // For configuring CORS Header, default to EM_HTTP_CORS_ALLOW_ALL = "*" + server->sendHeader(FPSTR(EM_HTTP_CORS), _CORS_Header); +#endif + + server->sendHeader(FPSTR(EM_HTTP_PRAGMA), FPSTR(EM_HTTP_NO_CACHE)); + server->sendHeader(FPSTR(EM_HTTP_EXPIRES), "-1"); + + String page = FPSTR(EM_HTTP_HEAD_START); + page.replace("{v}", "Info"); + + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_SCRIPT_NTP); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + + if (connect) + page += F(""); + + page += FPSTR(EM_HTTP_HEAD_END); + + page += F("
"); + + if (connect) + { + page += F("
Trying to connect
"); + page += ethStatus; + page += F("
"); + } + + page += pager; + page += F("

Information

"); + + reportStatus(page); + + page += FPSTR(EM_FLDSET_START); + page += F("

Device Data

"); + page += F(""); + page += F(""); + + page += F(""); + + page += F(""); + + page += F(""); + + page += F(""); + + page += F(""); + + page += F(""); + + page += F(""); + page += F("
NameValue
Chip ID"); + + page += String(ESP_getChipId(), HEX); + page += F("
Chip OUI"); + page += F("0x"); + page += String(getChipOUI(), HEX); + page += F("
Chip Model"); + page += ESP.getChipModel(); + page += F(" Rev"); + page += ESP.getChipRevision(); + + page += F("
Flash Chip ID"); + + // TODO + page += F("TODO"); + + page += F("
IDE Flash Size"); + page += ESP.getFlashChipSize(); + page += F(" bytes
Real Flash Size"); + + // TODO + page += F("TODO"); + + page += F(" bytes
Station IP"); + page += ETH.localIP().toString(); + page += F("
Station MAC"); + page += ETH.macAddress(); + page += F("
"); + + page += FPSTR(EM_FLDSET_END); + +#if USE_AVAILABLE_PAGES + page += FPSTR(EM_FLDSET_START); + page += FPSTR(EM_HTTP_AVAILABLE_PAGES); + page += FPSTR(EM_FLDSET_END); +#endif + + page += F("

More information about ESP32_W6100_Manager at"); + page += F("

https://github.com/khoih-prog/ESP32_W6100_Manager"); + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); + + LOGDEBUG(F("Sent info page")); +} + +////////////////////////////////////////// + +// Handle the state page +void ESP32_W6100_Manager::handleState() +{ + LOGDEBUG(F("State-Json")); + + LOGDEBUG(F("Sent state page in json format")); +} + +////////////////////////////////////////// + +// Handle the reset page +void ESP32_W6100_Manager::handleReset() +{ + LOGDEBUG(F("Reset")); + + server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + server->sendHeader("Pragma", "no-cache"); + server->sendHeader("Expires", "-1"); + + String page = FPSTR(EM_HTTP_HEAD_START); + + page.replace("{v}", "ETH Information"); + page += FPSTR(EM_HTTP_SCRIPT); + page += FPSTR(EM_HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(EM_HTTP_HEAD_END); + page += F("Resetting"); + page += FPSTR(EM_HTTP_END); + + server->send(200, "text/html", page); + + LOGDEBUG(F("Sent reset page")); + delay(5000); + + ESP.restart(); + + delay(2000); +} + +////////////////////////////////////////// + +void ESP32_W6100_Manager::handleNotFound() +{ + if (captivePortal()) + { + LOGDEBUG(F("handleNotFound: captive portal exit")); + + // If captive portal redirect instead of displaying the error page. + return; + } + + String message = "File Not Found\n\n"; + + message += "URI: "; + message += server->uri(); + message += "\nMethod: "; + message += (server->method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server->args(); + message += "\n"; + + for (uint8_t i = 0; i < server->args(); i++) + { + message += " " + server->argName(i) + ": " + server->arg(i) + "\n"; + } + + server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + server->sendHeader("Pragma", "no-cache"); + server->sendHeader("Expires", "-1"); + + server->send(404, "text/plain", message); +} + +////////////////////////////////////////// + +/** + HTTPD redirector + Redirect to captive portal if we got a request for another domain. + Return true in that case so the page handler do not try to handle the request again. +*/ +bool ESP32_W6100_Manager::captivePortal() +{ + LOGDEBUG1(F("captivePortal: hostHeader = "), server->hostHeader()); + + if (!isIp(server->hostHeader())) + { + LOGINFO1(F("Request redirected to captive portal : "), server->client().localIP()); + + server->sendHeader(F("Location"), (String)F("http://") + toStringIp(server->client().localIP()), true); + + // Empty content inhibits Content-length header so we have to close the socket ourselves. + server->send(302, FPSTR(EM_HTTP_HEAD_CT2), ""); + + server->client().stop(); // Stop is needed because we sent no content length + + return true; + } + + return false; +} + +////////////////////////////////////////// + +// start up save config callback +void ESP32_W6100_Manager::setSaveConfigCallback(void(*func)()) +{ + _savecallback = func; +} + +////////////////////////////////////////// + +// sets a custom element to add to head, like a new style tag +void ESP32_W6100_Manager::setCustomHeadElement(const char* element) +{ + _customHeadElement = element; +} + +////////////////////////////////////////// + +// Is this an IP? +bool ESP32_W6100_Manager::isIp(const String& str) +{ + for (unsigned int i = 0; i < str.length(); i++) + { + int c = str.charAt(i); + + if ( (c != '.') && (c != ':') && ( (c < '0') || (c > '9') ) ) + { + return false; + } + } + + return true; +} + +////////////////////////////////////////// + +// IP to String +String ESP32_W6100_Manager::toStringIp(const IPAddress& ip) +{ + String res = ""; + + for (int i = 0; i < 3; i++) + { + res += String((ip >> (8 * i)) & 0xFF) + "."; + } + + res += String(((ip >> 8 * 3)) & 0xFF); + + return res; +} + +////////////////////////////////////////// + +uint32_t getChipID() +{ + uint64_t chipId64 = 0; + + for (int i = 0; i < 6; i++) + { + chipId64 |= ( ( (uint64_t) ESP.getEfuseMac() >> (40 - (i * 8)) ) & 0xff ) << (i * 8); + } + + return (uint32_t) (chipId64 & 0xFFFFFF); +} + +////////////////////////////////////////// + +uint32_t getChipOUI() +{ + uint64_t chipId64 = 0; + + for (int i = 0; i < 6; i++) + { + chipId64 |= ( ( (uint64_t) ESP.getEfuseMac() >> (40 - (i * 8)) ) & 0xff ) << (i * 8); + } + + return (uint32_t) (chipId64 >> 24); +} + +////////////////////////////////////////// + +#endif // ESP32_W6100_Manager_Impl_h diff --git a/src/utils/TZ.h b/src/utils/TZ.h new file mode 100644 index 0000000..e96b0c7 --- /dev/null +++ b/src/utils/TZ.h @@ -0,0 +1,1526 @@ + +// autogenerated from https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv +// by script /tools/TZupdate.sh +// Thu Nov 12 04:07:03 UTC 2020 +// +// This database is autogenerated from IANA timezone database +// https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv +// (using https://www.iana.org/time-zones) +// and can be updated on demand in this repository +// or by yourself using the above script + +#ifndef TZDB_H +#define TZDB_H + +//See: https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html +// EST5EDT,M3.2.0,M11.1.0 (for America/New_York) +// EST5EDT is the name of the time zone +// EST is the abbreviation used when DST is off +// 6 hours is the time difference from GMT +// EDT is the abbreviation used when DST is on +// ,M3 is the third month +// .2 is the second occurrence of the day in the month +// .0 is Sunday +// ,M11 is the eleventh month +// .1 is the first occurrence of the day in the month +// .0 is Sunday + + +#if !defined(USING_AFRICA) + #define USING_AFRICA false +#endif + +#if !defined(USING_AMERICA) + #define USING_AMERICA true +#endif + +#if !defined(USING_ANTARCTICA) + #define USING_ANTARCTICA false +#endif + +#if !defined(USING_ASIA) + #define USING_ASIA false +#endif + +#if !defined(USING_ATLANTIC) + #define USING_ATLANTIC false +#endif + +#if !defined(USING_AUSTRALIA) + #define USING_AUSTRALIA true +#endif + +#if !defined(USING_EUROPE) + #define USING_EUROPE false +#endif + +#if !defined(USING_INDIAN) + #define USING_INDIAN false +#endif + +#if !defined(USING_PACIFIC) + #define USING_PACIFIC false +#endif + +#if !defined(USING_ETC_GMT) + #define USING_ETC_GMT false +#endif + +//////////////////////////////////////////////////// + +#define TZ_Africa_Abidjan ("GMT0") +#define TZ_Africa_Accra ("GMT0") +#define TZ_Africa_Addis_Ababa ("EAT-3") +#define TZ_Africa_Algiers ("CET-1") +#define TZ_Africa_Asmara ("EAT-3") +#define TZ_Africa_Bamako ("GMT0") +#define TZ_Africa_Bangui ("WAT-1") +#define TZ_Africa_Banjul ("GMT0") +#define TZ_Africa_Bissau ("GMT0") +#define TZ_Africa_Blantyre ("CAT-2") +#define TZ_Africa_Brazzaville ("WAT-1") +#define TZ_Africa_Bujumbura ("CAT-2") +#define TZ_Africa_Cairo ("EET-2") +#define TZ_Africa_Casablanca ("<+01>-1") +#define TZ_Africa_Ceuta ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Africa_Conakry ("GMT0") +#define TZ_Africa_Dakar ("GMT0") +#define TZ_Africa_Dar_es_Salaam ("EAT-3") +#define TZ_Africa_Djibouti ("EAT-3") +#define TZ_Africa_Douala ("WAT-1") +#define TZ_Africa_El_Aaiun ("<+01>-1") +#define TZ_Africa_Freetown ("GMT0") +#define TZ_Africa_Gaborone ("CAT-2") +#define TZ_Africa_Harare ("CAT-2") +#define TZ_Africa_Johannesburg ("SAST-2") +#define TZ_Africa_Juba ("EAT-3") +#define TZ_Africa_Kampala ("EAT-3") +#define TZ_Africa_Khartoum ("CAT-2") +#define TZ_Africa_Kigali ("CAT-2") +#define TZ_Africa_Kinshasa ("WAT-1") +#define TZ_Africa_Lagos ("WAT-1") +#define TZ_Africa_Libreville ("WAT-1") +#define TZ_Africa_Lome ("GMT0") +#define TZ_Africa_Luanda ("WAT-1") +#define TZ_Africa_Lubumbashi ("CAT-2") +#define TZ_Africa_Lusaka ("CAT-2") +#define TZ_Africa_Malabo ("WAT-1") +#define TZ_Africa_Maputo ("CAT-2") +#define TZ_Africa_Maseru ("SAST-2") +#define TZ_Africa_Mbabane ("SAST-2") +#define TZ_Africa_Mogadishu ("EAT-3") +#define TZ_Africa_Monrovia ("GMT0") +#define TZ_Africa_Nairobi ("EAT-3") +#define TZ_Africa_Ndjamena ("WAT-1") +#define TZ_Africa_Niamey ("WAT-1") +#define TZ_Africa_Nouakchott ("GMT0") +#define TZ_Africa_Ouagadougou ("GMT0") +#define TZ_Africa_PortomNovo ("WAT-1") +#define TZ_Africa_Sao_Tome ("GMT0") +#define TZ_Africa_Tripoli ("EET-2") +#define TZ_Africa_Tunis ("CET-1") +#define TZ_Africa_Windhoek ("CAT-2") +#define TZ_America_Adak ("HST10HDT,M3.2.0,M11.1.0") +#define TZ_America_Anchorage ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Anguilla ("AST4") +#define TZ_America_Antigua ("AST4") +#define TZ_America_Araguaina ("<-03>3") +#define TZ_America_Argentina_Buenos_Aires ("<-03>3") +#define TZ_America_Argentina_Catamarca ("<-03>3") +#define TZ_America_Argentina_Cordoba ("<-03>3") +#define TZ_America_Argentina_Jujuy ("<-03>3") +#define TZ_America_Argentina_La_Rioja ("<-03>3") +#define TZ_America_Argentina_Mendoza ("<-03>3") +#define TZ_America_Argentina_Rio_Gallegos ("<-03>3") +#define TZ_America_Argentina_Salta ("<-03>3") +#define TZ_America_Argentina_San_Juan ("<-03>3") +#define TZ_America_Argentina_San_Luis ("<-03>3") +#define TZ_America_Argentina_Tucuman ("<-03>3") +#define TZ_America_Argentina_Ushuaia ("<-03>3") +#define TZ_America_Aruba ("AST4") +#define TZ_America_Asuncion ("<-04>4<-03>,M10.1.0/0,M3.4.0/0") +#define TZ_America_Atikokan ("EST5") +#define TZ_America_Bahia ("<-03>3") +#define TZ_America_Bahia_Banderas ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Barbados ("AST4") +#define TZ_America_Belem ("<-03>3") +#define TZ_America_Belize ("CST6") +#define TZ_America_BlancmSablon ("AST4") +#define TZ_America_Boa_Vista ("<-04>4") +#define TZ_America_Bogota ("<-05>5") +#define TZ_America_Boise ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Cambridge_Bay ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Campo_Grande ("<-04>4") +#define TZ_America_Cancun ("EST5") +#define TZ_America_Caracas ("<-04>4") +#define TZ_America_Cayenne ("<-03>3") +#define TZ_America_Cayman ("EST5") +#define TZ_America_Chicago ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Chihuahua ("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Costa_Rica ("CST6") +#define TZ_America_Creston ("MST7") +#define TZ_America_Cuiaba ("<-04>4") +#define TZ_America_Curacao ("AST4") +#define TZ_America_Danmarkshavn ("GMT0") +#define TZ_America_Dawson ("MST7") +#define TZ_America_Dawson_Creek ("MST7") +#define TZ_America_Denver ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Detroit ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Dominica ("AST4") +#define TZ_America_Edmonton ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Eirunepe ("<-05>5") +#define TZ_America_El_Salvador ("CST6") +#define TZ_America_Fortaleza ("<-03>3") +#define TZ_America_Fort_Nelson ("MST7") +#define TZ_America_Glace_Bay ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Godthab ("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1") +#define TZ_America_Goose_Bay ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Grand_Turk ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Grenada ("AST4") +#define TZ_America_Guadeloupe ("AST4") +#define TZ_America_Guatemala ("CST6") +#define TZ_America_Guayaquil ("<-05>5") +#define TZ_America_Guyana ("<-04>4") +#define TZ_America_Halifax ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Havana ("CST5CDT,M3.2.0/0,M11.1.0/1") +#define TZ_America_Hermosillo ("MST7") +#define TZ_America_Indiana_Indianapolis ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Knox ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Marengo ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Petersburg ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Tell_City ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vevay ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vincennes ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Winamac ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Inuvik ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Iqaluit ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Jamaica ("EST5") +#define TZ_America_Juneau ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Louisville ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Monticello ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kralendijk ("AST4") +#define TZ_America_La_Paz ("<-04>4") +#define TZ_America_Lima ("<-05>5") +#define TZ_America_Los_Angeles ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Lower_Princes ("AST4") +#define TZ_America_Maceio ("<-03>3") +#define TZ_America_Managua ("CST6") +#define TZ_America_Manaus ("<-04>4") +#define TZ_America_Marigot ("AST4") +#define TZ_America_Martinique ("AST4") +#define TZ_America_Matamoros ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Mazatlan ("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Menominee ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Merida ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Metlakatla ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Mexico_City ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Miquelon ("<-03>3<-02>,M3.2.0,M11.1.0") +#define TZ_America_Moncton ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Monterrey ("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Montevideo ("<-03>3") +#define TZ_America_Montreal ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Montserrat ("AST4") +#define TZ_America_Nassau ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_New_York ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nipigon ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nome ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Noronha ("<-02>2") +#define TZ_America_North_Dakota_Beulah ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_Center ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_New_Salem ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Ojinaga ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Panama ("EST5") +#define TZ_America_Pangnirtung ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Paramaribo ("<-03>3") +#define TZ_America_Phoenix ("MST7") +#define TZ_America_PortmaumPrince ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Port_of_Spain ("AST4") +#define TZ_America_Porto_Velho ("<-04>4") +#define TZ_America_Puerto_Rico ("AST4") +#define TZ_America_Punta_Arenas ("<-03>3") +#define TZ_America_Rainy_River ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rankin_Inlet ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Recife ("<-03>3") +#define TZ_America_Regina ("CST6") +#define TZ_America_Resolute ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rio_Branco ("<-05>5") +#define TZ_America_Santarem ("<-03>3") +#define TZ_America_Santiago ("<-04>4<-03>,M9.1.6/24,M4.1.6/24") +#define TZ_America_Santo_Domingo ("AST4") +#define TZ_America_Sao_Paulo ("<-03>3") +#define TZ_America_Scoresbysund ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_America_Sitka ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_St_Barthelemy ("AST4") +#define TZ_America_St_Johns ("NST3:30NDT,M3.2.0,M11.1.0") +#define TZ_America_St_Kitts ("AST4") +#define TZ_America_St_Lucia ("AST4") +#define TZ_America_St_Thomas ("AST4") +#define TZ_America_St_Vincent ("AST4") +#define TZ_America_Swift_Current ("CST6") +#define TZ_America_Tegucigalpa ("CST6") +#define TZ_America_Thule ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Thunder_Bay ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tijuana ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Toronto ("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tortola ("AST4") +#define TZ_America_Vancouver ("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Whitehorse ("MST7") +#define TZ_America_Winnipeg ("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Yakutat ("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Yellowknife ("MST7MDT,M3.2.0,M11.1.0") +#define TZ_Antarctica_Casey ("<+11>-11") +#define TZ_Antarctica_Davis ("<+07>-7") +#define TZ_Antarctica_DumontDUrville ("<+10>-10") +#define TZ_Antarctica_Macquarie ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Antarctica_Mawson ("<+05>-5") +#define TZ_Antarctica_McMurdo ("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Antarctica_Palmer ("<-03>3") +#define TZ_Antarctica_Rothera ("<-03>3") +#define TZ_Antarctica_Syowa ("<+03>-3") +#define TZ_Antarctica_Troll ("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3") +#define TZ_Antarctica_Vostok ("<+06>-6") +#define TZ_Arctic_Longyearbyen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Asia_Aden ("<+03>-3") +#define TZ_Asia_Almaty ("<+06>-6") +#define TZ_Asia_Amman ("EET-2EEST,M3.5.4/24,M10.5.5/1") +#define TZ_Asia_Anadyr ("<+12>-12") +#define TZ_Asia_Aqtau ("<+05>-5") +#define TZ_Asia_Aqtobe ("<+05>-5") +#define TZ_Asia_Ashgabat ("<+05>-5") +#define TZ_Asia_Atyrau ("<+05>-5") +#define TZ_Asia_Baghdad ("<+03>-3") +#define TZ_Asia_Bahrain ("<+03>-3") +#define TZ_Asia_Baku ("<+04>-4") +#define TZ_Asia_Bangkok ("<+07>-7") +#define TZ_Asia_Barnaul ("<+07>-7") +#define TZ_Asia_Beirut ("EET-2EEST,M3.5.0/0,M10.5.0/0") +#define TZ_Asia_Bishkek ("<+06>-6") +#define TZ_Asia_Brunei ("<+08>-8") +#define TZ_Asia_Chita ("<+09>-9") +#define TZ_Asia_Choibalsan ("<+08>-8") +#define TZ_Asia_Colombo ("<+0530>-5:30") +#define TZ_Asia_Damascus ("EET-2EEST,M3.5.5/0,M10.5.5/0") +#define TZ_Asia_Dhaka ("<+06>-6") +#define TZ_Asia_Dili ("<+09>-9") +#define TZ_Asia_Dubai ("<+04>-4") +#define TZ_Asia_Dushanbe ("<+05>-5") +#define TZ_Asia_Famagusta ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Gaza ("EET-2EEST,M3.4.4/48,M10.4.4/49") +#define TZ_Asia_Hebron ("EET-2EEST,M3.4.4/48,M10.4.4/49") +#define TZ_Asia_Ho_Chi_Minh ("<+07>-7") +#define TZ_Asia_Hong_Kong ("HKT-8") +#define TZ_Asia_Hovd ("<+07>-7") +#define TZ_Asia_Irkutsk ("<+08>-8") +#define TZ_Asia_Jakarta ("WIB-7") +#define TZ_Asia_Jayapura ("WIT-9") +#define TZ_Asia_Jerusalem ("IST-2IDT,M3.4.4/26,M10.5.0") +#define TZ_Asia_Kabul ("<+0430>-4:30") +#define TZ_Asia_Kamchatka ("<+12>-12") +#define TZ_Asia_Karachi ("PKT-5") +#define TZ_Asia_Kathmandu ("<+0545>-5:45") +#define TZ_Asia_Khandyga ("<+09>-9") +#define TZ_Asia_Kolkata ("IST-5:30") +#define TZ_Asia_Krasnoyarsk ("<+07>-7") +#define TZ_Asia_Kuala_Lumpur ("<+08>-8") +#define TZ_Asia_Kuching ("<+08>-8") +#define TZ_Asia_Kuwait ("<+03>-3") +#define TZ_Asia_Macau ("CST-8") +#define TZ_Asia_Magadan ("<+11>-11") +#define TZ_Asia_Makassar ("WITA-8") +#define TZ_Asia_Manila ("PST-8") +#define TZ_Asia_Muscat ("<+04>-4") +#define TZ_Asia_Nicosia ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Novokuznetsk ("<+07>-7") +#define TZ_Asia_Novosibirsk ("<+07>-7") +#define TZ_Asia_Omsk ("<+06>-6") +#define TZ_Asia_Oral ("<+05>-5") +#define TZ_Asia_Phnom_Penh ("<+07>-7") +#define TZ_Asia_Pontianak ("WIB-7") +#define TZ_Asia_Pyongyang ("KST-9") +#define TZ_Asia_Qatar ("<+03>-3") +#define TZ_Asia_Qyzylorda ("<+05>-5") +#define TZ_Asia_Riyadh ("<+03>-3") +#define TZ_Asia_Sakhalin ("<+11>-11") +#define TZ_Asia_Samarkand ("<+05>-5") +#define TZ_Asia_Seoul ("KST-9") +#define TZ_Asia_Shanghai ("CST-8") +#define TZ_Asia_Singapore ("<+08>-8") +#define TZ_Asia_Srednekolymsk ("<+11>-11") +#define TZ_Asia_Taipei ("CST-8") +#define TZ_Asia_Tashkent ("<+05>-5") +#define TZ_Asia_Tbilisi ("<+04>-4") +#define TZ_Asia_Tehran ("<+0330>-3:30<+0430>,J79/24,J263/24") +#define TZ_Asia_Thimphu ("<+06>-6") +#define TZ_Asia_Tokyo ("JST-9") +#define TZ_Asia_Tomsk ("<+07>-7") +#define TZ_Asia_Ulaanbaatar ("<+08>-8") +#define TZ_Asia_Urumqi ("<+06>-6") +#define TZ_Asia_UstmNera ("<+10>-10") +#define TZ_Asia_Vientiane ("<+07>-7") +#define TZ_Asia_Vladivostok ("<+10>-10") +#define TZ_Asia_Yakutsk ("<+09>-9") +#define TZ_Asia_Yangon ("<+0630>-6:30") +#define TZ_Asia_Yekaterinburg ("<+05>-5") +#define TZ_Asia_Yerevan ("<+04>-4") +#define TZ_Atlantic_Azores ("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_Atlantic_Bermuda ("AST4ADT,M3.2.0,M11.1.0") +#define TZ_Atlantic_Canary ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Cape_Verde ("<-01>1") +#define TZ_Atlantic_Faroe ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Madeira ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Reykjavik ("GMT0") +#define TZ_Atlantic_South_Georgia ("<-02>2") +#define TZ_Atlantic_Stanley ("<-03>3") +#define TZ_Atlantic_St_Helena ("GMT0") +#define TZ_Australia_Adelaide ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Brisbane ("AEST-10") +#define TZ_Australia_Broken_Hill ("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Currie ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Darwin ("ACST-9:30") +#define TZ_Australia_Eucla ("<+0845>-8:45") +#define TZ_Australia_Hobart ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Lindeman ("AEST-10") +#define TZ_Australia_Lord_Howe ("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0") +#define TZ_Australia_Melbourne ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Perth ("AWST-8") +#define TZ_Australia_Sydney ("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Europe_Amsterdam ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Andorra ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Astrakhan ("<+04>-4") +#define TZ_Europe_Athens ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Belgrade ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Berlin ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bratislava ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Brussels ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bucharest ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Budapest ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Busingen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Chisinau ("EET-2EEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Copenhagen ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Dublin ("IST-1GMT0,M10.5.0,M3.5.0/1") +#define TZ_Europe_Gibraltar ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Guernsey ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Helsinki ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Isle_of_Man ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Istanbul ("<+03>-3") +#define TZ_Europe_Jersey ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Kaliningrad ("EET-2") +#define TZ_Europe_Kiev ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Kirov ("<+03>-3") +#define TZ_Europe_Lisbon ("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Ljubljana ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_London ("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Luxembourg ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Madrid ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Malta ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Mariehamn ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Minsk ("<+03>-3") +#define TZ_Europe_Monaco ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Moscow ("MSK-3") +#define TZ_Europe_Oslo ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Paris ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Podgorica ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Prague ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Riga ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Rome ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Samara ("<+04>-4") +#define TZ_Europe_San_Marino ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sarajevo ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Saratov ("<+04>-4") +#define TZ_Europe_Simferopol ("MSK-3") +#define TZ_Europe_Skopje ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sofia ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Stockholm ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Tallinn ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Tirane ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Ulyanovsk ("<+04>-4") +#define TZ_Europe_Uzhgorod ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Vaduz ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vatican ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vienna ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vilnius ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Volgograd ("<+04>-4") +#define TZ_Europe_Warsaw ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zagreb ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zaporozhye ("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Zurich ("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Indian_Antananarivo ("EAT-3") +#define TZ_Indian_Chagos ("<+06>-6") +#define TZ_Indian_Christmas ("<+07>-7") +#define TZ_Indian_Cocos ("<+0630>-6:30") +#define TZ_Indian_Comoro ("EAT-3") +#define TZ_Indian_Kerguelen ("<+05>-5") +#define TZ_Indian_Mahe ("<+04>-4") +#define TZ_Indian_Maldives ("<+05>-5") +#define TZ_Indian_Mauritius ("<+04>-4") +#define TZ_Indian_Mayotte ("EAT-3") +#define TZ_Indian_Reunion ("<+04>-4") +#define TZ_Pacific_Apia ("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") +#define TZ_Pacific_Auckland ("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Pacific_Bougainville ("<+11>-11") +#define TZ_Pacific_Chatham ("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45") +#define TZ_Pacific_Chuuk ("<+10>-10") +#define TZ_Pacific_Easter ("<-06>6<-05>,M9.1.6/22,M4.1.6/22") +#define TZ_Pacific_Efate ("<+11>-11") +#define TZ_Pacific_Enderbury ("<+13>-13") +#define TZ_Pacific_Fakaofo ("<+13>-13") +#define TZ_Pacific_Fiji ("<+12>-12<+13>,M11.2.0,M1.2.3/99") +#define TZ_Pacific_Funafuti ("<+12>-12") +#define TZ_Pacific_Galapagos ("<-06>6") +#define TZ_Pacific_Gambier ("<-09>9") +#define TZ_Pacific_Guadalcanal ("<+11>-11") +#define TZ_Pacific_Guam ("ChST-10") +#define TZ_Pacific_Honolulu ("HST10") +#define TZ_Pacific_Kiritimati ("<+14>-14") +#define TZ_Pacific_Kosrae ("<+11>-11") +#define TZ_Pacific_Kwajalein ("<+12>-12") +#define TZ_Pacific_Majuro ("<+12>-12") +#define TZ_Pacific_Marquesas ("<-0930>9:30") +#define TZ_Pacific_Midway ("SST11") +#define TZ_Pacific_Nauru ("<+12>-12") +#define TZ_Pacific_Niue ("<-11>11") +#define TZ_Pacific_Norfolk ("<+11>-11<+12>,M10.1.0,M4.1.0/3") +#define TZ_Pacific_Noumea ("<+11>-11") +#define TZ_Pacific_Pago_Pago ("SST11") +#define TZ_Pacific_Palau ("<+09>-9") +#define TZ_Pacific_Pitcairn ("<-08>8") +#define TZ_Pacific_Pohnpei ("<+11>-11") +#define TZ_Pacific_Port_Moresby ("<+10>-10") +#define TZ_Pacific_Rarotonga ("<-10>10") +#define TZ_Pacific_Saipan ("ChST-10") +#define TZ_Pacific_Tahiti ("<-10>10") +#define TZ_Pacific_Tarawa ("<+12>-12") +#define TZ_Pacific_Tongatapu ("<+13>-13") +#define TZ_Pacific_Wake ("<+12>-12") +#define TZ_Pacific_Wallis ("<+12>-12") +#define TZ_Etc_GMT ("GMT0") +#define TZ_Etc_GMTm0 ("GMT0") +#define TZ_Etc_GMTm1 ("<+01>-1") +#define TZ_Etc_GMTm2 ("<+02>-2") +#define TZ_Etc_GMTm3 ("<+03>-3") +#define TZ_Etc_GMTm4 ("<+04>-4") +#define TZ_Etc_GMTm5 ("<+05>-5") +#define TZ_Etc_GMTm6 ("<+06>-6") +#define TZ_Etc_GMTm7 ("<+07>-7") +#define TZ_Etc_GMTm8 ("<+08>-8") +#define TZ_Etc_GMTm9 ("<+09>-9") +#define TZ_Etc_GMTm10 ("<+10>-10") +#define TZ_Etc_GMTm11 ("<+11>-11") +#define TZ_Etc_GMTm12 ("<+12>-12") +#define TZ_Etc_GMTm13 ("<+13>-13") +#define TZ_Etc_GMTm14 ("<+14>-14") +#define TZ_Etc_GMT0 ("GMT0") +#define TZ_Etc_GMTp0 ("GMT0") +#define TZ_Etc_GMTp1 ("<-01>1") +#define TZ_Etc_GMTp2 ("<-02>2") +#define TZ_Etc_GMTp3 ("<-03>3") +#define TZ_Etc_GMTp4 ("<-04>4") +#define TZ_Etc_GMTp5 ("<-05>5") +#define TZ_Etc_GMTp6 ("<-06>6") +#define TZ_Etc_GMTp7 ("<-07>7") +#define TZ_Etc_GMTp8 ("<-08>8") +#define TZ_Etc_GMTp9 ("<-09>9") +#define TZ_Etc_GMTp10 ("<-10>10") +#define TZ_Etc_GMTp11 ("<-11>11") +#define TZ_Etc_GMTp12 ("<-12>12") +#define TZ_Etc_UCT ("UTC0") +#define TZ_Etc_UTC ("UTC0") +#define TZ_Etc_Greenwich ("GMT0") +#define TZ_Etc_Universal ("UTC0") +#define TZ_Etc_Zulu ("UTC0") + +//////////////////////////////////////////////////////////// + +#define TIMEZONE_MAX_LEN 50 + +static const char TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = +{ +#if USING_AFRICA + "Africa/Abidjan", //PSTR("GMT0") + "Africa/Accra", //PSTR("GMT0") + "Africa/Addis_Ababa", //PSTR("EAT-3") + "Africa/Algiers", //PSTR("CET-1") + "Africa/Asmara", //PSTR("EAT-3") + "Africa/Bamako", //PSTR("GMT0") + "Africa/Bangui", //PSTR("WAT-1") + "Africa/Banjul", //PSTR("GMT0") + "Africa/Bissau", //PSTR("GMT0") + "Africa/Blantyre", //PSTR("CAT-2") + "Africa/Brazzaville", //PSTR("WAT-1") + "Africa/Bujumbura", //PSTR("CAT-2") + "Africa/Cairo", //PSTR("EET-2") + "Africa/Casablanca", //PSTR("<+01>-1") + "Africa/Ceuta", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Africa/Conakry", //PSTR("GMT0") + "Africa/Dakar", //PSTR("GMT0") + "Africa/Dar_es_Salaam", //PSTR("EAT-3") + "Africa/Djibouti", //PSTR("EAT-3") + "Africa/Douala", //PSTR("WAT-1") + "Africa/El_Aaiun", //PSTR("<+01>-1") + "Africa/Freetown", //PSTR("GMT0") + "Africa/Gaborone", //PSTR("CAT-2") + "Africa/Harare", //PSTR("CAT-2") + "Africa/Johannesburg", //PSTR("SAST-2") + "Africa/Juba", //PSTR("EAT-3") + "Africa/Kampala", //PSTR("EAT-3") + "Africa/Khartoum", //PSTR("CAT-2") + "Africa/Kigali", //PSTR("CAT-2") + "Africa/Kinshasa", //PSTR("WAT-1") + "Africa/Lagos", //PSTR("WAT-1") + "Africa/Libreville", //PSTR("WAT-1") + "Africa/Lome", //PSTR("GMT0") + "Africa/Luanda", //PSTR("WAT-1") + "Africa/Lubumbashi", //PSTR("CAT-2") + "Africa/Lusaka", //PSTR("CAT-2") + "Africa/Malabo", //PSTR("WAT-1") + "Africa/Maputo", //PSTR("CAT-2") + "Africa/Maseru", //PSTR("SAST-2") + "Africa/Mbabane", //PSTR("SAST-2") + "Africa/Mogadishu", //PSTR("EAT-3") + "Africa/Monrovia", //PSTR("GMT0") + "Africa/Nairobi", //PSTR("EAT-3") + "Africa/Ndjamena", //PSTR("WAT-1") + "Africa/Niamey", //PSTR("WAT-1") + "Africa/Nouakchott", //PSTR("GMT0") + "Africa/Ouagadougou", //PSTR("GMT0") + "Africa/PortomNovo", //PSTR("WAT-1") + "Africa/Sao_Tome", //PSTR("GMT0") + "Africa/Tripoli", //PSTR("EET-2") + "Africa/Tunis", //PSTR("CET-1") + "Africa/Windhoek", //PSTR("CAT-2") +#endif + + +#if USING_AMERICA + "America/Adak", //PSTR("HST10HDT",M3.2.0",M11.1.0") + "America/Anchorage", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/Anguilla", //PSTR("AST4") + "America/Antigua", //PSTR("AST4") + "America/Araguaina", //PSTR("<-03>3") + "America/Argentina/Buenos_Aires", //PSTR("<-03>3") + "America/Argentina/Catamarca", //PSTR("<-03>3") + "America/Argentina/Cordoba", //PSTR("<-03>3") + "America/Argentina/Jujuy", //PSTR("<-03>3") + "America/Argentina/La_Rioja", //PSTR("<-03>3") + "America/Argentina/Mendoza", //PSTR("<-03>3") + "America/Argentina/Rio_Gallegos", //PSTR("<-03>3") + "America/Argentina/Salta", //PSTR("<-03>3") + "America/Argentina/San_Juan", //PSTR("<-03>3") + "America/Argentina/San_Luis", //PSTR("<-03>3") + "America/Argentina/Tucuman", //PSTR("<-03>3") + "America/Argentina/Ushuaia", //PSTR("<-03>3") + "America/Aruba", //PSTR("AST4") + "America/Asuncion", //PSTR("<-04>4<-03>",M10.1.0/0",M3.4.0/0") + "America/Atikokan", //PSTR("EST5") + "America/Bahia", //PSTR("<-03>3") + "America/Bahia_Banderas", //PSTR("CST6CDT",M4.1.0",M10.5.0") + "America/Barbados", //PSTR("AST4") + "America/Belem", //PSTR("<-03>3") + "America/Belize", //PSTR("CST6") + "America/BlancmSablon", //PSTR("AST4") + "America/Boa_Vista", //PSTR("<-04>4") + "America/Bogota", //PSTR("<-05>5") + "America/Boise", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Cambridge_Bay", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Campo_Grande", //PSTR("<-04>4") + "America/Cancun", //PSTR("EST5") + "America/Caracas", //PSTR("<-04>4") + "America/Cayenne", //PSTR("<-03>3") + "America/Cayman", //PSTR("EST5") + "America/Chicago", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Chihuahua", //PSTR("MST7MDT",M4.1.0",M10.5.0") + "America/Costa_Rica", //PSTR("CST6") + "America/Creston", //PSTR("MST7") + "America/Cuiaba", //PSTR("<-04>4") + "America/Curacao", //PSTR("AST4") + "America/Danmarkshavn", //PSTR("GMT0") + "America/Dawson", //PSTR("MST7") + "America/Dawson_Creek", //PSTR("MST7") + "America/Denver", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Detroit", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Dominica", //PSTR("AST4") + "America/Edmonton", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Eirunepe", //PSTR("<-05>5") + "America/El_Salvador", //PSTR("CST6") + "America/Fortaleza", //PSTR("<-03>3") + "America/Fort_Nelson", //PSTR("MST7") + "America/Glace_Bay", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "America/Godthab", //PSTR("<-03>3<-02>",M3.5.0/-2",M10.5.0/-1") + "America/Goose_Bay", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "America/Grand_Turk", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Grenada", //PSTR("AST4") + "America/Guadeloupe", //PSTR("AST4") + "America/Guatemala", //PSTR("CST6") + "America/Guayaquil", //PSTR("<-05>5") + "America/Guyana", //PSTR("<-04>4") + "America/Halifax", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "America/Havana", //PSTR("CST5CDT",M3.2.0/0",M11.1.0/1") + "America/Hermosillo", //PSTR("MST7") + "America/Indiana_Indianapolis", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Indiana_Knox", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Indiana_Marengo", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Indiana_Petersburg", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Indiana_Tell_City", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Indiana_Vevay", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Indiana_Vincennes", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Indiana_Winamac", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Inuvik", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Iqaluit", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Jamaica", //PSTR("EST5") + "America/Juneau", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/Kentucky_Louisville", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Kentucky_Monticello", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Kralendijk", //PSTR("AST4") + "America/La_Paz", //PSTR("<-04>4") + "America/Lima", //PSTR("<-05>5") + "America/Los_Angeles", //PSTR("PST8PDT",M3.2.0",M11.1.0") + "America/Lower_Princes", //PSTR("AST4") + "America/Maceio", //PSTR("<-03>3") + "America/Managua", //PSTR("CST6") + "America/Manaus", //PSTR("<-04>4") + "America/Marigot", //PSTR("AST4") + "America/Martinique", //PSTR("AST4") + "America/Matamoros", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Mazatlan", //PSTR("MST7MDT",M4.1.0",M10.5.0") + "America/Menominee", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Merida", //PSTR("CST6CDT",M4.1.0",M10.5.0") + "America/Metlakatla", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/Mexico_City", //PSTR("CST6CDT",M4.1.0",M10.5.0") + "America/Miquelon", //PSTR("<-03>3<-02>",M3.2.0",M11.1.0") + "America/Moncton", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "America/Monterrey", //PSTR("CST6CDT",M4.1.0",M10.5.0") + "America/Montevideo", //PSTR("<-03>3") + "America/Montreal", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Montserrat", //PSTR("AST4") + "America/Nassau", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/New_York", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Nipigon", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Nome", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/Noronha", //PSTR("<-02>2") + "America/North_Dakota_Beulah", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/North_Dakota_Center", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/North_Dakota_New_Salem", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Ojinaga", //PSTR("MST7MDT",M3.2.0",M11.1.0") + "America/Panama", //PSTR("EST5") + "America/Pangnirtung", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Paramaribo", //PSTR("<-03>3") + "America/Phoenix", //PSTR("MST7") + "America/PortmaumPrince", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Port_of_Spain", //PSTR("AST4") + "America/Porto_Velho", //PSTR("<-04>4") + "America/Puerto_Rico", //PSTR("AST4") + "America/Punta_Arenas", //PSTR("<-03>3") + "America/Rainy_River", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Rankin_Inlet", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Recife", //PSTR("<-03>3") + "America/Regina", //PSTR("CST6") + "America/Resolute", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Rio_Branco", //PSTR("<-05>5") + "America/Santarem", //PSTR("<-03>3") + "America/Santiago", //PSTR("<-04>4<-03>",M9.1.6/24",M4.1.6/24") + "America/Santo_Domingo", //PSTR("AST4") + "America/Sao_Paulo", //PSTR("<-03>3") + "America/Scoresbysund", //PSTR("<-01>1<+00>",M3.5.0/0",M10.5.0/1") + "America/Sitka", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/St_Barthelemy", //PSTR("AST4") + "America/St_Johns", //PSTR("NST3:30NDT",M3.2.0",M11.1.0") + "America/St_Kitts", //PSTR("AST4") + "America/St_Lucia", //PSTR("AST4") + "America/St_Thomas", //PSTR("AST4") + "America/St_Vincent", //PSTR("AST4") + "America/Swift_Current", //PSTR("CST6") + "America/Tegucigalpa", //PSTR("CST6") + "America/Thule", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "America/Thunder_Bay", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Tijuana", //PSTR("PST8PDT",M3.2.0",M11.1.0") + "America/Toronto", //PSTR("EST5EDT",M3.2.0",M11.1.0") + "America/Tortola", //PSTR("AST4") + "America/Vancouver", //PSTR("PST8PDT",M3.2.0",M11.1.0") + "America/Whitehorse", //PSTR("MST7") + "America/Winnipeg", //PSTR("CST6CDT",M3.2.0",M11.1.0") + "America/Yakutat", //PSTR("AKST9AKDT",M3.2.0",M11.1.0") + "America/Yellowknife", //PSTR("MST7MDT",M3.2.0",M11.1.0") +#endif + +#if USING_ANTARCTICA + "Antarctica/Casey", //PSTR("<+11>-11") + "Antarctica/Davis", //PSTR("<+07>-7") + "Antarctica/DumontDUrville", //PSTR("<+10>-10") + "Antarctica/Macquarie", //PSTR("AEST-10AEDT",M10.1.0",M4.1.0/3") + "Antarctica/Mawson", //PSTR("<+05>-5") + "Antarctica/McMurdo", //PSTR("NZST-12NZDT",M9.5.0",M4.1.0/3") + "Antarctica/Palmer", //PSTR("<-03>3") + "Antarctica/Rothera", //PSTR("<-03>3") + "Antarctica/Syowa", //PSTR("<+03>-3") + "Antarctica/Troll", //PSTR("<+00>0<+02>-2",M3.5.0/1",M10.5.0/3") + "Antarctica/Vostok", //PSTR("<+06>-6") + "Arctic/Longyearbyen", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") +#endif + +#if USING_ASIA + "Asia/Aden", //PSTR("<+03>-3") + "Asia/Almaty", //PSTR("<+06>-6") + "Asia/Amman", //PSTR("EET-2EEST",M3.5.4/24",M10.5.5/1") + "Asia/Anadyr", //PSTR("<+12>-12") + "Asia/Aqtau", //PSTR("<+05>-5") + "Asia/Aqtobe", //PSTR("<+05>-5") + "Asia/Ashgabat", //PSTR("<+05>-5") + "Asia/Atyrau", //PSTR("<+05>-5") + "Asia/Baghdad", //PSTR("<+03>-3") + "Asia/Bahrain", //PSTR("<+03>-3") + "Asia/Baku", //PSTR("<+04>-4") + "Asia/Bangkok", //PSTR("<+07>-7") + "Asia/Barnaul", //PSTR("<+07>-7") + "Asia/Beirut", //PSTR("EET-2EEST",M3.5.0/0",M10.5.0/0") + "Asia/Bishkek", //PSTR("<+06>-6") + "Asia/Brunei", //PSTR("<+08>-8") + "Asia/Chita", //PSTR("<+09>-9") + "Asia/Choibalsan", //PSTR("<+08>-8") + "Asia/Colombo", //PSTR("<+0530>-5:30") + "Asia/Damascus", //PSTR("EET-2EEST",M3.5.5/0",M10.5.5/0") + "Asia/Dhaka", //PSTR("<+06>-6") + "Asia/Dili", //PSTR("<+09>-9") + "Asia/Dubai", //PSTR("<+04>-4") + "Asia/Dushanbe", //PSTR("<+05>-5") + "Asia/Famagusta", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Asia/Gaza", //PSTR("EET-2EEST",M3.4.4/48",M10.4.4/49") + "Asia/Hebron", //PSTR("EET-2EEST",M3.4.4/48",M10.4.4/49") + "Asia/Ho_Chi_Minh", //PSTR("<+07>-7") + "Asia/Hong_Kong", //PSTR("HKT-8") + "Asia/Hovd", //PSTR("<+07>-7") + "Asia/Irkutsk", //PSTR("<+08>-8") + "Asia/Jakarta", //PSTR("WIB-7") + "Asia/Jayapura", //PSTR("WIT-9") + "Asia/Jerusalem", //PSTR("IST-2IDT",M3.4.4/26",M10.5.0") + "Asia/Kabul", //PSTR("<+0430>-4:30") + "Asia/Kamchatka", //PSTR("<+12>-12") + "Asia/Karachi", //PSTR("PKT-5") + "Asia/Kathmandu", //PSTR("<+0545>-5:45") + "Asia/Khandyga", //PSTR("<+09>-9") + "Asia/Kolkata", //PSTR("IST-5:30") + "Asia/Krasnoyarsk", //PSTR("<+07>-7") + "Asia/Kuala_Lumpur", //PSTR("<+08>-8") + "Asia/Kuching", //PSTR("<+08>-8") + "Asia/Kuwait", //PSTR("<+03>-3") + "Asia/Macau", //PSTR("CST-8") + "Asia/Magadan", //PSTR("<+11>-11") + "Asia/Makassar", //PSTR("WITA-8") + "Asia/Manila", //PSTR("PST-8") + "Asia/Muscat", //PSTR("<+04>-4") + "Asia/Nicosia", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Asia/Novokuznetsk", //PSTR("<+07>-7") + "Asia/Novosibirsk", //PSTR("<+07>-7") + "Asia/Omsk", //PSTR("<+06>-6") + "Asia/Oral", //PSTR("<+05>-5") + "Asia/Phnom_Penh", //PSTR("<+07>-7") + "Asia/Pontianak", //PSTR("WIB-7") + "Asia/Pyongyang", //PSTR("KST-9") + "Asia/Qatar", //PSTR("<+03>-3") + "Asia/Qyzylorda", //PSTR("<+05>-5") + "Asia/Riyadh", //PSTR("<+03>-3") + "Asia/Sakhalin", //PSTR("<+11>-11") + "Asia/Samarkand", //PSTR("<+05>-5") + "Asia/Seoul", //PSTR("KST-9") + "Asia/Shanghai", //PSTR("CST-8") + "Asia/Singapore", //PSTR("<+08>-8") + "Asia/Srednekolymsk", //PSTR("<+11>-11") + "Asia/Taipei", //PSTR("CST-8") + "Asia/Tashkent", //PSTR("<+05>-5") + "Asia/Tbilisi", //PSTR("<+04>-4") + "Asia/Tehran", //PSTR("<+0330>-3:30<+0430>",J79/24",J263/24") + "Asia/Thimphu", //PSTR("<+06>-6") + "Asia/Tokyo", //PSTR("JST-9") + "Asia/Tomsk", //PSTR("<+07>-7") + "Asia/Ulaanbaatar", //PSTR("<+08>-8") + "Asia/Urumqi", //PSTR("<+06>-6") + "Asia/UstmNera", //PSTR("<+10>-10") + "Asia/Vientiane", //PSTR("<+07>-7") + "Asia/Vladivostok", //PSTR("<+10>-10") + "Asia/Yakutsk", //PSTR("<+09>-9") + "Asia/Yangon", //PSTR("<+0630>-6:30") + "Asia/Yekaterinburg", //PSTR("<+05>-5") + "Asia/Yerevan", //PSTR("<+04>-4") +#endif + +#if USING_ATLANTIC + "Atlantic/Azores", //PSTR("<-01>1<+00>",M3.5.0/0",M10.5.0/1") + "Atlantic/Bermuda", //PSTR("AST4ADT",M3.2.0",M11.1.0") + "Atlantic/Canary", //PSTR("WET0WEST",M3.5.0/1",M10.5.0") + "Atlantic/Cape_Verde", //PSTR("<-01>1") + "Atlantic/Faroe", //PSTR("WET0WEST",M3.5.0/1",M10.5.0") + "Atlantic/Madeira", //PSTR("WET0WEST",M3.5.0/1",M10.5.0") + "Atlantic/Reykjavik", //PSTR("GMT0") + "Atlantic/South_Georgia", //PSTR("<-02>2") + "Atlantic/Stanley", //PSTR("<-03>3") + "Atlantic/St_Helena", //PSTR("GMT0") +#endif + +#if USING_AUSTRALIA + "Australia/Adelaide", //PSTR("ACST-9:30ACDT",M10.1.0",M4.1.0/3") + "Australia/Brisbane", //PSTR("AEST-10") + "Australia/Broken_Hill", //PSTR("ACST-9:30ACDT",M10.1.0",M4.1.0/3") + "Australia/Currie", //PSTR("AEST-10AEDT",M10.1.0",M4.1.0/3") + "Australia/Darwin", //PSTR("ACST-9:30") + "Australia/Eucla", //PSTR("<+0845>-8:45") + "Australia/Hobart", //PSTR("AEST-10AEDT",M10.1.0",M4.1.0/3") + "Australia/Lindeman", //PSTR("AEST-10") + "Australia/Lord_Howe", //PSTR("<+1030>-10:30<+11>-11",M10.1.0",M4.1.0") + "Australia/Melbourne", //PSTR("AEST-10AEDT",M10.1.0",M4.1.0/3") + "Australia/Perth", //PSTR("AWST-8") + "Australia/Sydney", //PSTR("AEST-10AEDT",M10.1.0",M4.1.0/3") +#endif + +#if USING_EUROPE + "Europe/Amsterdam", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Andorra", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Astrakhan", //PSTR("<+04>-4") + "Europe/Athens", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Belgrade", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Berlin", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Bratislava", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Brussels", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Bucharest", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Budapest", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Busingen", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Chisinau", //PSTR("EET-2EEST",M3.5.0",M10.5.0/3") + "Europe/Copenhagen", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Dublin", //PSTR("IST-1GMT0",M10.5.0",M3.5.0/1") + "Europe/Gibraltar", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Guernsey", //PSTR("GMT0BST",M3.5.0/1",M10.5.0") + "Europe/Helsinki", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Isle_of_Man", //PSTR("GMT0BST",M3.5.0/1",M10.5.0") + "Europe/Istanbul", //PSTR("<+03>-3") + "Europe/Jersey", //PSTR("GMT0BST",M3.5.0/1",M10.5.0") + "Europe/Kaliningrad", //PSTR("EET-2") + "Europe/Kiev", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Kirov", //PSTR("<+03>-3") + "Europe/Lisbon", //PSTR("WET0WEST",M3.5.0/1",M10.5.0") + "Europe/Ljubljana", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/London", //PSTR("GMT0BST",M3.5.0/1",M10.5.0") + "Europe/Luxembourg", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Madrid", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Malta", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Mariehamn", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Minsk", //PSTR("<+03>-3") + "Europe/Monaco", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Moscow", //PSTR("MSK-3") + "Europe/Oslo", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Paris", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Podgorica", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Prague", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Riga", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Rome", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Samara", //PSTR("<+04>-4") + "Europe/San_Marino", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Sarajevo", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Saratov", //PSTR("<+04>-4") + "Europe/Simferopol", //PSTR("MSK-3") + "Europe/Skopje", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Sofia", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Stockholm", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Tallinn", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Tirane", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Ulyanovsk", //PSTR("<+04>-4") + "Europe/Uzhgorod", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Vaduz", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Vatican", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Vienna", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Vilnius", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Volgograd", //PSTR("<+04>-4") + "Europe/Warsaw", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Zagreb", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") + "Europe/Zaporozhye", //PSTR("EET-2EEST",M3.5.0/3",M10.5.0/4") + "Europe/Zurich", //PSTR("CET-1CEST",M3.5.0",M10.5.0/3") +#endif + +#if USING_INDIAN + "Indian/Antananarivo", //PSTR("EAT-3") + "Indian/Chagos", //PSTR("<+06>-6") + "Indian/Christmas", //PSTR("<+07>-7") + "Indian/Cocos", //PSTR("<+0630>-6:30") + "Indian/Comoro", //PSTR("EAT-3") + "Indian/Kerguelen", //PSTR("<+05>-5") + "Indian/Mahe", //PSTR("<+04>-4") + "Indian/Maldives", //PSTR("<+05>-5") + "Indian/Mauritius", //PSTR("<+04>-4") + "Indian/Mayotte", //PSTR("EAT-3") + "Indian/Reunion", //PSTR("<+04>-4") +#endif + +#if USING_PACIFIC + "Pacific/Apia", //PSTR("<+13>-13<+14>",M9.5.0/3",M4.1.0/4") + "Pacific/Auckland", //PSTR("NZST-12NZDT",M9.5.0",M4.1.0/3") + "Pacific/Bougainville", //PSTR("<+11>-11") + "Pacific/Chatham", //PSTR("<+1245>-12:45<+1345>",M9.5.0/2:45",M4.1.0/3:45") + "Pacific/Chuuk", //PSTR("<+10>-10") + "Pacific/Easter", //PSTR("<-06>6<-05>",M9.1.6/22",M4.1.6/22") + "Pacific/Efate", //PSTR("<+11>-11") + "Pacific/Enderbury", //PSTR("<+13>-13") + "Pacific/Fakaofo", //PSTR("<+13>-13") + "Pacific/Fiji", //PSTR("<+12>-12<+13>",M11.2.0",M1.2.3/99") + "Pacific/Funafuti", //PSTR("<+12>-12") + "Pacific/Galapagos", //PSTR("<-06>6") + "Pacific/Gambier", //PSTR("<-09>9") + "Pacific/Guadalcanal", //PSTR("<+11>-11") + "Pacific/Guam", //PSTR("ChST-10") + "Pacific/Honolulu", //PSTR("HST10") + "Pacific/Kiritimati", //PSTR("<+14>-14") + "Pacific/Kosrae", //PSTR("<+11>-11") + "Pacific/Kwajalein", //PSTR("<+12>-12") + "Pacific/Majuro", //PSTR("<+12>-12") + "Pacific/Marquesas", //PSTR("<-0930>9:30") + "Pacific/Midway", //PSTR("SST11") + "Pacific/Nauru", //PSTR("<+12>-12") + "Pacific/Niue", //PSTR("<-11>11") + "Pacific/Norfolk", //PSTR("<+11>-11<+12>",M10.1.0",M4.1.0/3") + "Pacific/Noumea", //PSTR("<+11>-11") + "Pacific/Pago_Pago", //PSTR("SST11") + "Pacific/Palau", //PSTR("<+09>-9") + "Pacific/Pitcairn", //PSTR("<-08>8") + "Pacific/Pohnpei", //PSTR("<+11>-11") + "Pacific/Port_Moresby", //PSTR("<+10>-10") + "Pacific/Rarotonga", //PSTR("<-10>10") + "Pacific/Saipan", //PSTR("ChST-10") + "Pacific/Tahiti", //PSTR("<-10>10") + "Pacific/Tarawa", //PSTR("<+12>-12") + "Pacific/Tongatapu", //PSTR("<+13>-13") + "Pacific/Wake", //PSTR("<+12>-12") + "Pacific/Wallis", //PSTR("<+12>-12") +#endif + +#if USING_ETC_GMT + "Etc/GMT", //PSTR("GMT0") + "Etc/GMTm0", //PSTR("GMT0") + "Etc/GMTm1", //PSTR("<+01>-1") + "Etc/GMTm2", //PSTR("<+02>-2") + "Etc/GMTm3", //PSTR("<+03>-3") + "Etc/GMTm4", //PSTR("<+04>-4") + "Etc/GMTm5", //PSTR("<+05>-5") + "Etc/GMTm6", //PSTR("<+06>-6") + "Etc/GMTm7", //PSTR("<+07>-7") + "Etc/GMTm8", //PSTR("<+08>-8") + "Etc/GMTm9", //PSTR("<+09>-9") + "Etc/GMTm10", //PSTR("<+10>-10") + "Etc/GMTm11", //PSTR("<+11>-11") + "Etc/GMTm12", //PSTR("<+12>-12") + "Etc/GMTm13", //PSTR("<+13>-13") + "Etc/GMTm14", //PSTR("<+14>-14") + "Etc/GMT0", //PSTR("GMT0") + "Etc/GMTp0", //PSTR("GMT0") + "Etc/GMTp1", //PSTR("<-01>1") + "Etc/GMTp2", //PSTR("<-02>2") + "Etc/GMTp3", //PSTR("<-03>3") + "Etc/GMTp4", //PSTR("<-04>4") + "Etc/GMTp5", //PSTR("<-05>5") + "Etc/GMTp6", //PSTR("<-06>6") + "Etc/GMTp7", //PSTR("<-07>7") + "Etc/GMTp8", //PSTR("<-08>8") + "Etc/GMTp9", //PSTR("<-09>9") + "Etc/GMTp10", //PSTR("<-10>10") + "Etc/GMTp11", //PSTR("<-11>11") + "Etc/GMTp12", //PSTR("<-12>12") + "Etc/UCT", //PSTR("UTC0") + "Etc/UTC", //PSTR("UTC0") + "Etc/Greenwich", //PSTR("GMT0") + "Etc/Universal", //PSTR("UTC0") + "Etc/Zulu", //PSTR("UTC0") +#endif +}; + +//////////////////////////////////////////////////////////// + +static const char ESP_TZ_NAME[][TIMEZONE_MAX_LEN] /*PROGMEM*/ = +{ +#if USING_AFRICA + TZ_Africa_Abidjan, //PSTR("GMT0") + TZ_Africa_Accra, //PSTR("GMT0") + TZ_Africa_Addis_Ababa, //PSTR("EAT-3") + TZ_Africa_Algiers, //PSTR("CET-1") + TZ_Africa_Asmara, //PSTR("EAT-3") + TZ_Africa_Bamako, //PSTR("GMT0") + TZ_Africa_Bangui, //PSTR("WAT-1") + TZ_Africa_Banjul, //PSTR("GMT0") + TZ_Africa_Bissau, //PSTR("GMT0") + TZ_Africa_Blantyre, //PSTR("CAT-2") + TZ_Africa_Brazzaville, //PSTR("WAT-1") + TZ_Africa_Bujumbura, //PSTR("CAT-2") + TZ_Africa_Cairo, //PSTR("EET-2") + TZ_Africa_Casablanca, //PSTR("<+01>-1") + TZ_Africa_Ceuta, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Africa_Conakry, //PSTR("GMT0") + TZ_Africa_Dakar, //PSTR("GMT0") + TZ_Africa_Dar_es_Salaam, //PSTR("EAT-3") + TZ_Africa_Djibouti, //PSTR("EAT-3") + TZ_Africa_Douala, //PSTR("WAT-1") + TZ_Africa_El_Aaiun, //PSTR("<+01>-1") + TZ_Africa_Freetown, //PSTR("GMT0") + TZ_Africa_Gaborone, //PSTR("CAT-2") + TZ_Africa_Harare, //PSTR("CAT-2") + TZ_Africa_Johannesburg, //PSTR("SAST-2") + TZ_Africa_Juba, //PSTR("EAT-3") + TZ_Africa_Kampala, //PSTR("EAT-3") + TZ_Africa_Khartoum, //PSTR("CAT-2") + TZ_Africa_Kigali, //PSTR("CAT-2") + TZ_Africa_Kinshasa, //PSTR("WAT-1") + TZ_Africa_Lagos, //PSTR("WAT-1") + TZ_Africa_Libreville, //PSTR("WAT-1") + TZ_Africa_Lome, //PSTR("GMT0") + TZ_Africa_Luanda, //PSTR("WAT-1") + TZ_Africa_Lubumbashi, //PSTR("CAT-2") + TZ_Africa_Lusaka, //PSTR("CAT-2") + TZ_Africa_Malabo, //PSTR("WAT-1") + TZ_Africa_Maputo, //PSTR("CAT-2") + TZ_Africa_Maseru, //PSTR("SAST-2") + TZ_Africa_Mbabane, //PSTR("SAST-2") + TZ_Africa_Mogadishu, //PSTR("EAT-3") + TZ_Africa_Monrovia, //PSTR("GMT0") + TZ_Africa_Nairobi, //PSTR("EAT-3") + TZ_Africa_Ndjamena, //PSTR("WAT-1") + TZ_Africa_Niamey, //PSTR("WAT-1") + TZ_Africa_Nouakchott, //PSTR("GMT0") + TZ_Africa_Ouagadougou, //PSTR("GMT0") + TZ_Africa_PortomNovo, //PSTR("WAT-1") + TZ_Africa_Sao_Tome, //PSTR("GMT0") + TZ_Africa_Tripoli, //PSTR("EET-2") + TZ_Africa_Tunis, //PSTR("CET-1") + TZ_Africa_Windhoek, //PSTR("CAT-2") +#endif + +#if USING_AMERICA + TZ_America_Adak, //PSTR("HST10HDT,M3.2.0,M11.1.0") + TZ_America_Anchorage, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_Anguilla, //PSTR("AST4") + TZ_America_Antigua, //PSTR("AST4") + TZ_America_Araguaina, //PSTR("<-03>3") + TZ_America_Argentina_Buenos_Aires, //PSTR("<-03>3") + TZ_America_Argentina_Catamarca, //PSTR("<-03>3") + TZ_America_Argentina_Cordoba, //PSTR("<-03>3") + TZ_America_Argentina_Jujuy, //PSTR("<-03>3") + TZ_America_Argentina_La_Rioja, //PSTR("<-03>3") + TZ_America_Argentina_Mendoza, //PSTR("<-03>3") + TZ_America_Argentina_Rio_Gallegos, //PSTR("<-03>3") + TZ_America_Argentina_Salta, //PSTR("<-03>3") + TZ_America_Argentina_San_Juan, //PSTR("<-03>3") + TZ_America_Argentina_San_Luis, //PSTR("<-03>3") + TZ_America_Argentina_Tucuman, //PSTR("<-03>3") + TZ_America_Argentina_Ushuaia, //PSTR("<-03>3") + TZ_America_Aruba, //PSTR("AST4") + TZ_America_Asuncion, //PSTR("<-04>4<-03>,M10.1.0/0,M3.4.0/0") + TZ_America_Atikokan, //PSTR("EST5") + TZ_America_Bahia, //PSTR("<-03>3") + TZ_America_Bahia_Banderas, //PSTR("CST6CDT,M4.1.0,M10.5.0") + TZ_America_Barbados, //PSTR("AST4") + TZ_America_Belem, //PSTR("<-03>3") + TZ_America_Belize, //PSTR("CST6") + TZ_America_BlancmSablon, //PSTR("AST4") + TZ_America_Boa_Vista, //PSTR("<-04>4") + TZ_America_Bogota, //PSTR("<-05>5") + TZ_America_Boise, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Cambridge_Bay, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Campo_Grande, //PSTR("<-04>4") + TZ_America_Cancun, //PSTR("EST5") + TZ_America_Caracas, //PSTR("<-04>4") + TZ_America_Cayenne, //PSTR("<-03>3") + TZ_America_Cayman, //PSTR("EST5") + TZ_America_Chicago, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Chihuahua, //PSTR("MST7MDT,M4.1.0,M10.5.0") + TZ_America_Costa_Rica, //PSTR("CST6") + TZ_America_Creston, //PSTR("MST7") + TZ_America_Cuiaba, //PSTR("<-04>4") + TZ_America_Curacao, //PSTR("AST4") + TZ_America_Danmarkshavn, //PSTR("GMT0") + TZ_America_Dawson, //PSTR("MST7") + TZ_America_Dawson_Creek, //PSTR("MST7") + TZ_America_Denver, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Detroit, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Dominica, //PSTR("AST4") + TZ_America_Edmonton, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Eirunepe, //PSTR("<-05>5") + TZ_America_El_Salvador, //PSTR("CST6") + TZ_America_Fortaleza, //PSTR("<-03>3") + TZ_America_Fort_Nelson, //PSTR("MST7") + TZ_America_Glace_Bay, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_America_Godthab, //PSTR("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1") + TZ_America_Goose_Bay, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_America_Grand_Turk, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Grenada, //PSTR("AST4") + TZ_America_Guadeloupe, //PSTR("AST4") + TZ_America_Guatemala, //PSTR("CST6") + TZ_America_Guayaquil, //PSTR("<-05>5") + TZ_America_Guyana, //PSTR("<-04>4") + TZ_America_Halifax, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_America_Havana, //PSTR("CST5CDT,M3.2.0/0,M11.1.0/1") + TZ_America_Hermosillo, //PSTR("MST7") + TZ_America_Indiana_Indianapolis, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Knox, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Marengo, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Petersburg, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Tell_City, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Vevay, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Vincennes, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Indiana_Winamac, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Inuvik, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Iqaluit, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Jamaica, //PSTR("EST5") + TZ_America_Juneau, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_Kentucky_Louisville, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Kentucky_Monticello, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Kralendijk, //PSTR("AST4") + TZ_America_La_Paz, //PSTR("<-04>4") + TZ_America_Lima, //PSTR("<-05>5") + TZ_America_Los_Angeles, //PSTR("PST8PDT,M3.2.0,M11.1.0") + TZ_America_Lower_Princes, //PSTR("AST4") + TZ_America_Maceio, //PSTR("<-03>3") + TZ_America_Managua, //PSTR("CST6") + TZ_America_Manaus, //PSTR("<-04>4") + TZ_America_Marigot, //PSTR("AST4") + TZ_America_Martinique, //PSTR("AST4") + TZ_America_Matamoros, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Mazatlan, //PSTR("MST7MDT,M4.1.0,M10.5.0") + TZ_America_Menominee, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Merida, //PSTR("CST6CDT,M4.1.0,M10.5.0") + TZ_America_Metlakatla, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_Mexico_City, //PSTR("CST6CDT,M4.1.0,M10.5.0") + TZ_America_Miquelon, //PSTR("<-03>3<-02>,M3.2.0,M11.1.0") + TZ_America_Moncton, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_America_Monterrey, //PSTR("CST6CDT,M4.1.0,M10.5.0") + TZ_America_Montevideo, //PSTR("<-03>3") + TZ_America_Montreal, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Montserrat, //PSTR("AST4") + TZ_America_Nassau, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_New_York, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Nipigon, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Nome, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_Noronha, //PSTR("<-02>2") + TZ_America_North_Dakota_Beulah, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_North_Dakota_Center, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_North_Dakota_New_Salem, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Ojinaga, //PSTR("MST7MDT,M3.2.0,M11.1.0") + TZ_America_Panama, //PSTR("EST5") + TZ_America_Pangnirtung, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Paramaribo, //PSTR("<-03>3") + TZ_America_Phoenix, //PSTR("MST7") + TZ_America_PortmaumPrince, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Port_of_Spain, //PSTR("AST4") + TZ_America_Porto_Velho, //PSTR("<-04>4") + TZ_America_Puerto_Rico, //PSTR("AST4") + TZ_America_Punta_Arenas, //PSTR("<-03>3") + TZ_America_Rainy_River, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Rankin_Inlet, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Recife, //PSTR("<-03>3") + TZ_America_Regina, //PSTR("CST6") + TZ_America_Resolute, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Rio_Branco, //PSTR("<-05>5") + TZ_America_Santarem, //PSTR("<-03>3") + TZ_America_Santiago, //PSTR("<-04>4<-03>,M9.1.6/24,M4.1.6/24") + TZ_America_Santo_Domingo, //PSTR("AST4") + TZ_America_Sao_Paulo, //PSTR("<-03>3") + TZ_America_Scoresbysund, //PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1") + TZ_America_Sitka, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_St_Barthelemy, //PSTR("AST4") + TZ_America_St_Johns, //PSTR("NST3:30NDT,M3.2.0,M11.1.0") + TZ_America_St_Kitts, //PSTR("AST4") + TZ_America_St_Lucia, //PSTR("AST4") + TZ_America_St_Thomas, //PSTR("AST4") + TZ_America_St_Vincent, //PSTR("AST4") + TZ_America_Swift_Current, //PSTR("CST6") + TZ_America_Tegucigalpa, //PSTR("CST6") + TZ_America_Thule, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_America_Thunder_Bay, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Tijuana, //PSTR("PST8PDT,M3.2.0,M11.1.0") + TZ_America_Toronto, //PSTR("EST5EDT,M3.2.0,M11.1.0") + TZ_America_Tortola, //PSTR("AST4") + TZ_America_Vancouver, //PSTR("PST8PDT,M3.2.0,M11.1.0") + TZ_America_Whitehorse, //PSTR("MST7") + TZ_America_Winnipeg, //PSTR("CST6CDT,M3.2.0,M11.1.0") + TZ_America_Yakutat, //PSTR("AKST9AKDT,M3.2.0,M11.1.0") + TZ_America_Yellowknife, //PSTR("MST7MDT,M3.2.0,M11.1.0") +#endif + +#if USING_ANTARCTICA + TZ_Antarctica_Casey, //PSTR("<+11>-11") + TZ_Antarctica_Davis, //PSTR("<+07>-7") + TZ_Antarctica_DumontDUrville, //PSTR("<+10>-10") + TZ_Antarctica_Macquarie, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") + TZ_Antarctica_Mawson, //PSTR("<+05>-5") + TZ_Antarctica_McMurdo, //PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3") + TZ_Antarctica_Palmer, //PSTR("<-03>3") + TZ_Antarctica_Rothera, //PSTR("<-03>3") + TZ_Antarctica_Syowa, //PSTR("<+03>-3") + TZ_Antarctica_Troll, //PSTR("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3") + TZ_Antarctica_Vostok, //PSTR("<+06>-6") + TZ_Arctic_Longyearbyen, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#endif + + +#if USING_ASIA + TZ_Asia_Aden, //PSTR("<+03>-3") + TZ_Asia_Almaty, //PSTR("<+06>-6") + TZ_Asia_Amman, //PSTR("EET-2EEST,M3.5.4/24,M10.5.5/1") + TZ_Asia_Anadyr, //PSTR("<+12>-12") + TZ_Asia_Aqtau, //PSTR("<+05>-5") + TZ_Asia_Aqtobe, //PSTR("<+05>-5") + TZ_Asia_Ashgabat, //PSTR("<+05>-5") + TZ_Asia_Atyrau, //PSTR("<+05>-5") + TZ_Asia_Baghdad, //PSTR("<+03>-3") + TZ_Asia_Bahrain, //PSTR("<+03>-3") + TZ_Asia_Baku, //PSTR("<+04>-4") + TZ_Asia_Bangkok, //PSTR("<+07>-7") + TZ_Asia_Barnaul, //PSTR("<+07>-7") + TZ_Asia_Beirut, //PSTR("EET-2EEST,M3.5.0/0,M10.5.0/0") + TZ_Asia_Bishkek, //PSTR("<+06>-6") + TZ_Asia_Brunei, //PSTR("<+08>-8") + TZ_Asia_Chita, //PSTR("<+09>-9") + TZ_Asia_Choibalsan, //PSTR("<+08>-8") + TZ_Asia_Colombo, //PSTR("<+0530>-5:30") + TZ_Asia_Damascus, //PSTR("EET-2EEST,M3.5.5/0,M10.5.5/0") + TZ_Asia_Dhaka, //PSTR("<+06>-6") + TZ_Asia_Dili, //PSTR("<+09>-9") + TZ_Asia_Dubai, //PSTR("<+04>-4") + TZ_Asia_Dushanbe, //PSTR("<+05>-5") + TZ_Asia_Famagusta, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Asia_Gaza, //PSTR("EET-2EEST,M3.4.4/48,M10.4.4/49") + TZ_Asia_Hebron, //PSTR("EET-2EEST,M3.4.4/48,M10.4.4/49") + TZ_Asia_Ho_Chi_Minh, //PSTR("<+07>-7") + TZ_Asia_Hong_Kong, //PSTR("HKT-8") + TZ_Asia_Hovd, //PSTR("<+07>-7") + TZ_Asia_Irkutsk, //PSTR("<+08>-8") + TZ_Asia_Jakarta, //PSTR("WIB-7") + TZ_Asia_Jayapura, //PSTR("WIT-9") + TZ_Asia_Jerusalem, //PSTR("IST-2IDT,M3.4.4/26,M10.5.0") + TZ_Asia_Kabul, //PSTR("<+0430>-4:30") + TZ_Asia_Kamchatka, //PSTR("<+12>-12") + TZ_Asia_Karachi, //PSTR("PKT-5") + TZ_Asia_Kathmandu, //PSTR("<+0545>-5:45") + TZ_Asia_Khandyga, //PSTR("<+09>-9") + TZ_Asia_Kolkata, //PSTR("IST-5:30") + TZ_Asia_Krasnoyarsk, //PSTR("<+07>-7") + TZ_Asia_Kuala_Lumpur, //PSTR("<+08>-8") + TZ_Asia_Kuching, //PSTR("<+08>-8") + TZ_Asia_Kuwait, //PSTR("<+03>-3") + TZ_Asia_Macau, //PSTR("CST-8") + TZ_Asia_Magadan, //PSTR("<+11>-11") + TZ_Asia_Makassar, //PSTR("WITA-8") + TZ_Asia_Manila, //PSTR("PST-8") + TZ_Asia_Muscat, //PSTR("<+04>-4") + TZ_Asia_Nicosia, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Asia_Novokuznetsk, //PSTR("<+07>-7") + TZ_Asia_Novosibirsk, //PSTR("<+07>-7") + TZ_Asia_Omsk, //PSTR("<+06>-6") + TZ_Asia_Oral, //PSTR("<+05>-5") + TZ_Asia_Phnom_Penh, //PSTR("<+07>-7") + TZ_Asia_Pontianak, //PSTR("WIB-7") + TZ_Asia_Pyongyang, //PSTR("KST-9") + TZ_Asia_Qatar, //PSTR("<+03>-3") + TZ_Asia_Qyzylorda, //PSTR("<+05>-5") + TZ_Asia_Riyadh, //PSTR("<+03>-3") + TZ_Asia_Sakhalin, //PSTR("<+11>-11") + TZ_Asia_Samarkand, //PSTR("<+05>-5") + TZ_Asia_Seoul, //PSTR("KST-9") + TZ_Asia_Shanghai, //PSTR("CST-8") + TZ_Asia_Singapore, //PSTR("<+08>-8") + TZ_Asia_Srednekolymsk, //PSTR("<+11>-11") + TZ_Asia_Taipei, //PSTR("CST-8") + TZ_Asia_Tashkent, //PSTR("<+05>-5") + TZ_Asia_Tbilisi, //PSTR("<+04>-4") + TZ_Asia_Tehran, //PSTR("<+0330>-3:30<+0430>,J79/24,J263/24") + TZ_Asia_Thimphu, //PSTR("<+06>-6") + TZ_Asia_Tokyo, //PSTR("JST-9") + TZ_Asia_Tomsk, //PSTR("<+07>-7") + TZ_Asia_Ulaanbaatar, //PSTR("<+08>-8") + TZ_Asia_Urumqi, //PSTR("<+06>-6") + TZ_Asia_UstmNera, //PSTR("<+10>-10") + TZ_Asia_Vientiane, //PSTR("<+07>-7") + TZ_Asia_Vladivostok, //PSTR("<+10>-10") + TZ_Asia_Yakutsk, //PSTR("<+09>-9") + TZ_Asia_Yangon, //PSTR("<+0630>-6:30") + TZ_Asia_Yekaterinburg, //PSTR("<+05>-5") + TZ_Asia_Yerevan, //PSTR("<+04>-4") +#endif + +#if USING_ATLANTIC + TZ_Atlantic_Azores, //PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1") + TZ_Atlantic_Bermuda, //PSTR("AST4ADT,M3.2.0,M11.1.0") + TZ_Atlantic_Canary, //PSTR("WET0WEST,M3.5.0/1,M10.5.0") + TZ_Atlantic_Cape_Verde, //PSTR("<-01>1") + TZ_Atlantic_Faroe, //PSTR("WET0WEST,M3.5.0/1,M10.5.0") + TZ_Atlantic_Madeira, //PSTR("WET0WEST,M3.5.0/1,M10.5.0") + TZ_Atlantic_Reykjavik, //PSTR("GMT0") + TZ_Atlantic_South_Georgia, //PSTR("<-02>2") + TZ_Atlantic_Stanley, //PSTR("<-03>3") + TZ_Atlantic_St_Helena, //PSTR("GMT0") +#endif + +#if USING_AUSTRALIA + TZ_Australia_Adelaide, //PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") + TZ_Australia_Brisbane, //PSTR("AEST-10") + TZ_Australia_Broken_Hill, //PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") + TZ_Australia_Currie, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") + TZ_Australia_Darwin, //PSTR("ACST-9:30") + TZ_Australia_Eucla, //PSTR("<+0845>-8:45") + TZ_Australia_Hobart, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") + TZ_Australia_Lindeman, //PSTR("AEST-10") + TZ_Australia_Lord_Howe, //PSTR("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0") + TZ_Australia_Melbourne, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") + TZ_Australia_Perth, //PSTR("AWST-8") + TZ_Australia_Sydney, //PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") +#endif + +#if USING_EUROPE + TZ_Europe_Amsterdam, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Andorra, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Astrakhan, //PSTR("<+04>-4") + TZ_Europe_Athens, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Belgrade, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Berlin, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Bratislava, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Brussels, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Bucharest, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Budapest, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Busingen, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Chisinau, //PSTR("EET-2EEST,M3.5.0,M10.5.0/3") + TZ_Europe_Copenhagen, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Dublin, //PSTR("IST-1GMT0,M10.5.0,M3.5.0/1") + TZ_Europe_Gibraltar, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Guernsey, //PSTR("GMT0BST,M3.5.0/1,M10.5.0") + TZ_Europe_Helsinki, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Isle_of_Man, //PSTR("GMT0BST,M3.5.0/1,M10.5.0") + TZ_Europe_Istanbul, //PSTR("<+03>-3") + TZ_Europe_Jersey, //PSTR("GMT0BST,M3.5.0/1,M10.5.0") + TZ_Europe_Kaliningrad, //PSTR("EET-2") + TZ_Europe_Kiev, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Kirov, //PSTR("<+03>-3") + TZ_Europe_Lisbon, //PSTR("WET0WEST,M3.5.0/1,M10.5.0") + TZ_Europe_Ljubljana, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_London, //PSTR("GMT0BST,M3.5.0/1,M10.5.0") + TZ_Europe_Luxembourg, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Madrid, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Malta, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Mariehamn, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Minsk, //PSTR("<+03>-3") + TZ_Europe_Monaco, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Moscow, //PSTR("MSK-3") + TZ_Europe_Oslo, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Paris, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Podgorica, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Prague, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Riga, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Rome, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Samara, //PSTR("<+04>-4") + TZ_Europe_San_Marino, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Sarajevo, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Saratov, //PSTR("<+04>-4") + TZ_Europe_Simferopol, //PSTR("MSK-3") + TZ_Europe_Skopje, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Sofia, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Stockholm, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Tallinn, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Tirane, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Ulyanovsk, //PSTR("<+04>-4") + TZ_Europe_Uzhgorod, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Vaduz, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Vatican, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Vienna, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Vilnius, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Volgograd, //PSTR("<+04>-4") + TZ_Europe_Warsaw, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Zagreb, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") + TZ_Europe_Zaporozhye, //PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") + TZ_Europe_Zurich, //PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#endif + +#if USING_INDIAN + TZ_Indian_Antananarivo, //PSTR("EAT-3") + TZ_Indian_Chagos, //PSTR("<+06>-6") + TZ_Indian_Christmas, //PSTR("<+07>-7") + TZ_Indian_Cocos, //PSTR("<+0630>-6:30") + TZ_Indian_Comoro, //PSTR("EAT-3") + TZ_Indian_Kerguelen, //PSTR("<+05>-5") + TZ_Indian_Mahe, //PSTR("<+04>-4") + TZ_Indian_Maldives, //PSTR("<+05>-5") + TZ_Indian_Mauritius, //PSTR("<+04>-4") + TZ_Indian_Mayotte, //PSTR("EAT-3") + TZ_Indian_Reunion, //PSTR("<+04>-4") +#endif + +#if USING_PACIFIC + TZ_Pacific_Apia, //PSTR("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") + TZ_Pacific_Auckland, //PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3") + TZ_Pacific_Bougainville, //PSTR("<+11>-11") + TZ_Pacific_Chatham, //PSTR("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45") + TZ_Pacific_Chuuk, //PSTR("<+10>-10") + TZ_Pacific_Easter, //PSTR("<-06>6<-05>,M9.1.6/22,M4.1.6/22") + TZ_Pacific_Efate, //PSTR("<+11>-11") + TZ_Pacific_Enderbury, //PSTR("<+13>-13") + TZ_Pacific_Fakaofo, //PSTR("<+13>-13") + TZ_Pacific_Fiji, //PSTR("<+12>-12<+13>,M11.2.0,M1.2.3/99") + TZ_Pacific_Funafuti, //PSTR("<+12>-12") + TZ_Pacific_Galapagos, //PSTR("<-06>6") + TZ_Pacific_Gambier, //PSTR("<-09>9") + TZ_Pacific_Guadalcanal, //PSTR("<+11>-11") + TZ_Pacific_Guam, //PSTR("ChST-10") + TZ_Pacific_Honolulu, //PSTR("HST10") + TZ_Pacific_Kiritimati, //PSTR("<+14>-14") + TZ_Pacific_Kosrae, //PSTR("<+11>-11") + TZ_Pacific_Kwajalein, //PSTR("<+12>-12") + TZ_Pacific_Majuro, //PSTR("<+12>-12") + TZ_Pacific_Marquesas, //PSTR("<-0930>9:30") + TZ_Pacific_Midway, //PSTR("SST11") + TZ_Pacific_Nauru, //PSTR("<+12>-12") + TZ_Pacific_Niue, //PSTR("<-11>11") + TZ_Pacific_Norfolk, //PSTR("<+11>-11<+12>,M10.1.0,M4.1.0/3") + TZ_Pacific_Noumea, //PSTR("<+11>-11") + TZ_Pacific_Pago_Pago, //PSTR("SST11") + TZ_Pacific_Palau, //PSTR("<+09>-9") + TZ_Pacific_Pitcairn, //PSTR("<-08>8") + TZ_Pacific_Pohnpei, //PSTR("<+11>-11") + TZ_Pacific_Port_Moresby, //PSTR("<+10>-10") + TZ_Pacific_Rarotonga, //PSTR("<-10>10") + TZ_Pacific_Saipan, //PSTR("ChST-10") + TZ_Pacific_Tahiti, //PSTR("<-10>10") + TZ_Pacific_Tarawa, //PSTR("<+12>-12") + TZ_Pacific_Tongatapu, //PSTR("<+13>-13") + TZ_Pacific_Wake, //PSTR("<+12>-12") + TZ_Pacific_Wallis, //PSTR("<+12>-12") +#endif + +#if USING_ETC_GMT + TZ_Etc_GMT, //PSTR("GMT0") + TZ_Etc_GMTm0, //PSTR("GMT0") + TZ_Etc_GMTm1, //PSTR("<+01>-1") + TZ_Etc_GMTm2, //PSTR("<+02>-2") + TZ_Etc_GMTm3, //PSTR("<+03>-3") + TZ_Etc_GMTm4, //PSTR("<+04>-4") + TZ_Etc_GMTm5, //PSTR("<+05>-5") + TZ_Etc_GMTm6, //PSTR("<+06>-6") + TZ_Etc_GMTm7, //PSTR("<+07>-7") + TZ_Etc_GMTm8, //PSTR("<+08>-8") + TZ_Etc_GMTm9, //PSTR("<+09>-9") + TZ_Etc_GMTm10, //PSTR("<+10>-10") + TZ_Etc_GMTm11, //PSTR("<+11>-11") + TZ_Etc_GMTm12, //PSTR("<+12>-12") + TZ_Etc_GMTm13, //PSTR("<+13>-13") + TZ_Etc_GMTm14, //PSTR("<+14>-14") + TZ_Etc_GMT0, //PSTR("GMT0") + TZ_Etc_GMTp0, //PSTR("GMT0") + TZ_Etc_GMTp1, //PSTR("<-01>1") + TZ_Etc_GMTp2, //PSTR("<-02>2") + TZ_Etc_GMTp3, //PSTR("<-03>3") + TZ_Etc_GMTp4, //PSTR("<-04>4") + TZ_Etc_GMTp5, //PSTR("<-05>5") + TZ_Etc_GMTp6, //PSTR("<-06>6") + TZ_Etc_GMTp7, //PSTR("<-07>7") + TZ_Etc_GMTp8, //PSTR("<-08>8") + TZ_Etc_GMTp9, //PSTR("<-09>9") + TZ_Etc_GMTp10, //PSTR("<-10>10") + TZ_Etc_GMTp11, //PSTR("<-11>11") + TZ_Etc_GMTp12, //PSTR("<-12>12") + TZ_Etc_UCT, //PSTR("UTC0") + TZ_Etc_UTC, //PSTR("UTC0") + TZ_Etc_Greenwich, //PSTR("GMT0") + TZ_Etc_Universal, //PSTR("UTC0") + TZ_Etc_Zulu, //PSTR("UTC0") +#endif +}; + +#endif // TZDB_H diff --git a/travis/common.sh b/travis/common.sh new file mode 100644 index 0000000..d115085 --- /dev/null +++ b/travis/common.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +function build_examples() +{ + # track the exit code for this platform + local exit_code=0 + # loop through results and add them to the array + examples=($(find $PWD/examples/ -name "*.pde" -o -name "*.ino")) + + # get the last example in the array + local last="${examples[@]:(-1)}" + + # loop through example sketches + for example in "${examples[@]}"; do + + # store the full path to the example's sketch directory + local example_dir=$(dirname $example) + + # store the filename for the example without the path + local example_file=$(basename $example) + + echo "$example_file: " + local sketch="$example_dir/$example_file" + echo "$sketch" + #arduino -v --verbose-build --verify $sketch + + # verify the example, and save stdout & stderr to a variable + # we have to avoid reading the exit code of local: + # "when declaring a local variable in a function, the local acts as a command in its own right" + local build_stdout + build_stdout=$(arduino --verify $sketch 2>&1) + + # echo output if the build failed + if [ $? -ne 0 ]; then + # heavy X + echo -e "\xe2\x9c\x96" + echo -e "----------------------------- DEBUG OUTPUT -----------------------------\n" + echo "$build_stdout" + echo -e "\n------------------------------------------------------------------------\n" + + # mark as fail + exit_code=1 + + else + # heavy checkmark + echo -e "\xe2\x9c\x93" + fi + done + + return $exit_code +} diff --git a/utils/astyle_library.conf b/utils/astyle_library.conf new file mode 100644 index 0000000..8a73bc2 --- /dev/null +++ b/utils/astyle_library.conf @@ -0,0 +1,70 @@ +# Code formatting rules for Arduino libraries, modified from for KH libraries: +# +# https://github.com/arduino/Arduino/blob/master/build/shared/examples_formatter.conf +# + +# astyle --style=allman -s2 -t2 -C -S -xW -Y -M120 -f -p -xg -H -xb -c --xC120 -xL *.h *.cpp *.ino + +--mode=c +--lineend=linux +--style=allman + +# -r or -R +#--recursive + +# -c => Converts tabs into spaces +convert-tabs + +# -s2 => 2 spaces indentation +--indent=spaces=2 + +# -t2 => tab =2 spaces +#--indent=tab=2 + +# -C +--indent-classes + +# -S +--indent-switches + +# -xW +--indent-preproc-block + +# -Y => indent classes, switches (and cases), comments starting at column 1 +--indent-col1-comments + +# -M120 => maximum of 120 spaces to indent a continuation line +--max-continuation-indent=120 + +# -xC120 => max‑code‑length will break a line if the code exceeds # characters +--max-code-length=120 + +# -f => +--break-blocks + +# -p => put a space around operators +--pad-oper + +# -xg => Insert space padding after commas +--pad-comma + +# -H => put a space after if/for/while +pad-header + +# -xb => Break one line headers (e.g. if/for/while) +--break-one-line-headers + +# -c => Converts tabs into spaces +#--convert-tabs + +# if you like one-liners, keep them +#keep-one-line-statements + +# -xV +--attach-closing-while + +#unpad-paren + +# -xp +remove-comment-prefix + diff --git a/utils/restyle.sh b/utils/restyle.sh new file mode 100644 index 0000000..bcd846f --- /dev/null +++ b/utils/restyle.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for dir in . ; do + find $dir -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.ino" \) -exec astyle --suffix=none --options=./utils/astyle_library.conf \{\} \; +done +