├── .gitattributes ├── .gitignore ├── 1.构建、刷入固件,上传代码 ├── README.md ├── img │ ├── esplorer-ok.png │ ├── esplorer-open.png │ ├── esplorer-upload.png │ ├── flasher-config.png │ ├── flasher-finished.png │ ├── flasher-flashing.png │ └── nodemcu.jpg └── source │ └── init.lua ├── 2.断线自动重连,闪烁连接状态 ├── README.md └── source │ └── init.lua ├── 3.响应配置按钮 ├── README.md ├── img │ └── wiring.jpg └── source │ └── init.lua ├── 4.实现Web配置页面 ├── README.md ├── img │ └── config.png └── source │ ├── httpServer.lua │ ├── index.html │ ├── init.lua │ ├── spectre.min.css.gz │ └── zepto.min.js.gz └── 相关资源 ├── ESPlorer ├── ESPlorer.Log ├── ESPlorer.bat ├── ESPlorer.jar ├── README.TXT ├── _lua │ └── test100lines.lua ├── _micropython │ ├── MicroPython-1.7-130.bin │ └── gpio.py └── lib │ ├── AbsoluteLayout.jar │ ├── beansbinding-1.2.1.jar │ ├── jssc.jar │ └── rsyntaxtextarea-2.5.6.jar ├── NODEMCU-DEVKIT-INSTRUCTION-CN.pdf ├── NodeMCU ESP12.png ├── nodemcu-flasher-master ├── .gitignore ├── Clean.bat ├── DataChest.pas ├── DelphiZXIngQRCode.pas ├── ESP8266Flasher.dpr ├── ESP8266Flasher.dproj ├── ESP8266Flasher.res ├── LICENSE ├── README.md ├── Resource.rc ├── Resource.res ├── Resources │ ├── Binaries │ │ ├── 0x00000.bin │ │ ├── 0x10000.bin │ │ ├── blank.bin │ │ ├── esp_init_data_default.bin │ │ └── nodemcu_integer_0.9.5_20150318.bin │ ├── Images │ │ ├── File.png │ │ ├── Logo.ico │ │ ├── Logo.png │ │ ├── No.png │ │ ├── Setting.png │ │ ├── Wait.GIF │ │ └── Yes.png │ └── Webpages │ │ └── index.php ├── SPComm.pas ├── SerialPortsCtrl.pas ├── UnitESP8266Protocol.pas ├── UnitFormMain.dfm ├── UnitFormMain.pas ├── UnitFrameConfigLine.dfm ├── UnitFrameConfigLine.pas ├── Win32 │ └── Release │ │ └── ESP8266Flasher.exe └── Win64 │ └── Release │ └── ESP8266Flasher.exe └── nodemcu-master-12-modules-2016-07-05-07-20-39-float.bin /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/README.md: -------------------------------------------------------------------------------- 1 | # NodeMCU之旅(一):构建、刷入固件,上传代码 2 | 3 | ## 扬帆起航 4 | 5 | 本系列文章将试图实现,使用Web页面远程点亮led。具体包括: 6 | 7 | * 在NodeMCU上搭建HTTP服务器,使其可以通过Web页面配置要接入的网络。 8 | 9 | * 在配置页面可以显示附近中英网络名与信号强度。 10 | 11 | * 使用MQTT协议与Node.js服务端的通信。 12 | 13 | ![nodemcu](img/nodemcu.jpg) 14 | 15 | 16 | 17 | ## 构建固件 18 | 19 | [Building the firmware](http://nodemcu.readthedocs.io/en/master/en/build/)提供了三种构建你自己固件的方式。 20 | 21 | 这里推荐使用简单的云构建服务[NodeMCU custom builds](http://nodemcu-build.com/)来定制自己的固件,只需要在该网站选择你需要的库,留下邮箱,不一会就能收到编译好的固件。 22 | 23 | 我选择了这些库:cjson,crypto,file,gpio,http,mqtt,net,node,pwm,tmr,uart,wifi 24 | 25 | 26 | 27 | ## 刷入固件 28 | 29 | 下载[nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher)的**Release**版本,注意操作系统位数。 30 | 31 | 连接NodeMCU到电脑,运行**flasher**。 32 | 33 | 在**Config**选项卡下,配置好自己固件的路径。 34 | 35 | ![flasher-config](img/flasher-config.png) 36 | 37 | 然后回到**Operation**下,点击**Flash(F)**,稍等片刻即可。 38 | 39 | ![flasher-flashing](img/flasher-flashing.png) 40 | 41 | ![flasher-finished](img/flasher-finished.png) 42 | 43 | 44 | 45 | ## 上传代码 46 | 47 | [Uploading code](http://nodemcu.readthedocs.io/en/master/en/upload/)同样提供了多种工具来上传代码与文件到NodeMCU。 48 | 49 | 推荐使用**ESPlorer**,需要**Java环境**。下载[ESPlorer.zip](http://esp8266.ru/esplorer/#download)。 50 | 51 | 解压后,运行**ESPlorer.jar**。 52 | 53 | 在ESPlorer窗口右上部,设置端口号。 54 | 55 | 点击**Open**,按下NodeMCU上的**RST**按钮重启。如果一切正常,会有这些输出: 56 | 57 | ![esplorer-open](img/esplorer-open.png) 58 | 59 | NodeMCU会在启动后立即运行**init.lua**,但是现在我们还没有上传这个文件。 60 | 61 | 用你喜爱的编辑器保存下面代码为**init.lua**。这些代码会使NodeMCU连接到一个AP(Access Point),通过修改第四行代码来配置SSID和密码。对于开放网络,使用空文本作为密码。 62 | 63 | ``` lua 64 | -- init.lua 65 | print('Setting up WIFI...') 66 | wifi.setmode(wifi.STATION) 67 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 68 | wifi.sta.connect() 69 | 70 | tmr.alarm(1, 1000, tmr.ALARM_AUTO, function() 71 | if wifi.sta.getip() == nil then 72 | print('Waiting for IP ...') 73 | else 74 | print('IP is ' .. wifi.sta.getip()) 75 | tmr.stop(1) 76 | end 77 | end) 78 | ``` 79 | 80 | 保存后,点击ESPlorer窗口左下区域的**Upload ...**来上传。如果上传失败,尝试重启NodeMCU再试。 81 | 82 | ![esplorer-upload](img/esplorer-upload.png) 83 | 84 | 上传完毕后重启NodeMCU。如果一切正常,你将看到NodeMCU成功连入你的AP。 85 | 86 | ![esplorer-ok](img/esplorer-ok.png) 87 | 88 | 89 | 90 | ## 相关资源 91 | 92 | [NodeMCU文档](http://nodemcu.readthedocs.io/) 93 | 94 | [NodeMCU custom builds](http://nodemcu-build.com/) 95 | 96 | [nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher) 97 | 98 | [ESPlorer.zip](http://esp8266.ru/esplorer/#download) 99 | 100 | 你也可以在[NodeMCU-Tutorial](https://github.com/wangzexi/NodeMCU-Tutorial)下载到本文的相关资源和代码。 -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/esplorer-ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/esplorer-ok.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/esplorer-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/esplorer-open.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/esplorer-upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/esplorer-upload.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/flasher-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/flasher-config.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/flasher-finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/flasher-finished.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/flasher-flashing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/flasher-flashing.png -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/img/nodemcu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/1.构建、刷入固件,上传代码/img/nodemcu.jpg -------------------------------------------------------------------------------- /1.构建、刷入固件,上传代码/source/init.lua: -------------------------------------------------------------------------------- 1 | print('Setting up WIFI...') 2 | wifi.setmode(wifi.STATION) 3 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 4 | wifi.sta.connect() 5 | 6 | tmr.alarm(1, 1000, tmr.ALARM_AUTO, function() 7 | if wifi.sta.getip() == nil then 8 | print('Waiting for IP ...') 9 | else 10 | print('IP is ' .. wifi.sta.getip()) 11 | tmr.stop(1) 12 | end 13 | end) -------------------------------------------------------------------------------- /2.断线自动重连,闪烁连接状态/README.md: -------------------------------------------------------------------------------- 1 | # NodeMCU之旅(二):断线自动重连,闪烁连接状态 2 | 3 | ## 事件监听器 4 | 5 | NodeMCU采用了事件响应的方式。也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用。 6 | 7 | > 注册事件监听器 8 | > [wif.sta.eventMonReg()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaeventmonreg) 9 | > 10 | > 开始监听 11 | > [wifi.sta.eventMonStart()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaeventmonstart) 12 | 13 | ### 通过监听器获知wifi连接状态 14 | 15 | ```lua 16 | -- init.lua 17 | print('Setting up WIFI...') 18 | wifi.setmode(wifi.STATION) 19 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 20 | wifi.sta.connect() 21 | 22 | status = nil 23 | 24 | wifi.sta.eventMonReg(wifi.STA_GOTIP, function() 25 | status = 'STA_GOTIP' 26 | print(status, wifi.sta.getip()) 27 | end) 28 | 29 | wifi.sta.eventMonStart(1000) 30 | ``` 31 | 32 | `wifi.sta.eventMonStart(1000)`函数表明检测网络状态的间隔是一秒。 33 | 34 | 不止如此,常用的监听器还有: 35 | 36 | ```lua 37 | wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() 38 | status = 'STA_WRONGPWD' 39 | print(status) 40 | end) 41 | 42 | wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() 43 | status = 'STA_APNOTFOUND' 44 | print(status) 45 | end) 46 | 47 | wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) 48 | status = 'STA_CONNECTING' 49 | print(status) 50 | end) 51 | ``` 52 | 53 | 54 | 55 | ## 断线自动重连 56 | 57 | 有时因为路由器重启等原因,NodeMCU可能会掉线,好在NodeMCU可以设置自动连接: 58 | 59 | > 自动连接 60 | > [wifi.sta.autoconnect()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaautoconnect) 61 | 62 | 替换上节代码中的`wifi.sta.connect()`为 63 | 64 | 65 | ```lua 66 | wifi.sta.autoconnect(1) 67 | ``` 68 | 69 | 这样,当配置的wifi有效时,NodeMCU便能自动连入。 70 | 71 | 72 | 73 | ## 控制LED闪烁 74 | 75 | 在NodeMCU上有一个LED可用。可以用它来显示当前的连接状态。经测试,控制该LED的引脚为D4。 76 | 77 | 这是一个控制LED以特定延迟序列闪烁的函数。 78 | 79 | ```lua 80 | IO_BLINK = 4 81 | TMR_BLINK = 5 82 | 83 | gpio.mode(IO_LED_BLINK, gpio.OUTPUT) 84 | 85 | blink = nil 86 | tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function() 87 | gpio.write(IO_BLINK, blink.i % 2) 88 | tmr.interval(TMR_BLINK, blink[blink.i + 1]) 89 | blink.i = (blink.i + 1) % #blink 90 | end) 91 | 92 | function blinking(param) 93 | if type(param) == 'table' then 94 | blink = param 95 | blink.i = 0 96 | tmr.interval(TMR_BLINK, 1) 97 | running, _ = tmr.state(TMR_BLINK) 98 | if running ~= true then 99 | tmr.start(TMR_BLINK) 100 | end 101 | else 102 | tmr.stop(TMR_BLINK) 103 | gpio.write(IO_BLINK, param or gpio.LOW) 104 | end 105 | end 106 | ``` 107 | 108 | `blinking()`函数需要传入一个数组,数组元素依次表示LED亮灭的延迟。例子: 109 | 110 | ```lua 111 | blinking({300, 300}) -- 循环闪烁:亮300ms,灭300ms 112 | blinking({100, 100 , 100, 500}) -- 循环闪烁:亮100ms,灭100ms,亮100ms,灭500ms 113 | 114 | blinking() -- 常亮 115 | blinking(gpio.LOW) -- 常亮 116 | blinking(gpio.HIGH) -- 常灭 117 | ``` 118 | 119 | 120 | 121 | ## 闪烁显示连接状态 122 | 123 | 现在就可以结合监听器用LED显示连接状态了。 124 | 125 | 在上一节的监听器事件里,各添加一行闪烁的即可。 126 | 127 | ```lua 128 | wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() 129 | blinking({100, 100 , 100, 500}) 130 | status = 'STA_WRONGPWD' 131 | print(status) 132 | end) 133 | 134 | wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() 135 | blinking({2000, 2000}) 136 | status = 'STA_APNOTFOUND' 137 | print(status) 138 | end) 139 | 140 | wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) 141 | blinking({300, 300}) 142 | status = 'STA_CONNECTING' 143 | print(status) 144 | end) 145 | 146 | wifi.sta.eventMonReg(wifi.STA_GOTIP, function() 147 | blinking() 148 | status = 'STA_GOTIP' 149 | print(status, wifi.sta.getip()) 150 | end) 151 | ``` 152 | 153 | 154 | 155 | ## 相关资源 156 | 157 | 你可以在[NodeMCU-Tutorial](https://github.com/wangzexi/NodeMCU-Tutorial)下载到本文的相关资源和代码。 -------------------------------------------------------------------------------- /2.断线自动重连,闪烁连接状态/source/init.lua: -------------------------------------------------------------------------------- 1 | ------------- 2 | -- define 3 | ------------- 4 | IO_BLINK = 4 5 | TMR_BLINK = 5 6 | 7 | gpio.mode(IO_BLINK, gpio.OUTPUT) 8 | 9 | ------------- 10 | -- blink 11 | ------------- 12 | blink = nil 13 | tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function() 14 | gpio.write(IO_BLINK, blink.i % 2) 15 | tmr.interval(TMR_BLINK, blink[blink.i + 1]) 16 | blink.i = (blink.i + 1) % #blink 17 | end) 18 | 19 | function blinking(param) 20 | if type(param) == 'table' then 21 | blink = param 22 | blink.i = 0 23 | tmr.interval(TMR_BLINK, 1) 24 | running, _ = tmr.state(TMR_BLINK) 25 | if running ~= true then 26 | tmr.start(TMR_BLINK) 27 | end 28 | else 29 | tmr.stop(TMR_BLINK) 30 | gpio.write(IO_BLINK, param or gpio.LOW) 31 | end 32 | end 33 | 34 | ------------- 35 | -- wifi 36 | ------------- 37 | print('Setting up WIFI...') 38 | wifi.setmode(wifi.STATION) 39 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 40 | wifi.sta.autoconnect(1) 41 | 42 | status = nil 43 | 44 | wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() 45 | blinking({100, 100 , 100, 500}) 46 | status = 'STA_WRONGPWD' 47 | print(status) 48 | end) 49 | 50 | wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() 51 | blinking({2000, 2000}) 52 | status = 'STA_APNOTFOUND' 53 | print(status) 54 | end) 55 | 56 | wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) 57 | blinking({300, 300}) 58 | status = 'STA_CONNECTING' 59 | print(status) 60 | end) 61 | 62 | wifi.sta.eventMonReg(wifi.STA_GOTIP, function() 63 | blinking() 64 | status = 'STA_GOTIP' 65 | print(status, wifi.sta.getip()) 66 | end) 67 | 68 | wifi.sta.eventMonStart(1000) 69 | -------------------------------------------------------------------------------- /3.响应配置按钮/README.md: -------------------------------------------------------------------------------- 1 | # NodeMCU之旅(三):响应配置按钮 2 | 3 | ## 引言 4 | 在之前的代码中,要连接的WIFI信息都已写死在代码里,这显然不能适应我们的需求。所以需要想个办法让用户可以配置这些信息。 5 | 6 | 7 | 8 | ## WIFI工作模式 9 | 10 | NodeMCU支持STATION,SOFTAP,STATIONAP,NULLMODE四种模式。 11 | > 设置WIFI模式 12 | > [wifi.setmode()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifisetmode) 13 | > 14 | > * `wifi.STATION` 当设备需要连接到WIFI路由器时使用。常在访问Internet时使用。 15 | > * `wifi.SOFTAP` 当设备需要作为热点时使用。在此模式下你的设备会创建一个本地局域网,并出现在WIFI列表。在默认情况下,NodeMCU在本地局域网地址为192.168.4.1,其他设备将被分配为下一个的可用IP,比如192.168.4.2。 16 | > * `wifi.STATIONAP` 同时应用以上两者。在此模式下你可以在创建一个热点的同时连接到其他WIFI路由器。 17 | > * `wifi.NULLMODE` 关闭WIFI。 18 | 19 | 所以可以添加一个按钮,当按钮按下时,转换模式为`WIFI.STATIONAP`,然后通过手机接入NodeMCU的热点,进入设置页面配置WIFI信息。就像配置路由器一样。 20 | 21 | 22 | 23 | ## 接线 24 | 25 | ![img/wiring.jpg](wiring.jpg) 26 | 27 | * 绿色的LED就是未来被远程控制的那颗,正极连接D1。 28 | 29 | * 黄色的LED用于显示当前的WIFI工作模式,正极连接D2。 30 | 31 | * 白色的按钮连接D3。 32 | 33 | * 负极连接GND。 34 | 35 | 接线完成后,定义这些引脚: 36 | 37 | ```lua 38 | IO_LED = 1 39 | IO_LED_AP = 2 40 | IO_BTN_CFG = 3 41 | 42 | gpio.mode(IO_LED, gpio.OUTPUT) 43 | gpio.mode(IO_LED_AP, gpio.OUTPUT) 44 | gpio.mode(IO_BTN_CFG, gpio.INT) 45 | ``` 46 | 47 | 注意,`IO_BTN_CFG`被设置为了`gpio.INT`模式,也就是中断模式。 48 | 49 | 50 | 51 | ## 响应按钮 52 | 53 | 通过`gpio.trig()`设置响应中断的回调函数。 54 | 55 | > 设置响应中断的回调函数 56 | > [gpio.trig()](http://nodemcu.readthedocs.io/en/master/en/modules/gpio/#gpiotrig) 57 | 58 | 响应按钮抬起时的事件: 59 | 60 | ```lua 61 | function onBtnEvent() 62 | print('up~') 63 | end 64 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 65 | ``` 66 | 67 | 上传代码。测试按下按钮,发现输出正常。 68 | 69 | 但存在一个问题:有时只按了一次,输出却不止一次。因为按钮的信号会有抖动。 70 | 71 | 这里提供一种去抖方法: 72 | 73 | ```lua 74 | TMR_BTN = 6 75 | 76 | function onBtnEvent() 77 | gpio.trig(IO_BTN_CFG) 78 | tmr.alarm(TMR_BTN, 500, tmr.ALARM_SINGLE, function() 79 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 80 | end) 81 | 82 | print('up~') 83 | end 84 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 85 | ``` 86 | 87 | 思路是,在首次触发之后,清除按钮的回调函数,在0.5秒后,恢复回调。 88 | 89 | 90 | 91 | ## 开始与结束配置 92 | 93 | 正如之前所讲,平常运行时WIFI模式为`wifi.STATION`,当按下按钮后,WIFI模式转为`wifi.STATIONAP`,再次按下后恢复`wifi.STATION`。 94 | 95 | ```lua 96 | gpio.write(IO_LED_AP, gpio.LOW) 97 | 98 | function switchCfg() 99 | if wifi.getmode() == wifi.STATION then 100 | wifi.setmode(wifi.STATIONAP) 101 | gpio.write(IO_LED_AP, gpio.HIGH) 102 | else 103 | wifi.setmode(wifi.STATION) 104 | gpio.write(IO_LED_AP, gpio.LOW) 105 | end 106 | end 107 | ``` 108 | 109 | 注意,`gpio.write(IO_LED_AP, gpio.LOW)`在函数外部,目的是在NodeMCU开机时,重置AP信号灯为熄灭状态。 110 | 111 | 之后,修改上节按钮事件函数里的`print('up~')`为: 112 | 113 | ```lua 114 | switchCfg() 115 | ``` 116 | 117 | 这样就可以通过按钮来控制AP的开启关闭了。 118 | 119 | 120 | 121 | ## 配置热点信息 122 | 123 | 在`print('Setting up WIFI...')`后添加下行代码,来配置热点名为 **'mymcu'** ,安全性为**开放**。 124 | 125 | ```lua 126 | wifi.ap.config({ ssid = 'mymcu', auth = AUTH_OPEN }) 127 | ``` 128 | 关于`wifi.ap.config()`的更多细节,请参阅: 129 | 130 | >配置热点信息 131 | >[wifi.ap.config()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifiapconfig) 132 | 133 | 最后,删去之前写死在代码里的WIFI连接配置`wifi.sta.config('MY_SSID', 'MY_PASSWORD')`。 134 | 135 | 因为随后,我们将提供操作界面,让用户自己来设置它们。 136 | 137 | 138 | 139 | ## 相关资源 140 | 141 | 你可以在[NodeMCU-Tutorial](https://github.com/wangzexi/NodeMCU-Tutorial)下载到本文的相关资源和代码。 -------------------------------------------------------------------------------- /3.响应配置按钮/img/wiring.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/3.响应配置按钮/img/wiring.jpg -------------------------------------------------------------------------------- /3.响应配置按钮/source/init.lua: -------------------------------------------------------------------------------- 1 | ------------- 2 | -- define 3 | ------------- 4 | IO_LED = 1 5 | IO_LED_AP = 2 6 | IO_BTN_CFG = 3 7 | IO_BLINK = 4 8 | 9 | TMR_BLINK = 5 10 | TMR_BTN = 6 11 | 12 | gpio.mode(IO_LED, gpio.OUTPUT) 13 | gpio.mode(IO_LED_AP, gpio.OUTPUT) 14 | gpio.mode(IO_BTN_CFG, gpio.INT) 15 | gpio.mode(IO_BLINK, gpio.OUTPUT) 16 | 17 | ------------- 18 | -- button 19 | ------------- 20 | function onBtnEvent() 21 | gpio.trig(IO_BTN_CFG) 22 | tmr.alarm(TMR_BTN, 500, tmr.ALARM_SINGLE, function() 23 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 24 | end) 25 | 26 | switchCfg() 27 | end 28 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 29 | 30 | gpio.write(IO_LED_AP, gpio.LOW) 31 | 32 | function switchCfg() 33 | if wifi.getmode() == wifi.STATION then 34 | wifi.setmode(wifi.STATIONAP) 35 | gpio.write(IO_LED_AP, gpio.HIGH) 36 | else 37 | wifi.setmode(wifi.STATION) 38 | gpio.write(IO_LED_AP, gpio.LOW) 39 | end 40 | end 41 | 42 | ------------- 43 | -- blink 44 | ------------- 45 | blink = nil 46 | tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function() 47 | gpio.write(IO_BLINK, blink.i % 2) 48 | tmr.interval(TMR_BLINK, blink[blink.i + 1]) 49 | blink.i = (blink.i + 1) % #blink 50 | end) 51 | 52 | function blinking(param) 53 | if type(param) == 'table' then 54 | blink = param 55 | blink.i = 0 56 | tmr.interval(TMR_BLINK, 1) 57 | running, _ = tmr.state(TMR_BLINK) 58 | if running ~= true then 59 | tmr.start(TMR_BLINK) 60 | end 61 | else 62 | tmr.stop(TMR_BLINK) 63 | gpio.write(IO_BLINK, param or gpio.LOW) 64 | end 65 | end 66 | 67 | ------------- 68 | -- wifi 69 | ------------- 70 | print('Setting up WIFI...') 71 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 72 | wifi.ap.config({ ssid = 'mymcu', auth = AUTH_OPEN }) 73 | wifi.setmode(wifi.STATION) 74 | wifi.sta.autoconnect(1) 75 | 76 | status = nil 77 | 78 | wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() 79 | blinking({100, 100 , 100, 500}) 80 | status = 'STA_WRONGPWD' 81 | print(status) 82 | end) 83 | 84 | wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() 85 | blinking({2000, 2000}) 86 | status = 'STA_APNOTFOUND' 87 | print(status) 88 | end) 89 | 90 | wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) 91 | blinking({300, 300}) 92 | status = 'STA_CONNECTING' 93 | print(status) 94 | end) 95 | 96 | wifi.sta.eventMonReg(wifi.STA_GOTIP, function() 97 | blinking() 98 | status = 'STA_GOTIP' 99 | print(status, wifi.sta.getip()) 100 | end) 101 | 102 | wifi.sta.eventMonStart(1000) 103 | -------------------------------------------------------------------------------- /4.实现Web配置页面/README.md: -------------------------------------------------------------------------------- 1 | # NodeMCU之旅(四):实现Web配置页面 2 | 3 | ## 引言 4 | 5 | 利用Web页面做配置可以轻松适应用户的多种设备,如Android, IOS等。本文将介绍如何在NodeMCU中实现配置页面。 6 | 7 | ## 配置页面后端 8 | 9 | ### HTTP服务 10 | 11 | NodeMCU的可用运存大约只有32KB,非常小。 12 | 13 | 这里推荐一个轻量的HTTP服务库[NodeMCU-HTTP-Server](https://github.com/wangzexi/NodeMCU-HTTP-Server)。下载**httpServer.lua**即可。 14 | 15 | ### 服务静态文件 16 | 17 | 在**init.lua**的尾部添加: 18 | 19 | ```lua 20 | dofile('httpServer.lua') 21 | ``` 22 | 23 | 并在`switchCfg()`中启动和关闭监听: 24 | 25 | ```lua 26 | function switchCfg() 27 | if wifi.getmode() == wifi.STATION then 28 | -- ... 29 | httpServer:listen(80) 30 | else 31 | -- ... 32 | httpServer:close() 33 | end 34 | end 35 | ``` 36 | 37 | ### 测试HTTP服务 38 | 39 | 可以通过以下方法来测试服务器是否正常。 40 | 41 | 保存以下代码为**index.html**: 42 | 43 | ```html 44 | 45 | 46 | 47 | 48 | 配置终端 49 | 50 | 51 |

这是我的配置页面。

52 | 53 | 54 | ``` 55 | 56 | 上传**init.lua**、**httpServer.lua**以及**index.html**到NodeMCU。 57 | 58 | 按下**RST**按钮,按下**配置**按钮,用手机连入热点**mymcu**,在浏览器打开 **http://192.168.4.1/** 。 59 | 60 | 如果一切正常,你将能够看到这个页面。 61 | 62 | ### GZIP压缩 63 | 64 | 为了节省空间,此HTTP服务库还支持GZIP。比如:**index.html**可以压缩为**index.html.gz**再上传。 65 | 66 | 更多细节,请参阅[NodeMCU-HTTP-Server](https://github.com/wangzexi/NodeMCU-HTTP-Server#serving-static-files)。 67 | 68 | ### 设置IP地址 69 | 70 | NodeMCU在自身开放的AP局域网中的默认IP地址是**192.168.4.1**,如果需要修改NodeMCU在本地局域网中的IP地址,请在开启AP后,使用此函数设置: 71 | 72 | >设置IP 73 | >[wifi.ap.setip()](http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifiapsetip) 74 | 75 | 注意,该函数只有在开启AP后才有效。 76 | 77 | ### 后端接口 78 | 79 | #### 扫描附近热点 80 | 81 | 给httpServer添加中间件,当访问**'/scanap'**时:使用`wifi.sta.getap()`获取AP列表再转换到JSON格式返回。 82 | 83 | ```lua 84 | httpServer:use('/scanap', function(req, res) 85 | wifi.sta.getap(function(table) 86 | local aptable = {} 87 | for ssid,v in pairs(table) do 88 | local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)") 89 | aptable[ssid] = { 90 | authmode = authmode, 91 | rssi = rssi, 92 | bssid = bssid, 93 | channel = channel 94 | } 95 | end 96 | res:type('application/json') 97 | res:send(cjson.encode(aptable)) 98 | end) 99 | end) 100 | ``` 101 | 102 | 注意:由于NodeMCU内存很小,附近热点过多时,扫描热点会造成内存不足自动重启。此时请手动输入WIFI信息进行配置。 103 | 104 | #### 配置WIFI信息 105 | 106 | 同样添加一个中间件,当带参数访问**'/config'**时,配置WIFI信息,并返回连接结果。 107 | 108 | ```lua 109 | TMR_WIFI = 4 110 | 111 | httpServer:use('/config', function(req, res) 112 | if req.query.ssid ~= nil and req.query.pwd ~= nil then 113 | wifi.sta.config(req.query.ssid, req.query.pwd) 114 | 115 | status = 'STA_CONNECTING' 116 | tmr.alarm(TMR_WIFI, 1000, tmr.ALARM_AUTO, function() 117 | if status ~= 'STA_CONNECTING' then 118 | res:type('application/json') 119 | res:send('{"status":"' .. status .. '"}') 120 | tmr.stop(TMR_WIFI) 121 | end 122 | end) 123 | end 124 | end) 125 | ``` 126 | 127 | 128 | 129 | ## 配置页面前端 130 | 131 | 前端方面的选择就比较多了,我使用了轻量的[Zepto.js](https://github.com/madrobby/zepto)与[Spectre.css](https://github.com/picturepan2/spectre)来搭建前端页面,通过AJAX来请求数据。 132 | 133 | ![config.png](img/config.png) 134 | 135 | 相比起后端,前端代码大都是一些界面交互的逻辑,就不贴在这里了。 136 | 137 | 138 | 139 | ## 相关资源 140 | 141 | 你可以在[NodeMCU-Tutorial](https://github.com/wangzexi/NodeMCU-Tutorial)下载到本文的相关资源和代码。 -------------------------------------------------------------------------------- /4.实现Web配置页面/img/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/4.实现Web配置页面/img/config.png -------------------------------------------------------------------------------- /4.实现Web配置页面/source/httpServer.lua: -------------------------------------------------------------------------------- 1 | -------------------- 2 | -- helper 3 | -------------------- 4 | function urlDecode(url) 5 | return url:gsub('%%(%x%x)', function(x) 6 | return string.char(tonumber(x, 16)) 7 | end) 8 | end 9 | 10 | function guessType(filename) 11 | local types = { 12 | ['.css'] = 'text/css', 13 | ['.js'] = 'application/javascript', 14 | ['.html'] = 'text/html', 15 | ['.png'] = 'image/png', 16 | ['.jpg'] = 'image/jpeg' 17 | } 18 | for ext, type in pairs(types) do 19 | if string.sub(filename, -string.len(ext)) == ext 20 | or string.sub(filename, -string.len(ext .. '.gz')) == ext .. '.gz' then 21 | return type 22 | end 23 | end 24 | return 'text/plain' 25 | end 26 | 27 | -------------------- 28 | -- Response 29 | -------------------- 30 | Res = { 31 | _skt = nil, 32 | _type = nil, 33 | _status = nil, 34 | _redirectUrl = nil, 35 | } 36 | 37 | function Res:new(skt) 38 | local o = {} 39 | setmetatable(o, self) 40 | self.__index = self 41 | o._skt = skt 42 | return o 43 | end 44 | 45 | function Res:redirect(url, status) 46 | status = status or 302 47 | 48 | self:status(status) 49 | self._redirectUrl = url 50 | self:send(status) 51 | end 52 | 53 | function Res:type(type) 54 | self._type = type 55 | end 56 | 57 | function Res:status(status) 58 | self._status = status 59 | end 60 | 61 | function Res:send(body) 62 | self._status = self._status or 200 63 | self._type = self._type or 'text/html' 64 | 65 | local buf = 'HTTP/1.1 ' .. self._status .. '\r\n' 66 | .. 'Content-Type: ' .. self._type .. '\r\n' 67 | .. 'Content-Length:' .. string.len(body) .. '\r\n' 68 | if self._redirectUrl ~= nil then 69 | buf = buf .. 'Location: ' .. self._redirectUrl .. '\r\n' 70 | end 71 | buf = buf .. '\r\n' .. body 72 | 73 | local function doSend() 74 | if buf == '' then 75 | self:close() 76 | else 77 | self._skt:send(string.sub(buf, 1, 512)) 78 | buf = string.sub(buf, 513) 79 | end 80 | end 81 | self._skt:on('sent', doSend) 82 | 83 | doSend() 84 | end 85 | 86 | function Res:sendFile(filename) 87 | if file.exists(filename .. '.gz') then 88 | filename = filename .. '.gz' 89 | elseif not file.exists(filename) then 90 | self:status(404) 91 | if filename == '404.html' then 92 | self:send(404) 93 | else 94 | self:sendFile('404.html') 95 | end 96 | return 97 | end 98 | 99 | self._status = self._status or 200 100 | local header = 'HTTP/1.1 ' .. self._status .. '\r\n' 101 | 102 | self._type = self._type or guessType(filename) 103 | 104 | header = header .. 'Content-Type: ' .. self._type .. '\r\n' 105 | if string.sub(filename, -3) == '.gz' then 106 | header = header .. 'Content-Encoding: gzip\r\n' 107 | end 108 | header = header .. '\r\n' 109 | 110 | print('* Sending ', filename) 111 | local pos = 0 112 | local function doSend() 113 | file.open(filename, 'r') 114 | if file.seek('set', pos) == nil then 115 | self:close() 116 | print('* Finished ', filename) 117 | else 118 | local buf = file.read(512) 119 | pos = pos + 512 120 | self._skt:send(buf) 121 | end 122 | file.close() 123 | end 124 | self._skt:on('sent', doSend) 125 | 126 | self._skt:send(header) 127 | end 128 | 129 | function Res:close() 130 | self._skt:on('sent', function() end) -- release closures context 131 | self._skt:on('receive', function() end) 132 | self._skt:close() 133 | self._skt = nil 134 | end 135 | 136 | -------------------- 137 | -- Middleware 138 | -------------------- 139 | function parseHeader(req, res) 140 | local _, _, method, path, vars = string.find(req.source, '([A-Z]+) (.+)?(.+) HTTP') 141 | if method == nil then 142 | _, _, method, path = string.find(req.source, '([A-Z]+) (.+) HTTP') 143 | end 144 | local _GET = {} 145 | if vars ~= nil then 146 | vars = urlDecode(vars) 147 | for k, v in string.gmatch(vars, '([^&]+)=([^&]*)&*') do 148 | _GET[k] = v 149 | end 150 | end 151 | 152 | req.method = method 153 | req.query = _GET 154 | req.path = path 155 | 156 | return true 157 | end 158 | 159 | function staticFile(req, res) 160 | local filename = '' 161 | if req.path == '/' then 162 | filename = 'index.html' 163 | else 164 | filename = string.gsub(string.sub(req.path, 2), '/', '_') 165 | end 166 | 167 | res:sendFile(filename) 168 | end 169 | 170 | -------------------- 171 | -- HttpServer 172 | -------------------- 173 | httpServer = { 174 | _srv = nil, 175 | _mids = {{ 176 | url = '.*', 177 | cb = parseHeader 178 | }, { 179 | url = '.*', 180 | cb = staticFile 181 | }} 182 | } 183 | 184 | function httpServer:use(url, cb) 185 | table.insert(self._mids, #self._mids, { 186 | url = url, 187 | cb = cb 188 | }) 189 | end 190 | 191 | function httpServer:close() 192 | self._srv:close() 193 | self._srv = nil 194 | end 195 | 196 | function httpServer:listen(port) 197 | self._srv = net.createServer(net.TCP) 198 | self._srv:listen(port, function(conn) 199 | conn:on('receive', function(skt, msg) 200 | local req = { source = msg, path = '', ip = skt:getpeer() } 201 | local res = Res:new(skt) 202 | 203 | for i = 1, #self._mids do 204 | if string.find(req.path, '^' .. self._mids[i].url .. '$') 205 | and not self._mids[i].cb(req, res) then 206 | break 207 | end 208 | end 209 | 210 | collectgarbage() 211 | end) 212 | end) 213 | end -------------------------------------------------------------------------------- /4.实现Web配置页面/source/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 配置终端 7 | 8 | 22 | 23 | 24 |
25 |
26 |

配置终端

27 |
28 |

配置终端接入一个无线网络。

29 |
30 |
31 |
32 | 33 |
34 |
35 |

网络配置

36 |
37 |
38 | 39 |
40 | 41 | 42 |
43 |
44 | 45 | 46 |
47 | 48 | 49 |
50 | 51 | 52 |
53 |
54 |
55 | 56 | 65 | 66 | 75 | 76 | 77 | 78 | 79 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /4.实现Web配置页面/source/init.lua: -------------------------------------------------------------------------------- 1 | ------------- 2 | -- define 3 | ------------- 4 | IO_LED = 1 5 | IO_LED_AP = 2 6 | IO_BTN_CFG = 3 7 | IO_BLINK = 4 8 | 9 | TMR_WIFI = 4 10 | TMR_BLINK = 5 11 | TMR_BTN = 6 12 | 13 | gpio.mode(IO_LED, gpio.OUTPUT) 14 | gpio.mode(IO_LED_AP, gpio.OUTPUT) 15 | gpio.mode(IO_BTN_CFG, gpio.INT) 16 | gpio.mode(IO_BLINK, gpio.OUTPUT) 17 | 18 | ------------- 19 | -- button 20 | ------------- 21 | function onBtnEvent() 22 | gpio.trig(IO_BTN_CFG) 23 | tmr.alarm(TMR_BTN, 500, tmr.ALARM_SINGLE, function() 24 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 25 | end) 26 | 27 | switchCfg() 28 | end 29 | gpio.trig(IO_BTN_CFG, 'up', onBtnEvent) 30 | 31 | gpio.write(IO_LED_AP, gpio.LOW) 32 | 33 | function switchCfg() 34 | if wifi.getmode() == wifi.STATION then 35 | wifi.setmode(wifi.STATIONAP) 36 | httpServer:listen(80) 37 | gpio.write(IO_LED_AP, gpio.HIGH) 38 | else 39 | wifi.setmode(wifi.STATION) 40 | httpServer:close() 41 | gpio.write(IO_LED_AP, gpio.LOW) 42 | end 43 | end 44 | 45 | ------------- 46 | -- blink 47 | ------------- 48 | blink = nil 49 | tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function() 50 | gpio.write(IO_BLINK, blink.i % 2) 51 | tmr.interval(TMR_BLINK, blink[blink.i + 1]) 52 | blink.i = (blink.i + 1) % #blink 53 | end) 54 | 55 | function blinking(param) 56 | if type(param) == 'table' then 57 | blink = param 58 | blink.i = 0 59 | tmr.interval(TMR_BLINK, 1) 60 | running, _ = tmr.state(TMR_BLINK) 61 | if running ~= true then 62 | tmr.start(TMR_BLINK) 63 | end 64 | else 65 | tmr.stop(TMR_BLINK) 66 | gpio.write(IO_BLINK, param or gpio.LOW) 67 | end 68 | end 69 | 70 | ------------- 71 | -- wifi 72 | ------------- 73 | print('Setting up WIFI...') 74 | wifi.sta.config('MY_SSID', 'MY_PASSWORD') 75 | wifi.ap.config({ ssid = 'mymcu', auth = AUTH_OPEN }) 76 | wifi.setmode(wifi.STATION) 77 | wifi.sta.autoconnect(1) 78 | 79 | status = nil 80 | 81 | wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() 82 | blinking({100, 100 , 100, 500}) 83 | status = 'STA_WRONGPWD' 84 | print(status) 85 | end) 86 | 87 | wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() 88 | blinking({2000, 2000}) 89 | status = 'STA_APNOTFOUND' 90 | print(status) 91 | end) 92 | 93 | wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) 94 | blinking({300, 300}) 95 | status = 'STA_CONNECTING' 96 | print(status) 97 | end) 98 | 99 | wifi.sta.eventMonReg(wifi.STA_GOTIP, function() 100 | blinking() 101 | status = 'STA_GOTIP' 102 | print(status, wifi.sta.getip()) 103 | end) 104 | 105 | wifi.sta.eventMonStart(1000) 106 | 107 | ------------- 108 | -- http 109 | ------------- 110 | dofile('httpServer.lua') 111 | 112 | httpServer:use('/config', function(req, res) 113 | if req.query.ssid ~= nil and req.query.pwd ~= nil then 114 | wifi.sta.config(req.query.ssid, req.query.pwd) 115 | 116 | status = 'STA_CONNECTING' 117 | tmr.alarm(TMR_WIFI, 1000, tmr.ALARM_AUTO, function() 118 | if status ~= 'STA_CONNECTING' then 119 | res:type('application/json') 120 | res:send('{"status":"' .. status .. '"}') 121 | tmr.stop(TMR_WIFI) 122 | end 123 | end) 124 | end 125 | end) 126 | 127 | httpServer:use('/scanap', function(req, res) 128 | wifi.sta.getap(function(table) 129 | local aptable = {} 130 | for ssid,v in pairs(table) do 131 | local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)") 132 | aptable[ssid] = { 133 | authmode = authmode, 134 | rssi = rssi, 135 | bssid = bssid, 136 | channel = channel 137 | } 138 | end 139 | res:type('application/json') 140 | res:send(cjson.encode(aptable)) 141 | end) 142 | end) -------------------------------------------------------------------------------- /4.实现Web配置页面/source/spectre.min.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/4.实现Web配置页面/source/spectre.min.css.gz -------------------------------------------------------------------------------- /4.实现Web配置页面/source/zepto.min.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/4.实现Web配置页面/source/zepto.min.js.gz -------------------------------------------------------------------------------- /相关资源/ESPlorer/ESPlorer.bat: -------------------------------------------------------------------------------- 1 | java -jar "ESPlorer.jar" 2 | -------------------------------------------------------------------------------- /相关资源/ESPlorer/ESPlorer.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/ESPlorer.jar -------------------------------------------------------------------------------- /相关资源/ESPlorer/README.TXT: -------------------------------------------------------------------------------- 1 | ======================== 2 | BUILD OUTPUT DESCRIPTION 3 | ======================== 4 | 5 | When you build an Java application project that has a main class, the IDE 6 | automatically copies all of the JAR 7 | files on the projects classpath to your projects dist/lib folder. The IDE 8 | also adds each of the JAR files to the Class-Path element in the application 9 | JAR files manifest file (MANIFEST.MF). 10 | 11 | To run the project from the command line, go to the dist folder and 12 | type the following: 13 | 14 | java -jar "ESPlorer.jar" 15 | 16 | To distribute this project, zip up the dist folder (including the lib folder) 17 | and distribute the ZIP file. 18 | 19 | Notes: 20 | 21 | * If two JAR files on the project classpath have the same name, only the first 22 | JAR file is copied to the lib folder. 23 | * Only JAR files are copied to the lib folder. 24 | If the classpath contains other types of files or folders, these files (folders) 25 | are not copied. 26 | * If a library on the projects classpath also has a Class-Path element 27 | specified in the manifest,the content of the Class-Path element has to be on 28 | the projects runtime path. 29 | * To set a main class in a standard Java project, right-click the project node 30 | in the Projects window and choose Properties. Then click Run and enter the 31 | class name in the Main Class field. Alternatively, you can manually type the 32 | class name in the manifest Main-Class element. 33 | -------------------------------------------------------------------------------- /相关资源/ESPlorer/_lua/test100lines.lua: -------------------------------------------------------------------------------- 1 | print("This is line number 1") 2 | print("This is line number 2") 3 | print("This is line number 3") 4 | print("This is line number 4") 5 | print("This is line number 5") 6 | print("This is line number 6") 7 | print("This is line number 7") 8 | print("This is line number 8") 9 | print("This is line number 9") 10 | print("This is line number 10") 11 | print("This is line number 11") 12 | print("This is line number 12") 13 | print("This is line number 13") 14 | print("This is line number 14") 15 | print("This is line number 15") 16 | print("This is line number 16") 17 | print("This is line number 17") 18 | print("This is line number 18") 19 | print("This is line number 19") 20 | print("This is line number 20") 21 | print("This is line number 21") 22 | print("This is line number 22") 23 | print("This is line number 23") 24 | print("This is line number 24") 25 | print("This is line number 25") 26 | print("This is line number 26") 27 | print("This is line number 27") 28 | print("This is line number 28") 29 | print("This is line number 29") 30 | print("This is line number 30") 31 | print("This is line number 31") 32 | print("This is line number 32") 33 | print("This is line number 33") 34 | print("This is line number 34") 35 | print("This is line number 35") 36 | print("This is line number 36") 37 | print("This is line number 37") 38 | print("This is line number 38") 39 | print("This is line number 39") 40 | print("This is line number 40") 41 | print("This is line number 41") 42 | print("This is line number 42") 43 | print("This is line number 43") 44 | print("This is line number 44") 45 | print("This is line number 45") 46 | print("This is line number 46") 47 | print("This is line number 47") 48 | print("This is line number 48") 49 | print("This is line number 49") 50 | print("This is line number 50") 51 | print("This is line number 51") 52 | print("This is line number 52") 53 | print("This is line number 53") 54 | print("This is line number 54") 55 | print("This is line number 55") 56 | print("This is line number 56") 57 | print("This is line number 57") 58 | print("This is line number 58") 59 | print("This is line number 59") 60 | print("This is line number 60") 61 | print("This is line number 61") 62 | print("This is line number 62") 63 | print("This is line number 63") 64 | print("This is line number 64") 65 | print("This is line number 65") 66 | print("This is line number 66") 67 | print("This is line number 67") 68 | print("This is line number 68") 69 | print("This is line number 69") 70 | print("This is line number 70") 71 | print("This is line number 71") 72 | print("This is line number 72") 73 | print("This is line number 73") 74 | print("This is line number 74") 75 | print("This is line number 75") 76 | print("This is line number 76") 77 | print("This is line number 77") 78 | print("This is line number 78") 79 | print("This is line number 79") 80 | print("This is line number 80") 81 | print("This is line number 81") 82 | print("This is line number 82") 83 | print("This is line number 83") 84 | print("This is line number 84") 85 | print("This is line number 85") 86 | print("This is line number 86") 87 | print("This is line number 87") 88 | print("This is line number 88") 89 | print("This is line number 89") 90 | print("This is line number 90") 91 | print("This is line number 91") 92 | print("This is line number 92") 93 | print("This is line number 93") 94 | print("This is line number 94") 95 | print("This is line number 95") 96 | print("This is line number 96") 97 | print("This is line number 97") 98 | print("This is line number 98") 99 | print("This is line number 99") 100 | print("This is line number 100") 101 | -------------------------------------------------------------------------------- /相关资源/ESPlorer/_micropython/MicroPython-1.7-130.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/_micropython/MicroPython-1.7-130.bin -------------------------------------------------------------------------------- /相关资源/ESPlorer/_micropython/gpio.py: -------------------------------------------------------------------------------- 1 | import pyb 2 | import time 3 | pin = pyb.Pin(2, pyb.Pin.OUT) 4 | for i in range(4): 5 | print('LED ON') 6 | pin.value(0) 7 | time.sleep(1) 8 | print('LED OFF') 9 | pin.value(1) 10 | time.sleep(1) 11 | print('iteration done.') 12 | print("All done.") 13 | -------------------------------------------------------------------------------- /相关资源/ESPlorer/lib/AbsoluteLayout.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/lib/AbsoluteLayout.jar -------------------------------------------------------------------------------- /相关资源/ESPlorer/lib/beansbinding-1.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/lib/beansbinding-1.2.1.jar -------------------------------------------------------------------------------- /相关资源/ESPlorer/lib/jssc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/lib/jssc.jar -------------------------------------------------------------------------------- /相关资源/ESPlorer/lib/rsyntaxtextarea-2.5.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/ESPlorer/lib/rsyntaxtextarea-2.5.6.jar -------------------------------------------------------------------------------- /相关资源/NODEMCU-DEVKIT-INSTRUCTION-CN.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/NODEMCU-DEVKIT-INSTRUCTION-CN.pdf -------------------------------------------------------------------------------- /相关资源/NodeMCU ESP12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/NodeMCU ESP12.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/.gitignore: -------------------------------------------------------------------------------- 1 | *.dcu 2 | /__history 3 | /ESP8266Flasher.dproj.local 4 | /ESP8266Flasher.identcache 5 | 6 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Clean.bat: -------------------------------------------------------------------------------- 1 | rd __history /s/q 2 | rd Debug /s/q 3 | rd Release /s/q 4 | rd Win64 /s/q 5 | rd Win32 /s/q 6 | del *.dcu 7 | del *.identcache 8 | del *.dproj.local 9 | del *.exe 10 | del *.vlb 11 | del *.vrc 12 | del *.stat -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/DataChest.pas: -------------------------------------------------------------------------------- 1 | { 2 | ====================================== 3 | Language: 4 | Object Pascal 5 | Name: 6 | DataChest 7 | 数据存储柜 8 | Description: 9 | 使用动态index存储数据 10 | Writer: 11 | 黄锐( vowstar@gmail.com ) 12 | Date: 13 | 2010-4-8 12:54:43 14 | 36816 15 | ====================================== 16 | } 17 | unit DataChest; 18 | 19 | interface 20 | 21 | uses 22 | Classes, SysUtils, xmldom, XMLDoc, XMLIntf, EncdDecd; 23 | 24 | const 25 | ChestTypeEmpty = 0; 26 | ChestTypeInteger = 1; 27 | ChestTypeReal = 2; 28 | ChestTypeBoolean = 3; 29 | ChestTypeString = 4; 30 | ChestTypePointer = 5; 31 | 32 | type 33 | { 34 | ====================================== 35 | TChestElement 36 | 不建副本到内存 37 | ====================================== 38 | } 39 | TChestElement = class(TObject) 40 | ChestType: Word; 41 | Value: Pointer; 42 | Name: String; 43 | end; 44 | 45 | TChestString = class(TObject) 46 | Value: string; 47 | end; 48 | 49 | { 50 | ====================================== 51 | TChest 52 | 不建副本到内存 53 | ====================================== 54 | } 55 | TChest = class(TObject) 56 | const 57 | Version = '1.0.0.0'; 58 | private 59 | 60 | class var List: TList; 61 | class var Checked: Boolean; 62 | class var Sorted: Boolean; 63 | class var _Publisher: string; 64 | class var FDuplicates: TDuplicates; 65 | class function SelfCheck: Boolean; static; 66 | 67 | class procedure SortByName; static; 68 | class function GetValue(index: string): Pointer; static; 69 | class function GetValueAndType(index: string; 70 | var ChestType: Word): Pointer; static; 71 | class procedure SetValue(index: string; const Value: Pointer); static; 72 | class procedure SetValueAndType(index: string; const Value: Pointer; 73 | ChestType: Word = ChestTypeEmpty); static; 74 | class function GetCount: integer; static; 75 | class procedure _Delete(index: integer); overload; static; 76 | class function GetItem(index: integer): TChestElement; static; 77 | class procedure SetItem(index: integer; const Value: TChestElement); static; 78 | public 79 | class property Item[index: integer] 80 | : TChestElement read GetItem write SetItem; default; 81 | 82 | class property AsPointer[index: string] 83 | : Pointer read GetValue write SetValue default nil; 84 | class property Count: integer read GetCount default 0; 85 | class property Publisher: string read _Publisher write _Publisher; 86 | class property Duplicates: TDuplicates read FDuplicates write FDuplicates; 87 | class function Find(const S: string; var Index: integer): Boolean; static; 88 | class procedure Clear; static; 89 | class procedure _Delete(index: string); overload; static; 90 | class procedure DoInitialization; static; 91 | class procedure DoFinalization; static; 92 | 93 | end; 94 | 95 | { 96 | ====================================== 97 | TMemChest 98 | 不建副本到内存 99 | ====================================== 100 | } 101 | TMemChest = class(TChest) 102 | private 103 | class var TempList: TList; 104 | class procedure Delete(index: integer); overload; static; 105 | class function GetXML: WideString; static; 106 | class procedure SetXML(const Value: WideString); static; 107 | public 108 | class procedure FreeMemory; static; 109 | class procedure Delete(index: string); overload; static; 110 | class procedure SaveToXMLFile(FileName: string); static; 111 | class procedure LoadFromXMLFile(FileName: string); static; 112 | class procedure SaveToEncryptFile(FileName: string); static; 113 | class procedure LoadFromEncryptFile(FileName: string); static; 114 | class procedure SaveToFile(FileName: string); static; 115 | class procedure LoadFromFile(FileName: string); static; 116 | class property XML: WideString read GetXML write SetXML; 117 | end; 118 | 119 | { 120 | ====================================== 121 | TIntChest 122 | 建副本到内存 123 | ====================================== 124 | } 125 | TIntChest = class(TMemChest) 126 | private 127 | class function GetIntValue(index: string): integer; static; 128 | class procedure SetIntValue(index: string; const Value: integer); static; 129 | class function GetStringValue(index: string): String; static; 130 | class procedure SetStringValue(index: string; const Value: String); static; 131 | public 132 | class property AsInt[index: string] 133 | : integer read GetIntValue write SetIntValue; default; 134 | class property AsString[index: string] 135 | : String read GetStringValue write SetStringValue; 136 | end; 137 | 138 | { 139 | ====================================== 140 | TRealChest 141 | 建副本到内存 142 | ====================================== 143 | } 144 | TRealChest = class(TMemChest) 145 | private 146 | class function GetRealValue(index: string): Real; static; 147 | class procedure SetRealValue(index: string; const Value: Real); static; 148 | class function GetIntValue(index: string): integer; static; 149 | class function GetStringValue(index: string): String; static; 150 | class procedure SetIntValue(index: string; const Value: integer); static; 151 | class procedure SetStringValue(index: string; const Value: String); static; 152 | public 153 | class property AsReal[index: string] 154 | : Real read GetRealValue write SetRealValue; default; 155 | class property AsInt[index: string] 156 | : integer read GetIntValue write SetIntValue; 157 | class property AsString[index: string] 158 | : String read GetStringValue write SetStringValue; 159 | end; 160 | 161 | { 162 | ====================================== 163 | TBooleanChest 164 | 建副本到内存 165 | ====================================== 166 | } 167 | TBooleanChest = class(TMemChest) 168 | private 169 | class function GetRealValue(index: string): Real; static; 170 | class procedure SetRealValue(index: string; const Value: Real); static; 171 | class function GetIntValue(index: string): integer; static; 172 | class function GetStringValue(index: string): String; static; 173 | class procedure SetIntValue(index: string; const Value: integer); static; 174 | class procedure SetStringValue(index: string; const Value: String); static; 175 | class function GetBooleanValue(index: string): Boolean; static; 176 | class procedure SetBooleanValue(index: string; const Value: Boolean); 177 | static; 178 | public 179 | class property AsBoolean[index: string] 180 | : Boolean read GetBooleanValue write SetBooleanValue; default; 181 | class property AsReal[index: string] 182 | : Real read GetRealValue write SetRealValue; 183 | class property AsInt[index: string] 184 | : integer read GetIntValue write SetIntValue; 185 | class property AsString[index: string] 186 | : String read GetStringValue write SetStringValue; 187 | end; 188 | 189 | { 190 | ====================================== 191 | TStringChest 192 | 建副本到内存 193 | ====================================== 194 | } 195 | TStringChest = class(TMemChest) 196 | private 197 | class function GetStringValue(index: string): string; static; 198 | class procedure SetStringValue(index: string; const Value: string); static; 199 | public 200 | class property AsString[index: string] 201 | : string read GetStringValue write SetStringValue; default; 202 | end; 203 | 204 | { 205 | ====================================== 206 | TObjectChest 207 | 不建副本到内存 208 | ====================================== 209 | } 210 | TObjectChest = class(TChest) 211 | private 212 | class function GetObjectValue(index: string): TObject; static; 213 | class procedure SetObjectValue(index: string; const Value: TObject); static; 214 | public 215 | class property AsObject[index: string] 216 | : TObject read GetObjectValue write SetObjectValue; default; 217 | end; 218 | 219 | { 220 | ====================================== 221 | TComponentChest 222 | 不建副本到内存 223 | ====================================== 224 | } 225 | TComponentChest = class(TObjectChest) 226 | private 227 | class function GetComponentValue(index: string): TComponent; static; 228 | class procedure SetComponentValue(index: string; const Value: TComponent); 229 | static; 230 | public 231 | class property AsComponent[index: string] 232 | : TComponent read GetComponentValue write 233 | SetComponentValue; default; 234 | end; 235 | 236 | { 237 | ====================================== 238 | XML interface(AutoCreated) 239 | ====================================== 240 | } 241 | { Forward Decls } 242 | 243 | IXMLDataChestType = interface; 244 | IXMLPublisherType = interface; 245 | IXMLDataType = interface; 246 | IXMLDataTypeList = interface; 247 | 248 | { IXMLDataChestType } 249 | 250 | IXMLDataChestType = interface(IXMLNode) 251 | ['{02B0FB9E-6CEA-44DE-BB53-63C688856EB7}'] 252 | { Property Accessors } 253 | function Get_Publisher: IXMLPublisherType; 254 | function Get_Data: IXMLDataTypeList; 255 | { Methods & Properties } 256 | property Publisher: IXMLPublisherType read Get_Publisher; 257 | property Data: IXMLDataTypeList read Get_Data; 258 | end; 259 | 260 | { IXMLPublisherType } 261 | 262 | IXMLPublisherType = interface(IXMLNode) 263 | ['{B2149CEA-4B15-4BC1-B12A-D396BBADE025}'] 264 | { Property Accessors } 265 | function Get_Info: UnicodeString; 266 | function Get_Version: UnicodeString; 267 | procedure Set_Info(Value: UnicodeString); 268 | procedure Set_Version(Value: UnicodeString); 269 | { Methods & Properties } 270 | property Info: UnicodeString read Get_Info write Set_Info; 271 | property Version: UnicodeString read Get_Version write Set_Version; 272 | end; 273 | 274 | { IXMLDataType } 275 | 276 | IXMLDataType = interface(IXMLNode) 277 | ['{956479AF-F38D-46E3-94AA-03EE6464F9E8}'] 278 | { Property Accessors } 279 | function Get_Name: UnicodeString; 280 | function Get_Type_: UnicodeString; 281 | function Get_Value: UnicodeString; 282 | procedure Set_Name(Value: UnicodeString); 283 | procedure Set_Type_(Value: UnicodeString); 284 | procedure Set_Value(Value: UnicodeString); 285 | { Methods & Properties } 286 | property Name: UnicodeString read Get_Name write Set_Name; 287 | property Type_: UnicodeString read Get_Type_ write Set_Type_; 288 | property Value: UnicodeString read Get_Value write Set_Value; 289 | end; 290 | 291 | { IXMLDataTypeList } 292 | 293 | IXMLDataTypeList = interface(IXMLNodeCollection) 294 | ['{9A322421-9DD5-48C2-ACB0-4E0A9A0AF866}'] 295 | { Methods & Properties } 296 | function Add: IXMLDataType; 297 | function Insert(const Index: integer): IXMLDataType; 298 | 299 | function Get_Item(Index: integer): IXMLDataType; 300 | property Items[Index: integer]: IXMLDataType read Get_Item; default; 301 | end; 302 | 303 | { Forward Decls } 304 | 305 | TXMLDataChestType = class; 306 | TXMLPublisherType = class; 307 | TXMLDataType = class; 308 | TXMLDataTypeList = class; 309 | 310 | { TXMLDataChestType } 311 | 312 | TXMLDataChestType = class(TXMLNode, IXMLDataChestType) 313 | private 314 | FData: IXMLDataTypeList; 315 | protected 316 | { IXMLDataChestType } 317 | function Get_Publisher: IXMLPublisherType; 318 | function Get_Data: IXMLDataTypeList; 319 | public 320 | procedure AfterConstruction; override; 321 | end; 322 | 323 | { TXMLPublisherType } 324 | 325 | TXMLPublisherType = class(TXMLNode, IXMLPublisherType) 326 | protected 327 | { IXMLPublisherType } 328 | function Get_Info: UnicodeString; 329 | function Get_Version: UnicodeString; 330 | procedure Set_Info(Value: UnicodeString); 331 | procedure Set_Version(Value: UnicodeString); 332 | end; 333 | 334 | { TXMLDataType } 335 | 336 | TXMLDataType = class(TXMLNode, IXMLDataType) 337 | protected 338 | { IXMLDataType } 339 | function Get_Name: UnicodeString; 340 | function Get_Type_: UnicodeString; 341 | function Get_Value: UnicodeString; 342 | procedure Set_Name(Value: UnicodeString); 343 | procedure Set_Type_(Value: UnicodeString); 344 | procedure Set_Value(Value: UnicodeString); 345 | end; 346 | 347 | { TXMLDataTypeList } 348 | 349 | TXMLDataTypeList = class(TXMLNodeCollection, IXMLDataTypeList) 350 | protected 351 | { IXMLDataTypeList } 352 | function Add: IXMLDataType; 353 | function Insert(const Index: integer): IXMLDataType; 354 | 355 | function Get_Item(Index: integer): IXMLDataType; 356 | end; 357 | 358 | { 359 | ====================================== 360 | Global Functions 361 | ====================================== 362 | } 363 | function ChestTypeToString(ChestType: Word): string; 364 | function StringToChestType(S: string): Word; 365 | 366 | function GetDataChest(Doc: IXMLDocument): IXMLDataChestType; 367 | function LoadDataChest(const FileName: string): IXMLDataChestType; 368 | function NewDataChest: IXMLDataChestType; 369 | 370 | const 371 | TargetNamespace = ''; 372 | { 373 | ====================================== 374 | ChestValue 375 | ====================================== 376 | } 377 | 378 | var 379 | Chest: TChest; 380 | IntChest: TIntChest; 381 | RealChest: TRealChest; 382 | StringChest: TStringChest; 383 | 384 | { 385 | ====================================== 386 | ====================================== 387 | ====================================== 388 | ====================================== 389 | Implementation 390 | ====================================== 391 | ====================================== 392 | ====================================== 393 | } 394 | 395 | implementation 396 | 397 | { TChest } 398 | 399 | class function TChest.SelfCheck: Boolean; 400 | begin 401 | if (not TChest.Checked) then 402 | begin 403 | if not Assigned(TChest.List) then 404 | begin 405 | TChest.List := TList.Create; 406 | Result := False; 407 | end 408 | else 409 | Result := True; 410 | TChest.Checked := True; 411 | end 412 | else 413 | Result := True; 414 | end; 415 | 416 | class procedure TChest.Clear; 417 | var 418 | i: integer; 419 | Item: Pointer; 420 | begin 421 | for i := 0 to TChest.List.Count - 1 do 422 | begin 423 | Item := TChest.List.Items[i]; 424 | TChestElement(Item^).Free; 425 | FreeMem(Item, SizeOf(TChestElement)); 426 | end; 427 | TChest.List.Clear; 428 | end; 429 | 430 | class procedure TChest._Delete(index: integer); 431 | var 432 | Item: Pointer; 433 | begin 434 | Item := TChest.List.Items[index]; 435 | TChestElement(Item^).Free; 436 | FreeMem(Item, SizeOf(TChestElement)); 437 | TChest.List.Delete(index); 438 | TChest.Sorted := False; 439 | end; 440 | 441 | class procedure TChest._Delete(index: string); 442 | var 443 | i: integer; 444 | begin 445 | if not TChest.Sorted then 446 | TChest.SortByName; 447 | if TChest.Find(index, i) then 448 | TChest._Delete(i); 449 | end; 450 | 451 | class procedure TChest.DoFinalization; 452 | begin 453 | if Assigned(TChest.List) then 454 | begin 455 | TChest.Clear; 456 | TChest.List.Free; 457 | TChest.List := nil; 458 | end; 459 | TChest.Checked := False; 460 | TChest.Sorted := False; 461 | end; 462 | 463 | class procedure TChest.DoInitialization; 464 | begin 465 | TChest.Checked := False; 466 | TChest.Sorted := False; 467 | TChest.SelfCheck; 468 | TChest.Clear; 469 | end; 470 | 471 | class function TChest.Find(const S: string; var Index: integer): Boolean; 472 | var 473 | L, H, i, C: integer; 474 | begin 475 | Result := False; 476 | L := 0; 477 | H := TChest.List.Count - 1; 478 | while L <= H do 479 | begin 480 | i := (L + H) shr 1; 481 | C := CompareText(TChestElement(TChest.List.Items[i]^).Name, S); 482 | if C < 0 then 483 | L := i + 1 484 | else 485 | begin 486 | H := i - 1; 487 | if C = 0 then 488 | begin 489 | Result := True; 490 | if Duplicates <> dupAccept then 491 | L := i; 492 | end; 493 | end; 494 | end; 495 | Index := L; 496 | end; 497 | 498 | class function TChest.GetCount: integer; 499 | begin 500 | if Assigned(TChest.List) then 501 | Result := TChest.List.Count 502 | else 503 | Result := 0; 504 | end; 505 | 506 | class function TChest.GetItem(index: integer): TChestElement; 507 | begin 508 | Result := TChestElement(TChest.List.Items[index]^); 509 | end; 510 | 511 | class function TChest.GetValue(index: string): Pointer; 512 | var 513 | i: integer; 514 | begin 515 | if not TChest.SelfCheck then 516 | begin 517 | Result := nil; 518 | Exit; 519 | end 520 | else 521 | begin 522 | if not TChest.Sorted then 523 | TChest.SortByName; 524 | if TChest.Find(index, i) then 525 | begin 526 | Result := TChestElement(TChest.List.Items[i]^).Value; 527 | Exit; 528 | end 529 | else 530 | begin 531 | Result := nil; 532 | Exit; 533 | end; 534 | end; 535 | end; 536 | 537 | class function TChest.GetValueAndType(index: string; 538 | var ChestType: Word): Pointer; 539 | var 540 | i: integer; 541 | Item: Pointer; 542 | begin 543 | if not TChest.SelfCheck then 544 | begin 545 | ChestType := ChestTypeEmpty; 546 | Result := nil; 547 | Exit; 548 | end 549 | else 550 | begin 551 | if not TChest.Sorted then 552 | TChest.SortByName; 553 | if TChest.Find(index, i) then 554 | begin 555 | Item := TChest.List.Items[i]; 556 | ChestType := TChestElement(Item^).ChestType; 557 | Result := TChestElement(Item^).Value; 558 | Exit; 559 | end 560 | else 561 | begin 562 | Result := nil; 563 | Exit; 564 | end; 565 | end; 566 | end; 567 | 568 | class procedure TChest.SetItem(index: integer; const Value: TChestElement); 569 | begin 570 | TChestElement((TChest.List.Items[index])^) := Value; 571 | end; 572 | 573 | class procedure TChest.SetValue(index: string; const Value: Pointer); 574 | var 575 | i: integer; 576 | P: Pointer; 577 | begin 578 | TChest.SelfCheck; 579 | if TChest.Find(index, i) then 580 | begin 581 | TChestElement((TChest.List.Items[i])^).Value := Value; 582 | Exit; 583 | end 584 | else 585 | begin 586 | P := GetMemory(SizeOf(TChestElement)); 587 | TChestElement(P^) := TChestElement.Create; 588 | TChestElement(P^).Name := index; 589 | TChestElement(P^).Value := Value; 590 | TChest.List.Add(P); 591 | TChest.Sorted := False; 592 | end; 593 | end; 594 | 595 | class procedure TChest.SetValueAndType(index: string; const Value: Pointer; 596 | ChestType: Word = ChestTypeEmpty); 597 | var 598 | i: integer; 599 | P, Item: Pointer; 600 | begin 601 | TChest.SelfCheck; 602 | if TChest.Find(index, i) then 603 | begin 604 | Item := TChest.List.Items[i]; 605 | TChestElement(Item^).Value := Value; 606 | TChestElement(Item^).ChestType := ChestType; 607 | Exit; 608 | end 609 | else 610 | begin 611 | P := GetMemory(SizeOf(TChestElement)); 612 | TChestElement(P^) := TChestElement.Create; 613 | TChestElement(P^).Name := index; 614 | TChestElement(P^).Value := Value; 615 | TChestElement(P^).ChestType := ChestType; 616 | TChest.List.Add(P); 617 | TChest.Sorted := False; 618 | end; 619 | end; 620 | 621 | class procedure TChest.SortByName; 622 | procedure QuickSort(iLo, iHi: integer); 623 | var 624 | Lo, Hi: integer; 625 | Mid: string; 626 | begin 627 | Lo := iLo; 628 | Hi := iHi; 629 | Mid := TChestElement(TChest.List.Items[(Lo + Hi) div 2]^).Name; 630 | repeat 631 | while CompareText(TChestElement(TChest.List.Items[Lo]^).Name, Mid) < 0 do 632 | Inc(Lo); 633 | while CompareText(TChestElement(TChest.List.Items[Hi]^).Name, Mid) > 0 do 634 | Dec(Hi); 635 | if Lo <= Hi then 636 | begin 637 | TChest.List.Exchange(Lo, Hi); 638 | Inc(Lo); 639 | Dec(Hi); 640 | end; 641 | until Lo > Hi; 642 | if Hi > iLo then 643 | QuickSort(iLo, Hi); 644 | if Lo < iHi then 645 | QuickSort(Lo, iHi); 646 | end; 647 | 648 | begin 649 | if not TChest.Sorted then 650 | begin 651 | if TChest.List.Count > 0 then 652 | QuickSort(0, TChest.List.Count - 1); 653 | TChest.Sorted := True; 654 | end; 655 | end; 656 | 657 | { TMemChest } 658 | 659 | class procedure TMemChest.Delete(index: integer); 660 | procedure SelfDelete(index, Size: integer); 661 | begin 662 | FreeMem(TChestElement((TMemChest.List.Items[index])^).Value, Size); 663 | TChest._Delete(index); 664 | end; 665 | 666 | begin 667 | case TChestElement((TChest.List.Items[index])^).ChestType of 668 | ChestTypeInteger: 669 | SelfDelete(index, SizeOf(integer)); 670 | ChestTypeReal: 671 | SelfDelete(index, SizeOf(Real)); 672 | ChestTypeBoolean: 673 | SelfDelete(index, SizeOf(Boolean)); 674 | ChestTypeString: 675 | begin 676 | TChestString(TChestElement((TChest.List.Items[index])^).Value^).Free; 677 | SelfDelete(index, SizeOf(TChestString)); 678 | end; 679 | ChestTypePointer: 680 | SelfDelete(index, SizeOf(Pointer)); 681 | end; 682 | TMemChest.TempList.Delete(index); 683 | end; 684 | 685 | class procedure TMemChest.Delete(index: string); 686 | var 687 | i: integer; 688 | begin 689 | if not TMemChest.Sorted then 690 | TMemChest.SortByName; 691 | if TMemChest.Find(index, i) then 692 | TMemChest.Delete(i); 693 | end; 694 | 695 | class procedure TMemChest.FreeMemory; 696 | var 697 | i: integer; 698 | begin 699 | if Assigned(TMemChest.TempList) then 700 | begin 701 | for i := TMemChest.List.Count - 1 downto 0 do 702 | begin 703 | TMemChest.Delete(i); 704 | end; 705 | TMemChest.TempList.Clear; 706 | TMemChest.TempList.Free; 707 | TMemChest.TempList := nil; 708 | end; 709 | end; 710 | 711 | class function TMemChest.GetXML: WideString; 712 | var 713 | XMLDataChest: IXMLDataChestType; 714 | XMLData: IXMLDataType; 715 | XML: WideString; 716 | i: integer; 717 | Item: TChestElement; 718 | begin 719 | XMLDataChest := NewDataChest; 720 | for i := 0 to TMemChest.Count - 1 do 721 | begin 722 | Item := TChestElement(TMemChest.List.Items[i]^); 723 | if (Item.Value <> nil) then 724 | begin 725 | XMLData := XMLDataChest.Data.Add; 726 | XMLData.Name := Item.Name; 727 | case Item.ChestType of 728 | ChestTypeInteger: 729 | begin 730 | XMLData.Type_ := 'Integer'; 731 | XMLData.Value := IntToStr(integer(Item.Value^)); 732 | end; 733 | ChestTypeBoolean: 734 | begin 735 | XMLData.Type_ := 'Boolean'; 736 | if (Boolean(Item.Value^)) then 737 | XMLData.Value := 'True' 738 | else 739 | XMLData.Value := 'False'; 740 | end; 741 | ChestTypeReal: 742 | begin 743 | XMLData.Type_ := 'Real'; 744 | XMLData.Value := FloatToStr(Real(Item.Value^)); 745 | end; 746 | ChestTypeString: 747 | begin 748 | XMLData.Type_ := 'String'; 749 | XMLData.Value := TChestString(Item.Value^).Value; 750 | end; 751 | else 752 | begin 753 | XMLData.Type_ := 'Empty'; 754 | XMLData.Value := 'Invalid'; 755 | end; 756 | end; 757 | end; 758 | end; 759 | if TMemChest._Publisher = '' then 760 | XMLDataChest.Publisher.Info := 761 | 'DataChest,©黄锐,vowstar@gmail.com,http://hi.baidu.com/蝶晓梦' 762 | else 763 | XMLDataChest.Publisher.Info := TMemChest._Publisher; 764 | XMLDataChest.Publisher.Version := '1.0'; 765 | XMLDataChest.OwnerDocument.Encoding := 'UTF-8'; 766 | XMLDataChest.OwnerDocument.SaveToXML(XML); 767 | Result := XML; 768 | 769 | end; 770 | 771 | class procedure TMemChest.LoadFromEncryptFile(FileName: string); 772 | var 773 | StringStream: TStringStream; 774 | Temp: WideString; 775 | begin 776 | Temp := ''; 777 | if (FileExists(FileName)) then 778 | begin 779 | StringStream := TStringStream.Create; 780 | StringStream.LoadFromFile(FileName); 781 | Temp := StringStream.ReadString(StringStream.Size); 782 | StringStream.Free; 783 | end; 784 | TMemChest.XML := DecodeString(Temp); 785 | end; 786 | 787 | class procedure TMemChest.LoadFromFile(FileName: string); 788 | begin 789 | TMemChest.LoadFromEncryptFile(FileName); 790 | end; 791 | 792 | class procedure TMemChest.LoadFromXMLFile(FileName: string); 793 | var 794 | StringList: TStringList; 795 | begin 796 | StringList := TStringList.Create; 797 | StringList.LoadFromFile(FileName, TEncoding.UTF8); 798 | TMemChest.XML := StringList.Text; 799 | StringList.Free; 800 | end; 801 | 802 | class procedure TMemChest.SaveToEncryptFile(FileName: string); 803 | var 804 | StringStream: TStringStream; 805 | Temp: string; 806 | begin 807 | StringStream := TStringStream.Create; 808 | Temp := EncodeString(TMemChest.XML); 809 | StringStream.WriteString(Temp); 810 | StringStream.SaveToFile(FileName); 811 | StringStream.Free; 812 | end; 813 | 814 | class procedure TMemChest.SaveToFile(FileName: string); 815 | begin 816 | TMemChest.SaveToEncryptFile(FileName); 817 | end; 818 | 819 | class procedure TMemChest.SaveToXMLFile(FileName: string); 820 | { 821 | 耗时操作 822 | } 823 | var 824 | StringList: TStringList; 825 | begin 826 | StringList := TStringList.Create; 827 | StringList.Text := FormatXMLData(TMemChest.XML); 828 | StringList.SaveToFile(FileName, TEncoding.UTF8); 829 | StringList.Free; 830 | end; 831 | 832 | class procedure TMemChest.SetXML(const Value: WideString); 833 | var 834 | XMLDataChest: IXMLDataChestType; 835 | XMLData: IXMLDataType; 836 | i: integer; 837 | ChestType: Word; 838 | Doc: IXMLDocument; 839 | begin 840 | Doc := NewXMLDocument; 841 | Doc.LoadFromXML(Value); 842 | XMLDataChest := GetDataChest(Doc); 843 | for i := 0 to XMLDataChest.Data.Count - 1 do 844 | begin 845 | XMLData := XMLDataChest.Data.Items[i]; 846 | ChestType := StringToChestType(XMLData.Type_); 847 | case ChestType of 848 | ChestTypeInteger: 849 | begin 850 | TIntChest.AsString[XMLData.Name] := XMLData.Value; 851 | end; 852 | ChestTypeReal: 853 | begin 854 | TRealChest.AsString[XMLData.Name] := XMLData.Value; 855 | end; 856 | ChestTypeBoolean: 857 | begin 858 | TBooleanChest.AsString[XMLData.Name] := XMLData.Value; 859 | end; 860 | ChestTypeString: 861 | begin 862 | TStringChest.AsString[XMLData.Name] := XMLData.Value; 863 | end; 864 | end; 865 | end; 866 | end; 867 | 868 | { TIntChest } 869 | 870 | class function TIntChest.GetIntValue(index: string): integer; 871 | var 872 | P: Pointer; 873 | ChestType: Word; 874 | begin 875 | P := TIntChest.GetValueAndType(index, ChestType); 876 | if (P <> nil) then 877 | begin 878 | if (ChestType = ChestTypeInteger) then 879 | Result := integer(P^) 880 | else 881 | Result := 0; 882 | end 883 | else 884 | begin 885 | Result := 0; 886 | end; 887 | end; 888 | 889 | class function TIntChest.GetStringValue(index: string): String; 890 | begin 891 | Result := IntToStr(TIntChest.GetIntValue(index)); 892 | end; 893 | 894 | class procedure TIntChest.SetIntValue(index: string; const Value: integer); 895 | var 896 | P: ^integer; 897 | begin 898 | if not Assigned(TIntChest.TempList) then 899 | TIntChest.TempList := TList.Create; 900 | 901 | GetMem(P, SizeOf(integer)); 902 | TIntChest.TempList.Add(P); 903 | P^ := Value; 904 | TIntChest.SetValueAndType(index, P, ChestTypeInteger); 905 | end; 906 | 907 | class procedure TIntChest.SetStringValue(index: string; const Value: String); 908 | begin 909 | TIntChest.SetIntValue(index, StrToInt(Value)); 910 | end; 911 | 912 | { TRealChest } 913 | 914 | class function TRealChest.GetIntValue(index: string): integer; 915 | begin 916 | Result := Round(TRealChest.GetRealValue(index)); 917 | end; 918 | 919 | class function TRealChest.GetRealValue(index: string): Real; 920 | var 921 | P: Pointer; 922 | ChestType: Word; 923 | begin 924 | P := TRealChest.GetValueAndType(index, ChestType); 925 | if (P <> nil) then 926 | begin 927 | if (ChestType = ChestTypeReal) then 928 | Result := Real(P^) 929 | else 930 | Result := 0.0; 931 | end 932 | else 933 | begin 934 | Result := 0.0; 935 | end; 936 | end; 937 | 938 | class function TRealChest.GetStringValue(index: string): String; 939 | begin 940 | Result := FloatToStr(TRealChest.GetRealValue(index)); 941 | end; 942 | 943 | class procedure TRealChest.SetIntValue(index: string; const Value: integer); 944 | begin 945 | TRealChest.SetRealValue(index, Value); 946 | end; 947 | 948 | class procedure TRealChest.SetRealValue(index: string; const Value: Real); 949 | var 950 | P: ^Real; 951 | begin 952 | if not Assigned(TRealChest.TempList) then 953 | TRealChest.TempList := TList.Create; 954 | 955 | GetMem(P, SizeOf(Real)); 956 | TRealChest.TempList.Add(P); 957 | P^ := Value; 958 | TRealChest.SetValueAndType(index, P, ChestTypeReal); 959 | end; 960 | 961 | class procedure TRealChest.SetStringValue(index: string; const Value: String); 962 | begin 963 | TRealChest.SetRealValue(index, StrToFloat(Value)); 964 | end; 965 | 966 | { TBooleanChest } 967 | 968 | class function TBooleanChest.GetBooleanValue(index: string): Boolean; 969 | var 970 | P: Pointer; 971 | ChestType: Word; 972 | begin 973 | P := TBooleanChest.GetValueAndType(index, ChestType); 974 | if (P <> nil) then 975 | begin 976 | if (ChestType = ChestTypeBoolean) then 977 | Result := Boolean(P^) 978 | else 979 | Result := False; 980 | end 981 | else 982 | begin 983 | Result := False; 984 | end; 985 | end; 986 | 987 | class function TBooleanChest.GetIntValue(index: string): integer; 988 | begin 989 | if (TBooleanChest.GetBooleanValue(index)) then 990 | Result := 1 991 | else 992 | Result := 0; 993 | end; 994 | 995 | class function TBooleanChest.GetRealValue(index: string): Real; 996 | begin 997 | if (TBooleanChest.GetBooleanValue(index)) then 998 | Result := 1 999 | else 1000 | Result := 0; 1001 | end; 1002 | 1003 | class function TBooleanChest.GetStringValue(index: string): String; 1004 | begin 1005 | if (TBooleanChest.GetBooleanValue(index)) then 1006 | Result := 'True' 1007 | else 1008 | Result := 'False'; 1009 | end; 1010 | 1011 | class procedure TBooleanChest.SetBooleanValue(index: string; 1012 | const Value: Boolean); 1013 | var 1014 | P: ^Boolean; 1015 | begin 1016 | if not Assigned(TBooleanChest.TempList) then 1017 | TBooleanChest.TempList := TList.Create; 1018 | 1019 | GetMem(P, SizeOf(Boolean)); 1020 | TBooleanChest.TempList.Add(P); 1021 | P^ := Value; 1022 | TBooleanChest.SetValueAndType(index, P, ChestTypeBoolean); 1023 | end; 1024 | 1025 | class procedure TBooleanChest.SetIntValue(index: string; const Value: integer); 1026 | begin 1027 | if Value > 0 then 1028 | TBooleanChest.SetBooleanValue(index, True) 1029 | else 1030 | TBooleanChest.SetBooleanValue(index, False); 1031 | 1032 | end; 1033 | 1034 | class procedure TBooleanChest.SetRealValue(index: string; const Value: Real); 1035 | begin 1036 | if Value > 0.0000001 then 1037 | TBooleanChest.SetBooleanValue(index, True) 1038 | else 1039 | TBooleanChest.SetBooleanValue(index, False); 1040 | end; 1041 | 1042 | class procedure TBooleanChest.SetStringValue(index: string; 1043 | const Value: String); 1044 | begin 1045 | if UpperCase(Value) = 'TRUE' then 1046 | TBooleanChest.SetBooleanValue(index, True) 1047 | else if UpperCase(Value) = 'FALSE' then 1048 | TBooleanChest.SetBooleanValue(index, False); 1049 | end; 1050 | 1051 | { TStringChest } 1052 | 1053 | class function TStringChest.GetStringValue(index: string): string; 1054 | var 1055 | P: Pointer; 1056 | ChestType: Word; 1057 | begin 1058 | P := TStringChest.GetValueAndType(index, ChestType); 1059 | if (P <> nil) then 1060 | begin 1061 | if (ChestType = ChestTypeString) then 1062 | Result := TChestString(P^).Value 1063 | else 1064 | Result := ''; 1065 | end 1066 | else 1067 | begin 1068 | Result := ''; 1069 | end; 1070 | end; 1071 | 1072 | class procedure TStringChest.SetStringValue(index: string; const Value: string); 1073 | var 1074 | P: Pointer; 1075 | 1076 | begin 1077 | if not Assigned(TStringChest.TempList) then 1078 | TStringChest.TempList := TList.Create; 1079 | GetMem(P, SizeOf(TChestString)); 1080 | TChestString(P^) := TChestString.Create; 1081 | TChestString(P^).Value := Value; 1082 | TStringChest.TempList.Add(P); 1083 | TStringChest.SetValueAndType(index, P, ChestTypeString); 1084 | end; 1085 | 1086 | { TObjectChest } 1087 | 1088 | class function TObjectChest.GetObjectValue(index: string): TObject; 1089 | var 1090 | P: Pointer; 1091 | begin 1092 | P := TObjectChest.GetValue(index); 1093 | if (P <> nil) then 1094 | begin 1095 | Result := TObject(P^); 1096 | end 1097 | else 1098 | begin 1099 | Result := nil; 1100 | end; 1101 | end; 1102 | 1103 | class procedure TObjectChest.SetObjectValue(index: string; 1104 | const Value: TObject); 1105 | var 1106 | P: ^TObject; 1107 | begin 1108 | P := @Value; 1109 | TObjectChest.SetValue(index, P); 1110 | end; 1111 | 1112 | { TComponentChest } 1113 | 1114 | class function TComponentChest.GetComponentValue(index: string): TComponent; 1115 | begin 1116 | Result := TComponent(TComponentChest.GetObjectValue(index)); 1117 | end; 1118 | 1119 | class procedure TComponentChest.SetComponentValue(index: string; 1120 | const Value: TComponent); 1121 | begin 1122 | TComponentChest.SetObjectValue(index, TObject(Value)); 1123 | end; 1124 | 1125 | { TXMLDataChestType } 1126 | 1127 | procedure TXMLDataChestType.AfterConstruction; 1128 | begin 1129 | RegisterChildNode('Publisher', TXMLPublisherType); 1130 | RegisterChildNode('Data', TXMLDataType); 1131 | FData := CreateCollection(TXMLDataTypeList, IXMLDataType, 'Data') 1132 | as IXMLDataTypeList; 1133 | inherited; 1134 | end; 1135 | 1136 | function TXMLDataChestType.Get_Publisher: IXMLPublisherType; 1137 | begin 1138 | Result := ChildNodes['Publisher'] as IXMLPublisherType; 1139 | end; 1140 | 1141 | function TXMLDataChestType.Get_Data: IXMLDataTypeList; 1142 | begin 1143 | Result := FData; 1144 | end; 1145 | 1146 | { TXMLPublisherType } 1147 | 1148 | function TXMLPublisherType.Get_Info: UnicodeString; 1149 | begin 1150 | Result := ChildNodes['Info'].Text; 1151 | end; 1152 | 1153 | procedure TXMLPublisherType.Set_Info(Value: UnicodeString); 1154 | begin 1155 | ChildNodes['Info'].NodeValue := Value; 1156 | end; 1157 | 1158 | function TXMLPublisherType.Get_Version: UnicodeString; 1159 | begin 1160 | Result := ChildNodes['Version'].Text; 1161 | end; 1162 | 1163 | procedure TXMLPublisherType.Set_Version(Value: UnicodeString); 1164 | begin 1165 | ChildNodes['Version'].NodeValue := Value; 1166 | end; 1167 | 1168 | { TXMLDataType } 1169 | 1170 | function TXMLDataType.Get_Name: UnicodeString; 1171 | begin 1172 | Result := AttributeNodes['name'].Text; 1173 | end; 1174 | 1175 | procedure TXMLDataType.Set_Name(Value: UnicodeString); 1176 | begin 1177 | SetAttribute('name', Value); 1178 | end; 1179 | 1180 | function TXMLDataType.Get_Type_: UnicodeString; 1181 | begin 1182 | Result := ChildNodes['Type'].Text; 1183 | end; 1184 | 1185 | procedure TXMLDataType.Set_Type_(Value: UnicodeString); 1186 | begin 1187 | ChildNodes['Type'].NodeValue := Value; 1188 | end; 1189 | 1190 | function TXMLDataType.Get_Value: UnicodeString; 1191 | begin 1192 | Result := ChildNodes['Value'].Text; 1193 | end; 1194 | 1195 | procedure TXMLDataType.Set_Value(Value: UnicodeString); 1196 | begin 1197 | ChildNodes['Value'].NodeValue := Value; 1198 | end; 1199 | 1200 | { TXMLDataTypeList } 1201 | 1202 | function TXMLDataTypeList.Add: IXMLDataType; 1203 | begin 1204 | Result := AddItem(-1) as IXMLDataType; 1205 | end; 1206 | 1207 | function TXMLDataTypeList.Insert(const Index: integer): IXMLDataType; 1208 | begin 1209 | Result := AddItem(Index) as IXMLDataType; 1210 | end; 1211 | 1212 | function TXMLDataTypeList.Get_Item(Index: integer): IXMLDataType; 1213 | begin 1214 | Result := List[Index] as IXMLDataType; 1215 | end; 1216 | 1217 | { Global Functions } 1218 | function ChestTypeToString(ChestType: Word): string; 1219 | begin 1220 | case ChestType of 1221 | ChestTypeInteger: 1222 | begin 1223 | Result := 'Integer'; 1224 | end; 1225 | ChestTypeBoolean: 1226 | begin 1227 | Result := 'Boolean'; 1228 | end; 1229 | ChestTypeReal: 1230 | begin 1231 | Result := 'Real'; 1232 | end; 1233 | ChestTypeString: 1234 | begin 1235 | Result := 'String'; 1236 | end; 1237 | else 1238 | begin 1239 | Result := 'Empty'; 1240 | end; 1241 | end; 1242 | end; 1243 | 1244 | function StringToChestType(S: string): Word; 1245 | var 1246 | Temp: string; 1247 | ChestType: Word; 1248 | begin 1249 | Temp := UpperCase(S); 1250 | if Temp = 'INTEGER' then 1251 | ChestType := ChestTypeInteger 1252 | else if Temp = 'REAL' then 1253 | ChestType := ChestTypeReal 1254 | else if Temp = 'BOOLEAN' then 1255 | ChestType := ChestTypeBoolean 1256 | else if Temp = 'STRING' then 1257 | ChestType := ChestTypeString 1258 | else 1259 | ChestType := ChestTypeEmpty; 1260 | Result := ChestType; 1261 | end; 1262 | 1263 | function GetDataChest(Doc: IXMLDocument): IXMLDataChestType; 1264 | begin 1265 | Result := Doc.GetDocBinding('DataChest', TXMLDataChestType, TargetNamespace) 1266 | as IXMLDataChestType; 1267 | end; 1268 | 1269 | function LoadDataChest(const FileName: string): IXMLDataChestType; 1270 | begin 1271 | Result := LoadXMLDocument(FileName).GetDocBinding('DataChest', 1272 | TXMLDataChestType, TargetNamespace) as IXMLDataChestType; 1273 | end; 1274 | 1275 | function NewDataChest: IXMLDataChestType; 1276 | begin 1277 | Result := NewXMLDocument.GetDocBinding('DataChest', TXMLDataChestType, 1278 | TargetNamespace) as IXMLDataChestType; 1279 | end; 1280 | 1281 | initialization 1282 | 1283 | TChest.DoInitialization; 1284 | 1285 | { 1286 | ====================================== 1287 | ====================================== 1288 | ====================================== 1289 | ====================================== 1290 | ====================================== 1291 | } 1292 | finalization 1293 | 1294 | TIntChest.FreeMemory; 1295 | TRealChest.FreeMemory; 1296 | TStringChest.FreeMemory; 1297 | TChest.DoFinalization; 1298 | 1299 | end. 1300 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/ESP8266Flasher.dpr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/ESP8266Flasher.dpr -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/ESP8266Flasher.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {B07B95E1-CA04-46CA-8448-C86B0B010324} 4 | 17.2 5 | VCL 6 | ESP8266Flasher.dpr 7 | True 8 | Release 9 | Win32 10 | 3 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Cfg_1 40 | true 41 | true 42 | 43 | 44 | true 45 | Base 46 | true 47 | 48 | 49 | true 50 | Cfg_2 51 | true 52 | true 53 | 54 | 55 | true 56 | Cfg_2 57 | true 58 | true 59 | 60 | 61 | Resources\Images\Logo.ico 62 | true 63 | true 64 | "Cobalt XEMedia|VCLSTYLE|$(PUBLIC)\Documents\Embarcadero\Studio\16.0\Styles\CobaltXEMedia.vsf" 65 | ESP8266Flasher 66 | 2052 67 | $(BDS)\bin\default_app.manifest 68 | CompanyName=黄锐;FileDescription=ESP8266Flasher;FileVersion=1.0.0.0;InternalName=ESP8266Flasher;LegalCopyright=@黄锐;LegalTrademarks=Vowstar;OriginalFilename=ESP8266Flasher.exe;ProductName=ESP8266Flasher;ProductVersion=1.0.0.0;Comments=ESP8266Flasher 69 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 70 | .\$(Platform)\$(Config) 71 | .\$(Platform)\$(Config) 72 | false 73 | false 74 | false 75 | false 76 | false 77 | 78 | 79 | 1033 80 | DataSnapIndy10ServerTransport;frxDB19;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;vcldbx;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;TeeDB;frx19;inetdbbde;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;vclFireDAC;DataSnapProviderClient;xmlrtl;svnui;DBXSybaseASEDriver;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;DatasnapConnectorsFreePascal;FireDACCommonDriver;MetropolisUILiveTile;bindengine;vclactnband;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;VclSmp;FireDACMSSQLDriver;FireDAC;dsnap;Intraweb;fmxase;vcl;IndyCore;FireDACDataSnapDriver;IndyIPServer;IndyIPCommon;VCLRESTComponents;CloudService;dsnapcon;FireDACIBDriver;DBXFirebirdDriver;inet;DBXMSSQLDriver;fmxobj;FireDACDBXDriver;DBXInformixDriver;DataSnapConnectors;FireDACMySQLDriver;FmxTeeUI;vclx;CodeSiteExpressPkg;inetdbxpress;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;FireDACDb2Driver;RESTComponents;frxe19;bdertl;adortl;FireDACMSAccDriver;dbexpress;IndyIPClient;$(DCC_UsePackage) 81 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 82 | 83 | 84 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 85 | 1033 86 | DataSnapIndy10ServerTransport;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;TeeDB;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DBXOdbcDriver;DataSnapServer;Tee;vclFireDAC;DataSnapProviderClient;xmlrtl;DBXSybaseASEDriver;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;DatasnapConnectorsFreePascal;FireDACCommonDriver;MetropolisUILiveTile;bindengine;vclactnband;vcldb;soaprtl;bindcompdbx;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;VclSmp;FireDACMSSQLDriver;FireDAC;dsnap;Intraweb;fmxase;vcl;IndyCore;FireDACDataSnapDriver;IndyIPServer;IndyIPCommon;VCLRESTComponents;CloudService;dsnapcon;FireDACIBDriver;DBXFirebirdDriver;inet;DBXMSSQLDriver;fmxobj;FireDACDBXDriver;DBXInformixDriver;DataSnapConnectors;FireDACMySQLDriver;FmxTeeUI;vclx;inetdbxpress;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;FireDACDb2Driver;RESTComponents;adortl;FireDACMSAccDriver;dbexpress;IndyIPClient;$(DCC_UsePackage) 87 | 88 | 89 | DEBUG;$(DCC_Define) 90 | true 91 | false 92 | true 93 | true 94 | true 95 | 96 | 97 | 1033 98 | false 99 | 100 | 101 | 1033 102 | 103 | 104 | false 105 | RELEASE;$(DCC_Define) 106 | 0 107 | 0 108 | 109 | 110 | 1033 111 | 112 | 113 | 1033 114 | 115 | 116 | 117 | MainSource 118 | 119 | 120 |
Resource.res
121 |
122 | 123 |
FormMain
124 | dfm 125 |
126 | 127 | 128 |
FrameConfigLine
129 | dfm 130 | TFrame 131 |
132 | 133 | 134 | Cfg_2 135 | Base 136 | 137 | 138 | Base 139 | 140 | 141 | Cfg_1 142 | Base 143 | 144 |
145 | 146 | Delphi.Personality.12 147 | 148 | 149 | 150 | 151 | False 152 | False 153 | 1 154 | 0 155 | 0 156 | 0 157 | False 158 | False 159 | False 160 | False 161 | False 162 | 2052 163 | 936 164 | 165 | 166 | 167 | 168 | 1.0.0.0 169 | 170 | 171 | 172 | 173 | 174 | 1.0.0.0 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | ESP8266Flasher.dpr 202 | 203 | 204 | Embarcadero C++Builder Office 2000 Servers Package 205 | Embarcadero C++Builder Office XP Servers Package 206 | Microsoft Office 2000 Sample Automation Server Wrapper Components 207 | Microsoft Office XP Sample Automation Server Wrapper Components 208 | 209 | 210 | 211 | 212 | 213 | ESP8266Flasher.exe 214 | true 215 | 216 | 217 | 218 | 219 | 1 220 | .dylib 221 | 222 | 223 | 0 224 | .bpl 225 | 226 | 227 | Contents\MacOS 228 | 1 229 | .dylib 230 | 231 | 232 | 1 233 | .dylib 234 | 235 | 236 | 1 237 | .dylib 238 | 239 | 240 | 241 | 242 | 1 243 | .dylib 244 | 245 | 246 | 0 247 | .dll;.bpl 248 | 249 | 250 | Contents\MacOS 251 | 1 252 | .dylib 253 | 254 | 255 | 1 256 | .dylib 257 | 258 | 259 | 1 260 | .dylib 261 | 262 | 263 | 264 | 265 | 1 266 | 267 | 268 | 1 269 | 270 | 271 | 1 272 | 273 | 274 | 275 | 276 | Contents 277 | 1 278 | 279 | 280 | 281 | 282 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 283 | 1 284 | 285 | 286 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 287 | 1 288 | 289 | 290 | 291 | 292 | res\drawable-normal 293 | 1 294 | 295 | 296 | 297 | 298 | library\lib\x86 299 | 1 300 | 301 | 302 | 303 | 304 | 1 305 | 306 | 307 | 1 308 | 309 | 310 | 1 311 | 312 | 313 | 314 | 315 | ../ 316 | 1 317 | 318 | 319 | 320 | 321 | library\lib\armeabi-v7a 322 | 1 323 | 324 | 325 | 326 | 327 | 1 328 | 329 | 330 | 1 331 | 332 | 333 | 1 334 | 335 | 336 | 337 | 338 | res\drawable-xlarge 339 | 1 340 | 341 | 342 | 343 | 344 | res\drawable-xhdpi 345 | 1 346 | 347 | 348 | 349 | 350 | 1 351 | 352 | 353 | 1 354 | 355 | 356 | 1 357 | 358 | 359 | 360 | 361 | res\drawable-xxhdpi 362 | 1 363 | 364 | 365 | 366 | 367 | library\lib\mips 368 | 1 369 | 370 | 371 | 372 | 373 | res\drawable 374 | 1 375 | 376 | 377 | 378 | 379 | Contents\MacOS 380 | 1 381 | 382 | 383 | 1 384 | 385 | 386 | 0 387 | 388 | 389 | 390 | 391 | Contents\MacOS 392 | 1 393 | .framework 394 | 395 | 396 | 0 397 | 398 | 399 | 400 | 401 | res\drawable-small 402 | 1 403 | 404 | 405 | 406 | 407 | ../ 408 | 1 409 | 410 | 411 | ../ 412 | 1 413 | 414 | 415 | 416 | 417 | Contents\MacOS 418 | 1 419 | 420 | 421 | 1 422 | 423 | 424 | Contents\MacOS 425 | 0 426 | 427 | 428 | 429 | 430 | classes 431 | 1 432 | 433 | 434 | 435 | 436 | 1 437 | 438 | 439 | 1 440 | 441 | 442 | 1 443 | 444 | 445 | 446 | 447 | 1 448 | 449 | 450 | 1 451 | 452 | 453 | 1 454 | 455 | 456 | 457 | 458 | res\drawable 459 | 1 460 | 461 | 462 | 463 | 464 | Contents\Resources 465 | 1 466 | 467 | 468 | 469 | 470 | 1 471 | 472 | 473 | 1 474 | 475 | 476 | 477 | 478 | 1 479 | 480 | 481 | 1 482 | 483 | 484 | 1 485 | 486 | 487 | 488 | 489 | library\lib\armeabi-v7a 490 | 1 491 | 492 | 493 | 1 494 | 495 | 496 | 0 497 | 498 | 499 | Contents\MacOS 500 | 1 501 | 502 | 503 | 1 504 | 505 | 506 | 1 507 | 508 | 509 | 510 | 511 | library\lib\armeabi 512 | 1 513 | 514 | 515 | 516 | 517 | res\drawable-large 518 | 1 519 | 520 | 521 | 522 | 523 | 0 524 | 525 | 526 | 0 527 | 528 | 529 | 0 530 | 531 | 532 | Contents\MacOS 533 | 0 534 | 535 | 536 | 0 537 | 538 | 539 | 0 540 | 541 | 542 | 543 | 544 | 1 545 | 546 | 547 | 1 548 | 549 | 550 | 1 551 | 552 | 553 | 554 | 555 | res\drawable-ldpi 556 | 1 557 | 558 | 559 | 560 | 561 | res\values 562 | 1 563 | 564 | 565 | 566 | 567 | 1 568 | 569 | 570 | 1 571 | 572 | 573 | 1 574 | 575 | 576 | 577 | 578 | res\drawable-mdpi 579 | 1 580 | 581 | 582 | 583 | 584 | res\drawable-hdpi 585 | 1 586 | 587 | 588 | 589 | 590 | 1 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | True 603 | True 604 | 605 | 606 | 12 607 | 608 | 609 | 610 | 611 |
612 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/ESP8266Flasher.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/ESP8266Flasher.res -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 zeroday 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/README.md: -------------------------------------------------------------------------------- 1 | NodeMCU Flasher 2 | =============== 3 | 4 | NodeMCU flasher is a firmware programmer for NodeMCU DEVKIT V0.9. 5 | 6 | You can use it to program NodeMCU DEVKIT or your own ESP8266 board. 7 | 8 | You MUST set GPIO0 to LOW before programming, and NodeMCU DEVKIT V0.9 will do it automatically. 9 | 10 | This is demo version. 11 | 12 | We are working on next version and will use QT framework. 13 | 14 | It will be cross platform and open source. 15 | 16 | Usage 17 | --------------- 18 | Just click flash and you can burn firmware to ESP8266. Before you doing it, GPIO0 MUST LOW. 19 | 20 | ![Begin program](http://i659.photobucket.com/albums/uu316/vowstar/NodeMCU-Flasher-Begin.png) 21 | 22 | And wait a moment. 23 | 24 | ![Programming](http://i659.photobucket.com/albums/uu316/vowstar/NodeMCU-Flasher-Programming.png) 25 | 26 | Program success. 27 | 28 | ![Program success](http://i659.photobucket.com/albums/uu316/vowstar/NodeMCU-Flasher-Success.png) 29 | 30 | Setting your own firmware. 31 | 32 | ![Setting](http://i659.photobucket.com/albums/uu316/vowstar/NodeMCU-Flasher-Setting.png) 33 | 34 | When the path have some error(e.g. file not exist), the line will become red. 35 | 36 | Tips: You could use some special path to do something interesting. 37 | 38 | The blank.bin file: 39 | 40 | INTERNAL://BLANK 41 | 42 | The esp_init_data_default.bin file(for 26MHz crystal): 43 | 44 | INTERNAL://DEFAULT 45 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resource.rc: -------------------------------------------------------------------------------- 1 | BLANK BIN Resources\Binaries\blank.bin 2 | FLASH BIN Resources\Binaries\0x00000.bin 3 | IROM BIN Resources\Binaries\0x10000.bin 4 | DEFAULT BIN Resources\Binaries\esp_init_data_default.bin 5 | NODEMCU BIN Resources\Binaries\nodemcu_integer_0.9.5_20150318.bin 6 | YES RCDATA Resources\Images\Yes.png 7 | NO RCDATA Resources\Images\No.png 8 | WAIT BIN Resources\Images\Wait.gif 9 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resource.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resource.res -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Binaries/0x00000.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Binaries/0x00000.bin -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Binaries/0x10000.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Binaries/0x10000.bin -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Binaries/blank.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Binaries/blank.bin -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Binaries/esp_init_data_default.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Binaries/esp_init_data_default.bin -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Binaries/nodemcu_integer_0.9.5_20150318.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Binaries/nodemcu_integer_0.9.5_20150318.bin -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/File.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/File.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/Logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/Logo.ico -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/Logo.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/No.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/No.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/Setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/Setting.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/Wait.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/Wait.GIF -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Images/Yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Resources/Images/Yes.png -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Resources/Webpages/index.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/SPComm.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/SPComm.pas -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/SerialPortsCtrl.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/SerialPortsCtrl.pas -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/UnitESP8266Protocol.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/UnitESP8266Protocol.pas -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/UnitFormMain.dfm: -------------------------------------------------------------------------------- 1 | object FormMain: TFormMain 2 | Left = 221 3 | Top = 103 4 | AlphaBlend = True 5 | Caption = 'NODEMCU FIRMWARE PROGRAMMER' 6 | ClientHeight = 298 7 | ClientWidth = 556 8 | Color = clCream 9 | TransparentColorValue = clNone 10 | Constraints.MinWidth = 525 11 | DoubleBuffered = True 12 | Font.Charset = ANSI_CHARSET 13 | Font.Color = clWindowText 14 | Font.Height = -21 15 | Font.Name = #24494#36719#38597#40657 16 | Font.Style = [] 17 | GlassFrame.Top = 30 18 | OldCreateOrder = False 19 | OnClose = FormClose 20 | OnCreate = FormCreate 21 | OnDestroy = FormDestroy 22 | PixelsPerInch = 96 23 | TextHeight = 28 24 | object PanelControlPanel: TPanel 25 | Left = 0 26 | Top = 271 27 | Width = 556 28 | Height = 27 29 | Align = alBottom 30 | Font.Charset = ANSI_CHARSET 31 | Font.Color = clWindowText 32 | Font.Height = -21 33 | Font.Name = #24494#36719#38597#40657 34 | Font.Style = [] 35 | ParentColor = True 36 | ParentFont = False 37 | TabOrder = 0 38 | object LabelCopyRight: TLabel 39 | Left = 28 40 | Top = 2 41 | Width = 296 42 | Height = 20 43 | Caption = 'NodeMCU Team ' 44 | Font.Charset = ANSI_CHARSET 45 | Font.Color = clWindowText 46 | Font.Height = -14 47 | Font.Name = #24494#36719#38597#40657 48 | Font.Style = [] 49 | ParentFont = False 50 | end 51 | object ImageStatus: TImage 52 | Left = 1 53 | Top = 1 54 | Width = 25 55 | Height = 25 56 | Align = alLeft 57 | Stretch = True 58 | Transparent = True 59 | ExplicitLeft = 484 60 | ExplicitTop = 2 61 | end 62 | object LabelStatus: TLabel 63 | Left = 514 64 | Top = 1 65 | Width = 41 66 | Height = 25 67 | Align = alRight 68 | Caption = 'Ready' 69 | Font.Charset = ANSI_CHARSET 70 | Font.Color = clWindowText 71 | Font.Height = -14 72 | Font.Name = #24494#36719#38597#40657 73 | Font.Style = [] 74 | ParentFont = False 75 | ExplicitHeight = 20 76 | end 77 | end 78 | object PageControlMain: TPageControl 79 | Left = 0 80 | Top = 0 81 | Width = 556 82 | Height = 271 83 | ActivePage = TabSheetOperation 84 | Align = alClient 85 | Font.Charset = ANSI_CHARSET 86 | Font.Color = clWindowText 87 | Font.Height = -21 88 | Font.Name = #24494#36719#38597#40657 89 | Font.Style = [] 90 | ParentFont = False 91 | TabOrder = 1 92 | object TabSheetOperation: TTabSheet 93 | Caption = 'Operation' 94 | Font.Charset = ANSI_CHARSET 95 | Font.Color = clWindowText 96 | Font.Height = -21 97 | Font.Name = #24494#36719#38597#40657 98 | Font.Style = [] 99 | ParentFont = False 100 | DesignSize = ( 101 | 548 102 | 228) 103 | object LabelDevA: TLabel 104 | Left = 13 105 | Top = 20 106 | Width = 100 107 | Height = 28 108 | Caption = 'COM Port' 109 | Font.Charset = ANSI_CHARSET 110 | Font.Color = clWindowText 111 | Font.Height = -21 112 | Font.Name = #24494#36719#38597#40657 113 | Font.Style = [] 114 | ParentFont = False 115 | end 116 | object LabelIntroduction: TLabel 117 | Left = 13 118 | Top = 97 119 | Width = 146 120 | Height = 20 121 | Cursor = crHandPoint 122 | Caption = 'require("nodemcu")' 123 | Font.Charset = ANSI_CHARSET 124 | Font.Color = clWindowText 125 | Font.Height = -15 126 | Font.Name = #24494#36719#38597#40657 127 | Font.Style = [] 128 | ParentFont = False 129 | StyleElements = [] 130 | OnClick = LabelIntroductionClick 131 | end 132 | object ComboBoxSerialPortA: TComboBox 133 | Left = 119 134 | Top = 16 135 | Width = 162 136 | Height = 36 137 | Font.Charset = ANSI_CHARSET 138 | Font.Color = clWindowText 139 | Font.Height = -21 140 | Font.Name = #24494#36719#38597#40657 141 | Font.Style = [] 142 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 143 | ParentColor = True 144 | ParentFont = False 145 | ParentShowHint = False 146 | ShowHint = True 147 | TabOrder = 0 148 | TabStop = False 149 | TextHint = 'Select port' 150 | end 151 | object ButtonBurn: TButton 152 | Left = 297 153 | Top = 16 154 | Width = 233 155 | Height = 36 156 | Action = ActionBurn 157 | Anchors = [akLeft, akTop, akRight] 158 | Caption = 'Flash(&F)' 159 | Font.Charset = ANSI_CHARSET 160 | Font.Color = clWindowText 161 | Font.Height = -21 162 | Font.Name = #24494#36719#38597#40657 163 | Font.Style = [] 164 | ParentFont = False 165 | TabOrder = 1 166 | end 167 | object ProgressBarStatus: TProgressBar 168 | Left = 13 169 | Top = 58 170 | Width = 517 171 | Height = 33 172 | Anchors = [akLeft, akTop, akRight] 173 | Smooth = True 174 | TabOrder = 2 175 | end 176 | object PanelQRCode: TPanel 177 | Left = 13 178 | Top = 123 179 | Width = 100 180 | Height = 100 181 | TabOrder = 3 182 | object ImageQRCode: TImage 183 | Left = 1 184 | Top = 1 185 | Width = 98 186 | Height = 98 187 | Align = alClient 188 | Stretch = True 189 | ExplicitLeft = 0 190 | ExplicitTop = -23 191 | end 192 | end 193 | object LabeledEditAPMAC: TLabeledEdit 194 | Left = 216 195 | Top = 124 196 | Width = 314 197 | Height = 36 198 | Anchors = [akLeft, akTop, akRight] 199 | EditLabel.Width = 84 200 | EditLabel.Height = 28 201 | EditLabel.Caption = 'AP MAC' 202 | LabelPosition = lpLeft 203 | ReadOnly = True 204 | TabOrder = 4 205 | Text = 'Waiting MAC' 206 | TextHint = 'Waiting MAC' 207 | end 208 | object LabeledEditSTAMAC: TLabeledEdit 209 | Left = 216 210 | Top = 184 211 | Width = 314 212 | Height = 36 213 | Anchors = [akLeft, akTop, akRight] 214 | EditLabel.Width = 95 215 | EditLabel.Height = 28 216 | EditLabel.Caption = 'STA MAC' 217 | LabelPosition = lpLeft 218 | ReadOnly = True 219 | TabOrder = 5 220 | Text = 'Waiting MAC' 221 | TextHint = 'Waiting MAC' 222 | end 223 | end 224 | object TabSheetConfig: TTabSheet 225 | Caption = 'Config' 226 | Font.Charset = ANSI_CHARSET 227 | Font.Color = clWindowText 228 | Font.Height = -21 229 | Font.Name = #24494#36719#38597#40657 230 | Font.Style = [] 231 | ImageIndex = 3 232 | ParentFont = False 233 | object GridPanelConfig: TGridPanel 234 | Left = 0 235 | Top = 0 236 | Width = 548 237 | Height = 228 238 | Align = alClient 239 | ColumnCollection = < 240 | item 241 | Value = 100.000000000000000000 242 | end> 243 | ControlCollection = < 244 | item 245 | Column = 0 246 | Control = FrameConfigLine1 247 | Row = 0 248 | end 249 | item 250 | Column = 0 251 | Control = FrameConfigLine2 252 | Row = 1 253 | end 254 | item 255 | Column = 0 256 | Control = FrameConfigLine3 257 | Row = 2 258 | end 259 | item 260 | Column = 0 261 | Control = FrameConfigLine4 262 | Row = 3 263 | end 264 | item 265 | Column = 0 266 | Control = FrameConfigLine5 267 | Row = 4 268 | end 269 | item 270 | Column = 0 271 | Control = FrameConfigLine6 272 | Row = 5 273 | end 274 | item 275 | Column = 0 276 | Control = FrameConfigLine7 277 | Row = 6 278 | end> 279 | RowCollection = < 280 | item 281 | SizeStyle = ssAbsolute 282 | Value = 30.000000000000000000 283 | end 284 | item 285 | SizeStyle = ssAbsolute 286 | Value = 30.000000000000000000 287 | end 288 | item 289 | SizeStyle = ssAbsolute 290 | Value = 30.000000000000000000 291 | end 292 | item 293 | SizeStyle = ssAbsolute 294 | Value = 30.000000000000000000 295 | end 296 | item 297 | SizeStyle = ssAbsolute 298 | Value = 30.000000000000000000 299 | end 300 | item 301 | SizeStyle = ssAbsolute 302 | Value = 30.000000000000000000 303 | end 304 | item 305 | SizeStyle = ssAbsolute 306 | Value = 30.000000000000000000 307 | end 308 | item 309 | SizeStyle = ssAbsolute 310 | Value = 30.000000000000000000 311 | end> 312 | TabOrder = 0 313 | inline FrameConfigLine1: TFrameConfigLine 314 | Left = 1 315 | Top = 1 316 | Width = 546 317 | Height = 31 318 | Align = alTop 319 | Font.Charset = DEFAULT_CHARSET 320 | Font.Color = clWindowText 321 | Font.Height = -11 322 | Font.Name = 'Tahoma' 323 | Font.Style = [] 324 | ParentFont = False 325 | TabOrder = 0 326 | ExplicitLeft = 1 327 | ExplicitTop = 1 328 | ExplicitWidth = 546 329 | inherited GridPanelConfigLine: TGridPanel 330 | Width = 546 331 | ControlCollection = < 332 | item 333 | Column = 0 334 | Control = FrameConfigLine1.CheckBoxEnable 335 | Row = 0 336 | end 337 | item 338 | Column = 1 339 | Control = FrameConfigLine1.ComboBoxPath 340 | Row = 0 341 | end 342 | item 343 | Column = 3 344 | Control = FrameConfigLine1.ComboBoxOffset 345 | Row = 0 346 | end 347 | item 348 | Column = 2 349 | Control = FrameConfigLine1.ImageOpenFile 350 | Row = 0 351 | end> 352 | ExplicitWidth = 546 353 | inherited CheckBoxEnable: TCheckBox 354 | OnMouseLeave = FrameConfigLineChange 355 | end 356 | inherited ComboBoxPath: TComboBox 357 | Width = 394 358 | OnChange = FrameConfigLineChange 359 | ExplicitWidth = 394 360 | end 361 | inherited ComboBoxOffset: TComboBox 362 | Left = 445 363 | OnChange = FrameConfigLineChange 364 | ExplicitLeft = 445 365 | end 366 | inherited ImageOpenFile: TImage 367 | Left = 415 368 | ExplicitLeft = 368 369 | end 370 | end 371 | end 372 | inline FrameConfigLine2: TFrameConfigLine 373 | Left = 1 374 | Top = 31 375 | Width = 546 376 | Height = 31 377 | Align = alTop 378 | Font.Charset = DEFAULT_CHARSET 379 | Font.Color = clWindowText 380 | Font.Height = -11 381 | Font.Name = 'Tahoma' 382 | Font.Style = [] 383 | ParentFont = False 384 | TabOrder = 1 385 | ExplicitLeft = 1 386 | ExplicitTop = 31 387 | ExplicitWidth = 546 388 | inherited GridPanelConfigLine: TGridPanel 389 | Width = 546 390 | ControlCollection = < 391 | item 392 | Column = 0 393 | Control = FrameConfigLine2.CheckBoxEnable 394 | Row = 0 395 | end 396 | item 397 | Column = 1 398 | Control = FrameConfigLine2.ComboBoxPath 399 | Row = 0 400 | end 401 | item 402 | Column = 3 403 | Control = FrameConfigLine2.ComboBoxOffset 404 | Row = 0 405 | end 406 | item 407 | Column = 2 408 | Control = FrameConfigLine2.ImageOpenFile 409 | Row = 0 410 | end> 411 | ExplicitWidth = 546 412 | inherited CheckBoxEnable: TCheckBox 413 | OnMouseLeave = FrameConfigLineChange 414 | end 415 | inherited ComboBoxPath: TComboBox 416 | Width = 394 417 | OnChange = FrameConfigLineChange 418 | ExplicitWidth = 394 419 | end 420 | inherited ComboBoxOffset: TComboBox 421 | Left = 445 422 | OnChange = FrameConfigLineChange 423 | ExplicitLeft = 445 424 | end 425 | inherited ImageOpenFile: TImage 426 | Left = 415 427 | ExplicitLeft = 368 428 | end 429 | end 430 | end 431 | inline FrameConfigLine3: TFrameConfigLine 432 | Left = 1 433 | Top = 61 434 | Width = 546 435 | Height = 30 436 | Align = alTop 437 | Font.Charset = DEFAULT_CHARSET 438 | Font.Color = clWindowText 439 | Font.Height = -11 440 | Font.Name = 'Tahoma' 441 | Font.Style = [] 442 | ParentFont = False 443 | TabOrder = 2 444 | ExplicitLeft = 1 445 | ExplicitTop = 61 446 | ExplicitWidth = 546 447 | ExplicitHeight = 30 448 | inherited GridPanelConfigLine: TGridPanel 449 | Width = 546 450 | Height = 30 451 | ControlCollection = < 452 | item 453 | Column = 0 454 | Control = FrameConfigLine3.CheckBoxEnable 455 | Row = 0 456 | end 457 | item 458 | Column = 1 459 | Control = FrameConfigLine3.ComboBoxPath 460 | Row = 0 461 | end 462 | item 463 | Column = 3 464 | Control = FrameConfigLine3.ComboBoxOffset 465 | Row = 0 466 | end 467 | item 468 | Column = 2 469 | Control = FrameConfigLine3.ImageOpenFile 470 | Row = 0 471 | end> 472 | ExplicitWidth = 546 473 | ExplicitHeight = 30 474 | inherited CheckBoxEnable: TCheckBox 475 | Height = 28 476 | OnMouseLeave = FrameConfigLineChange 477 | ExplicitHeight = 28 478 | end 479 | inherited ComboBoxPath: TComboBox 480 | Width = 394 481 | OnChange = FrameConfigLineChange 482 | ExplicitWidth = 394 483 | end 484 | inherited ComboBoxOffset: TComboBox 485 | Left = 445 486 | OnChange = FrameConfigLineChange 487 | ExplicitLeft = 445 488 | end 489 | inherited ImageOpenFile: TImage 490 | Left = 415 491 | Height = 28 492 | ExplicitLeft = 368 493 | ExplicitHeight = 28 494 | end 495 | end 496 | end 497 | inline FrameConfigLine4: TFrameConfigLine 498 | Left = 1 499 | Top = 91 500 | Width = 546 501 | Height = 30 502 | Align = alTop 503 | Font.Charset = DEFAULT_CHARSET 504 | Font.Color = clWindowText 505 | Font.Height = -11 506 | Font.Name = 'Tahoma' 507 | Font.Style = [] 508 | ParentFont = False 509 | TabOrder = 3 510 | ExplicitLeft = 1 511 | ExplicitTop = 91 512 | ExplicitWidth = 546 513 | ExplicitHeight = 30 514 | inherited GridPanelConfigLine: TGridPanel 515 | Width = 546 516 | Height = 30 517 | ControlCollection = < 518 | item 519 | Column = 0 520 | Control = FrameConfigLine4.CheckBoxEnable 521 | Row = 0 522 | end 523 | item 524 | Column = 1 525 | Control = FrameConfigLine4.ComboBoxPath 526 | Row = 0 527 | end 528 | item 529 | Column = 3 530 | Control = FrameConfigLine4.ComboBoxOffset 531 | Row = 0 532 | end 533 | item 534 | Column = 2 535 | Control = FrameConfigLine4.ImageOpenFile 536 | Row = 0 537 | end> 538 | ExplicitWidth = 546 539 | ExplicitHeight = 30 540 | inherited CheckBoxEnable: TCheckBox 541 | Height = 28 542 | OnMouseLeave = FrameConfigLineChange 543 | ExplicitHeight = 28 544 | end 545 | inherited ComboBoxPath: TComboBox 546 | Width = 394 547 | OnChange = FrameConfigLineChange 548 | ExplicitWidth = 394 549 | end 550 | inherited ComboBoxOffset: TComboBox 551 | Left = 445 552 | OnChange = FrameConfigLineChange 553 | ExplicitLeft = 445 554 | end 555 | inherited ImageOpenFile: TImage 556 | Left = 415 557 | Height = 28 558 | ExplicitLeft = 368 559 | ExplicitHeight = 28 560 | end 561 | end 562 | end 563 | inline FrameConfigLine5: TFrameConfigLine 564 | Left = 1 565 | Top = 121 566 | Width = 546 567 | Height = 30 568 | Align = alTop 569 | Font.Charset = DEFAULT_CHARSET 570 | Font.Color = clWindowText 571 | Font.Height = -11 572 | Font.Name = 'Tahoma' 573 | Font.Style = [] 574 | ParentFont = False 575 | TabOrder = 4 576 | ExplicitLeft = 1 577 | ExplicitTop = 121 578 | ExplicitWidth = 546 579 | ExplicitHeight = 30 580 | inherited GridPanelConfigLine: TGridPanel 581 | Width = 546 582 | Height = 30 583 | ControlCollection = < 584 | item 585 | Column = 0 586 | Control = FrameConfigLine5.CheckBoxEnable 587 | Row = 0 588 | end 589 | item 590 | Column = 1 591 | Control = FrameConfigLine5.ComboBoxPath 592 | Row = 0 593 | end 594 | item 595 | Column = 3 596 | Control = FrameConfigLine5.ComboBoxOffset 597 | Row = 0 598 | end 599 | item 600 | Column = 2 601 | Control = FrameConfigLine5.ImageOpenFile 602 | Row = 0 603 | end> 604 | ExplicitWidth = 546 605 | ExplicitHeight = 30 606 | inherited CheckBoxEnable: TCheckBox 607 | Height = 28 608 | OnMouseLeave = FrameConfigLineChange 609 | ExplicitHeight = 28 610 | end 611 | inherited ComboBoxPath: TComboBox 612 | Width = 394 613 | OnChange = FrameConfigLineChange 614 | ExplicitWidth = 394 615 | end 616 | inherited ComboBoxOffset: TComboBox 617 | Left = 445 618 | OnChange = FrameConfigLineChange 619 | ExplicitLeft = 445 620 | end 621 | inherited ImageOpenFile: TImage 622 | Left = 415 623 | Height = 28 624 | ExplicitLeft = 368 625 | ExplicitHeight = 28 626 | end 627 | end 628 | end 629 | inline FrameConfigLine6: TFrameConfigLine 630 | Left = 1 631 | Top = 151 632 | Width = 546 633 | Height = 30 634 | Align = alTop 635 | Font.Charset = DEFAULT_CHARSET 636 | Font.Color = clWindowText 637 | Font.Height = -11 638 | Font.Name = 'Tahoma' 639 | Font.Style = [] 640 | ParentFont = False 641 | TabOrder = 5 642 | ExplicitLeft = 1 643 | ExplicitTop = 151 644 | ExplicitWidth = 546 645 | ExplicitHeight = 30 646 | inherited GridPanelConfigLine: TGridPanel 647 | Width = 546 648 | Height = 30 649 | ControlCollection = < 650 | item 651 | Column = 0 652 | Control = FrameConfigLine6.CheckBoxEnable 653 | Row = 0 654 | end 655 | item 656 | Column = 1 657 | Control = FrameConfigLine6.ComboBoxPath 658 | Row = 0 659 | end 660 | item 661 | Column = 3 662 | Control = FrameConfigLine6.ComboBoxOffset 663 | Row = 0 664 | end 665 | item 666 | Column = 2 667 | Control = FrameConfigLine6.ImageOpenFile 668 | Row = 0 669 | end> 670 | ExplicitWidth = 546 671 | ExplicitHeight = 30 672 | inherited CheckBoxEnable: TCheckBox 673 | Height = 28 674 | OnMouseLeave = FrameConfigLineChange 675 | ExplicitHeight = 28 676 | end 677 | inherited ComboBoxPath: TComboBox 678 | Width = 394 679 | OnChange = FrameConfigLineChange 680 | ExplicitWidth = 394 681 | end 682 | inherited ComboBoxOffset: TComboBox 683 | Left = 445 684 | OnChange = FrameConfigLineChange 685 | ExplicitLeft = 445 686 | end 687 | inherited ImageOpenFile: TImage 688 | Left = 415 689 | Height = 28 690 | ExplicitLeft = 368 691 | ExplicitHeight = 28 692 | end 693 | end 694 | end 695 | inline FrameConfigLine7: TFrameConfigLine 696 | Left = 1 697 | Top = 181 698 | Width = 546 699 | Height = 30 700 | Align = alTop 701 | Font.Charset = DEFAULT_CHARSET 702 | Font.Color = clWindowText 703 | Font.Height = -11 704 | Font.Name = 'Tahoma' 705 | Font.Style = [] 706 | ParentFont = False 707 | TabOrder = 6 708 | ExplicitLeft = 1 709 | ExplicitTop = 181 710 | ExplicitWidth = 546 711 | ExplicitHeight = 30 712 | inherited GridPanelConfigLine: TGridPanel 713 | Width = 546 714 | Height = 30 715 | ControlCollection = < 716 | item 717 | Column = 0 718 | Control = FrameConfigLine7.CheckBoxEnable 719 | Row = 0 720 | end 721 | item 722 | Column = 1 723 | Control = FrameConfigLine7.ComboBoxPath 724 | Row = 0 725 | end 726 | item 727 | Column = 3 728 | Control = FrameConfigLine7.ComboBoxOffset 729 | Row = 0 730 | end 731 | item 732 | Column = 2 733 | Control = FrameConfigLine7.ImageOpenFile 734 | Row = 0 735 | end> 736 | ExplicitWidth = 546 737 | ExplicitHeight = 30 738 | inherited CheckBoxEnable: TCheckBox 739 | Height = 28 740 | OnMouseLeave = FrameConfigLineChange 741 | ExplicitHeight = 28 742 | end 743 | inherited ComboBoxPath: TComboBox 744 | Width = 394 745 | OnChange = FrameConfigLineChange 746 | ExplicitWidth = 394 747 | end 748 | inherited ComboBoxOffset: TComboBox 749 | Left = 445 750 | OnChange = FrameConfigLineChange 751 | ExplicitLeft = 445 752 | end 753 | inherited ImageOpenFile: TImage 754 | Left = 415 755 | Height = 28 756 | ExplicitLeft = 368 757 | ExplicitHeight = 28 758 | end 759 | end 760 | end 761 | end 762 | end 763 | object TabSheetAdvanced: TTabSheet 764 | Caption = 'Advanced' 765 | ImageIndex = 4 766 | object LabelFlashBaudrate: TLabel 767 | Left = 16 768 | Top = 27 769 | Width = 91 770 | Height = 28 771 | Caption = 'Baudrate' 772 | Font.Charset = ANSI_CHARSET 773 | Font.Color = clWindowText 774 | Font.Height = -21 775 | Font.Name = #24494#36719#38597#40657 776 | Font.Style = [] 777 | ParentFont = False 778 | end 779 | object LabelFlashSize: TLabel 780 | Left = 16 781 | Top = 69 782 | Width = 96 783 | Height = 28 784 | Caption = 'Flash size' 785 | Font.Charset = ANSI_CHARSET 786 | Font.Color = clWindowText 787 | Font.Height = -21 788 | Font.Name = #24494#36719#38597#40657 789 | Font.Style = [] 790 | ParentFont = False 791 | end 792 | object LabelFlashSpeed: TLabel 793 | Left = 16 794 | Top = 111 795 | Width = 118 796 | Height = 28 797 | Caption = 'Flash speed' 798 | Font.Charset = ANSI_CHARSET 799 | Font.Color = clWindowText 800 | Font.Height = -21 801 | Font.Name = #24494#36719#38597#40657 802 | Font.Style = [] 803 | ParentFont = False 804 | end 805 | object LabelSPIMode: TLabel 806 | Left = 16 807 | Top = 153 808 | Width = 96 809 | Height = 28 810 | Caption = 'SPI Mode' 811 | Font.Charset = ANSI_CHARSET 812 | Font.Color = clWindowText 813 | Font.Height = -21 814 | Font.Name = #24494#36719#38597#40657 815 | Font.Style = [] 816 | ParentFont = False 817 | end 818 | object ComboBoxFlashBaudrate: TComboBox 819 | Left = 140 820 | Top = 24 821 | Width = 162 822 | Height = 36 823 | Font.Charset = ANSI_CHARSET 824 | Font.Color = clWindowText 825 | Font.Height = -21 826 | Font.Name = #24494#36719#38597#40657 827 | Font.Style = [] 828 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 829 | ParentColor = True 830 | ParentFont = False 831 | ParentShowHint = False 832 | ShowHint = True 833 | TabOrder = 0 834 | TabStop = False 835 | Text = '230400' 836 | TextHint = 'Baudrate' 837 | OnChange = FrameConfigLineChange 838 | Items.Strings = ( 839 | '9600' 840 | '19200' 841 | '38400' 842 | '57600' 843 | '74880' 844 | '115200' 845 | '230400' 846 | '460800' 847 | '512000' 848 | '576000' 849 | '921600') 850 | end 851 | object ComboBoxFlashSize: TComboBox 852 | Left = 140 853 | Top = 66 854 | Width = 162 855 | Height = 36 856 | Style = csDropDownList 857 | Font.Charset = ANSI_CHARSET 858 | Font.Color = clWindowText 859 | Font.Height = -21 860 | Font.Name = #24494#36719#38597#40657 861 | Font.Style = [] 862 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 863 | ItemIndex = 4 864 | ParentColor = True 865 | ParentFont = False 866 | ParentShowHint = False 867 | ShowHint = True 868 | TabOrder = 1 869 | TabStop = False 870 | Text = '4MByte' 871 | TextHint = 'Select size' 872 | OnChange = FrameConfigLineChange 873 | Items.Strings = ( 874 | '256kByte' 875 | '512kByte' 876 | '1MByte' 877 | '2MByte' 878 | '4MByte' 879 | '8MByte' 880 | '16MByte') 881 | end 882 | object ComboBoxFlashSpeed: TComboBox 883 | Left = 140 884 | Top = 108 885 | Width = 162 886 | Height = 36 887 | Style = csDropDownList 888 | Font.Charset = ANSI_CHARSET 889 | Font.Color = clWindowText 890 | Font.Height = -21 891 | Font.Name = #24494#36719#38597#40657 892 | Font.Style = [] 893 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 894 | ItemIndex = 0 895 | ParentColor = True 896 | ParentFont = False 897 | ParentShowHint = False 898 | ShowHint = True 899 | TabOrder = 2 900 | TabStop = False 901 | Text = '40MHz' 902 | TextHint = 'Select speed' 903 | OnChange = FrameConfigLineChange 904 | Items.Strings = ( 905 | '40MHz' 906 | '26.7MHz' 907 | '20MHz' 908 | '80MHz') 909 | end 910 | object ButtonRestoreDefault: TButton 911 | Left = 328 912 | Top = 24 913 | Width = 198 914 | Height = 162 915 | Caption = 'Restore default' 916 | TabOrder = 3 917 | OnClick = ButtonRestoreDefaultClick 918 | end 919 | object ComboBoxSPIMode: TComboBox 920 | Left = 140 921 | Top = 150 922 | Width = 162 923 | Height = 36 924 | Style = csDropDownList 925 | Font.Charset = ANSI_CHARSET 926 | Font.Color = clWindowText 927 | Font.Height = -21 928 | Font.Name = #24494#36719#38597#40657 929 | Font.Style = [] 930 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 931 | ItemIndex = 1 932 | ParentColor = True 933 | ParentFont = False 934 | ParentShowHint = False 935 | ShowHint = True 936 | TabOrder = 4 937 | TabStop = False 938 | Text = 'DIO' 939 | TextHint = 'Select speed' 940 | OnChange = FrameConfigLineChange 941 | Items.Strings = ( 942 | 'QIO' 943 | 'DIO' 944 | 'QOUT' 945 | 'DOUT') 946 | end 947 | end 948 | object TabSheetIntroduction: TTabSheet 949 | Caption = 'About' 950 | ImageIndex = 2 951 | object RichEditNote: TRichEdit 952 | Left = 0 953 | Top = 0 954 | Width = 548 955 | Height = 228 956 | Align = alClient 957 | BevelInner = bvNone 958 | BevelOuter = bvNone 959 | BorderStyle = bsNone 960 | Ctl3D = False 961 | Font.Charset = GB2312_CHARSET 962 | Font.Color = clWindowText 963 | Font.Height = -14 964 | Font.Name = #24494#36719#38597#40657 965 | Font.Style = [] 966 | Lines.Strings = ( 967 | 'If you have any questions, please contact me.' 968 | 'Vowstar ' 969 | 'NodeMcu is a powerful tool for software engineers' 970 | 'to program from HardwareIO to Wifi network within' 971 | 'several minites.' 972 | 'This programmer can flash esp8266 by one click.' 973 | 'Our website is http://www.nodemcu.com' 974 | 'Our Tencent QQ Group:309957875.' 975 | '') 976 | ParentColor = True 977 | ParentCtl3D = False 978 | ParentFont = False 979 | ReadOnly = True 980 | ScrollBars = ssBoth 981 | TabOrder = 0 982 | Zoom = 100 983 | end 984 | end 985 | object TabSheetLog: TTabSheet 986 | Caption = 'Log' 987 | Font.Charset = ANSI_CHARSET 988 | Font.Color = clWindowText 989 | Font.Height = -21 990 | Font.Name = #24494#36719#38597#40657 991 | Font.Style = [] 992 | ImageIndex = 1 993 | ParentFont = False 994 | ExplicitLeft = 0 995 | ExplicitTop = 0 996 | ExplicitWidth = 0 997 | ExplicitHeight = 0 998 | object MemoOutput: TMemo 999 | Left = 0 1000 | Top = 0 1001 | Width = 548 1002 | Height = 228 1003 | Hint = #36816#34892#36755#20986'.|'#23547#21271#31243#24207#30340#36816#34892#36755#20986#22312#36825#37324#26174#31034'.' 1004 | Align = alClient 1005 | Font.Charset = ANSI_CHARSET 1006 | Font.Color = clWindowText 1007 | Font.Height = -14 1008 | Font.Name = #24494#36719#38597#40657 1009 | Font.Style = [] 1010 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 1011 | ParentColor = True 1012 | ParentFont = False 1013 | ParentShowHint = False 1014 | ReadOnly = True 1015 | ScrollBars = ssVertical 1016 | ShowHint = True 1017 | TabOrder = 0 1018 | OnChange = MemoOutputChange 1019 | end 1020 | end 1021 | end 1022 | object ActionListStandard: TActionList 1023 | Left = 272 1024 | object FileExit: TFileExit 1025 | Category = 'File' 1026 | Caption = #36864#20986'(&X)' 1027 | Hint = 'Exit|Quits the application' 1028 | ImageIndex = 43 1029 | end 1030 | object ActionBurn: TAction 1031 | Category = 'Control' 1032 | Caption = #19968#38190#28903#20889'(&F)' 1033 | OnExecute = ActionBurnExecute 1034 | end 1035 | end 1036 | object TimerFindPorts: TTimer 1037 | Interval = 500 1038 | OnTimer = TimerFindPortsTimer 1039 | Left = 448 1040 | end 1041 | object TimerStateMachine: TTimer 1042 | Enabled = False 1043 | Interval = 50 1044 | OnTimer = TimerStateMachineTimer 1045 | Left = 368 1046 | end 1047 | object IdHTTPUpdate: TIdHTTP 1048 | AllowCookies = True 1049 | ProxyParams.BasicAuthentication = False 1050 | ProxyParams.ProxyPort = 0 1051 | Request.ContentLength = -1 1052 | Request.ContentRangeEnd = -1 1053 | Request.ContentRangeStart = -1 1054 | Request.ContentRangeInstanceLength = -1 1055 | Request.Accept = #9'text/html, application/xhtml+xml, */*' 1056 | Request.AcceptCharSet = 'utf-8' 1057 | Request.BasicAuthentication = False 1058 | Request.UserAgent = 1059 | 'Mozilla/5.0 (Windows NT 6.3; ARM; Trident/7.0; Touch; rv:11.0) l' + 1060 | 'ike Gecko' 1061 | Request.Ranges.Units = 'bytes' 1062 | Request.Ranges = <> 1063 | HTTPOptions = [] 1064 | Left = 512 1065 | end 1066 | object TimerCode: TTimer 1067 | Interval = 100 1068 | OnTimer = TimerCodeTimer 1069 | Left = 496 1070 | Top = 112 1071 | end 1072 | end 1073 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/UnitFormMain.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/UnitFormMain.pas -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/UnitFrameConfigLine.dfm: -------------------------------------------------------------------------------- 1 | object FrameConfigLine: TFrameConfigLine 2 | Left = 0 3 | Top = 0 4 | Width = 375 5 | Height = 31 6 | Font.Charset = DEFAULT_CHARSET 7 | Font.Color = clWindowText 8 | Font.Height = -11 9 | Font.Name = 'Tahoma' 10 | Font.Style = [] 11 | ParentFont = False 12 | TabOrder = 0 13 | object GridPanelConfigLine: TGridPanel 14 | Left = 0 15 | Top = 0 16 | Width = 375 17 | Height = 31 18 | Align = alClient 19 | ColumnCollection = < 20 | item 21 | SizeStyle = ssAbsolute 22 | Value = 20.000000000000000000 23 | end 24 | item 25 | Value = 100.000000000000000000 26 | end 27 | item 28 | SizeStyle = ssAbsolute 29 | Value = 30.000000000000000000 30 | end 31 | item 32 | SizeStyle = ssAbsolute 33 | Value = 100.000000000000000000 34 | end> 35 | ControlCollection = < 36 | item 37 | Column = 0 38 | Control = CheckBoxEnable 39 | Row = 0 40 | end 41 | item 42 | Column = 1 43 | Control = ComboBoxPath 44 | Row = 0 45 | end 46 | item 47 | Column = 3 48 | Control = ComboBoxOffset 49 | Row = 0 50 | end 51 | item 52 | Column = 2 53 | Control = ImageOpenFile 54 | Row = 0 55 | end> 56 | Font.Charset = ANSI_CHARSET 57 | Font.Color = clWindowText 58 | Font.Height = -21 59 | Font.Name = #24494#36719#38597#40657 60 | Font.Style = [] 61 | ParentFont = False 62 | RowCollection = < 63 | item 64 | Value = 100.000000000000000000 65 | end> 66 | TabOrder = 0 67 | object CheckBoxEnable: TCheckBox 68 | Left = 1 69 | Top = 1 70 | Width = 20 71 | Height = 29 72 | Align = alClient 73 | Font.Charset = ANSI_CHARSET 74 | Font.Color = clWindowText 75 | Font.Height = -15 76 | Font.Name = #24494#36719#38597#40657 77 | Font.Style = [] 78 | ParentFont = False 79 | TabOrder = 0 80 | end 81 | object ComboBoxPath: TComboBox 82 | Left = 21 83 | Top = 1 84 | Width = 223 85 | Height = 28 86 | Align = alClient 87 | Font.Charset = ANSI_CHARSET 88 | Font.Color = clWindowText 89 | Font.Height = -15 90 | Font.Name = #24494#36719#38597#40657 91 | Font.Style = [] 92 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 93 | ParentFont = False 94 | TabOrder = 1 95 | TextHint = 'Path of binary file' 96 | end 97 | object ComboBoxOffset: TComboBox 98 | Left = 274 99 | Top = 1 100 | Width = 100 101 | Height = 28 102 | Align = alClient 103 | Font.Charset = ANSI_CHARSET 104 | Font.Color = clWindowText 105 | Font.Height = -15 106 | Font.Name = #24494#36719#38597#40657 107 | Font.Style = [] 108 | ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 109 | ParentFont = False 110 | Sorted = True 111 | TabOrder = 2 112 | TextHint = 'Offset' 113 | OnKeyPress = ComboBoxOffsetKeyPress 114 | Items.Strings = ( 115 | '0x00000' 116 | '0x01000' 117 | '0x10000' 118 | '0x1FC000' 119 | '0x1FE000' 120 | '0x3C000' 121 | '0x3E000' 122 | '0x3FC000' 123 | '0x3FE000' 124 | '0x40000' 125 | '0x7C000' 126 | '0x7E000' 127 | '0x7FC000' 128 | '0x7FE000' 129 | '0xFC000' 130 | '0xFE000' 131 | '0xFFC000' 132 | '0xFFE000') 133 | end 134 | object ImageOpenFile: TImage 135 | Left = 244 136 | Top = 1 137 | Width = 30 138 | Height = 29 139 | Cursor = crHandPoint 140 | Align = alClient 141 | Picture.Data = { 142 | 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000800000 143 | 00800806000000C33E61CB000042324944415478DAED7D079C54D5D9FE33BD6F 144 | 6F2CBBF42220202A458AA26043147B542C898AC658A2517F31C62F9F5DA326B6 145 | 68C41663FB8C1ABBD8208082B2584060E96D97657B99DD9D5EFFEF7BEE3DB377 146 | 666769B22EF9C3F177BD33C3EC9D7BCFF3BCF5BCE71C1D0EB583BAE97AFA060E 147 | B59E6D87087090B7430438C8DB21021CE4ED10010EF276880007793B448083BC 148 | 1D22C041DE0E11E0206F070501CACBCB4FB1582DB70703C1A427D6A96FE2F45F 149 | A2D14BA3C9887024BCB5A1AEE1CAE38F3F3ED2D3F7DF9DEDA020C0C68D1BFF9E 150 | 9999F96B7FC00F9DAEE391D311201E8F43AFD3C3EFF787F57AFDB0C183076FE9 151 | E9FBEFCEF6FF3D010850C3B68A6DCB2C66CBD1E170788F08C0CD643421180C9E 152 | 3760C080B77BFA19BAB3FD571160DEBC79163ECF983123B8A77FB373E7CED248 153 | 34B2DA60306432B802F45D3CB52480D56A85D7E77DA45F9F7EB7EECD3D2E5CB8 154 | 308BCC86BBA7FB6A4FDB7F0D01BEFFFEFB13F446FDBD0450757666F6C5FDFBF7 155 | 0FECC9DF5556569E6CB6983F8DC5629A874E4F02093E2B04B3D90C32190B4B4B 156 | 4A4FD8D37B5CB162C50C83D1F04438147EA325D2F2E8F4F1D39B7ABADF76D70E 157 | 78029495950D31980C7F24D53DDB66B5198C462382A1E0AB417FF0F2A38F3E3A 158 | BCBBBFAFAEAEFEA3DD61BF37100874025EA77993300371E5B5416F00998C5A22 159 | CEE1252525BB0572CD9A35C7EBF4BA7F93DF90CD6423F3B1311A8FDEE769F5BC 160 | 7E203B92072C0116AE5898650BDB6E301A8C37D8ECB6DC583406EA5CE80D7AD8 161 | 2C36048281A7870E197A1D1123BEABEBD4D6D6BE6BB7DBCF2440A0E09FC4808E 162 | 96C03FAEBCD6098D100B4683134B8B4ACB76F51BEBD6AD3B8A24FF63BA9742F6 163 | 33A2D1A8F89CCFA170E83FF168FCCEF1E3C77FD5D37D9AAE1D7004A04ED77FB3 164 | FC9B0B4802EF20891F26BC72029E2592C11724A0839C3A96B27B060D1AF4A7AE 165 | AEB56DDB36ABD3E95C492660682412511F58D7F593A790804247F802BE2B0B72 166 | 0B5EE8EA37B66CD9329824FF53F23106848221B0F4476351013E9F454411F087 167 | A391E8CBF158FC814993261D5051C5014580A54B971E13D7C7EF22704F642F9C 168 | 81200DA010C060482281784DE7482C721D396A4FA5BB5E9DBB6EA0316A5C45D2 169 | 694F3880BB7BEA7807016C361B3C1ECF53797979D7A5FBEAD6BAAD85FA80FE53 170 | BADF234823810016A00B1244953339A090DACBE7F33584A3E1BF7ADBBC4F9323 171 | DBD6D3FDBDBBAEF8D91A79CEFDC8CEFF9E3AE957D4E916068B8167D0BB04DFA0 172 | 9CA98522F1C845A5C5A5FF4EBD6E53531327803E21E94B56FFA9A6001AD5AF79 173 | AD3A825FE564E71C9B7AEDF2F272676666E6BB569B753AFB170CB638A2B12412 174 | 680FE988D235578723E17B329D99EFED891FD39DADC709F0E5975FF6A2EEF9C6 175 | 6977F6E58E93C06B0F4902ED591CA45E396B479DEE26D29C565858F8756B6B6B 176 | 0EBD1E130A858E2187F12C02F148E1DDA7013D9D0FA0BC5408C03903BA8E9FC0 177 | 7B9DAEF5159D97E7E6E66EE0AF906FF11291F5D254C9D7924082AE25019B22BE 178 | 3EDF1369843BA61D3FEDBE9EECFF1E270049BF9524E23BEAD81152AA53099024 179 | FD5A02684810F007761060CBE860E04B388EE74E6600C846272200DD6E1E5986 180 | 829204421B51E4C1C0F9FDFE007DFE031D4D2683E97401A40AFEAE48907AB059 181 | 2062A1A9B9E957679D71D64B3DD9FF3D4E006EFFFAD7BF1EE9DBAFEFCDAC7219 182 | 54EE7009BC00DCD0D909D412802595FF8DFD06EE7421BD2AE889CCDFAE22006E 183 | 693440E23D13291E4B68056EECEDF3F7186C069FFF5D6BFB13AFA38A1F904A02 184 | D220EEDA9ADA9173E6CCA9EAC9BE3F2008F0FA9BAF9F505450349F6CADAE2BE9 185 | 4F4B00069F80E633BFE7A79184904F97440220E975BA964806695EF359AB1124 186 | 2124F0E22C418F752680947A1919B04F525959F9F959679E750A92A8F6F3B703 187 | 82004F3DF594B3FF80FE3F9694940C480BBEB4FFAAE72F8890023E032B0F2DF0 188 | 12F0DD019FDA7605BEF61060ABD29F6406B47E80460BF0BF9129416545E5F5E7 189 | 9E7BEEDF7ABAEF0F080270FBE0830FE6F61BD0EF2A56E349AA3F4D0420805735 190 | 4012F81AB5AF053FF1B07B4802AD1690EF13874A0601781A12EC4924505353E3 191 | 73B7B88F20026CEAE97E3F6008F0EEBBEF9E5A545C348FCC4047E897260AD002 192 | DF097C9D2ED90400897F97DFDDD326C14C3509A9D22FCD41C21788C53AE50252 193 | 49505159B1F894934E397E7759CC9FA31D300478F5D557337A15F7FAB14F699F 194 | 7EA9929F74D6A751FDFA0EE0E5C17F2F01670FBEB1B90535750DA8AD6F404353 195 | 339A5BDC08043B06159D0E0772B3B35090978B5E85F9282CC8474E5666E21A31 196 | A1CE63493E80561324A43FD517886A08409FA9EAFFA69933673ED6D37DCEED80 197 | 2100B7CF3EFBEC69F205AE31994C9D124009FB2F255F82AEAA7D193DF0993BBE 198 | A26A2756AE5987AF977F8FEF7F5C2DDEBB5B5B09004EDAC4D5589C1FBF4308F9 199 | 9DD16880DD66435E6E0E06F6EF87F1471D8189478FC1E1870D2552E489EF31A1 200 | D8912378931DC1DD9801FEACBAA6DABBB36AE791175C70C1C69EEE6FF9CC074C 201 | FBF4D34FA79496962E723A9D7AE9EC75720035AA5F9E2D16339DF5A8ACAAC627 202 | FFF9121F7EB6002B56AD46B3DB4DA01860B466C068CB86CE4C126D72216EB021 203 | 429FC7E96F94519F18FD3F06433C8478D8035DA41D317F0BC20137A2212FCC26 204 | 037A151562E2D8A371E6A927E2F8C913904DDA214A440845281C8C6AC0D79040 205 | 6B0264167047E58E4F274F9E7C6A4FF7B56CDD46008AED2759EC9629BA986E7E 206 | 7346F39A5F1DFFABDD8EDF6FDAB4E93693D9741F81AAEF9401D410404ABFC562 207 | 11EFBF5F558E97DEF8373EFA7C01AA6BEB60303B61C92881CE518288A5005103 208 | 836E81C96C81C36686CB6E46A6D30C8BC908A341273442301C853710469B3704 209 | AF3F8800A9EA58C80343A80586400D629E4A84DAEB8968510C193810BF387326 210 | 2E3AFB74F4EF5B8A70288450389C4C8068B219E02880C91A0E857F0C8542670E 211 | 1B366CFBEEFAE3FDCFDF2F0E7BC39343C1D000A3DEF8F0F9E79F1FFDAF20C013 212 | F39EB0E4B7E77F999999398E6E3E6A3419D7935AFF841EE2439BCDF6EDC48913 213 | FDA97F535E5E7E97D566FD9304BBAB0410BF3711700C3EABF8279E7F051F7CFA 214 | 05DABD7E58334B60C81C8288AD0461A30B76BB157D0B3330A27F3646F425955E 215 | 9C89822C1B321D16D82C06D56F0001154398400A856368F506D1D81A4045BD07 216 | 1B77B8B1AEB205DBAADBE0266D027F3D8CDEAD88B46C46D0DB8CDEC5BD70E92F 217 | CEC255975C80925E85F0917991833F5A5F203130441A430C0AF97D6B49E19C45 218 | 24E86406785C241C0E4F0F47C2B3E8EF2690A1CAE3BF6D6B6F3BEFB28B2FDBEF 219 | E569DD4280575E7FE56ABBCDFE0C3B476CCF192C4ECD7247909D5E4BC7A7368B 220 | EDFD402020C8B066CD9AFF21F0EF96CE5B5ADBAFBEB6DB6DC2A17BE2F957F1C2 221 | EB6FA2A5D5037BCE40E8B20F47C85C446ADE8A81BD3331F588624C3EBC1883E8 222 | B5CBC63E05493A3B6DC261638F5E7D2D0EE5B5E20EC485466085CD677F30829A 223 | 262F566F6DC4D7E57558BBAD09DED60698DA3723DABC06FEB63A0C1CD01F375F 224 | 7305669F7306DDBB5E3897A93E803621A492607D44179931FAB0D1DBCACACAFA 225 | D3F7A687A3047A243A91345C76241CE141239132E67EA4BE5A17F407C75F71C5 226 | 15ED0734019E7BEEB942BBD3FEADD96C2E958E199380E37BCED9F3383E8FB3B3 227 | 13458097D3BF6D20C0CF668248D0C510704A2460A2EBF077E67FF935EE78F071 228 | AC5EB71EB6ACBE30E41D89B0B50471BAFEA881B998357900C60E2D20156F11C0 229 | C6D5F4AD5E2F23848EC796C06BC910A50FC364D3D9E30F47A4242B170A8522D8 230 | 5ED786C52BABB17C5D2D11A109A6D67284EA57221CF4E0D4695371EF1F7E87A1 231 | 83FAC3EBF325C5FEA9A120DF8BC7EB594B406F258027D3336631E83CB2C86966 232 | D200E2CC5A83CFDC975EAFF7F65F5EFACB070E6802BCF8D28B8F385DCE9BF9A1 233 | 1974013E1D82082A09C499DE73EE9F0F6678A714B04613F077F87A8F3EFB4F3C 234 | F6EC4B08C5880C45472396310C219D197D8A3270D69481386644116C56130837 235 | E127180589D867A0B3C810AA0450492081976488C414024485F42AE7081381FC 236 | 833011364267FE629CA30C22C2C2155558BDA501714F2DF40D65F0366C403199 237 | 82FB6FBF19679F7692D0040C6A22059C322A287E57291F4B80CEDF17671578F9 238 | 995A5DD414F287C6CE993367DB01490092FE5166ABF96B02DC61A0702A410015 239 | 784902490839E82386808DC9A0CBF756321FEED636DC7CD74378EF932F60CBEE 240 | 077DC12444ADF9D019F59832BA14A78CEB8B9C4C9B0098FFCE68E26BA8296383 241 | 364700F11DEDC010C3CF0464D24425016292002A09227C44C5116230C2ACD295 242 | 9C7E399986C52B29C46C6983B1753582D5CBA0A368E27764126EA183F307EC20 243 | F277E53880765450A488230A21B4522F8920DF13F8A25FBC1EEF3FAEB8FC8ACB 244 | 0F38025027EA5E78F185F76C0EDB19DCAB52F2D3822FBC6F631209B487FCCC6E 245 | B561474D2DAEBEF57F51F6C38FB0178D0172C7216AB4C2EA30E3D4F1FD316670 246 | 21742CE9744D336B1706DF6410F1BCC1A013E1216B03839A30125A407DF41864 247 | 76AFC31C44E38A0F20354038A2104010211C558940E084F808336BD0D2E6C3C2 248 | 1F2A5155DB4E4E6225A23B1721D85E878BCF3F0B0FFEF166414AB6E5327FA025 249 | 80D406820CAAD477D202E10E2290C608912F30EDEAABAF5E724011E099679E39 250 | DD6C33BF4FD2A613C09B4DE935807C6F54A45E1041530492009F3CF8ED3BAA71 251 | F94D7FC49AF59B61EF3D09F19CD1889214D81C569C34AE1F06F4CE469C4D8485 252 | 7F8FAF6714D26F22CD6030B22FA190A0236F905205A43A803229C4AFA32A21F8 253 | 1C210D20C08F28A620128D769020AC902042C0C6E8358182A5AB771261491304 254 | 9A10DB391FBEE66D38F7F419F8EB3D7F80C9C024082780D69A02794ED2005AF0 255 | 5533C05A80E9EBF7FB170F193464FAFEA836DE2F0478F8E1871DCE0CE752F2E4 256 | 4773479B4DE664DBAFF1019818A9D29F20805121808D9CBD9AFA06FCF2B7B763 257 | 35816FEB7D1CE2D9232896E7A48E059346F5466951168869043EFD96C5283480 258 | 49D50002784100BD009D71D793BCEB39E14307BFD6C515C72EAE9344D0815C33 259 | 3AF488C4F5E21CA5CF227174F80591A8AA11228208D130138000E262503A87C8 260 | 815BBEAE06F50D1E1883AD8855CD87BF6913CE3F7326FE72E7EF455F0589305A 261 | E0131A40D502AC5552C9A0D502FC396BD8802F70D9B5D75EFBF2014180279F7A 262 | F2269BDDF6574E87B2C39650FF1A0248A91704307698004900A911384AF05147 263 | 5E7ED31DF8E6BB95B09530F88783BE8438116BF8C07CF423C9D7D3F7C8DF20F0 264 | CD42FA8D2A018C82441C3292DA17D9BD280CB1308CB110756E80BC733FDA3C3E 265 | 7829660F5067B3DA677FC14AF7E5B059459869B558453819D19910D69353A933 266 | 0A323011148D104D9080091065D08804D150107E8F1F2B36D4D239087DC08DD8 267 | 8ECFE0274D70D56517E1CE5BAE551C3E097864EF4C803C38D944D7D9420EE1B8 268 | DFFDEE77CD3D4A8047FFFE683F63CCB88C802D941EBB96009D2200950C52FD4B 269 | B5AFFDF75BC8E1FBD7FBF3E02C998458CE513C510F31FAF7FCBC0C1C36201F06 270 | 720C8D7418087C45FD9B14D54FDF93C09B08706394E2685F3B6AEB1B5159530F 271 | 775B1B89731876039061250793B5047D3F44AADE4F60B605A3F0474963982CC8 272 | C9CE4269613E727272A0B33A1136DA106132C4F5C2476033100DB14D0F8B3313 273 | 800F10099A9ADAB1617B030845E8BC8D8855CE43C85387BB6FBB09975F78363C 274 | 1EAF22EDEA1C823D22006B8450C799352D91E0FE1BAEBBE18F3D4A8007FEFCC0 275 | AD2E97EB21B6B30C8456FD774500AD06D01E2E8703CFBEF636EE7EE44958F349 276 | E5171E47E09B85E41B48F50FEE970F7B861D7A013E9180FD0C22803833A17471 277 | 21E9A6B0073E7723B65454A1A9B1118576604CEF0C8C20CDD1273F13B9994E72 278 | 302D82307A9D22D9ECA97B483BD4BBDB29D66FC5AA2A377EAC69475BC488A2A2 279 | 429496F486D1998388C94144302BFE029B05D6000C1A9DE3EC0FB039200DB66D 280 | 47139A9BDBA1E77C475B052215F36031C6F18FC71FC0B83123E1F17A3B54FFDE 281 | 6800FA5C3A941411549B8DE6913F450BFC64025CFB876B73337419CFE617E69F 282 | 4D44E84480DD990079B0EA5DB576232EBDFEF708C2097DC90CC42D19A00B2246 283 | D7CCCAC9402FB6FB2AF82CFD06D636669362EFC96A9BC25E44DB1AB07DFB7678 284 | 5A1A30AEC4819386F7C2E1FD8B515490075766166C363B1151196D141DA0D325 285 | 0DE7725EDFEFF3A2ADD54D0E5D1D7ED852834FCA6BB1BE398282A262F42EED8B 286 | B83D0751935DF11738D1A3FA02B1106B002641109E560F2AAA08976040D1048D 287 | AB10A85C80E14306E195A7FE0C3B991B3607BB2240573E00278BEAEBEADB5ADB 288 | 5A2F7BF49147DFFF297505FBC507B8EAAAABECF905F9CF161615CECEC8CC4890 289 | 20350B989A089287920C82F0F897AF5C0B5BFF998839FB92F493DD275B0F720A 290 | 0B0BB3607739481D5B05F00A014C22D1A327B56E0ABAE1AEA9406D550526145B 291 | 70DED17D70C4907E282CEA05872B43981A6D3147971DA2A929885087B7BA5B50 292 | 5555856FD66DC71BDF55619BCF847E0306C2965B8CB0390331327B22CDCBF901 293 | E10C2A6680B54055750BFC6D1EE8D97BE7F2F19DFF81AFEE475C75E985F8C3F5 294 | 7344B630C9EB57BDFD5D39819C1EAEABAD6B6C6F6D9F4DCEF7E73F15BBFD1606 295 | DE79E79D4692A1BFE6E7E75FCF76531B062645029A2490244286CB8997DE7C1F 296 | 773DFC24ECC56311CF3F86676510F8663A93B43B1DC8CBCB84C16623F56F160E 297 | A09EFE4D387B5172B6BC0DA8ABD80CABBF11578C2FC6C9470D459F7EFD61B33B 298 | 12C3B07B5B11C44DCC26D2E9C4355ADDCDD8BC790BDEFA6623DE2A7723AB571F 299 | 6415F747D49A45D18929610E98006C0A48BCD1D2DC0677632B7444081D7DA6F3 300 | D6235AF1218CF1005E2253306AF860F8C8EC24423DA90152CE92185C4C525353 301 | 53D1DAD27AC1430F3DB46C7FE0B6DF53C177DF7BF79F880077121174660192B1 302 | CB54307FCE99BEE6D6365CF8EB5B50DF4ADE7A9FD349C566AB0460E9B7C19CE1 303 | 4046968BD4BF55D87F41020EF5087CB4D7A16EEB7A1CE6F0E3C6130663FCE811 304 | C82D2814EA95432E93AA61E4B0F29E90209D961043B90446F58E0A7C5EB6068F 305 | 2FD981A0B308797D87006C12F446410241802093802282362F5A1ADB38661384 306 | 1024A8FF1EFEAAC5387ED204FCEDBEDBC53D26E5FED369007AEDF3FA505B53BB 307 | DADDE2BEE081071E58BBBFF0EA96D1C0FB1EB8EFAAACACACC70B0B0BAD3C12A8 308 | 055F6B16F8EC723AF1F8F3AFE2A9175F85A3CFF1E4F58F16765FAA7ED81C8200 309 | 763A58F2D907D073E50F857668AF47E3F675189715C0ADA78CC09851A360212D 310 | D146DE3E274DD8CF10E30D1C2A1A4D493584BB023F1D19A436E06B34D6D762E1 311 | B2157860FE56B8EDBD90533A84489B453E019919F209E28204444092EED6A636 312 | C449D58397A7614DE073234E5141D45787BFDD7F07268F1B430EA1AF53D247AB 313 | 113C1E0F6AAA6B16B5065B2FBEEF8EFB76EE4FACBAAD20E4FE3FDF7F465666D6 314 | 73454545053CC952ABF6A583C8E470938D9CFD9B5BD1E4A5CEED731A819EA980 315 | 4FFF469EA12080C969878D0E065F47FE052772E06984BB723D8E74B6E37F661E 316 | 8E23C78C218299D14E9D15621B1C5300E3DFB40867D12C12447BAB053ACD07E0 317 | 412EBAF77672123FFF6A19EEF9A202DE8C12388B072166CD1019C5384FFF2202 318 | 84FC01B4B5B483BC4A8049407E802041C36A04762CC0940947E3897B6E4B0C06 319 | 316953C7025A5A5AE275F575FFF2B679AF2633BBDF2794766B49D8634F3EF68B 320 | 92E29237EC0E7B3201CC0A0132286AF8E75B1FE0E1BFBD005BC914C4738F1036 321 | 3F4E120B2B014E0488B3D74E7F6FA12841483FA7F582EDF0566D44FF580DEE9A 322 | 3104938F194F96C2AEA853519DC31D19819C5A6EA6DFE30413FFA63405BB033E 323 | 8904B26E401DD56372D9E9DE5A9B1BF1EE174BF1E0528AF90B07C394471182C9 324 | A66418F93EC8667B5BBD1D04A0331300DE16A0F263E8C22D78E6A1FFC5A8C306 325 | 5108EA13F13DDF7B2249141333889657FDB36AD29D8BEEEC964526BA95006FBF 326 | F3F66DD4510F48A99104906A99641E57DEF227ACDF560F63DFD349E2F384E4C7 327 | 59D255E98F11B0ECFC591C3691FAD545A9831A2B616EDC883BA6E461D6F4C9C8 328 | C9CD4F8CBB0B49524920176A304853A0E629B415C312E8D4736AF977EAB83E37 329 | 3273A8DABE15CF7FB20CCFAF8F91091B017D4621799C06A10582A401FCED5EE8 330 | 88083A023F2EB5009903D47D8B40F5D7F8C5AC53F187EB2E47BBD70B5E5F40EB 331 | 0FF0EF51C8B7331E8D8F3AFFFCF37F52C6EF672700A92BFDF091C317DB6DF6C9 332 | B232484B002779F62BD66CC0B57FB807FACCC34882260B872F4E8E1E9FA5F4C7 333 | D9F36747D06E15E3FAF036C3B7A31CBF1C10C23533C661E090610940F877D471 334 | 73A53395D1B384299024308AC9279DB5809600B2D2B7A3A43B96280D9767362D 335 | 999999F87EF932DCF7C93A94857AC1D59BFC018B43FC2D0F1085C8BEEB821A02 336 | B016E07274F74E44ABE6A130DB8117FF7A171C368BA8584E2D0611D540C1C0CC 337 | 0BCFBFF0E3FF2A02BCFAEAAB25268B690D757A264B9C3613C840B0FA7FECB957 338 | F1CABF3F86B5F42412A741BC2407E2E4F8E90878A8046053C0CE2067FC0CF130 339 | 0275DB3038BC0D774DEF8B29C71E2BAE972AB9DC716C0E4262E02522720C2253 340 | A926A278B0C9643227990259B3A7ADF34F025F6A8058F2DC809CAC6C52DD41BC 341 | 336F3EEE5BEE43A870380C5945D4B3068AD9C388B3B4CBC3E715A64068001FF9 342 | 063BFF8370DB563CF087DFE2B8F163D046FE8B48F74A12D0216A00BCDEC72EBA 343 | E0A29BFEAB08F0CFD7FE39CB6EB5BFC7D2973A1AC8F698C3B86B6EBB079B76B4 344 | C050320370E629AA9FA45D804F31BC023EBDB72ADF37065A11AC2AC7F54382B8 345 | 7CE6B128E9DB2F21FDB27568013565CAF9F698F21D2B5D8BC1A70E45734B33DA 346 | DBDBC5BFF1E00FCF48CAC9CD11F7C673FE39D71FD348BE28F464AD10D7AE2616 347 | 17631A05F90558B3F2073C3CEF477CDADE0B0ED2029C29E41232CE0C2A0450FC 348 | 001D93C0AFBEAF5F8960ED529C7DEA74DCFAEB4BD046F7A3F503E4C89F3FE02F 349 | 9B7DC1EC63BA6326D17E21C0DCB9734DE4C9F6315A8C8751878C361BCD4710D8 350 | 1348E24B13833D2A09D80673DAB7B2BA4E1020622945BCE838927AA7A2FE6D4C 351 | 00A7120108F06D2227C0B5FBD1969D18E4DF803BA71662DAF413C5F5BA0ADB44 352 | 158DAA0538CDCA4E9BA7DD83D5E5AB39B3B7DDEBF12E25F0D7738105756C1EF9 353 | 2413B233B38F1A3E7CB87DF0A0C1CA885B20A8D60CA64E1393134E9577999959 354 | 88901678E3FD4FF0E08F40B86804A2B61C31C40C0651D5003AE10C7A8529602D 355 | 106FD98E58F57C0C282DC0DFEEBE55FC4EA23C4C930388D2035054B08CEE7705 356 | FDFB8A5034B4C6D7EADB7AFBEDB7FFE465E8F6890037DE786396C3E138CC6C37 357 | 8F25753E96C01D4D800F20E9717268C7A073136A579B1236294E98CBE5C4678B 358 | 97E1FE279F83B9600279FFA385DA8F8BD0CFA11080D53F93817301A439100E90 359 | B46CC2ECDC6AFCF68CF1386CC4A8445D5D6A935A400E9C703E607BC576AC58B9 360 | 62A3CFE3BB9B3AF1A3DB6EBBAD35F5EF1EFCEB8323E82E6F2AEE5DFCAB891326 361 | EA79CC2010F06B888544516947A1A9F28C59E40B2CFD7211EE9DBF1DDFEA2922 362 | C8ED239C41B0860A04C8F9F3ABD1006900D24082006D143D542F8055EFC1E377 363 | DD8292C23CF8FC4A25B09600E23955CDC3DAC1EFF7C74953D4D2BFAD235FE77B 364 | FAAC2C1A8AAEB05AAD95E47BED55B4B0D704B8EEC6EBA63A9DCE7F12A8A5E4E0 365 | E9B419B6D4585F66FDB4D2CF268053BF4FBEF426DEFE78212CBDA791FD1F2880 366 | 8E0BE78F1C288743D87F610E9800D491517F1B6CF56B71DB303F2E3E672632C9 367 | F66A177F4C6DD2A633621B36ACC7AA35AB3ED6C57457CC9933A76E77CFF8F893 368 | 8F5F949F973F77D2C4494E880C60B0A3AB1878752A9AB65C3D23230395DBB6E0 369 | 897716E1A58612188B0653D46283A841E701213E920840AF3D6EC4C90444DBB7 370 | E08EEB2FC7B163472BD180CC0EA62686D4AA20594720279D08A737146AA7CF3F 371 | 78F8C1872FC15EAC39B0D704B8E6BA6BCE23E97F93EBEBB4D5BD49833E290340 372 | 0902A855C06C87EF78E4197CB7662B0CC5274297514C0EA04D78FC7038152D60 373 | 53D53F9B0506A1B501833D6BF03F93323163C6CCDDDEB9CCDC55EDACC2F2EF96 374 | 7F15F2874EDB9B9AFAE79E7BEE42D2042F1F7DD4D1468FD793545E2E27A66A67 375 | 2FB3E60B10C0AFBCF92E1EDAE882377F38452F2EA52E5D8C0DF885ED671F204E 376 | D71366C14BB753F71DC24D2BF1CB734FC3EC334F223FC0D34100097E4A599824 377 | 47C2C409A28B554BBE7FFC2F8F8FED560290049D63755ADF96DE7C22B19352FF 378 | 973404AC6A03D600DC51FCB337DFFB18B6D7F9A12F9A069D2B5F019A4177BAC8 379 | 0154BD7F7E4F7FC3CF136CAEC6F1B1D5B8FDD461183FE9D82ED5BFB671E72C2B 380 | 5BD6D6E06E9874E90597AED9DB677DEDFF5E7B7ECC1163AEC8266DC3AAD99098 381 | A124AB97F5C93398E8FD07EFBF877B9707B02D73244CCE1CE542618D1F200920 382 | 1C420F620D6B106D2CC349C78EC74DBF3A171E8F0F41D238B2F8A3D3D070A823 383 | 632889C2EF85260885CA9E7EF2E9BD7216F79A0097CFB9FC1CBBC3FEB68CE7D3 384 | 8EFBEF82002CFD1E5F0037DDF318DC210239FF58E8B8A3380464BBEF543580D6 385 | 01242F3CDC5889F32C6B70EBB9533164F888DD1280C1A8ADADC5EAD5ABE79E71 386 | C619BFDEDBE7E4F6CE3BEF0CC9CCCAFC7EE4C8514E3F49B7003E45F2393AD1AB 387 | E30BFC9C8B177C81FBFE538932CB1858B2F2942EE67B4D8482A4FA0501384144 388 | 6468DC4804F806478E1888FFBDEE52F2F80309C94E55FF89AA209936D690814D 389 | 4230142C9BFBD4DCEE2780CD667BBB53E56F9A61DFC4B8BFA92301C453AF1B9A 390 | 5B71CB034F22A0CB473C6F2211205B890058F21D2904E0389FC3B8C6EDB8CCB9 391 | 0637CD3E5D1465A4867FB269A3824D9B37C5EB6AEBA69D72CA290BF78500DC3E 392 | 9FFFF9E7A30E1F75A2BCAA02BE3E4106EDE0123FF377CBBEC6FD1FADC402D358 393 | 98330B14AF311A511C4149008AF7E15709D0BC8DB4C0D718D2371FF7DCF82B05 394 | 481E474821406A6D4042FAD53387B34488B2B94F7733012EBBFCB27328A44A10 395 | 80A53AED90AFF6BDB12301C421E08E9A06DCF19767113214219637017A0D0174 396 | 4480440EC0A6440071EA4063CB365C4904B8E1B2F3915F58949600A9051F1B37 397 | 6E6CF1F97C238E3DF6D89A7D25C0E2AF163F3078E0E0DBCC6CBA38A124D4BD3E 398 | 6950494B80553F7C873FBFB3141F1927C09459A81220AA3A817E01BC2080D000 399 | 3EC428140411A06FAF4CDC7DC365C2C74810A08B3A0171A8D22F3581488347C2 400 | 65CF3EFD6CF713C06AB3269980A431FE2EAA7F24611C04F2F6AA3ADCF5C48B08 401 | 198B11CB1DA7218083B481533105367B2204E4215673CB565CE9F811375C7131 402 | 7272F392220065D40E62CA56626D40EAF88A8A8AED3BFD3B47CF98B0EFCBB27E 403 | FBEDB7379694943CCA239ADC3A2D48A569FC8C9C10FAF35B8BF0A169328C090D 404 | A01240F501D804C4D5A4101340DF5C86E27C07EEBCF66251DBC8255FC2DB4F19 405 | 164EAD0E92631E9200D148B4ECD9B944007423012EBEECE2736C76C504C8B0CE 406 | 64489EFDA355FBDACF993082003BEB70CFDF5E26029006C8190BBD2B47A48019 407 | 749D437502B504A087339306F8A5E53BDC34E752E4E6E57726403C9E48D9AAB3 408 | 90515B57BBB331D43872CAA8292DFB4A8095AB56FEBE7771EF07395B283AAC0B 409 | F0E578076B8007DF5C8479F6A93066A83E802617209C4061027C221D1C6F2202 410 | B47E87DE4480FFF9F5856202096722D3F900DA42914E04888BB0B7EC85B92F74 411 | AF06B8F0B20BCFB15BED49044802DE684C5FFA6532AA3E801D3BEB9A70EFDF5F 412 | 4500B988651F0D7D06A781950120244C80C607E0946B6B152E8A2FC5EF2E3F9F 413 | 2246BB005991463D742A30CAEC6E9EDE158383BED3DAD61AF0B47B8E183D7AF4 414 | 867D2540F9DAF2E74B4B4AAF108B42CA3582D415423B168952268CF2ECE5B5AB 415 | 57E28177CBB030733A8C8E2CE5228200320AF0A95180571020D648A170FB4A94 416 | 1665E0F62BCF1565ED5D69009E8F108A843AC2C150870FA0E63DCAFEF1FC3FBA 417 | 9700E75F7CFE394E9BF3ED84A7AF12414C06D568824E55406AB8C84E6073AB07 418 | 77FFFD7578C31988668E819E552583CD52EFD08481AC01380A605CDB1B31CB3F 419 | 1FB75D723A5C1496713EBFA3A63E2A067DA29A019BC282023A0AD1D0D03067E8 420 | D0A1CFEF0BF85F7FFDB5ADA0A060456E6EEED0CD5BB6A8B398E54215726A9B41 421 | 294FA3CF7864F0DB6F96E0BECF37E3BBBCE930F133708B4827D0A710C0E751A3 422 | 8156D2009B61F0AEC1C0925CDC7AD92C31EE1008A49F2DAC35056AF2271115A8 423 | 730DCB5E7EF1E56E26C085E7274C406AF9B7B6D45BAB01B426C06AB58851B2FB 424 | 9F7F0BCD5E03C28ED1D067F52213A0247F142750350116350CE40ADD8007539B 425 | 3EC3ED678DC3A0C38673A54CC70CDB8866B2A5C892C5C4EF0C1F361CF5F5F5CB 426 | 5B5B5B27EFCBAADCEBD7AF3F3F2727E70DBFDFAFDB5E59A13ABCDA994C4675FE 427 | A11212727DC047EFBD83477E8C6053FE1451A1243C471E0FF06B08C009209F5F 428 | 1486C49B36C118588791834A70ED2F4E260730C4E15C22C1A33DB4E96129FD52 429 | 53A8D3CFCB5EF9C72BDD4B8073CE3F47E401446768B440BA891E5A7F40A68239 430 | 11C4EAFA2FAF7C88CA3A2F82D6C361C82E21C7CF25245E3881DA9140F6BE49CD 431 | 4748F50DAF5F845BC73A71E2A933515757A7E4FBA3DA19B70AF86C0FF97DBFBE 432 | FDC4B0B3DBEDBE61D0A0414FEECD73EED8B123873A7C2949FF61144E8AF8DC2C 433 | 2A8A54D035339BE4BC461791F799B9CFE259F75034E68E14EA5C1020144E8C08 434 | 7698000E079B81A6F53086B760F2114371F18CC962EA1A1320B540349508DA3C 435 | 4044AD7E2212743F01CE38F78CF3C807789381146556E6E4A95EA92448F50BC4 436 | 7231F477CFBDF71FACD95C0BBF71107459FDC8FE671209880076A732166055C7 437 | 029800D4C13C7B27BF790DE664AEC3D5575FCD7B01A87971B90A076900396CAB 438 | 4EF2E0DF1C3A78084B0A590CEF0543860CF9684F9EF1C71F7F74B85CAED7F2F2 439 | F266D5D4D6B233A9822FA7B0CB798DFAC486161C25F809D8FB9F7A11EFBA4E43 440 | D855A4742EAF27180C75228008015BEB6170AF83295E8D9953C6E0E409A392C6 441 | 0252358076EE40A744504468C095FF7AED5F47762B014E9879426F53DC741981 442 | 3F91C01C4547B1C3E130B00324C99034F3378500A21A8854FC875FADC0C2EF37 443 | C0172F41CC354089047852A6C321C241A51844750479D8977EDBE06DC2192DEF 444 | E18FBFBE0436A70B2DEE9684CD97E3F53175FC5E19118C8961E081FD07B063E5 445 | 2555FE078AB1E78E183122D4D5F36DDAB46904DDE7E3A4CEA7353737A3AA7A67 446 | 42CD2BCBD568A7B1EB05193813C87321D8FE3FF8E14A94959C0583C9A25C3011 447 | 026A0683D42C60B4B91A16DF7A580C6E5C72EA248C1C58222A84938A43532690 448 | 0AE92742B1A3C87E103D531B116673341CFD566FD47FFCD1FB1F7DB83778FEA4 449 | 7A80E9E74DCF74C239C862B48CA10E19471D378A4830904891E72455AEAD064E 450 | 1080CC80C361C3AA4D55786BD10FF0043211B0F48321B3B023FE1743C2F60E33 451 | 407F27FC00EA8823767E8CDF4D2AC43432033B7654AAD22FC7EC6529574C5DF4 452 | 49090DD9F1ECDBA7AFB22E8FC7F30D75E26B74FB0BE99EAA89107489A8838839 453 | 9ADECFA2E34272E6B2EAEAEBC0D2CFCE1EDBFDC42A65498B59286300FC6CEC00 454 | 3EF3F4DFF062F34054178C83410A218F03247200EC007A3B2280A60AB8A29BE1 455 | B2C770D599C72127C321C61C12E3002AE80CB80AB68F5E579189581F0C047FA0 456 | 88E0BB502C541E7007AA162D5AB44F45A3FBBB224877DE79E71592D40DB4D82D 457 | BF250FFA3C591FA09D06C62B7F34B57BF1F267DF81ABA65BC2C530E6901F6077 458 | 2980A71280CD805ECCEA4766EB665C105A885B6FBE514CB06C6FF72476E088C7 459 | 642650A9DC114B3FC495655EB90E90EE478CDBF377DADBDB798CB79E5E470858 460 | 1791338F43541F49692DF9176D6DAD42BA9352BFE95E937FC243C1D544C67BE6 461 | BE8EF9BD2F44CC9A0575005F4C139369609D5A0C22B281EDCD88376F45B66927 462 | 4AF25DF8E56913134528DA215F3E93266A6B75B7FE9AA4FC07226CE55B6FBDE5 463 | FF6930751F01128DECF48CACDCAC8F590B6809A0CC06B20A697A73D12A54D479 464 | 50D39A4191405F654C4086838964904C0819C5756324114757BC855B4E198EC9 465 | C74F474565A592FA550B36B475FC8202DA424FB53A99CD02CF48E2B4AE58EF37 466 | 2E46D2C49C021F4BA9BA689558E52C49F5778C01C8D08F7D1F2E277B71EEDFF1 467 | 5C550EB6151F2F66298BA6C9008AA160BF5A0DC4EABFA50666EF56E438DA70D4 468 | D0529C3C6EB8586730E1006A1690686A6EFAE6A9C79F9AD81D38751B017EF39B 469 | DF949AACA635241D19DAA55FA423682750BF5E5B896F37D5A1BA5E8780B91806 470 | 110E2ACE9F0805A516E02C1CCF15D089753E90D9B61567B67F823FDC72A358E7 471 | 87D7001699B924D747DD0A32164F2C042535434C2E14A84BCE22CA750265C58F 472 | 585B48AFAE37A44F5EBD5CA684B3B3B3B1715D39EE7FE1DF58DCFF1244CD19D0 473 | 49E997C3C05C0BE053C701F8EC6B4594D47FAEA11A198E08664E188E01BDF344 474 | 04A00DFFA40620023C36F7A9B9FF5D45A15C165ED754B7983A68B27619181936 475 | B25DAE777BF1D9CA1DA86B0CA2BAD5A19451713460510A434569B8D400960E2D 476 | C0AB750CDDF131AE1A1AC7EC5F5E2142420E07759A4D61E44EA01D0344D0688A 477 | 78226B28C9211C4891E98BC97D239555C7D4B50E13BB980902A84BD58AB50D75 478 | 78E4E147F0B67E021AF2C628B396C44D46C57C40590892981C429140BCAD1E68 479 | DE863EB93EE4669A71F6E411CA0293EA1A815A0278C96C78DA3DA73D3FF7F979 480 | FF5504E076F53557FF3E2B27EB412D01B49342598AFE535E83AA463FD66FF523 481 | EE2C1559C1B86AFB7589D270B532889342F437BC03A03EE2C784ADAFE1D67326 482 | 63FCE4E338E3A700A73E51870FA0ACFA05357D2B01873415720388782C3196A0 483 | 1D5194F65EC96B28CFA0534991959985D75E7A1ECF9587B0A1FF5948AC4125A4 484 | 5F9921ACA87F9F322F8089E06B43B4B11299F15A94F4326078490EC61F562A96 485 | C5490CEDAA92CF9A8A7C95AACAF6CAE11FBCF8C17E5D21B4DB0970FDF5D75BCC 486 | 76F3DF09F85FF17BED727089A161AB059B6ADAB0AAC68FAD5B9B51DB6E17D3AB 487 | 748E0CC4CD568500760D01F83019C56DC77406D83DD59856F3167E7FD56C0C1C 488 | 3A8CC242778706D0EEEEA1E6EA93E6F92508808456900924EDBE008A19D00B27 489 | 522C41A39281EDFE17F33EC4E39FACC00F832E41CC68854EDA204EFD32F8A180 490 | 6AFB197C655208DA1B1069DC8AA1BDE3C8C932E3D8C37A21DB654B14826855BF 491 | 9ACF688CC6A2673FFAF0A3DDB2F56CB710E09A6BAEC9B63AAD2F50C8779658E6 492 | 544D9868978213594122002FBAB4ACC28BFA163F5694374197D157D1026C066C 493 | 6A91A82C0E355B1389216E319D1119EE8D38C5FD096EBCF2120C2212B4B5B725 494 | 066DC47792D4BE620A92CC804217C544A839059958129A436C44A55317B35456 495 | 3261C9FF72FE6778FCFD2528EB3F1B11F2FA79F531E507638AE72FD47F404C0B 496 | 4B804FA15F846C7F161A316248260A5D268C1D988F104F6451CBC1937618E3E5 497 | 6594FD10DCBEA06FCED38F3D7DE02F167DC5B557F4B59BEDAF91944FE2F855AF 498 | 7ACAA91B424A2D6025E76E4BBD0F15ED7AAC5D578DAA66A3D002B0670989D7D9 499 | 6DAA19503580B9C314708B1209B25A36E0D8868F71F52F668A7A41BF5A5A2DA0 500 | 4DDDE849055CABFE65939A22A2492BC755605903E4E6E4887BFEF09DB7F08FC5 501 | EBB062C00508D972A18FABC5295AD51F0A26BC7FA80488B7D591FADF8623873A 502 | 91976BC7E14516E4B8AC89296132EE4F5A57B88304A1403070F3B34F3FBB5F37 503 | 9ADAAF04B8E48A4B0E77D81C6F12D8C31880C482CF52F253B480F40578A9F6F2 504 | C6389ADA22F8FADB0A44EDBD282228567C01314C6C53B48034033C7D9C93431A 505 | 12B8DA2B7144C5BF71EE842138E39CF3E0726524460CB54E5F82149AEDE2B54D 506 | 2EF12E5704650270D8989B9B87DAEA2ABCFECACBF878870E1B079D87B0D99502 507 | 7E44013E14E808FF7CEA2C206F2BC20DDB50EC0AE0C8D125C8324630B4D02A7E 508 | 2711FAA548BF5C6358CE1164612247F19E975F7CF94F7B86C8CF4880D9B3674F 509 | B2382C6FD04D96F00D77C4D1C64E44906B01274608490BD4B685511DB263C386 510 | 6AACD9DC06735E3FE85CB9640A54E957CD80481733015248C0E6C0146A43FF6D 511 | 1F61A2B50667CD9C81A3274C049772B146909D984A046D4B848BEA383FA7B69D 512 | 0E27BC9E762CFCE233BCBF60297E708E4575E954315721A1F6F93A11097E5005 513 | 3FA8002F348047CC6A327AAB71FCA4FE6225F3FEF620EC1603FCF45DB938A476 514 | 5F41ED02D372BD00B9B52E6982A7D7AC5C7353797979688F01EA4E029C79EE99 515 | 27391C8ED72934CA65166B1DBE4EE9537DF29AC062010775DEFFF63623DA6316 516 | 7CB9641D1A7D161116EA1C6AB918036F53670FB31FC0B97636051A12F016301C 517 | 21643795A35FD5028CCDD761DA719331FAA8B1A28C8C9B66CDDDA4953FE4EA1F 518 | CAE8A549F800B5D53BB17CE9122CF8FA5BAC0CE5A3AADFC9F0BA4A618845D0B1 519 | D3B43ADCCB033E6165812831EB47168106BC22EC0B91F48F3BBC00C386F58133 520 | DC8C42475C2C3CCDD2AF0DFB129B4CC5929792955540FC9AFD2732AFAFD5ECAC 521 | 99F3CD37DFFCA4ACE04F26C029334F99E1B03BFE8FAE9421CBA2A4CD4FDDF439 522 | 7533C8248790B4803F14474D34134DEE00162C5E8B88251F869CDEE40C6688F5 523 | 8184F40B2D60512302B342029E3A26EAF221167E8CEB8D8847C370D4AD4161CD 524 | 320C363663E480628C183E5CACF09593972F268A32D062C096EE3B4CE0F9C864 525 | D4D7D560CBA64D585DBE0E6B76B6609BB1140D259310CE1920424CAE4F0CC754 526 | F0D9E193922FC1E7D5C00292047EB19249B07E1B06149971C2D4D1D087DA5168 527 | 5066A5A573FC52F71C4E5D37586A02161A0A6BDF71D95D97BEF2CA2BDE1E23C0 528 | D469536713E8AFCAA24FEDE04F573B7F6B8920932C6C0A2CF4F7CD24381E7321 529 | 366FA9C692E5DB60C828A6A8A017F9012EC449EA7536451B0812080D605188C0 530 | 44B2184551A589486036284408F09ABEEE1A58EBD7C2E5DE8A9C6833724C5164 531 | 58F4B0F2208F8E4BC8C8548762700763688E98D162298027670822054361CEC8 532 | 85D500519A1EA42FF2AAA281704C2C192F243FA2AC0DA880AFA8FFB89C0BE86D 533 | 26C9AF408E258859338F81956ED3E9DB018B212E0A3FB48E5F6287913404489A 534 | 21A46A01B1A9B5C1B8229A1D9DF2F92B9FF71C01A819C64F1C3F2F2323E324B1 535 | 1853CA5E00DAD4693A02A4FA03BCC07353D88688A310DF7DBF1E3FACAE8629BB 536 | 844850443E804BD87F01BED5A286850CBE620A6C36DE9AC6283683B299F570A9 537 | 07E7F3C92585271015A36D016F3BA28176C4D959A3CED6713D03F91A662299CD 538 | E112F90927FD1D3B78BC84AC3B188587C8E10BF33CBC28D9E08858205AA47A99 539 | 042AF8719500027C4F0BC2CD95B0C6DA70D6199350904FA162E346D87541A1FA 540 | 13033E9168D2BE425A02241690D4802FCC97D8C4221CD1C574A72E5AB468FE4F 541 | 016FBFF80063A959EC962F9D4EA7553B27A0AB9D3F93760253CD81282651B794 542 | 61FBEAD66753285880254B7FC4AAF5753067F756965FB165080750C7D2AF4604 543 | BC9E609C230A02CEE5E0D94766386D141ED2914D478ECD806C2B91819C2E9B49 544 | AFEC2300B977804E6801656880008EC4D016204D406469F045D144472BBD6E0B 545 | 44E0A523100C935F17122B83EA78014811F629CBC27580DF4CE0EF8039D28A33 546 | 4F9F847EFD7B2358B31EB6885B2C3B9FC8F76BEB1853761DDF95FA17AB9687C3 547 | 6F2C59BCE4C29F8ADD7E8B02C64E18FB94CBE5FA0D2777648897BAFD6BA72D60 548 | 5349A0A91DE4848CCF5A04BD230F8BBF5C811FD79226205360201288EA21351F 549 | A05357146302F00A622EA7154E3B13C08C4CBB09390E13B2ED4406D20C2E2281 550 | 83249B49602512980CCAD8019B74B6EB7E029F25BD9508E026D05BFC5134FBC2 551 | 707BC368F387452DA397C00F0614E967F0E5A2908AF7CF25DF0C7E15497E3B49 552 | FE71183CA42FDAABD6C2E4AF13790665D18A64F093B6989304884493E70468FE 553 | 867C8756BD493F6EC982253F79F3C9FD4680D1C78CEE6DD3D9BE7765B80AB5BE 554 | 80DCFA250970BDBE6B1224348159D9B081BC6E2381FED5573F60F90F5B6070E6 555 | 2B24A0E8001C224A47D0A48485068B09194E1BEC440087CD24760CCBA0239334 556 | 01E92738C8F6DB79657102DFA857B69111C3F6C2BEC7C8BEC785B4B711015A09 557 | 7C3E187CDE53D0E7E3FD0449D573BC1F5109205608678F9F4C4A7B0382CD3B49 558 | F3C471EED9D348F24BE0AE580D7DDB4E1133A493FC4ED2CF4488C492D60E4E52 559 | FDBCE64124744FD95765FB2517B05F1341471E7DE48D0E97E3D1442590BA358C 560 | 411D4E4D05BE132934D181A2094CA2163096510A47413FFCF0C33ACC5FF403C2 561 | B0C14C3E81CE992BFC02E10B080D6012BB87E9C504140BEC76C51C58C939B45B 562 | 140258097C0B69009341D95340AF1280378C62F51FA4C317229B4F24E02DE37C 563 | 0145F23D047E28C03B8B12F09C5308AB615F90AB7CDC88B5D723D8528301A5B9 564 | 38F7DC53904736BF69D3F714022AEB3A86D42A1FED4E629DF61B8E76EDFDCB08 565 | 2110086C36E94DE3962C59B2CF935DBA8D00471D75945D67D42D2553708470E8 566 | 4C9DF7044A6CFCACDD0C5AA7EBA40D6481299340246C5CC5C8EA33029555F5F8 567 | E8A3C5D859D726265F1A9C796412B288048E8E9090878D8DCA52F2369B599DC3 568 | A8EC2622CE46BDD000722B39A54620AED8E7484CEC10C60783E6F7F3EADC21B1 569 | 18B408F9D8E963E72F4CDEBE9FA4DEDB84706B2D74210F264F1C85D34E9B065D 570 | 3C8CFAF5DF9039A81783C3A9899E74E07765FB656530FFBB3A0DFCD2B2AFCB5E 571 | D95F98EDF7B180D1478E9E491AE07DBBC3AE4F1711C835FAE422CCCADEBF96B4 572 | 5A41980431ADDCA45CDC9A8DDC414721AAB7E23F0B9662E937AB108A13B8AE7C 573 | F2157228446407D1AE44054C028351EC34C2F1BED1ACD4F6198C1DDA46AFEB30 574 | 015067F8C81DC2A2EAC65002781EDB8FAAE093BA8F0779A12772E828C60FB535 575 | A2B45736CE9C7522468D391C2DD5DBD1B0E11BFA9E47D98330124E4EF2506421 576 | 6715C9499E7C2FB262295101AC99102236AAE6EDE542C1450E8BE3C47DADFFFB 577 | 5908C0D73CE2E823DE212D70A65C4042FA02DCF14AD225ECA34E28A3877A9B80 578 | 7659EDD6072882D069F70596DA41D6DC0BA75224792CC8EA371A79FD86A162FB 579 | 4E7C326F11CAD76D45CC6085994C825E0C2239C939B42B7E81412502A76E35E0 580 | CB8A1F4900592924AA8BE9E0F030017C94378320EF3EC4C3BAAD88FA5A106A6F 581 | 414E8615279C3001D34F3C4E98951DE5CBE0DEB146A488236AF64E9BDC9192AE 582 | F6015A5B5BBF277BFEA021669816D7C74FA67BEB2F773F970490E622140C85F4 583 | 46FD09CBBE5AB674BF82D50D04C0C8A3468E341BCD5F3B1D4E2783A74ABB87CE 584 | DFC6E2B18F8D71E3BCF9F3E7AF93DF3FF5F4536F77381CF7F1A04BAA4948D506 585 | 1CD3B34765CE2E46C9888970E616A17CF57ACCFFE22BAC252204A3E4DDDB3360 586 | 206DA0B7388446D019ADE41B50C4A012814BCBA06E249968CA78B01807D031F8 587 | 31029D933C6145E263C17684BDAD74F6A220C7852953C662DA4953915F90839A 588 | CD6BB1B37C2991A25159CE469BDA5555BB9470013E01DBDED6BE3E1809CEF8FC 589 | C3CFC52690D3A74FCF0C22381951CC22C24CA3C074805EA4B6136B16BEB8FCEB 590 | E557EC7769ED0E02703BFC88C31FA298FE12FA853292B8CF48DA162C5FB2BCCB 591 | B0E59499A7DC41A6E36E321D3A063C95040922A8DA80B3FF9CE9CB2A198ABE87 592 | 4F8033BB005B366FC3922F9791B3588EBA06B7D8DFC74891022779F4661B11C1 593 | A2924012C1A090800775E28AC4C739CF1F65672F48273F2201023F1280831CC8 594 | C1034B09F8F19830692CB2B33351B37D332A567D85B6DAEDE0B9186253A9949D 595 | 42B5C04B154FE097FBC3FEB317CC5B90B63FC68F1F9F118A85C69203C1DBCC4F 596 | 27E2E718AC8663972D5AB6FDBF8600EC10929A73AE5AB5AA7E4FFF8634C11FC9 597 | 74DCCB4E9B20804E9F9E08899DC60C62B8D640129EDD7B304A871F85FCDEFD84 598 | D7BE61DD26AC5CB11AEBD66F414D4D03DA3D0131EC1CE735BE4458AA9A0531AB 599 | 382616A1E08A63CEEF7362887711CBCDC9C0807EBD316AF4708C21FBDEA77FA9 600 | D819AC6A73392AD67E87D6BA0A411C5E215CEE009AEAE425B6A3892B45A79E76 601 | CFC6565FEBC98B3E5DB447608E1831C29C939393FBD5575FEDF322173D42807D 602 | 69E75D74DE1504ECF3ACF63AB67BEDD8F8B1936948D418E8D52A5F8AF133F350 603 | 3480C01A32123905BD04E02D2D6ED454D76267550D1A1A9A504F4763638B28C4 604 | E0B42C47062E9703BD7B15904ACF43AF5EF9282929169B4551584B7E9F1F7555 605 | DB51B17E05EA2A3620E871ABC4D1250FE4A400AF5D73580E3D930658E7C9F38C 606 | F9E4C94F823DDDDFDC0E2402E87E71D12FBED01974D3D869EA70D27469C920CF 607 | 49630A22C250066EF464F3ED1939C82E2C417E715FE4121932B3F3C436325CD9 608 | 1B8BCADDC2634A7DBF4ED96D9427A17A3D6D703735A0B1B60A0DD59570375423 609 | 40A0F3103117894663B14E29DC54559F4400CDA4157A9638698913DF7EE3ED05 610 | 3DDDE1A2D37BFA06643BE79C7306EB4CBA15D4490E7E9FBA144BE2D0ABF9FB34 611 | 5A4110425BB70F244ABA1838234505260B450B161B1D562289493859FCCDB058 612 | 61DC4F3E1F979305C8F10F098710BA8E5C4154B366B0762EA2166CA8D1845C44 613 | 42BBE43C1F7C7F9158E4E9F7DE7CEFDA9EEE736E070C01669D33EB060A171F67 614 | 27A913F81AD0E5CEDFDAD7494450378B4E680E7D3259E4F8BFD292977F95DBCA 615 | CB7A41B15C7C2C9A04623CD621D5126859692C09904A06690662B1C467DB5AE2 616 | 2DA3977EB0B45B4ABDF7A61D2804D09D36EBB42F483AA67127A5AA79A532B7B3 617 | 46482580F6BD045F5C5CBD967CAD4B809DDCBADA30A27361693C49D2B55BCA24 618 | EF32D2017C22CF1F151A89AC54ECC42F3EFDA2C7CDC0014180934E3AA93FA9FF 619 | 1FE96E5CD2AEA73A7FE90E6544579700BD132180A4CF13EFD33DBDA63C308908 620 | 29002B5FED1AF4D4358412E642F51758C3893D09A39127BE5CF0E56F7BBAEF0F 621 | 08024C3D61EA950693E139EEAC44B188262BA8D5045AC03B11423E94F6BD067C 622 | F96FBB6ADA42516DE5706A25F12EB54262BEA1A6C227D231D0A3CC508AAF8F87 623 | E347FED49ABE9FDA0E08024C9C32F15DF2E4CFE4D7E96A08D245035A694F3C4C 624 | 8AAA4F2CF0BD3704D0CC1588AB1348B5EFA5FD97130813048825AB7EADD4A796 625 | 7AAB668EDE60725959D97ED900725F5B8F1360D4A8510506B361A3C168C84C8E 626 | ED3B6A04B4DA209D19E0FA3C7FC0FF1E5DCE437F3B95AE5522F61496034FE9D4 627 | FF2E5A9216D064F042141E1080AB08EC6FE8DE66DBED76516ADCB15C5C87CD4F 628 | 2AF054966FE958BE86BEC7CF489FDDB3E2DB15FBADC67F5F5A8F1360C48811CE 629 | 703C7C27A9FDAB2D568B3375E430B58228D537E00EF5FABC1F3B2A1CE77CB2F9 630 | 93E031271F93638E9847D3778EA1632681748C188F48F7A85DF800CA5B45CAC5 631 | 122CC1D01B04230FC27C5B985DB8F1ADB7DE8A4E3E6EF2E966B3F94D8BCD6295 632 | 1A207558575BE29D4810C98DA862D1E5F4F7BF5FF9DDCA453DD9FF3D4E00D906 633 | 0D1A34466FD2FFC968329EC97581DA4AA2B444D02BE19ADFEB5F1EF407672C5F 634 | BEBCD3F629C74D3B6EACCD665B461DDDB13B541AB3C02D9EE40576BCF47ABCEF 635 | 2DF87CC159E9EE994CD71CA3D9F88CC964D2CB905182AEADF2D5268842E15055 636 | 2C12FBB3CFE37BA1AAAAAA47EDBFA63B0E9C3668E8A059A40DFE64B6988F349A 637 | 3A9796CBAC1FB76030B8391A8C9E44E06F4B77AD2953A6E45B9C96728BC5929F 638 | 0055B767E06B34C0FF2EFC62E1DD5DDDEF51E38FFA1311EC2E83C1D049E2A55F 639 | A08EFDFB22B1C8F3BA88EEA18D1B37EED7ED5F7F4A3BE008C0ADB0B0D0E1CA74 640 | 5D455AE056EADC5E6C16F48664E90F07C3B5D178F4D495DFAE5CD9E585EE847E 641 | EA92A94BAC36EB31492A3EDD53277140015FEC3E160CCDFA72E1971FECAA0F47 642 | 8E19F9386981EBD9471189A3588733C8A38344800FC3D1F0DD5B376CFDAEA7FB 643 | B6D3CDF7F40DECAA0D1830A08FDEA8FF3D49D7E5A411ACB2A48C3AD54D1D7AE6 644 | FAD5EB17EFEE1A93A74E7EC66AB55EBDCBA74F033E9FC9E9F3D1EF1C51F665D9 645 | A6DDFC8C71D8F061FF207370B1923656ED7C38FA2319807B36ADDFF4EF9EEECB 646 | AEDACF41001948EDCB6F0968FA0DEA3781BCE63B49239C4C9FF848CA2ED8BC7E 647 | 33AF87A7DFC5DFF2EF458F9C70E41CBBCDFE2C4BA7F8B08B48205D9287A47F5D 648 | 5545D5D1D5D5D5012405849D5AACB8B8D8EE74395F27B3358BEEAF9ECCC15F48 649 | 5FFD7DC3860DED9AFBD9EDB362B7FA69FFB6EE24804E73FDD4D77BDB789D5F53 650 | BF81FD66736551E5B64A5E28C19C725DBDFA5AAFF92C3CE8B041E3B232B3E61B 651 | 4DCA02436909104F967C790EF803EFAC5AB1EA22F5B7D46F260EA4BC8E141414 652 | E492E9BA9224FFDFDBB76F5F4F9F19D041D278E75FDD65BF69FF3D96F25BFB15 653 | A4EEB89E1608ED59BEDE5372683F17A5F5EA352CEA6706CDD99872887F23F59F 654 | 3570C8C0D7C98414763506C0AD6337D08EE44E9BBBEDAFDBB66E7B160A01A29A 655 | 2396028A3CB85833A0FEB641F379BAEF22CD7BA4F95CFBF7FB9D08FB4A00ADF5 656 | 4C05520BB621E5306A5EA712229530A9AFB5D7D55EDBA45ED7AC12431E66F5D0 657 | 93E6F835A9E761BADD3CAE360B188944E2B53B6B1F73BBDDE5E8205F583D2229 658 | 4448254724E5B354E27475C453AE19EBE26FE5F7766596BA9500A9D74805492B 659 | 9126CD61D49CB5C44805559FE648BDB6F6BA126C06DEAA9E6DEA61CACDCF1D97 660 | 9B973B3275418874BD204912A680BD727BE5FBE4CCF1B6ED3E3A82EA914A82A8 661 | FA5A7B68BF134EF3EFD13D38225DFC5D3AEDF3B310A02BB6A5B3C15A70CD2960 662 | 6909A005D490E66FD311C1A8F91B731A32583467271D1914461658EDD602BAFB 663 | 24F390F2FC5A751B255FC3EBF3FAAAE9B59B0E0F14D5CE040869009112BA3B02 664 | A492218A5D13219CE67ABB323F3F0B0176771D2D11D2A97FA9AEB540EB7773A4 665 | D32CDA6BA73329F2B55603C9D74C18A921E4BDA423800436AC021F50814F053F 666 | 86F466201DC0DAF75A159FAAD6BBD206A9DFD5FA113D4E805422A4DAEC74AF53 667 | BF8B2EDEA7BBAE6E17D74217AF2529A4B99004D06AB6AE8048052F9D04A63A6A 668 | A936BD2B67B02BA730DDEFC4B09F80D702D61D2D159074A0A4FE7E3CCDF7BB8A 669 | 8DBBBAEE9E3C6BAAF6494D0775056C3AB0B08BD77B7A4EF77CDAFB48774FFBAD 670 | FD5C89A0BDFDAD5DF91AFBEB9EF6F47A7B1ABFEFC93374752FE93E8BEDC3B5F6 671 | A9230EB5AEDB2E068CBBED375231E936F0537FFC503B08DB21021CE4ED10010E 672 | F276880007793B448083BC1D22C041DE0E11E0206F87087090B7430438C8DBFF 673 | 03AEB13F06C56A264E0000000049454E44AE426082} 674 | Stretch = True 675 | Transparent = True 676 | OnClick = ImageOpenFileClick 677 | ExplicitLeft = 296 678 | ExplicitTop = 112 679 | ExplicitWidth = 105 680 | ExplicitHeight = 105 681 | end 682 | end 683 | object OpenDialogBinaries: TOpenDialog 684 | Filter = 'Binaries|*.bin|All Files|*.*' 685 | Left = 216 686 | end 687 | object TimerCheck: TTimer 688 | OnTimer = TimerCheckTimer 689 | Left = 184 690 | end 691 | end 692 | -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/UnitFrameConfigLine.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/UnitFrameConfigLine.pas -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Win32/Release/ESP8266Flasher.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Win32/Release/ESP8266Flasher.exe -------------------------------------------------------------------------------- /相关资源/nodemcu-flasher-master/Win64/Release/ESP8266Flasher.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-flasher-master/Win64/Release/ESP8266Flasher.exe -------------------------------------------------------------------------------- /相关资源/nodemcu-master-12-modules-2016-07-05-07-20-39-float.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzexi/NodeMCU-Tutorial/87a4268833cad7cb9da71eac28cfb88c8fa0fdc5/相关资源/nodemcu-master-12-modules-2016-07-05-07-20-39-float.bin --------------------------------------------------------------------------------