Compare commits

...

21 Commits

Author SHA1 Message Date
025ac7b810 fix: endpoints result 2025-09-23 21:29:18 +02:00
a9f56c1279 fix: tasks endpoint response 2025-09-23 21:03:13 +02:00
594b5e3af6 feat: implement complete JSON serialization system with response classes
- Add abstract JsonSerializable base class with toJson/fromJson methods
- Create comprehensive response classes for complete JSON document handling:
  * ClusterMembersResponse for cluster member data
  * TaskStatusResponse and TaskControlResponse for task operations
  * NodeStatusResponse, NodeEndpointsResponse, NodeOperationResponse for node data
- Implement concrete serializable classes for all data types:
  * NodeInfoSerializable, TaskInfoSerializable, SystemInfoSerializable
  * TaskSummarySerializable, EndpointInfoSerializable
- Refactor all service classes to use new serialization system
- Reduce service method complexity from 20-30 lines to 2-3 lines
- Eliminate manual JsonDocument creation and field mapping
- Ensure type safety and compile-time validation
- Maintain backward compatibility while improving maintainability

Breaking change: Service classes now use response objects instead of manual JSON creation
2025-09-22 21:55:25 +02:00
c11652c123 feat: optimize neopattern example 2025-09-20 22:05:52 +02:00
51d4d4bc94 feat: remove hostname from labels 2025-09-20 15:04:11 +02:00
e95eb09a11 feat: introduce new param type numberRange 2025-09-19 21:49:59 +02:00
4727405be1 feat: rewrite NeoPattern example 2025-09-19 21:02:26 +02:00
93f09c3bb4 feat: unified monitoring service 2025-09-16 20:09:48 +02:00
83d87159fc Merge pull request 'feature/relay-example-ui' (#6) from feature/relay-example-ui into main
Reviewed-on: #6
2025-09-16 18:14:58 +02:00
f7f5918509 fix: builds 2025-09-16 18:14:41 +02:00
95a7e3167e fix: revert low mem treshold 2025-09-16 17:06:14 +02:00
702eec5a13 feat: releay ui example, simplify logging 2025-09-16 15:32:49 +02:00
2d85f560bb feat: serve static files, relay example 2025-09-16 12:12:27 +02:00
0b63efece0 Merge pull request 'feat: logging service' (#5) from feature/logging into main
Reviewed-on: #5
2025-09-16 10:11:27 +02:00
8a2988cb50 feat: logging service 2025-09-16 10:10:23 +02:00
6a30dc0dc1 Merge pull request 'feature/web' (#4) from feature/web into main
Reviewed-on: #4
2025-09-16 08:29:04 +02:00
5229848600 chore: cleanup 2025-09-16 08:28:28 +02:00
adde7a3676 docs: add FS and FileService info 2025-09-16 08:27:05 +02:00
dd0c7cca78 fix: ldscript in all envs 2025-09-16 08:20:45 +02:00
d160630f1d fix: partition layout 2025-09-16 08:10:22 +02:00
98fdc3e1ae WIP: service and broken partitions 2025-09-15 20:33:15 +02:00
58 changed files with 3985 additions and 2152 deletions

View File

@@ -1,794 +0,0 @@
[
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Crypto.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Crypto.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Crypto.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Crypto.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Esp-frag.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp-frag.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp-frag.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Esp-frag.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Esp-version.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp-version.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp-version.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Esp-version.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Esp.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Esp.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Esp.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/FS.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/FS.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/FSnoop.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FSnoop.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FSnoop.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/FSnoop.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/FunctionalInterrupt.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FunctionalInterrupt.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FunctionalInterrupt.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/FunctionalInterrupt.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/HardwareSerial.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/HardwareSerial.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/HardwareSerial.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/HardwareSerial.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/IPAddress.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/IPAddress.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/IPAddress.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/IPAddress.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/LwipDhcpServer-NonOS.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipDhcpServer-NonOS.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipDhcpServer-NonOS.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/LwipDhcpServer-NonOS.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/LwipDhcpServer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipDhcpServer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipDhcpServer.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/LwipDhcpServer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/LwipIntf.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipIntf.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipIntf.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/LwipIntf.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/LwipIntfCB.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipIntfCB.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/LwipIntfCB.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/LwipIntfCB.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/MD5Builder.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/MD5Builder.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/MD5Builder.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/MD5Builder.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Print.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Print.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Print.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Print.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Schedule.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Schedule.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Schedule.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Schedule.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/StackThunk.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/StackThunk.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/StackThunk.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/StackThunk.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Stream.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Stream.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Stream.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Stream.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/StreamSend.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/StreamSend.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/StreamSend.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/StreamSend.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Tone.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Tone.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Tone.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Tone.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/TypeConversion.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/TypeConversion.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/TypeConversion.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/TypeConversion.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/Updater.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Updater.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Updater.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/Updater.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/WMath.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WMath.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WMath.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/WMath.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/WString.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/WString.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/abi.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/abi.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/abi.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/abi.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/aes_unwrap.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/aes_unwrap.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/aes_unwrap.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/aes_unwrap.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/base64.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/base64.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/base64.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/base64.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/cbuf.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cbuf.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cbuf.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/cbuf.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -mlongcalls -mtext-section-literals -x assembler-with-cpp -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic -c -o .pio/build/esp01_1m/FrameworkArduino/cont.S.o /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cont.S",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cont.S",
"output": ".pio/build/esp01_1m/FrameworkArduino/cont.S.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/cont_util.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cont_util.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/cont_util.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/cont_util.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_app_entry_noextra4k.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_app_entry_noextra4k.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_app_entry_noextra4k.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_app_entry_noextra4k.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_eboot_command.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_eboot_command.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_eboot_command.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_eboot_command.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_features.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_features.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_features.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_features.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_flash_quirks.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_flash_quirks.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_flash_quirks.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_flash_quirks.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_flash_utils.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_flash_utils.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_flash_utils.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_flash_utils.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_i2s.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_i2s.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_i2s.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_i2s.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_main.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_main.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_main.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_main.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_non32xfer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_non32xfer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_non32xfer.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_non32xfer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_noniso.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_noniso.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_noniso.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_noniso.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_phy.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_phy.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_phy.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_phy.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_postmortem.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_postmortem.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_postmortem.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_postmortem.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_si2c.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_si2c.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_si2c.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_si2c.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_sigma_delta.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_sigma_delta.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_sigma_delta.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_sigma_delta.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_spi_utils.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_spi_utils.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_spi_utils.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_spi_utils.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_timer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_timer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_timer.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_timer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_vm.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_vm.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_vm.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_vm.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_waveform_phase.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_waveform_phase.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_waveform_phase.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_waveform_phase.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_waveform_pwm.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_waveform_pwm.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_waveform_pwm.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_waveform_pwm.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_analog.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_analog.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_analog.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_analog.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_digital.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_digital.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_digital.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_digital.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_pulse.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_pulse.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_pulse.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_pulse.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_pwm.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_pwm.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_pwm.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_pwm.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_shift.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_shift.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/core_esp8266_wiring_shift.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/core_esp8266_wiring_shift.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/crc32.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/crc32.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/crc32.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/crc32.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/debug.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/debug.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/debug.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/debug.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -mlongcalls -mtext-section-literals -x assembler-with-cpp -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic -c -o .pio/build/esp01_1m/FrameworkArduino/exc-c-wrapper-handler.S.o /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/exc-c-wrapper-handler.S",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/exc-c-wrapper-handler.S",
"output": ".pio/build/esp01_1m/FrameworkArduino/exc-c-wrapper-handler.S.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/exc-sethandler.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/exc-sethandler.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/exc-sethandler.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/exc-sethandler.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/flash_hal.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/flash_hal.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/flash_hal.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/flash_hal.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/gdb_hooks.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/gdb_hooks.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/gdb_hooks.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/gdb_hooks.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/heap.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/heap.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/heap.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/heap.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/hwdt_app_entry.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/hwdt_app_entry.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/hwdt_app_entry.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/hwdt_app_entry.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/libb64/cdecode.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libb64/cdecode.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libb64/cdecode.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/libb64/cdecode.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/libb64/cencode.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libb64/cencode.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libb64/cencode.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/libb64/cencode.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/libc_replacements.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libc_replacements.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/libc_replacements.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/libc_replacements.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/mmu_iram.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/mmu_iram.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/mmu_iram.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/mmu_iram.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/reboot_uart_dwnld.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/reboot_uart_dwnld.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/reboot_uart_dwnld.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/reboot_uart_dwnld.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_cache.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_cache.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_check.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_check.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_check.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_check.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_gc.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_gc.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_gc.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_gc.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_hydrogen.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_hydrogen.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_hydrogen.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_hydrogen.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_nucleus.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs/spiffs_nucleus.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/spiffs_api.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs_api.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs_api.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/spiffs_api.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/sqrt32.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/sqrt32.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/sqrt32.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/sqrt32.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/stdlib_noniso.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/stdlib_noniso.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/stdlib_noniso.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/stdlib_noniso.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/time.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/time.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/time.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/time.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/uart.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/uart.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/uart.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/uart.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -o .pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_info.c.o -c -std=gnu17 -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_info.c",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_info.c",
"output": ".pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_info.c.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -o .pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_integrity.c.o -c -std=gnu17 -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_integrity.c",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_integrity.c",
"output": ".pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_integrity.c.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -o .pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_local.c.o -c -std=gnu17 -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_local.c",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_local.c",
"output": ".pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_local.c.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_malloc.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_malloc.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_malloc.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_malloc.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -o .pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_poison.c.o -c -std=gnu17 -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_poison.c",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_poison.c",
"output": ".pio/build/esp01_1m/FrameworkArduino/umm_malloc/umm_poison.c.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/FrameworkArduino/wpa2_eap_patch.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/wpa2_eap_patch.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/wpa2_eap_patch.cpp",
"output": ".pio/build/esp01_1m/FrameworkArduino/wpa2_eap_patch.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/libe54/Hash/Hash.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src/Hash.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src/Hash.cpp",
"output": ".pio/build/esp01_1m/libe54/Hash/Hash.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib573/ESPAsyncTCP/AsyncPrinter.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncTCP/src/AsyncPrinter.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncTCP/src/AsyncPrinter.cpp",
"output": ".pio/build/esp01_1m/lib573/ESPAsyncTCP/AsyncPrinter.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib573/ESPAsyncTCP/ESPAsyncTCP.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncTCP/src/ESPAsyncTCP.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncTCP/src/ESPAsyncTCP.cpp",
"output": ".pio/build/esp01_1m/lib573/ESPAsyncTCP/ESPAsyncTCP.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib573/ESPAsyncTCP/ESPAsyncTCPbuffer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncTCP/src/ESPAsyncTCPbuffer.cpp",
"output": ".pio/build/esp01_1m/lib573/ESPAsyncTCP/ESPAsyncTCPbuffer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib573/ESPAsyncTCP/SyncClient.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncTCP/src/SyncClient.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncTCP/src/SyncClient.cpp",
"output": ".pio/build/esp01_1m/lib573/ESPAsyncTCP/SyncClient.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-gcc -o .pio/build/esp01_1m/lib573/ESPAsyncTCP/tcp_axtls.c.o -c -std=gnu17 -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncTCP/src/tcp_axtls.c",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncTCP/src/tcp_axtls.c",
"output": ".pio/build/esp01_1m/lib573/ESPAsyncTCP/tcp_axtls.c.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/BearSSLHelpers.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/BearSSLHelpers.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/CertStoreBearSSL.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/CertStoreBearSSL.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFi.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFi.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiAP.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiAP.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiGeneric.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiGeneric.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiGratuitous.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiGratuitous.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiGratuitous.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiGratuitous.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiMulti.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiMulti.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiSTA-WPS.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiSTA-WPS.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiSTA.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiSTA.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiScan.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/ESP8266WiFiScan.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiClient.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClient.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClient.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiClient.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiClientSecureBearSSL.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiClientSecureBearSSL.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiServer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServer.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiServer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiServerSecureBearSSL.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiServerSecureBearSSL.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiUdp.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/WiFiUdp.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib39d/ESP8266WiFi/enable_wifi_at_boot_time.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp",
"output": ".pio/build/esp01_1m/lib39d/ESP8266WiFi/enable_wifi_at_boot_time.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncEventSource.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncEventSource.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncEventSource.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncEventSource.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncJson.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncJson.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncJson.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncJson.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncMessagePack.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncMessagePack.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncMessagePack.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncMessagePack.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebHeader.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebHeader.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebHeader.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebHeader.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebServerRequest.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebServerRequest.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebServerRequest.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebServerRequest.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebSocket.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebSocket.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/AsyncWebSocket.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/AsyncWebSocket.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/BackPort_SHA1Builder.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/BackPort_SHA1Builder.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/BackPort_SHA1Builder.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/BackPort_SHA1Builder.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/ChunkPrint.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/ChunkPrint.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/ChunkPrint.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/ChunkPrint.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/Middleware.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/Middleware.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/Middleware.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/Middleware.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebAuthentication.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebAuthentication.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebAuthentication.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebAuthentication.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebHandlers.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebHandlers.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebHandlers.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebHandlers.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebRequest.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebRequest.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebRequest.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebRequest.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebResponses.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebResponses.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebResponses.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebResponses.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebServer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic .pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebServer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": ".pio/libdeps/esp01_1m/ESPAsyncWebServer/src/WebServer.cpp",
"output": ".pio/build/esp01_1m/lib794/ESPAsyncWebServer/WebServer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/lib111/ESP8266HTTPClient/ESP8266HTTPClient.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic /home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp",
"output": ".pio/build/esp01_1m/lib111/ESP8266HTTPClient/ESP8266HTTPClient.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/examples/base/main.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic examples/base/main.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "examples/base/main.cpp",
"output": ".pio/build/esp01_1m/src/examples/base/main.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/ApiServer.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/ApiServer.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/ApiServer.cpp",
"output": ".pio/build/esp01_1m/src/src/ApiServer.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/ClusterManager.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/ClusterManager.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/ClusterManager.cpp",
"output": ".pio/build/esp01_1m/src/src/ClusterManager.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/Config.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/Config.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/Config.cpp",
"output": ".pio/build/esp01_1m/src/src/Config.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/NetworkManager.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/NetworkManager.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/NetworkManager.cpp",
"output": ".pio/build/esp01_1m/src/src/NetworkManager.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/NodeContext.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/NodeContext.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/NodeContext.cpp",
"output": ".pio/build/esp01_1m/src/src/NodeContext.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/NodeInfo.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/NodeInfo.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/NodeInfo.cpp",
"output": ".pio/build/esp01_1m/src/src/NodeInfo.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/TaskManager.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/TaskManager.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/TaskManager.cpp",
"output": ".pio/build/esp01_1m/src/src/TaskManager.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/services/ClusterService.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/services/ClusterService.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/services/ClusterService.cpp",
"output": ".pio/build/esp01_1m/src/src/services/ClusterService.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/services/NetworkService.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/services/NetworkService.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/services/NetworkService.cpp",
"output": ".pio/build/esp01_1m/src/src/services/NetworkService.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/services/NodeService.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/services/NodeService.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/services/NodeService.cpp",
"output": ".pio/build/esp01_1m/src/src/services/NodeService.cpp.o"
},
{
"command": "/home/master/.platformio/packages/toolchain-xtensa/bin/xtensa-lx106-elf-g++ -o .pio/build/esp01_1m/src/src/services/TaskService.cpp.o -c -fno-rtti -std=gnu++17 -fno-exceptions -Os -mlongcalls -mtext-section-literals -falign-functions=4 -U__STRICT_ANSI__ -ffunction-sections -fdata-sections -Wall -Werror=return-type -free -fipa-pta -DPLATFORMIO=60118 -DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01 -DF_CPU=80000000L -D__ets__ -DICACHE_FLASH -D_GNU_SOURCE -DARDUINO=10805 -DARDUINO_BOARD=\\\"PLATFORMIO_ESP01_1M\\\" -DARDUINO_BOARD_ID=\\\"esp01_1m\\\" -DFLASHMODE_DOUT -DLWIP_OPEN_SRC -DNONOSDK22x_190703=1 -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DVTABLES_IN_FLASH -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -Iinclude -I. -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src -I.pio/libdeps/esp01_1m/ESPAsyncWebServer/src -I.pio/libdeps/esp01_1m/ArduinoJson/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src -I.pio/libdeps/esp01_1m/ESPAsyncTCP/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/cores/esp8266 -I/home/master/.platformio/packages/toolchain-xtensa/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip2/include -I/home/master/.platformio/packages/framework-arduinoespressif8266/variants/generic src/services/TaskService.cpp",
"directory": "/home/master/src/embedded/spore",
"file": "src/services/TaskService.cpp",
"output": ".pio/build/esp01_1m/src/src/services/TaskService.cpp.o"
}
]

19
ctl.sh
View File

@@ -27,6 +27,25 @@ function flash {
${@:-info} ${@:-info}
} }
function mkfs {
~/bin/mklittlefs -c data \
-s 0x9000 \
-b 4096 \
-p 256 \
littlefs.bin
}
function flashfs {
esptool.py --port /dev/ttyUSB0 \
--baud 115200 \
write_flash 0xbb000 littlefs.bin
}
function uploadfs {
echo "Uploading files to LittleFS..."
pio run -e $1 -t uploadfs
}
function ota { function ota {
function update { function update {
echo "Updating node at $1 with $2... " echo "Updating node at $1 with $2... "

View File

@@ -73,6 +73,37 @@ lib_deps =
ESP8266WiFi@1.0 ESP8266WiFi@1.0
``` ```
### Filesystem, Linker Scripts, and Flash Layout
This project uses LittleFS as the filesystem on ESP8266. Flash layout is controlled by the linker script (ldscript) selected per environment in `platformio.ini`.
- **Filesystem**: LittleFS (replaces SPIFFS). Although ldscripts reference SPIFFS in their names, the reserved region is used by LittleFS transparently.
- **Why ldscript matters**: It defines maximum sketch size and the size of the filesystem area in flash.
| Board / Env | Flash size | ldscript | Filesystem | FS size | Notes |
|-------------|------------|---------|------------|---------|-------|
| esp01_1m | 1MB | `eagle.flash.1m64.ld` | LittleFS | 64KB | Prioritizes sketch size on 1MB modules. OTA is constrained on 1MB.
| d1_mini | 4MB | `eagle.flash.4m1m.ld` | LittleFS | 1MB | Standard 4M/1M layout; ample space for firmware and data.
Configured in `platformio.ini`:
```ini
[env:esp01_1m]
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.1m64.ld
[env:d1_mini]
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld
```
Notes:
- The ldscript name indicates total flash and filesystem size (e.g., `4m1m` = 4MB flash with 1MB FS; `1m64` = 1MB flash with 64KB FS).
- LittleFS works within the filesystem region defined by the ldscript, despite SPIFFS naming.
- If you need a different FS size, select an appropriate ldscript variant and keep `board_build.filesystem = littlefs`.
- On ESP8266, custom partition CSVs are not used for layout; the linker script defines the flash map. This project removed prior `board_build.partitions` usage in favor of explicit `board_build.ldscript` entries per environment.
## Building ## Building
### Basic Build Commands ### Basic Build Commands

View File

@@ -52,6 +52,7 @@ Complete development and deployment guide.
**Includes:** **Includes:**
- PlatformIO configuration - PlatformIO configuration
- Filesystem, linker scripts, and flash layout mapping
- Build and flash instructions - Build and flash instructions
- OTA update procedures - OTA update procedures
- Cluster management commands - Cluster management commands
@@ -59,6 +60,9 @@ Complete development and deployment guide.
- Troubleshooting guide - Troubleshooting guide
- Best practices - Best practices
### 📖 [StaticFileService.md](./StaticFileService.md)
Static file hosting over HTTP using LittleFS.
## Quick Links ## Quick Links
- **Main Project**: [../README.md](../README.md) - **Main Project**: [../README.md](../README.md)

84
docs/StaticFileService.md Normal file
View File

@@ -0,0 +1,84 @@
# StaticFileService
Serves static files from the device's LittleFS filesystem over HTTP.
## Overview
- Service name: `StaticFileService`
- Mounts: LittleFS at startup
- Endpoints:
- GET / → serves /index.html
- GET /* → serves any file under LittleFS by path
Files are looked up relative to the filesystem root. If a requested path is empty or `/`, it falls back to `index.html`. Unknown paths return 404; a helper exists to fall back to `index.html` for SPA routing if desired.
## Content types
Determined by filename extension:
- .html, .htm → text/html
- .css → text/css
- .js → application/javascript
- .json → application/json
- .png → image/png
- .jpg, .jpeg → image/jpeg
- .gif → image/gif
- .svg → image/svg+xml
- .ico → image/x-icon
- default → application/octet-stream
## Building and uploading the filesystem
Place your web assets under the `data/` folder at the project root. The build system packages `data/` into a LittleFS image matching the environment's flash layout.
### Upload via PlatformIO
```bash
# Build and upload filesystem for esp01_1m
pio run -e esp01_1m -t uploadfs
# Build and upload filesystem for d1_mini
pio run -e d1_mini -t uploadfs
```
### Manual image build (optional)
There are helper commands in `ctl.sh` if you need to build and flash the FS image manually:
```bash
# Build image from ./data into littlefs.bin
./ctl.sh mkfs
# Flash image at preconfigured offset
./ctl.sh flashfs
```
Note: Offsets and sizes must match the environment's ldscript. The project defaults are:
- esp01_1m: ldscript `eagle.flash.1m64.ld` (64KB FS)
- d1_mini: ldscript `eagle.flash.4m1m.ld` (1MB FS)
See `docs/Development.md` for details on filesystem and ldscript mapping.
## Enabling the service
`StaticFileService` is registered as a core service in the framework and enabled by default:
```cpp
// part of Spore::registerCoreServices()
auto staticFileService = std::make_shared<StaticFileService>(ctx, apiServer);
services.push_back(staticFileService);
```
If you maintain a custom build without the default services, ensure you instantiate and add the service before starting the API server.
## Routing notes
- Place your SPA assets in `data/` and reference paths relatively.
- To support client-side routing, you can adapt `handleNotFound` to always serve `/index.html` for unknown paths.
## Troubleshooting
- "LittleFS Mount Failed": Ensure `board_build.filesystem = littlefs` is set and the ldscript provides a filesystem region.
- 404 for known files: Confirm the file exists under `data/` and was uploaded (`pio run -t uploadfs`).
- Incorrect MIME type: Add the extension mapping to `getContentType()` if using custom extensions.

View File

@@ -0,0 +1,165 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Spore</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
margin: 0;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
min-height: 100vh;
}
.container {
max-width: 800px;
margin: 0 auto;
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 20px;
padding: 30px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
h1 {
text-align: center;
margin-bottom: 30px;
font-size: 2.5em;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.status-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.status-card {
background: rgba(255, 255, 255, 0.2);
border-radius: 15px;
padding: 20px;
text-align: center;
transition: transform 0.3s ease;
}
.status-card:hover {
transform: translateY(-5px);
}
.status-value {
font-size: 2em;
font-weight: bold;
margin: 10px 0;
}
.api-section {
margin-top: 30px;
}
.api-links {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
}
.api-link {
background: rgba(255, 255, 255, 0.2);
color: white;
text-decoration: none;
padding: 10px 20px;
border-radius: 25px;
transition: all 0.3s ease;
border: 2px solid transparent;
}
.api-link:hover {
background: rgba(255, 255, 255, 0.3);
border-color: rgba(255, 255, 255, 0.5);
transform: translateY(-2px);
}
.loading {
text-align: center;
font-style: italic;
opacity: 0.7;
}
</style>
</head>
<body>
<div class="container">
<h1>🍄 Spore Node</h1>
<div class="status-grid">
<div class="status-card">
<h3>Node Status</h3>
<div class="status-value" id="nodeStatus">Loading...</div>
</div>
<div class="status-card">
<h3>Network</h3>
<div class="status-value" id="networkStatus">Loading...</div>
</div>
<div class="status-card">
<h3>Tasks</h3>
<div class="status-value" id="taskStatus">Loading...</div>
</div>
<div class="status-card">
<h3>Cluster</h3>
<div class="status-value" id="clusterStatus">Loading...</div>
</div>
</div>
<div class="api-section">
<h2>API Endpoints</h2>
<div class="api-links">
<a href="/api/node/status" class="api-link">Node Status</a>
<a href="/api/network/status" class="api-link">Network Status</a>
<a href="/api/tasks/status" class="api-link">Tasks Status</a>
<a href="/api/cluster/members" class="api-link">Cluster Members</a>
<a href="/api/node/endpoints" class="api-link">All Endpoints</a>
</div>
</div>
</div>
<script>
// Load initial data
async function loadStatus() {
try {
const [nodeResponse, networkResponse, taskResponse, clusterResponse] = await Promise.all([
fetch('/api/node/status').then(r => r.json()).catch(() => null),
fetch('/api/network/status').then(r => r.json()).catch(() => null),
fetch('/api/tasks/status').then(r => r.json()).catch(() => null),
fetch('/api/cluster/members').then(r => r.json()).catch(() => null)
]);
// Update node status
if (nodeResponse) {
document.getElementById('nodeStatus').textContent =
nodeResponse.uptime ? `${Math.floor(nodeResponse.uptime / 1000)}s` : 'Online';
}
// Update network status
if (networkResponse) {
document.getElementById('networkStatus').textContent =
networkResponse.connected ? 'Connected' : 'Disconnected';
}
// Update task status
if (taskResponse) {
const activeTasks = taskResponse.tasks ?
taskResponse.tasks.filter(t => t.status === 'running').length : 0;
document.getElementById('taskStatus').textContent = `${activeTasks} active`;
}
// Update cluster status
if (clusterResponse) {
const memberCount = clusterResponse.members ?
Object.keys(clusterResponse.members).length : 0;
document.getElementById('clusterStatus').textContent = `${memberCount} nodes`;
}
} catch (error) {
console.error('Error loading status:', error);
}
}
// Load status on page load
loadStatus();
// Refresh status every 5 seconds
setInterval(loadStatus, 5000);
</script>
</body>
</html>

View File

@@ -1,470 +1,376 @@
/** #include "NeoPattern.h"
* Original NeoPattern code by Bill Earl
* https://learn.adafruit.com/multi-tasking-the-arduino-part-3/overview
*
* TODO
* - cleanup the mess
* - fnc table for patterns to replace switch case
*
* Custom modifications by 0x1d:
* - default OnComplete callback that sets pattern to reverse
* - separate animation update from timer; Update now updates directly, UpdateScheduled uses timer
*/
#ifndef __NeoPattern_INCLUDED__
#define __NeoPattern_INCLUDED__
#include <Adafruit_NeoPixel.h> // Constructor - calls base-class constructor to initialize strip
NeoPattern::NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)(int))
using namespace std; : Adafruit_NeoPixel(pixels, pin, type)
// Pattern types supported:
enum pattern
{ {
NONE = 0, frameBuffer = (uint8_t *)malloc(768);
RAINBOW_CYCLE = 1, OnComplete = callback;
THEATER_CHASE = 2, TotalSteps = numPixels();
COLOR_WIPE = 3, begin();
SCANNER = 4, }
FADE = 5,
FIRE = 6 NeoPattern::NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type)
}; : Adafruit_NeoPixel(pixels, pin, type)
// Patern directions supported:
enum direction
{ {
FORWARD, frameBuffer = (uint8_t *)malloc(768);
REVERSE TotalSteps = numPixels();
}; begin();
}
// NeoPattern Class - derived from the Adafruit_NeoPixel class NeoPattern::~NeoPattern() {
class NeoPattern : public Adafruit_NeoPixel if (frameBuffer) {
free(frameBuffer);
}
}
void NeoPattern::handleStream(uint8_t *data, size_t len)
{ {
public: //const uint16_t *data16 = (uint16_t *)data;
// Member Variables: bufferSize = len;
pattern ActivePattern = RAINBOW_CYCLE; // which pattern is running memcpy(frameBuffer, data, len);
direction Direction = FORWARD; // direction to run the pattern }
unsigned long Interval = 150; // milliseconds between updates void NeoPattern::drawFrameBuffer(int w, uint8_t *frame, int length)
unsigned long lastUpdate = 0; // last update of position {
for (int i = 0; i < length; i++)
uint32_t Color1 = 0;
uint32_t Color2 = 0; // What colors are in use
uint16_t TotalSteps = 32; // total number of steps in the pattern
uint16_t Index; // current step within the pattern
uint16_t completed = 0;
// FIXME return current NeoPatternState
void (*OnComplete)(int); // Callback on completion of pattern
uint8_t *frameBuffer;
int bufferSize = 0;
// Constructor - calls base-class constructor to initialize strip
NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)(int))
: Adafruit_NeoPixel(pixels, pin, type)
{ {
frameBuffer = (uint8_t *)malloc(768); uint8_t r = frame[i];
OnComplete = callback; uint8_t g = frame[i + 1];
TotalSteps = numPixels(); uint8_t b = frame[i + 2];
begin(); setPixelColor(i, r, g, b);
} }
}
NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type) void NeoPattern::onCompleteDefault(int pixels)
: Adafruit_NeoPixel(pixels, pin, type) {
//Serial.println("onCompleteDefault");
// FIXME no specific code
if (ActivePattern == THEATER_CHASE)
{ {
frameBuffer = (uint8_t *)malloc(768); return;
TotalSteps = numPixels();
begin();
} }
Reverse();
//Serial.println("pattern completed");
}
void handleStream(uint8_t *data, size_t len) // Increment the Index and reset at the end
void NeoPattern::Increment()
{
completed = 0;
if (Direction == FORWARD)
{ {
//const uint16_t *data16 = (uint16_t *)data; Index++;
bufferSize = len; if (Index >= TotalSteps)
memcpy(frameBuffer, data, len);
}
void drawFrameBuffer(int w, uint8_t *frame, int length)
{
for (int i = 0; i < length; i++)
{ {
uint8_t r = frame[i];
uint8_t g = frame[i + 1];
uint8_t b = frame[i + 2];
setPixelColor(i, r, g, b);
}
}
void onCompleteDefault(int pixels)
{
//Serial.println("onCompleteDefault");
// FIXME no specific code
if (ActivePattern == THEATER_CHASE)
{
return;
}
Reverse();
//Serial.println("pattern completed");
}
// Update the pattern
void Update()
{
switch (ActivePattern)
{
case RAINBOW_CYCLE:
RainbowCycleUpdate();
break;
case THEATER_CHASE:
TheaterChaseUpdate();
break;
case COLOR_WIPE:
ColorWipeUpdate();
break;
case SCANNER:
ScannerUpdate();
break;
case FADE:
FadeUpdate();
break;
case FIRE:
Fire(50, 120);
break;
default:
if (bufferSize > 0)
{
drawFrameBuffer(TotalSteps, frameBuffer, bufferSize);
}
break;
}
}
void UpdateScheduled()
{
if ((millis() - lastUpdate) > Interval) // time to update
{
lastUpdate = millis();
Update();
}
}
// Increment the Index and reset at the end
void Increment()
{
completed = 0;
if (Direction == FORWARD)
{
Index++;
if (Index >= TotalSteps)
{
Index = 0;
completed = 1;
if (OnComplete != NULL)
{
OnComplete(numPixels()); // call the comlpetion callback
}
else
{
onCompleteDefault(numPixels());
}
}
}
else // Direction == REVERSE
{
--Index;
if (Index <= 0)
{
Index = TotalSteps - 1;
completed = 1;
if (OnComplete != NULL)
{
OnComplete(numPixels()); // call the comlpetion callback
}
else
{
onCompleteDefault(numPixels());
}
}
}
}
// Reverse pattern direction
void Reverse()
{
if (Direction == FORWARD)
{
Direction = REVERSE;
Index = TotalSteps - 1;
}
else
{
Direction = FORWARD;
Index = 0; Index = 0;
} completed = 1;
} if (OnComplete != NULL)
// Initialize for a RainbowCycle
void RainbowCycle(uint8_t interval, direction dir = FORWARD)
{
ActivePattern = RAINBOW_CYCLE;
Interval = interval;
TotalSteps = 255;
Index = 0;
Direction = dir;
}
// Update the Rainbow Cycle Pattern
void RainbowCycleUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
setPixelColor(i, Wheel(((i * 256 / numPixels()) + Index) & 255));
}
show();
Increment();
}
// Initialize for a Theater Chase
void TheaterChase(uint32_t color1, uint32_t color2, uint16_t interval, direction dir = FORWARD)
{
ActivePattern = THEATER_CHASE;
Interval = interval;
TotalSteps = numPixels();
Color1 = color1;
Color2 = color2;
Index = 0;
Direction = dir;
}
// Update the Theater Chase Pattern
void TheaterChaseUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
if ((i + Index) % 3 == 0)
{ {
setPixelColor(i, Color1); OnComplete(numPixels()); // call the comlpetion callback
} }
else else
{ {
setPixelColor(i, Color2); onCompleteDefault(numPixels());
} }
} }
show();
Increment();
} }
else // Direction == REVERSE
// Initialize for a ColorWipe
void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD)
{ {
ActivePattern = COLOR_WIPE; --Index;
Interval = interval; if (Index <= 0)
TotalSteps = numPixels();
Color1 = color;
Index = 0;
Direction = dir;
}
// Update the Color Wipe Pattern
void ColorWipeUpdate()
{
setPixelColor(Index, Color1);
show();
Increment();
}
// Initialize for a SCANNNER
void Scanner(uint32_t color1, uint8_t interval)
{
ActivePattern = SCANNER;
Interval = interval;
TotalSteps = (numPixels() - 1) * 2;
Color1 = color1;
Index = 0;
}
// Update the Scanner Pattern
void ScannerUpdate()
{
for (int i = 0; i < numPixels(); i++)
{ {
if (i == Index) // Scan Pixel to the right Index = TotalSteps - 1;
completed = 1;
if (OnComplete != NULL)
{ {
setPixelColor(i, Color1); OnComplete(numPixels()); // call the comlpetion callback
}
else if (i == TotalSteps - Index) // Scan Pixel to the left
{
setPixelColor(i, Color1);
}
else // Fading tail
{
setPixelColor(i, DimColor(getPixelColor(i)));
}
}
show();
Increment();
}
// Initialize for a Fade
void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD)
{
ActivePattern = FADE;
Interval = interval;
TotalSteps = steps;
Color1 = color1;
Color2 = color2;
Index = 0;
Direction = dir;
}
// Update the Fade Pattern
void FadeUpdate()
{
// Calculate linear interpolation between Color1 and Color2
// Optimise order of operations to minimize truncation error
uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / TotalSteps;
uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps;
uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps;
ColorSet(Color(red, green, blue));
show();
Increment();
}
// Calculate 50% dimmed version of a color (used by ScannerUpdate)
uint32_t DimColor(uint32_t color)
{
// Shift R, G and B components one bit to the right
uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1);
return dimColor;
}
// Set all pixels to a color (synchronously)
void ColorSet(uint32_t color)
{
for (int i = 0; i < numPixels(); i++)
{
setPixelColor(i, color);
}
show();
}
// Returns the Red component of a 32-bit color
uint8_t Red(uint32_t color)
{
return (color >> 16) & 0xFF;
}
// Returns the Green component of a 32-bit color
uint8_t Green(uint32_t color)
{
return (color >> 8) & 0xFF;
}
// Returns the Blue component of a 32-bit color
uint8_t Blue(uint32_t color)
{
return color & 0xFF;
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(uint8_t WheelPos)
{
//if(WheelPos == 0) return Color(0,0,0);
WheelPos = 255 - WheelPos;
if (WheelPos < 85)
{
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else if (WheelPos < 170)
{
WheelPos -= 85;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
else
{
WheelPos -= 170;
return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}
/**
* Effects from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
void Fire(int Cooling, int Sparking)
{
uint8_t heat[numPixels()];
int cooldown;
// Step 1. Cool down every cell a little
for (int i = 0; i < numPixels(); i++)
{
cooldown = random(0, ((Cooling * 10) / numPixels()) + 2);
if (cooldown > heat[i])
{
heat[i] = 0;
} }
else else
{ {
heat[i] = heat[i] - cooldown; onCompleteDefault(numPixels());
} }
} }
// Step 2. Heat from each cell drifts 'up' and diffuses a little
for (int k = numPixels() - 1; k >= 2; k--)
{
heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
}
// Step 3. Randomly ignite new 'sparks' near the bottom
if (random(255) < Sparking)
{
int y = random(7);
heat[y] = heat[y] + random(160, 255);
//heat[y] = random(160,255);
}
// Step 4. Convert heat to LED colors
for (int j = 0; j < numPixels(); j++)
{
setPixelHeatColor(j, heat[j]);
}
showStrip();
} }
}
void setPixelHeatColor(int Pixel, uint8_t temperature) // Reverse pattern direction
void NeoPattern::Reverse()
{
if (Direction == FORWARD)
{ {
// Scale 'heat' down from 0-255 to 0-191 Direction = REVERSE;
uint8_t t192 = round((temperature / 255.0) * 191); Index = TotalSteps - 1;
}
else
{
Direction = FORWARD;
Index = 0;
}
}
// calculate ramp up from // Initialize for a RainbowCycle
uint8_t heatramp = t192 & 0x3F; // 0..63 void NeoPattern::RainbowCycle(uint8_t interval, direction dir)
heatramp <<= 2; // scale up to 0..252 {
ActivePattern = RAINBOW_CYCLE;
Interval = interval;
TotalSteps = 255;
Index = 0;
Direction = dir;
}
// figure out which third of the spectrum we're in: // Update the Rainbow Cycle Pattern
if (t192 > 0x80) void NeoPattern::RainbowCycleUpdate()
{ // hottest {
setPixel(Pixel, 255, 255, heatramp); for (int i = 0; i < numPixels(); i++)
} {
else if (t192 > 0x40) setPixelColor(i, Wheel(((i * 256 / numPixels()) + Index) & 255));
{ // middle }
setPixel(Pixel, 255, heatramp, 0); show();
Increment();
}
// Initialize for a Theater Chase
void NeoPattern::TheaterChase(uint32_t color1, uint32_t color2, uint16_t interval, direction dir)
{
ActivePattern = THEATER_CHASE;
Interval = interval;
TotalSteps = numPixels();
Color1 = color1;
Color2 = color2;
Index = 0;
Direction = dir;
}
// Update the Theater Chase Pattern
void NeoPattern::TheaterChaseUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
if ((i + Index) % 3 == 0)
{
setPixelColor(i, Color1);
} }
else else
{ // coolest {
setPixel(Pixel, heatramp, 0, 0); setPixelColor(i, Color2);
}
}
show();
Increment();
}
// Initialize for a ColorWipe
void NeoPattern::ColorWipe(uint32_t color, uint8_t interval, direction dir)
{
ActivePattern = COLOR_WIPE;
Interval = interval;
TotalSteps = numPixels();
Color1 = color;
Index = 0;
Direction = dir;
}
// Update the Color Wipe Pattern
void NeoPattern::ColorWipeUpdate()
{
setPixelColor(Index, Color1);
show();
Increment();
}
// Initialize for a SCANNNER
void NeoPattern::Scanner(uint32_t color1, uint8_t interval)
{
ActivePattern = SCANNER;
Interval = interval;
TotalSteps = (numPixels() - 1) * 2;
Color1 = color1;
Index = 0;
}
// Update the Scanner Pattern
void NeoPattern::ScannerUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
if (i == Index) // Scan Pixel to the right
{
setPixelColor(i, Color1);
}
else if (i == TotalSteps - Index) // Scan Pixel to the left
{
setPixelColor(i, Color1);
}
else // Fading tail
{
setPixelColor(i, DimColor(getPixelColor(i)));
}
}
show();
Increment();
}
// Initialize for a Fade
void NeoPattern::Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir)
{
ActivePattern = FADE;
Interval = interval;
TotalSteps = steps;
Color1 = color1;
Color2 = color2;
Index = 0;
Direction = dir;
}
// Update the Fade Pattern
void NeoPattern::FadeUpdate()
{
// Calculate linear interpolation between Color1 and Color2
// Optimise order of operations to minimize truncation error
uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / TotalSteps;
uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps;
uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps;
ColorSet(Color(red, green, blue));
show();
Increment();
}
// Calculate 50% dimmed version of a color (used by ScannerUpdate)
uint32_t NeoPattern::DimColor(uint32_t color)
{
// Shift R, G and B components one bit to the right
uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1);
return dimColor;
}
// Set all pixels to a color (synchronously)
void NeoPattern::ColorSet(uint32_t color)
{
for (int i = 0; i < numPixels(); i++)
{
setPixelColor(i, color);
}
show();
}
// Returns the Red component of a 32-bit color
uint8_t NeoPattern::Red(uint32_t color)
{
return (color >> 16) & 0xFF;
}
// Returns the Green component of a 32-bit color
uint8_t NeoPattern::Green(uint32_t color)
{
return (color >> 8) & 0xFF;
}
// Returns the Blue component of a 32-bit color
uint8_t NeoPattern::Blue(uint32_t color)
{
return color & 0xFF;
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t NeoPattern::Wheel(uint8_t WheelPos)
{
//if(WheelPos == 0) return Color(0,0,0);
WheelPos = 255 - WheelPos;
if (WheelPos < 85)
{
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else if (WheelPos < 170)
{
WheelPos -= 85;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
else
{
WheelPos -= 170;
return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}
/**
* Effects from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
void NeoPattern::Fire(int Cooling, int Sparking)
{
uint8_t heat[numPixels()];
int cooldown;
// Step 1. Cool down every cell a little
for (int i = 0; i < numPixels(); i++)
{
cooldown = random(0, ((Cooling * 10) / numPixels()) + 2);
if (cooldown > heat[i])
{
heat[i] = 0;
}
else
{
heat[i] = heat[i] - cooldown;
} }
} }
void setPixel(int Pixel, uint8_t red, uint8_t green, uint8_t blue) // Step 2. Heat from each cell drifts 'up' and diffuses a little
for (int k = numPixels() - 1; k >= 2; k--)
{ {
setPixelColor(Pixel, Color(red, green, blue)); heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
} }
void showStrip()
{
show();
}
};
#endif // Step 3. Randomly ignite new 'sparks' near the bottom
if (random(255) < Sparking)
{
int y = random(7);
heat[y] = heat[y] + random(160, 255);
//heat[y] = random(160,255);
}
// Step 4. Convert heat to LED colors
for (int j = 0; j < numPixels(); j++)
{
setPixelHeatColor(j, heat[j]);
}
showStrip();
}
void NeoPattern::setPixelHeatColor(int Pixel, uint8_t temperature)
{
// Scale 'heat' down from 0-255 to 0-191
uint8_t t192 = round((temperature / 255.0) * 191);
// calculate ramp up from
uint8_t heatramp = t192 & 0x3F; // 0..63
heatramp <<= 2; // scale up to 0..252
// figure out which third of the spectrum we're in:
if (t192 > 0x80)
{ // hottest
setPixel(Pixel, 255, 255, heatramp);
}
else if (t192 > 0x40)
{ // middle
setPixel(Pixel, 255, heatramp, 0);
}
else
{ // coolest
setPixel(Pixel, heatramp, 0, 0);
}
}
void NeoPattern::setPixel(int Pixel, uint8_t red, uint8_t green, uint8_t blue)
{
setPixelColor(Pixel, Color(red, green, blue));
}
void NeoPattern::showStrip()
{
show();
}

View File

@@ -0,0 +1,109 @@
/**
* Original NeoPattern code by Bill Earl
* https://learn.adafruit.com/multi-tasking-the-arduino-part-3/overview
*
* Custom modifications by 0x1d:
* - default OnComplete callback that sets pattern to reverse
* - separate animation update from timer; Update now updates directly, UpdateScheduled uses timer
*/
#ifndef __NeoPattern_INCLUDED__
#define __NeoPattern_INCLUDED__
#include <Adafruit_NeoPixel.h>
using namespace std;
// Pattern types supported:
enum pattern
{
NONE = 0,
RAINBOW_CYCLE = 1,
THEATER_CHASE = 2,
COLOR_WIPE = 3,
SCANNER = 4,
FADE = 5,
FIRE = 6
};
// Pattern directions supported:
enum direction
{
FORWARD,
REVERSE
};
// NeoPattern Class - derived from the Adafruit_NeoPixel class
class NeoPattern : public Adafruit_NeoPixel
{
public:
// Member Variables:
pattern ActivePattern = RAINBOW_CYCLE; // which pattern is running
direction Direction = FORWARD; // direction to run the pattern
unsigned long Interval = 150; // milliseconds between updates
unsigned long lastUpdate = 0; // last update of position
uint32_t Color1 = 0;
uint32_t Color2 = 0; // What colors are in use
uint16_t TotalSteps = 32; // total number of steps in the pattern
uint16_t Index; // current step within the pattern
uint16_t completed = 0;
// Callback on completion of pattern
void (*OnComplete)(int);
uint8_t *frameBuffer;
int bufferSize = 0;
// Constructor - calls base-class constructor to initialize strip
NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)(int));
NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type);
~NeoPattern();
// Stream handling
void handleStream(uint8_t *data, size_t len);
void drawFrameBuffer(int w, uint8_t *frame, int length);
// Pattern completion
void onCompleteDefault(int pixels);
// Pattern control
void Increment();
void Reverse();
// Rainbow Cycle
void RainbowCycle(uint8_t interval, direction dir = FORWARD);
void RainbowCycleUpdate();
// Theater Chase
void TheaterChase(uint32_t color1, uint32_t color2, uint16_t interval, direction dir = FORWARD);
void TheaterChaseUpdate();
// Color Wipe
void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD);
void ColorWipeUpdate();
// Scanner
void Scanner(uint32_t color1, uint8_t interval);
void ScannerUpdate();
// Fade
void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD);
void FadeUpdate();
// Fire effect
void Fire(int Cooling, int Sparking);
void setPixelHeatColor(int Pixel, uint8_t temperature);
void setPixel(int Pixel, uint8_t red, uint8_t green, uint8_t blue);
void showStrip();
// Utility methods
uint32_t DimColor(uint32_t color);
void ColorSet(uint32_t color);
uint8_t Red(uint32_t color);
uint8_t Green(uint32_t color);
uint8_t Blue(uint32_t color);
uint32_t Wheel(uint8_t WheelPos);
};
#endif

View File

@@ -1,56 +1,96 @@
#include "NeoPatternService.h" #include "NeoPatternService.h"
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/util/Logging.h"
#include <ArduinoJson.h>
NeoPatternService::NeoPatternService(TaskManager& taskMgr, uint16_t numPixels, uint8_t pin, uint8_t type) NeoPatternService::NeoPatternService(TaskManager& taskMgr, const NeoPixelConfig& config)
: taskManager(taskMgr), : taskManager(taskMgr),
pixels(numPixels, pin, type), config(config),
updateIntervalMs(100), activePattern(NeoPatternType::RAINBOW_CYCLE),
brightness(48) { direction(NeoDirection::FORWARD),
pixels.setBrightness(brightness); updateIntervalMs(config.updateInterval),
pixels.show(); lastUpdateMs(0),
initialized(false) {
// Initialize NeoPattern
neoPattern = new NeoPattern(config.length, config.pin, NEO_GRB + NEO_KHZ800);
neoPattern->setBrightness(config.brightness);
// Initialize state
currentState.pattern = static_cast<uint>(activePattern);
currentState.color = 0xFF0000; // Red
currentState.color2 = 0x0000FF; // Blue
currentState.totalSteps = 16;
currentState.brightness = config.brightness;
// Set initial pattern
neoPattern->Color1 = currentState.color;
neoPattern->Color2 = currentState.color2;
neoPattern->TotalSteps = currentState.totalSteps;
neoPattern->ActivePattern = static_cast<::pattern>(activePattern);
neoPattern->Direction = static_cast<::direction>(direction);
registerPatterns();
registerTasks(); registerTasks();
setPatternByName("rainbow_cycle"); initialized = true;
LOG_INFO("NeoPattern", "Service initialized");
}
NeoPatternService::~NeoPatternService() {
if (neoPattern) {
delete neoPattern;
}
} }
void NeoPatternService::registerEndpoints(ApiServer& api) { void NeoPatternService::registerEndpoints(ApiServer& api) {
// Status endpoint
api.addEndpoint("/api/neopattern/status", HTTP_GET, api.addEndpoint("/api/neopattern/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); }, [this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{});
// Patterns list endpoint
api.addEndpoint("/api/neopattern/patterns", HTTP_GET, api.addEndpoint("/api/neopattern/patterns", HTTP_GET,
[this](AsyncWebServerRequest* request) { handlePatternsRequest(request); }, [this](AsyncWebServerRequest* request) { handlePatternsRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{});
// Control endpoint
api.addEndpoint("/api/neopattern", HTTP_POST, api.addEndpoint("/api/neopattern", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleControlRequest(request); }, [this](AsyncWebServerRequest* request) { handleControlRequest(request); },
std::vector<ParamSpec>{ std::vector<ParamSpec>{
ParamSpec{String("pattern"), false, String("body"), String("string"), patternNamesVector()}, ParamSpec{String("pattern"), false, String("body"), String("string"), patternNamesVector()},
ParamSpec{String("interval_ms"), false, String("body"), String("number"), {}, String("100")},
ParamSpec{String("brightness"), false, String("body"), String("number"), {}, String("50")},
ParamSpec{String("color"), false, String("body"), String("color"), {}}, ParamSpec{String("color"), false, String("body"), String("color"), {}},
ParamSpec{String("color2"), false, String("body"), String("color"), {}}, ParamSpec{String("color2"), false, String("body"), String("color"), {}},
ParamSpec{String("r"), false, String("body"), String("number"), {}}, ParamSpec{String("brightness"), false, String("body"), String("numberRange"), {}, String("80")},
ParamSpec{String("g"), false, String("body"), String("number"), {}}, ParamSpec{String("total_steps"), false, String("body"), String("numberRange"), {}, String("16")},
ParamSpec{String("b"), false, String("body"), String("number"), {}}, ParamSpec{String("direction"), false, String("body"), String("string"), {String("forward"), String("reverse")}},
ParamSpec{String("r2"), false, String("body"), String("number"), {}}, ParamSpec{String("interval"), false, String("body"), String("number"), {}, String("100")}
ParamSpec{String("g2"), false, String("body"), String("number"), {}},
ParamSpec{String("b2"), false, String("body"), String("number"), {}},
ParamSpec{String("total_steps"), false, String("body"), String("number"), {}},
ParamSpec{String("direction"), false, String("body"), String("string"), {String("forward"), String("reverse")}}
}); });
// State endpoint for complex state updates
api.addEndpoint("/api/neopattern/state", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleStateRequest(request); },
std::vector<ParamSpec>{});
} }
void NeoPatternService::handleStatusRequest(AsyncWebServerRequest* request) { void NeoPatternService::handleStatusRequest(AsyncWebServerRequest* request) {
JsonDocument doc; JsonDocument doc;
doc["pin"] = pixels.getPin(); doc["pin"] = config.pin;
doc["count"] = pixels.numPixels(); doc["length"] = config.length;
doc["interval_ms"] = updateIntervalMs; doc["brightness"] = currentState.brightness;
doc["brightness"] = brightness;
doc["pattern"] = currentPatternName(); doc["pattern"] = currentPatternName();
doc["total_steps"] = pixels.TotalSteps; doc["color"] = String(currentState.color, HEX);
doc["color1"] = pixels.Color1; doc["color2"] = String(currentState.color2, HEX);
doc["color2"] = pixels.Color2; doc["total_steps"] = currentState.totalSteps;
doc["direction"] = (direction == NeoDirection::FORWARD) ? "forward" : "reverse";
doc["interval"] = updateIntervalMs;
doc["active"] = initialized;
// Add pattern metadata
String currentPattern = currentPatternName();
doc["pattern_description"] = getPatternDescription(currentPattern);
doc["pattern_requires_color2"] = patternRequiresColor2(currentPattern);
doc["pattern_supports_direction"] = patternSupportsDirection(currentPattern);
String json; String json;
serializeJson(doc, json); serializeJson(doc, json);
@@ -60,7 +100,17 @@ void NeoPatternService::handleStatusRequest(AsyncWebServerRequest* request) {
void NeoPatternService::handlePatternsRequest(AsyncWebServerRequest* request) { void NeoPatternService::handlePatternsRequest(AsyncWebServerRequest* request) {
JsonDocument doc; JsonDocument doc;
JsonArray arr = doc.to<JsonArray>(); JsonArray arr = doc.to<JsonArray>();
for (auto& kv : patternSetters) arr.add(kv.first);
// Get all patterns from registry and include metadata
auto patterns = patternRegistry.getAllPatterns();
for (const auto& pattern : patterns) {
JsonObject patternObj = arr.add<JsonObject>();
patternObj["name"] = pattern.name;
patternObj["type"] = pattern.type;
patternObj["description"] = pattern.description;
patternObj["requires_color2"] = pattern.requiresColor2;
patternObj["supports_direction"] = pattern.supportsDirection;
}
String json; String json;
serializeJson(doc, json); serializeJson(doc, json);
@@ -68,120 +118,334 @@ void NeoPatternService::handlePatternsRequest(AsyncWebServerRequest* request) {
} }
void NeoPatternService::handleControlRequest(AsyncWebServerRequest* request) { void NeoPatternService::handleControlRequest(AsyncWebServerRequest* request) {
bool updated = false;
if (request->hasParam("pattern", true)) { if (request->hasParam("pattern", true)) {
String name = request->getParam("pattern", true)->value(); String name = request->getParam("pattern", true)->value();
setPatternByName(name); if (isValidPattern(name)) {
setPatternByName(name);
updated = true;
} else {
// Invalid pattern name - could add error handling here
LOG_WARN("NeoPattern", "Invalid pattern name: " + name);
}
} }
if (request->hasParam("interval_ms", true)) { if (request->hasParam("color", true)) {
unsigned long v = request->getParam("interval_ms", true)->value().toInt(); String colorStr = request->getParam("color", true)->value();
if (v < 1) v = 1; uint32_t color = parseColor(colorStr);
updateIntervalMs = v; setColor(color);
taskManager.setTaskInterval("neopattern_update", updateIntervalMs); updated = true;
}
if (request->hasParam("color2", true)) {
String colorStr = request->getParam("color2", true)->value();
uint32_t color = parseColor(colorStr);
setColor2(color);
updated = true;
} }
if (request->hasParam("brightness", true)) { if (request->hasParam("brightness", true)) {
int b = request->getParam("brightness", true)->value().toInt(); int b = request->getParam("brightness", true)->value().toInt();
if (b < 0) b = 0; if (b > 255) b = 255; if (b < 0) b = 0;
setBrightness((uint8_t)b); if (b > 255) b = 255;
} setBrightness(static_cast<uint8_t>(b));
updated = true;
// Accept packed color ints or r,g,b triplets
if (request->hasParam("color", true)) {
pixels.Color1 = (uint32_t)strtoul(request->getParam("color", true)->value().c_str(), nullptr, 0);
}
if (request->hasParam("color2", true)) {
pixels.Color2 = (uint32_t)strtoul(request->getParam("color2", true)->value().c_str(), nullptr, 0);
}
if (request->hasParam("r", true) || request->hasParam("g", true) || request->hasParam("b", true)) {
int r = request->hasParam("r", true) ? request->getParam("r", true)->value().toInt() : 0;
int g = request->hasParam("g", true) ? request->getParam("g", true)->value().toInt() : 0;
int b = request->hasParam("b", true) ? request->getParam("b", true)->value().toInt() : 0;
pixels.Color1 = pixels.Color(r, g, b);
}
if (request->hasParam("r2", true) || request->hasParam("g2", true) || request->hasParam("b2", true)) {
int r = request->hasParam("r2", true) ? request->getParam("r2", true)->value().toInt() : 0;
int g = request->hasParam("g2", true) ? request->getParam("g2", true)->value().toInt() : 0;
int b = request->hasParam("b2", true) ? request->getParam("b2", true)->value().toInt() : 0;
pixels.Color2 = pixels.Color(r, g, b);
} }
if (request->hasParam("total_steps", true)) { if (request->hasParam("total_steps", true)) {
pixels.TotalSteps = request->getParam("total_steps", true)->value().toInt(); int steps = request->getParam("total_steps", true)->value().toInt();
if (steps > 0) {
setTotalSteps(static_cast<uint16_t>(steps));
updated = true;
}
} }
if (request->hasParam("direction", true)) { if (request->hasParam("direction", true)) {
String dir = request->getParam("direction", true)->value(); String dirStr = request->getParam("direction", true)->value();
if (dir.equalsIgnoreCase("forward")) pixels.Direction = FORWARD; NeoDirection dir = (dirStr.equalsIgnoreCase("reverse")) ? NeoDirection::REVERSE : NeoDirection::FORWARD;
else if (dir.equalsIgnoreCase("reverse")) pixels.Direction = REVERSE; setDirection(dir);
updated = true;
} }
if (request->hasParam("interval", true)) {
unsigned long interval = request->getParam("interval", true)->value().toInt();
if (interval > 0) {
setUpdateInterval(interval);
updated = true;
}
}
// Return current state
JsonDocument resp; JsonDocument resp;
resp["ok"] = true; resp["ok"] = true;
resp["pattern"] = currentPatternName(); resp["pattern"] = currentPatternName();
resp["interval_ms"] = updateIntervalMs; resp["color"] = String(currentState.color, HEX);
resp["brightness"] = brightness; resp["color2"] = String(currentState.color2, HEX);
resp["brightness"] = currentState.brightness;
resp["total_steps"] = currentState.totalSteps;
resp["direction"] = (direction == NeoDirection::FORWARD) ? "forward" : "reverse";
resp["interval"] = updateIntervalMs;
resp["updated"] = updated;
String json; String json;
serializeJson(resp, json); serializeJson(resp, json);
request->send(200, "application/json", json); request->send(200, "application/json", json);
} }
void NeoPatternService::setBrightness(uint8_t b) { void NeoPatternService::handleStateRequest(AsyncWebServerRequest* request) {
brightness = b; if (request->contentType() != "application/json") {
pixels.setBrightness(brightness); request->send(400, "application/json", "{\"error\":\"Content-Type must be application/json\"}");
pixels.show(); return;
}
// Note: AsyncWebServerRequest doesn't have getBody() method
// For now, we'll skip JSON body parsing and use form parameters
request->send(400, "application/json", "{\"error\":\"JSON body parsing not implemented\"}");
return;
// JSON body parsing not implemented for AsyncWebServerRequest
// This would need to be implemented differently
request->send(501, "application/json", "{\"error\":\"Not implemented\"}");
}
void NeoPatternService::setPattern(NeoPatternType pattern) {
activePattern = pattern;
currentState.pattern = static_cast<uint>(pattern);
neoPattern->ActivePattern = static_cast<::pattern>(pattern);
resetStateForPattern(pattern);
// Initialize the pattern using the registry
patternRegistry.initializePattern(static_cast<uint8_t>(pattern));
}
void NeoPatternService::setPatternByName(const String& name) {
NeoPatternType pattern = nameToPattern(name);
setPattern(pattern);
}
void NeoPatternService::setColor(uint32_t color) {
currentState.color = color;
neoPattern->Color1 = color;
if (activePattern == NeoPatternType::NONE) {
neoPattern->ColorSet(color);
}
}
void NeoPatternService::setColor2(uint32_t color) {
currentState.color2 = color;
neoPattern->Color2 = color;
}
void NeoPatternService::setBrightness(uint8_t brightness) {
currentState.brightness = brightness;
neoPattern->setBrightness(brightness);
neoPattern->show();
}
void NeoPatternService::setTotalSteps(uint16_t steps) {
currentState.totalSteps = steps;
neoPattern->TotalSteps = steps;
}
void NeoPatternService::setDirection(NeoDirection dir) {
direction = dir;
neoPattern->Direction = static_cast<::direction>(dir);
}
void NeoPatternService::setUpdateInterval(unsigned long interval) {
updateIntervalMs = interval;
taskManager.setTaskInterval("neopattern_update", interval);
}
void NeoPatternService::setState(const NeoPatternState& state) {
currentState = state;
// Apply state to NeoPattern
neoPattern->Index = 0;
neoPattern->Color1 = state.color;
neoPattern->Color2 = state.color2;
neoPattern->TotalSteps = state.totalSteps;
neoPattern->ActivePattern = static_cast<::pattern>(state.pattern);
neoPattern->Direction = FORWARD;
setBrightness(state.brightness);
setPattern(static_cast<NeoPatternType>(state.pattern));
}
NeoPatternState NeoPatternService::getState() const {
return currentState;
} }
void NeoPatternService::registerTasks() { void NeoPatternService::registerTasks() {
taskManager.registerTask("neopattern_update", updateIntervalMs, [this]() { update(); }); taskManager.registerTask("neopattern_update", updateIntervalMs, [this]() { update(); });
taskManager.registerTask("neopattern_status_print", 10000, [this]() { taskManager.registerTask("neopattern_status_print", 10000, [this]() {
Serial.printf("[NeoPattern] pattern=%s interval=%lu ms brightness=%u\n", LOG_INFO("NeoPattern", "Status update");
currentPatternName().c_str(), updateIntervalMs, brightness);
}); });
} }
void NeoPatternService::registerPatterns() { void NeoPatternService::registerPatterns() {
patternSetters["off"] = [this]() { pixels.ActivePattern = NONE; }; // Register all patterns with their metadata and callbacks
patternSetters["rainbow_cycle"] = [this]() { pixels.RainbowCycle(updateIntervalMs); }; patternRegistry.registerPattern(
patternSetters["theater_chase"] = [this]() { pixels.TheaterChase(pixels.Color1 ? pixels.Color1 : pixels.Color(127,127,127), pixels.Color2, updateIntervalMs); }; "none",
patternSetters["color_wipe"] = [this]() { pixels.ColorWipe(pixels.Color1 ? pixels.Color1 : pixels.Color(255,0,0), updateIntervalMs); }; static_cast<uint8_t>(NeoPatternType::NONE),
patternSetters["scanner"] = [this]() { pixels.Scanner(pixels.Color1 ? pixels.Color1 : pixels.Color(0,0,255), updateIntervalMs); }; "No pattern - solid color",
patternSetters["fade"] = [this]() { pixels.Fade(pixels.Color1, pixels.Color2, pixels.TotalSteps ? pixels.TotalSteps : 32, updateIntervalMs); }; [this]() { /* No initialization needed */ },
patternSetters["fire"] = [this]() { pixels.ActivePattern = FIRE; pixels.Interval = updateIntervalMs; }; [this]() { updateNone(); },
false, // doesn't require color2
false // doesn't support direction
);
patternRegistry.registerPattern(
"rainbow_cycle",
static_cast<uint8_t>(NeoPatternType::RAINBOW_CYCLE),
"Rainbow cycle pattern",
[this]() { neoPattern->RainbowCycle(updateIntervalMs, static_cast<::direction>(direction)); },
[this]() { updateRainbowCycle(); },
false, // doesn't require color2
true // supports direction
);
patternRegistry.registerPattern(
"theater_chase",
static_cast<uint8_t>(NeoPatternType::THEATER_CHASE),
"Theater chase pattern",
[this]() { neoPattern->TheaterChase(currentState.color, currentState.color2, updateIntervalMs, static_cast<::direction>(direction)); },
[this]() { updateTheaterChase(); },
true, // requires color2
true // supports direction
);
patternRegistry.registerPattern(
"color_wipe",
static_cast<uint8_t>(NeoPatternType::COLOR_WIPE),
"Color wipe pattern",
[this]() { neoPattern->ColorWipe(currentState.color, updateIntervalMs, static_cast<::direction>(direction)); },
[this]() { updateColorWipe(); },
false, // doesn't require color2
true // supports direction
);
patternRegistry.registerPattern(
"scanner",
static_cast<uint8_t>(NeoPatternType::SCANNER),
"Scanner pattern",
[this]() { neoPattern->Scanner(currentState.color, updateIntervalMs); },
[this]() { updateScanner(); },
false, // doesn't require color2
false // doesn't support direction
);
patternRegistry.registerPattern(
"fade",
static_cast<uint8_t>(NeoPatternType::FADE),
"Fade pattern",
[this]() { neoPattern->Fade(currentState.color, currentState.color2, currentState.totalSteps, updateIntervalMs, static_cast<::direction>(direction)); },
[this]() { updateFade(); },
true, // requires color2
true // supports direction
);
patternRegistry.registerPattern(
"fire",
static_cast<uint8_t>(NeoPatternType::FIRE),
"Fire effect pattern",
[this]() { neoPattern->Fire(50, 120); },
[this]() { updateFire(); },
false, // doesn't require color2
false // doesn't support direction
);
} }
std::vector<String> NeoPatternService::patternNamesVector() { std::vector<String> NeoPatternService::patternNamesVector() const {
if (patternSetters.empty()) registerPatterns(); return patternRegistry.getAllPatternNames();
std::vector<String> v;
v.reserve(patternSetters.size());
for (const auto& kv : patternSetters) v.push_back(kv.first);
return v;
} }
String NeoPatternService::currentPatternName() { String NeoPatternService::currentPatternName() const {
switch (pixels.ActivePattern) { return patternRegistry.getPatternName(static_cast<uint8_t>(activePattern));
case NONE: return String("off"); }
case RAINBOW_CYCLE: return String("rainbow_cycle");
case THEATER_CHASE: return String("theater_chase"); NeoPatternService::NeoPatternType NeoPatternService::nameToPattern(const String& name) const {
case COLOR_WIPE: return String("color_wipe"); uint8_t type = patternRegistry.getPatternType(name);
case SCANNER: return String("scanner"); return static_cast<NeoPatternType>(type);
case FADE: return String("fade"); }
case FIRE: return String("fire");
void NeoPatternService::resetStateForPattern(NeoPatternType pattern) {
neoPattern->Index = 0;
neoPattern->Direction = static_cast<::direction>(direction);
neoPattern->completed = 0;
lastUpdateMs = 0;
}
uint32_t NeoPatternService::parseColor(const String& colorStr) const {
if (colorStr.startsWith("#")) {
return strtoul(colorStr.substring(1).c_str(), nullptr, 16);
} else if (colorStr.startsWith("0x") || colorStr.startsWith("0X")) {
return strtoul(colorStr.c_str(), nullptr, 16);
} else {
return strtoul(colorStr.c_str(), nullptr, 10);
} }
return String("off");
} }
void NeoPatternService::setPatternByName(const String& name) { bool NeoPatternService::isValidPattern(const String& name) const {
if (patternSetters.empty()) registerPatterns(); return patternRegistry.isValidPattern(name);
auto it = patternSetters.find(name); }
if (it != patternSetters.end()) {
pixels.Index = 0; bool NeoPatternService::isValidPattern(NeoPatternType type) const {
pixels.Direction = FORWARD; return patternRegistry.isValidPattern(static_cast<uint8_t>(type));
it->second(); }
}
bool NeoPatternService::patternRequiresColor2(const String& name) const {
const PatternInfo* info = patternRegistry.getPattern(name);
return info ? info->requiresColor2 : false;
}
bool NeoPatternService::patternSupportsDirection(const String& name) const {
const PatternInfo* info = patternRegistry.getPattern(name);
return info ? info->supportsDirection : false;
}
String NeoPatternService::getPatternDescription(const String& name) const {
const PatternInfo* info = patternRegistry.getPattern(name);
return info ? info->description : "";
} }
void NeoPatternService::update() { void NeoPatternService::update() {
pixels.Update(); if (!initialized) return;
//unsigned long now = millis();
//if (now - lastUpdateMs < updateIntervalMs) return;
//lastUpdateMs = now;
// Use pattern registry to execute the current pattern
patternRegistry.executePattern(static_cast<uint8_t>(activePattern));
}
void NeoPatternService::updateRainbowCycle() {
neoPattern->RainbowCycleUpdate();
}
void NeoPatternService::updateTheaterChase() {
neoPattern->TheaterChaseUpdate();
}
void NeoPatternService::updateColorWipe() {
neoPattern->ColorWipeUpdate();
}
void NeoPatternService::updateScanner() {
neoPattern->ScannerUpdate();
}
void NeoPatternService::updateFade() {
neoPattern->FadeUpdate();
}
void NeoPatternService::updateFire() {
neoPattern->Fire(50, 120);
}
void NeoPatternService::updateNone() {
// For NONE pattern, just show the current color
neoPattern->ColorSet(neoPattern->Color1);
} }

View File

@@ -1,34 +1,95 @@
#pragma once #pragma once
#include "spore/Service.h" #include "spore/Service.h"
#include "spore/core/TaskManager.h" #include "spore/core/TaskManager.h"
#include "NeoPattern.cpp" #include "NeoPattern.h"
#include "NeoPatternState.h"
#include "NeoPixelConfig.h"
#include "PatternRegistry.h"
#include <map> #include <map>
#include <vector> #include <functional>
class NeoPatternService : public Service { class NeoPatternService : public Service {
public: public:
NeoPatternService(TaskManager& taskMgr, uint16_t numPixels, uint8_t pin, uint8_t type); enum class NeoPatternType {
NONE = 0,
RAINBOW_CYCLE = 1,
THEATER_CHASE = 2,
COLOR_WIPE = 3,
SCANNER = 4,
FADE = 5,
FIRE = 6
};
enum class NeoDirection {
FORWARD,
REVERSE
};
NeoPatternService(TaskManager& taskMgr, const NeoPixelConfig& config);
~NeoPatternService();
void registerEndpoints(ApiServer& api) override; void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return "NeoPattern"; } const char* getName() const override { return "NeoPattern"; }
void setBrightness(uint8_t b); // Pattern control methods
void setPattern(NeoPatternType pattern);
void setPatternByName(const String& name); void setPatternByName(const String& name);
void setColor(uint32_t color);
void setColor2(uint32_t color2);
void setBrightness(uint8_t brightness);
void setTotalSteps(uint16_t steps);
void setDirection(NeoDirection direction);
void setUpdateInterval(unsigned long interval);
// State management
void setState(const NeoPatternState& state);
NeoPatternState getState() const;
private: private:
void registerTasks(); void registerTasks();
void registerPatterns(); void registerPatterns();
std::vector<String> patternNamesVector();
String currentPatternName();
void update(); void update();
// Pattern updaters
void updateRainbowCycle();
void updateTheaterChase();
void updateColorWipe();
void updateScanner();
void updateFade();
void updateFire();
void updateNone();
// Handlers // API handlers
void handleStatusRequest(AsyncWebServerRequest* request); void handleStatusRequest(AsyncWebServerRequest* request);
void handlePatternsRequest(AsyncWebServerRequest* request); void handlePatternsRequest(AsyncWebServerRequest* request);
void handleControlRequest(AsyncWebServerRequest* request); void handleControlRequest(AsyncWebServerRequest* request);
void handleStateRequest(AsyncWebServerRequest* request);
// Utility methods
std::vector<String> patternNamesVector() const;
String currentPatternName() const;
NeoPatternType nameToPattern(const String& name) const;
void resetStateForPattern(NeoPatternType pattern);
uint32_t parseColor(const String& colorStr) const;
// Pattern validation methods
bool isValidPattern(const String& name) const;
bool isValidPattern(NeoPatternType type) const;
bool patternRequiresColor2(const String& name) const;
bool patternSupportsDirection(const String& name) const;
String getPatternDescription(const String& name) const;
TaskManager& taskManager; TaskManager& taskManager;
NeoPattern pixels; NeoPattern* neoPattern;
NeoPixelConfig config;
NeoPatternState currentState;
// Pattern registry for centralized pattern management
PatternRegistry patternRegistry;
NeoPatternType activePattern;
NeoDirection direction;
unsigned long updateIntervalMs; unsigned long updateIntervalMs;
uint8_t brightness; unsigned long lastUpdateMs;
std::map<String, std::function<void()>> patternSetters; bool initialized;
}; };

View File

@@ -0,0 +1,59 @@
#ifndef __NEOPATTERN_STATE__
#define __NEOPATTERN_STATE__
#include <ArduinoJson.h>
struct NeoPatternState {
// Default values
static constexpr uint DEFAULT_PATTERN = 0;
static constexpr uint DEFAULT_COLOR = 0xFF0000; // Red
static constexpr uint DEFAULT_COLOR2 = 0x0000FF; // Blue
static constexpr uint DEFAULT_TOTAL_STEPS = 16;
static constexpr uint DEFAULT_BRIGHTNESS = 64;
uint pattern = DEFAULT_PATTERN;
uint color = DEFAULT_COLOR;
uint color2 = DEFAULT_COLOR2;
uint totalSteps = DEFAULT_TOTAL_STEPS;
uint brightness = DEFAULT_BRIGHTNESS;
NeoPatternState() = default;
NeoPatternState(uint p, uint c, uint c2, uint steps, uint b)
: pattern(p), color(c), color2(c2), totalSteps(steps), brightness(b) {}
void mapJsonObject(JsonObject& root) const {
root["pattern"] = pattern;
root["color"] = color;
root["color2"] = color2;
root["totalSteps"] = totalSteps;
root["brightness"] = brightness;
}
void fromJsonObject(JsonObject& json) {
pattern = json["pattern"] | pattern;
color = json["color"] | color;
color2 = json["color2"] | color2;
totalSteps = json["totalSteps"] | totalSteps;
brightness = json["brightness"] | brightness;
}
// Helper methods for JSON string conversion
String toJsonString() const {
JsonDocument doc;
JsonObject root = doc.to<JsonObject>();
mapJsonObject(root);
String result;
serializeJson(doc, result);
return result;
}
void fromJsonString(const String& jsonStr) {
JsonDocument doc;
deserializeJson(doc, jsonStr);
JsonObject root = doc.as<JsonObject>();
fromJsonObject(root);
}
};
#endif

View File

@@ -0,0 +1,45 @@
#ifndef __NEOPIXEL_CONFIG__
#define __NEOPIXEL_CONFIG__
#include <ArduinoJson.h>
struct NeoPixelConfig
{
// Configuration constants
static constexpr int DEFAULT_PIN = 2;
static constexpr int DEFAULT_LENGTH = 8;
static constexpr int DEFAULT_BRIGHTNESS = 100;
static constexpr int DEFAULT_UPDATE_INTERVAL = 100;
static constexpr int DEFAULT_COLOR = 0xFF0000; // Red
int pin = DEFAULT_PIN;
int length = DEFAULT_LENGTH;
int brightness = DEFAULT_BRIGHTNESS;
int updateInterval = DEFAULT_UPDATE_INTERVAL;
int defaultColor = DEFAULT_COLOR;
NeoPixelConfig() = default;
NeoPixelConfig(int p, int l, int b, int interval, int color = DEFAULT_COLOR)
: pin(p), length(l), brightness(b), updateInterval(interval), defaultColor(color) {}
void mapJsonObject(JsonObject &root) const
{
root["pin"] = pin;
root["length"] = length;
root["brightness"] = brightness;
root["updateInterval"] = updateInterval;
root["defaultColor"] = defaultColor;
}
void fromJsonObject(JsonObject &json)
{
pin = json["pin"] | pin;
length = json["length"] | length;
brightness = json["brightness"] | brightness;
updateInterval = json["updateInterval"] | updateInterval;
defaultColor = json["defaultColor"] | defaultColor;
}
};
#endif

View File

@@ -0,0 +1,101 @@
#include "PatternRegistry.h"
PatternRegistry::PatternRegistry() {
// Constructor - patterns will be registered by the service
}
void PatternRegistry::registerPattern(const PatternInfo& pattern) {
patternMap_[pattern.name] = pattern;
typeToNameMap_[pattern.type] = pattern.name;
}
void PatternRegistry::registerPattern(const String& name, uint8_t type, const String& description,
std::function<void()> initializer, std::function<void()> updater,
bool requiresColor2, bool supportsDirection) {
PatternInfo info(name, type, description, initializer, updater, requiresColor2, supportsDirection);
registerPattern(info);
}
const PatternInfo* PatternRegistry::getPattern(const String& name) const {
auto it = patternMap_.find(name);
return (it != patternMap_.end()) ? &it->second : nullptr;
}
const PatternInfo* PatternRegistry::getPattern(uint8_t type) const {
auto typeIt = typeToNameMap_.find(type);
if (typeIt == typeToNameMap_.end()) {
return nullptr;
}
return getPattern(typeIt->second);
}
String PatternRegistry::getPatternName(uint8_t type) const {
auto it = typeToNameMap_.find(type);
return (it != typeToNameMap_.end()) ? it->second : "";
}
uint8_t PatternRegistry::getPatternType(const String& name) const {
const PatternInfo* info = getPattern(name);
return info ? info->type : 0;
}
std::vector<String> PatternRegistry::getAllPatternNames() const {
std::vector<String> names;
names.reserve(patternMap_.size());
for (const auto& pair : patternMap_) {
names.push_back(pair.first);
}
return names;
}
std::vector<PatternInfo> PatternRegistry::getAllPatterns() const {
std::vector<PatternInfo> patterns;
patterns.reserve(patternMap_.size());
for (const auto& pair : patternMap_) {
patterns.push_back(pair.second);
}
return patterns;
}
bool PatternRegistry::isValidPattern(const String& name) const {
return patternMap_.find(name) != patternMap_.end();
}
bool PatternRegistry::isValidPattern(uint8_t type) const {
return typeToNameMap_.find(type) != typeToNameMap_.end();
}
void PatternRegistry::executePattern(const String& name) const {
const PatternInfo* info = getPattern(name);
if (info && info->updater) {
info->updater();
}
}
void PatternRegistry::executePattern(uint8_t type) const {
const PatternInfo* info = getPattern(type);
if (info && info->updater) {
info->updater();
}
}
void PatternRegistry::initializePattern(const String& name) const {
const PatternInfo* info = getPattern(name);
if (info && info->initializer) {
info->initializer();
}
}
void PatternRegistry::initializePattern(uint8_t type) const {
const PatternInfo* info = getPattern(type);
if (info && info->initializer) {
info->initializer();
}
}
void PatternRegistry::updateTypeMap() {
typeToNameMap_.clear();
for (const auto& pair : patternMap_) {
typeToNameMap_[pair.second.type] = pair.first;
}
}

View File

@@ -0,0 +1,73 @@
#pragma once
#include <map>
#include <functional>
#include <vector>
#include <Arduino.h>
/**
* PatternInfo structure containing all information needed for a pattern
*/
struct PatternInfo {
String name;
uint8_t type;
String description;
std::function<void()> updater;
std::function<void()> initializer;
bool requiresColor2;
bool supportsDirection;
// Default constructor for std::map compatibility
PatternInfo() : type(0), requiresColor2(false), supportsDirection(false) {}
// Parameterized constructor
PatternInfo(const String& n, uint8_t t, const String& desc,
std::function<void()> initFunc, std::function<void()> updateFunc = nullptr,
bool needsColor2 = false, bool supportsDir = true)
: name(n), type(t), description(desc), updater(updateFunc),
initializer(initFunc), requiresColor2(needsColor2), supportsDirection(supportsDir) {}
};
/**
* PatternRegistry class for centralized pattern management
*/
class PatternRegistry {
public:
using PatternMap = std::map<String, PatternInfo>;
using PatternTypeMap = std::map<uint8_t, String>;
PatternRegistry();
~PatternRegistry() = default;
// Pattern registration
void registerPattern(const PatternInfo& pattern);
void registerPattern(const String& name, uint8_t type, const String& description,
std::function<void()> initializer, std::function<void()> updater = nullptr,
bool requiresColor2 = false, bool supportsDirection = true);
// Pattern lookup
const PatternInfo* getPattern(const String& name) const;
const PatternInfo* getPattern(uint8_t type) const;
String getPatternName(uint8_t type) const;
uint8_t getPatternType(const String& name) const;
// Pattern enumeration
std::vector<String> getAllPatternNames() const;
std::vector<PatternInfo> getAllPatterns() const;
const PatternMap& getPatternMap() const { return patternMap_; }
// Pattern validation
bool isValidPattern(const String& name) const;
bool isValidPattern(uint8_t type) const;
// Pattern execution
void executePattern(const String& name) const;
void executePattern(uint8_t type) const;
void initializePattern(const String& name) const;
void initializePattern(uint8_t type) const;
private:
PatternMap patternMap_;
PatternTypeMap typeToNameMap_;
void updateTypeMap();
};

View File

@@ -0,0 +1,131 @@
# NeoPattern Service for Spore Framework
This example demonstrates how to integrate a NeoPixel pattern service with the Spore framework. It provides a comprehensive LED strip control system with multiple animation patterns and REST API endpoints.
## Features
- **Multiple Animation Patterns**: Rainbow cycle, theater chase, color wipe, scanner, fade, and fire effects
- **REST API Control**: Full HTTP API for pattern control and configuration
- **Real-time Updates**: Smooth pattern transitions and real-time parameter changes
- **State Management**: Persistent state with JSON serialization
- **Spore Integration**: Built on the Spore framework for networking and task management
## Hardware Requirements
- ESP32 or compatible microcontroller
- NeoPixel LED strip (WS2812B or compatible)
- Appropriate power supply for your LED strip
## Configuration
Edit `NeoPixelConfig.h` to configure your setup:
```cpp
static constexpr int DEFAULT_PIN = 2;
static constexpr int DEFAULT_LENGTH = 8;
static constexpr int DEFAULT_BRIGHTNESS = 100;
static constexpr int DEFAULT_UPDATE_INTERVAL = 100;
static constexpr int DEFAULT_COLOR = 0xFF0000; // Red
```
## API Endpoints
### Status Information
- `GET /api/neopattern/status` - Get current status and configuration
- `GET /api/neopattern/patterns` - List available patterns
### Pattern Control
- `POST /api/neopattern` - Control pattern parameters
- `pattern`: Pattern name (none, rainbow_cycle, theater_chase, color_wipe, scanner, fade, fire)
- `color`: Primary color (hex string like "#FF0000" or "0xFF0000")
- `color2`: Secondary color for two-color patterns
- `brightness`: Brightness level (0-255)
- `total_steps`: Number of steps for patterns
- `direction`: Pattern direction (forward, reverse)
- `interval`: Update interval in milliseconds
### State Management
- `POST /api/neopattern/state` - Set complete state via JSON
## Example API Usage
### Set a rainbow cycle pattern
```bash
curl -X POST http://esp32-ip/api/neopattern \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "pattern=rainbow_cycle&interval=50"
```
### Set custom colors for theater chase
```bash
curl -X POST http://esp32-ip/api/neopattern \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "pattern=theater_chase&color=0xFF0000&color2=0x0000FF&brightness=150"
```
### Set complete state via JSON
```bash
curl -X POST http://esp32-ip/api/neopattern/state \
-H "Content-Type: application/json" \
-d '{
"pattern": 3,
"color": 16711680,
"color2": 255,
"totalSteps": 32,
"brightness": 128
}'
```
## Available Patterns
1. **none** - Static color display
2. **rainbow_cycle** - Smooth rainbow cycling
3. **theater_chase** - Moving dots with two colors
4. **color_wipe** - Progressive color filling
5. **scanner** - Scanning light effect
6. **fade** - Smooth color transition
7. **fire** - Fire simulation effect
## Building and Flashing
1. Install PlatformIO
2. Configure your `platformio.ini` to include the Spore framework
3. Build and upload:
```bash
pio run -t upload
```
## Integration with Spore Framework
This service integrates with the Spore framework by:
- Extending the `Service` base class
- Using `TaskManager` for pattern updates
- Registering REST API endpoints with `ApiServer`
- Following Spore's logging and configuration patterns
The service automatically registers itself with the Spore framework and provides all functionality through the standard Spore API infrastructure.
## Customization
To add new patterns:
1. Add the pattern enum to `NeoPatternService.h`
2. Implement the pattern logic in `NeoPattern.cpp`
3. Add the pattern updater to `registerPatterns()` in `NeoPatternService.cpp`
4. Update the pattern mapping in `nameToPatternMap`
## Troubleshooting
- **LEDs not lighting**: Check wiring and power supply
- **Patterns not updating**: Verify the update interval and task registration
- **API not responding**: Check network configuration and Spore framework setup
- **Memory issues**: Reduce LED count or pattern complexity
## Dependencies
- Spore Framework
- Adafruit NeoPixel library
- ArduinoJson
- ESP32 Arduino Core

View File

@@ -1,31 +0,0 @@
#ifndef __DEVICE_CONFIG__
#define __DEVICE_CONFIG__
// Scheduler config
#define _TASK_SLEEP_ON_IDLE_RUN
#define _TASK_STD_FUNCTION
#define _TASK_PRIORITY
// Chip config
#define SPROCKET_TYPE "SPROCKET"
#define SERIAL_BAUD_RATE 115200
#define STARTUP_DELAY 1000
// network config
#define SPROCKET_MODE 1
#define WIFI_CHANNEL 11
#define AP_SSID "sprocket"
#define AP_PASSWORD "th3r31sn0sp00n"
#define STATION_SSID "MyAP"
#define STATION_PASSWORD "th3r31sn0sp00n"
#define HOSTNAME "sprocket"
#define CONNECT_TIMEOUT 10000
// NeoPixel conig
#define LED_STRIP_PIN D2
#define LED_STRIP_LENGTH 8
#define LED_STRIP_BRIGHTNESS 48
#define LED_STRIP_UPDATE_INTERVAL 200
#define LED_STRIP_DEFAULT_COLOR 100
#endif

View File

@@ -1,25 +1,32 @@
#include <Arduino.h> #include <Arduino.h>
#include "spore/Spore.h" #include "spore/Spore.h"
#include "spore/util/Logging.h"
#include "NeoPatternService.h" #include "NeoPatternService.h"
#include "NeoPixelConfig.h"
#ifndef LED_STRIP_PIN // Configuration constants
#define LED_STRIP_PIN 2 #ifndef NEOPIXEL_PIN
#define NEOPIXEL_PIN 2
#endif #endif
#ifndef LED_STRIP_LENGTH #ifndef NEOPIXEL_LENGTH
#define LED_STRIP_LENGTH 8 #define NEOPIXEL_LENGTH 8
#endif #endif
#ifndef LED_STRIP_TYPE #ifndef NEOPIXEL_BRIGHTNESS
#define LED_STRIP_TYPE (NEO_GRB + NEO_KHZ800) #define NEOPIXEL_BRIGHTNESS 100
#endif
#ifndef NEOPIXEL_UPDATE_INTERVAL
#define NEOPIXEL_UPDATE_INTERVAL 100
#endif #endif
// Create Spore instance with custom labels // Create Spore instance with custom labels
Spore spore({ Spore spore({
{"app", "neopattern"}, {"app", "neopattern"},
{"device", "light"}, {"role", "led"},
{"pixels", String(LED_STRIP_LENGTH)}, {"pixels", String(NEOPIXEL_LENGTH)},
{"pin", String(LED_STRIP_PIN)} {"pin", String(NEOPIXEL_PIN)}
}); });
// Create custom service // Create custom service
@@ -29,17 +36,25 @@ void setup() {
// Initialize the Spore framework // Initialize the Spore framework
spore.setup(); spore.setup();
// Create configuration
NeoPixelConfig config(
NEOPIXEL_PIN,
NEOPIXEL_LENGTH,
NEOPIXEL_BRIGHTNESS,
NEOPIXEL_UPDATE_INTERVAL
);
// Create and add custom service // Create and add custom service
neoPatternService = new NeoPatternService(spore.getTaskManager(), LED_STRIP_LENGTH, LED_STRIP_PIN, LED_STRIP_TYPE); neoPatternService = new NeoPatternService(spore.getTaskManager(), config);
spore.addService(neoPatternService); spore.addService(neoPatternService);
// Start the API server and complete initialization // Start the API server and complete initialization
spore.begin(); spore.begin();
Serial.println("[Main] NeoPattern service registered and ready!"); LOG_INFO("Main", "NeoPattern service registered and ready!");
} }
void loop() { void loop() {
// Run the Spore framework loop // Run the Spore framework loop
spore.loop(); spore.loop();
} }

View File

@@ -1,291 +0,0 @@
#include "NeoPixelService.h"
#include "spore/core/ApiServer.h"
// Wheel helper: map 0-255 to RGB rainbow
static uint32_t colorWheel(Adafruit_NeoPixel& strip, uint8_t pos) {
pos = 255 - pos;
if (pos < 85) {
return strip.Color(255 - pos * 3, 0, pos * 3);
}
if (pos < 170) {
pos -= 85;
return strip.Color(0, pos * 3, 255 - pos * 3);
}
pos -= 170;
return strip.Color(pos * 3, 255 - pos * 3, 0);
}
NeoPixelService::NeoPixelService(TaskManager& taskMgr, uint16_t numPixels, uint8_t pin, neoPixelType type)
: taskManager(taskMgr),
strip(numPixels, pin, type),
currentPattern(Pattern::Off),
updateIntervalMs(20),
lastUpdateMs(0),
wipeIndex(0),
wipeColor(strip.Color(255, 0, 0)),
rainbowJ(0),
cycleJ(0),
chaseJ(0),
chaseQ(0),
chasePhaseOn(true),
chaseColor(strip.Color(127, 127, 127)),
brightness(50) {
strip.begin();
strip.setBrightness(brightness);
strip.show();
registerPatterns();
registerTasks();
}
void NeoPixelService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/neopixel/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{});
api.addEndpoint("/api/neopixel/patterns", HTTP_GET,
[this](AsyncWebServerRequest* request) { handlePatternsRequest(request); },
std::vector<ParamSpec>{});
api.addEndpoint("/api/neopixel", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleControlRequest(request); },
std::vector<ParamSpec>{
ParamSpec{String("pattern"), false, String("body"), String("string"), patternNamesVector()},
ParamSpec{String("interval_ms"), false, String("body"), String("number"), {}, String("100")},
ParamSpec{String("brightness"), false, String("body"), String("number"), {}, String("50")},
ParamSpec{String("color"), false, String("body"), String("color"), {}},
ParamSpec{String("color2"), false, String("body"), String("color"), {}},
ParamSpec{String("r"), false, String("body"), String("number"), {}},
ParamSpec{String("g"), false, String("body"), String("number"), {}},
ParamSpec{String("b"), false, String("body"), String("number"), {}},
ParamSpec{String("r2"), false, String("body"), String("number"), {}},
ParamSpec{String("g2"), false, String("body"), String("number"), {}},
ParamSpec{String("b2"), false, String("body"), String("number"), {}},
ParamSpec{String("total_steps"), false, String("body"), String("number"), {}},
ParamSpec{String("direction"), false, String("body"), String("string"), {String("forward"), String("reverse")}}
});
}
void NeoPixelService::handleStatusRequest(AsyncWebServerRequest* request) {
JsonDocument doc;
doc["pin"] = strip.getPin();
doc["count"] = strip.numPixels();
doc["interval_ms"] = updateIntervalMs;
doc["brightness"] = brightness;
doc["pattern"] = currentPatternName();
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
}
void NeoPixelService::handlePatternsRequest(AsyncWebServerRequest* request) {
JsonDocument doc;
JsonArray arr = doc.to<JsonArray>();
for (auto& kv : patternUpdaters) arr.add(kv.first);
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
}
void NeoPixelService::handleControlRequest(AsyncWebServerRequest* request) {
if (request->hasParam("pattern", true)) {
String name = request->getParam("pattern", true)->value();
setPatternByName(name);
}
if (request->hasParam("interval_ms", true)) {
unsigned long v = request->getParam("interval_ms", true)->value().toInt();
if (v < 1) v = 1;
updateIntervalMs = v;
taskManager.setTaskInterval("neopixel_update", updateIntervalMs);
}
if (request->hasParam("brightness", true)) {
int b = request->getParam("brightness", true)->value().toInt();
if (b < 0) b = 0; if (b > 255) b = 255;
setBrightness((uint8_t)b);
}
// Accept packed color ints or r,g,b triplets
if (request->hasParam("color", true)) {
wipeColor = (uint32_t)strtoul(request->getParam("color", true)->value().c_str(), nullptr, 0);
chaseColor = wipeColor;
}
if (request->hasParam("r", true) || request->hasParam("g", true) || request->hasParam("b", true)) {
int r = request->hasParam("r", true) ? request->getParam("r", true)->value().toInt() : 0;
int g = request->hasParam("g", true) ? request->getParam("g", true)->value().toInt() : 0;
int b = request->hasParam("b", true) ? request->getParam("b", true)->value().toInt() : 0;
wipeColor = strip.Color(r, g, b);
chaseColor = strip.Color(r / 2, g / 2, b / 2); // dimmer for chase
}
JsonDocument resp;
resp["ok"] = true;
resp["pattern"] = currentPatternName();
resp["interval_ms"] = updateIntervalMs;
resp["brightness"] = brightness;
String json;
serializeJson(resp, json);
request->send(200, "application/json", json);
}
void NeoPixelService::setBrightness(uint8_t b) {
brightness = b;
strip.setBrightness(brightness);
strip.show();
}
void NeoPixelService::registerTasks() {
taskManager.registerTask("neopixel_update", updateIntervalMs, [this]() { update(); });
taskManager.registerTask("neopixel_status_print", 10000, [this]() {
Serial.printf("[NeoPixel] pattern=%s interval=%lu ms brightness=%u\n",
currentPatternName().c_str(), updateIntervalMs, brightness);
});
}
void NeoPixelService::registerPatterns() {
patternUpdaters["off"] = [this]() { updateOff(); };
patternUpdaters["color_wipe"] = [this]() { updateColorWipe(); };
patternUpdaters["rainbow"] = [this]() { updateRainbow(); };
patternUpdaters["rainbow_cycle"] = [this]() { updateRainbowCycle(); };
patternUpdaters["theater_chase"] = [this]() { updateTheaterChase(); };
patternUpdaters["theater_chase_rainbow"] = [this]() { updateTheaterChaseRainbow(); };
}
std::vector<String> NeoPixelService::patternNamesVector() const {
std::vector<String> v;
v.reserve(patternUpdaters.size());
for (const auto& kv : patternUpdaters) v.push_back(kv.first);
return v;
}
String NeoPixelService::currentPatternName() const {
switch (currentPattern) {
case Pattern::Off: return String("off");
case Pattern::ColorWipe: return String("color_wipe");
case Pattern::Rainbow: return String("rainbow");
case Pattern::RainbowCycle: return String("rainbow_cycle");
case Pattern::TheaterChase: return String("theater_chase");
case Pattern::TheaterChaseRainbow: return String("theater_chase_rainbow");
}
return String("off");
}
NeoPixelService::Pattern NeoPixelService::nameToPattern(const String& name) const {
if (name.equalsIgnoreCase("color_wipe")) return Pattern::ColorWipe;
if (name.equalsIgnoreCase("rainbow")) return Pattern::Rainbow;
if (name.equalsIgnoreCase("rainbow_cycle")) return Pattern::RainbowCycle;
if (name.equalsIgnoreCase("theater_chase")) return Pattern::TheaterChase;
if (name.equalsIgnoreCase("theater_chase_rainbow")) return Pattern::TheaterChaseRainbow;
return Pattern::Off;
}
void NeoPixelService::setPatternByName(const String& name) {
Pattern p = nameToPattern(name);
resetStateForPattern(p);
}
void NeoPixelService::resetStateForPattern(Pattern p) {
strip.clear();
strip.show();
wipeIndex = 0;
rainbowJ = 0;
cycleJ = 0;
chaseJ = 0;
chaseQ = 0;
chasePhaseOn = true;
lastUpdateMs = 0;
currentPattern = p;
}
void NeoPixelService::update() {
unsigned long now = millis();
if (now - lastUpdateMs < updateIntervalMs) return;
lastUpdateMs = now;
const String name = currentPatternName();
auto it = patternUpdaters.find(name);
if (it != patternUpdaters.end()) {
it->second();
} else {
updateOff();
}
}
void NeoPixelService::updateOff() {
strip.clear();
strip.show();
}
void NeoPixelService::updateColorWipe() {
if (wipeIndex < strip.numPixels()) {
strip.setPixelColor(wipeIndex, wipeColor);
++wipeIndex;
strip.show();
} else {
strip.clear();
wipeIndex = 0;
}
}
void NeoPixelService::updateRainbow() {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, colorWheel(strip, (i + rainbowJ) & 255));
}
strip.show();
rainbowJ = (rainbowJ + 1) & 0xFF;
}
void NeoPixelService::updateRainbowCycle() {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
uint8_t pos = ((i * 256 / strip.numPixels()) + cycleJ) & 0xFF;
strip.setPixelColor(i, colorWheel(strip, pos));
}
strip.show();
cycleJ = (cycleJ + 1) & 0xFF;
}
void NeoPixelService::updateTheaterChase() {
if (chasePhaseOn) {
for (uint16_t i = 0; i < strip.numPixels(); i += 3) {
uint16_t idx = i + chaseQ;
if (idx < strip.numPixels()) strip.setPixelColor(idx, chaseColor);
}
strip.show();
chasePhaseOn = false;
} else {
for (uint16_t i = 0; i < strip.numPixels(); i += 3) {
uint16_t idx = i + chaseQ;
if (idx < strip.numPixels()) strip.setPixelColor(idx, 0);
}
strip.show();
chasePhaseOn = true;
chaseQ = (chaseQ + 1) % 3;
chaseJ = (chaseJ + 1) % 10;
}
}
void NeoPixelService::updateTheaterChaseRainbow() {
if (chasePhaseOn) {
for (uint16_t i = 0; i < strip.numPixels(); i += 3) {
uint16_t idx = i + chaseQ;
if (idx < strip.numPixels()) strip.setPixelColor(idx, colorWheel(strip, (idx + chaseJ) % 255));
}
strip.show();
chasePhaseOn = false;
} else {
for (uint16_t i = 0; i < strip.numPixels(); i += 3) {
uint16_t idx = i + chaseQ;
if (idx < strip.numPixels()) strip.setPixelColor(idx, 0);
}
strip.show();
chasePhaseOn = true;
chaseQ = (chaseQ + 1) % 3;
chaseJ = (chaseJ + 1) & 0xFF;
}
}

View File

@@ -1,67 +0,0 @@
#pragma once
#include "spore/Service.h"
#include "spore/core/TaskManager.h"
#include <Adafruit_NeoPixel.h>
#include <map>
#include <vector>
class NeoPixelService : public Service {
public:
enum class Pattern {
Off,
ColorWipe,
Rainbow,
RainbowCycle,
TheaterChase,
TheaterChaseRainbow
};
NeoPixelService(TaskManager& taskMgr, uint16_t numPixels, uint8_t pin, neoPixelType type);
void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return "NeoPixel"; }
void setPatternByName(const String& name);
void setBrightness(uint8_t b);
private:
void registerTasks();
void registerPatterns();
std::vector<String> patternNamesVector() const;
String currentPatternName() const;
Pattern nameToPattern(const String& name) const;
void resetStateForPattern(Pattern p);
void update();
// Pattern updaters
void updateOff();
void updateColorWipe();
void updateRainbow();
void updateRainbowCycle();
void updateTheaterChase();
void updateTheaterChaseRainbow();
// Handlers
void handleStatusRequest(AsyncWebServerRequest* request);
void handlePatternsRequest(AsyncWebServerRequest* request);
void handleControlRequest(AsyncWebServerRequest* request);
TaskManager& taskManager;
Adafruit_NeoPixel strip;
std::map<String, std::function<void()>> patternUpdaters;
Pattern currentPattern;
unsigned long updateIntervalMs;
unsigned long lastUpdateMs;
// State for patterns
uint16_t wipeIndex;
uint32_t wipeColor;
uint8_t rainbowJ;
uint8_t cycleJ;
int chaseJ;
int chaseQ;
bool chasePhaseOn;
uint32_t chaseColor;
uint8_t brightness;
};

View File

@@ -1,45 +0,0 @@
#include <Arduino.h>
#include "spore/Spore.h"
#include "NeoPixelService.h"
#ifndef NEOPIXEL_PIN
#define NEOPIXEL_PIN 2
#endif
#ifndef NEOPIXEL_COUNT
#define NEOPIXEL_COUNT 16
#endif
#ifndef NEOPIXEL_TYPE
#define NEOPIXEL_TYPE (NEO_GRB + NEO_KHZ800)
#endif
// Create Spore instance with custom labels
Spore spore({
{"app", "neopixel"},
{"device", "light"},
{"pixels", String(NEOPIXEL_COUNT)},
{"pin", String(NEOPIXEL_PIN)}
});
// Create custom service
NeoPixelService* neoPixelService = nullptr;
void setup() {
// Initialize the Spore framework
spore.setup();
// Create and add custom service
neoPixelService = new NeoPixelService(spore.getTaskManager(), NEOPIXEL_COUNT, NEOPIXEL_PIN, NEOPIXEL_TYPE);
spore.addService(neoPixelService);
// Start the API server and complete initialization
spore.begin();
Serial.println("[Main] NeoPixel service registered and ready!");
}
void loop() {
// Run the Spore framework loop
spore.loop();
}

View File

@@ -1,6 +1,13 @@
# Relay Service Example # Relay Service Example
A minimal example that demonstrates the Spore framework with a custom RelayService. The Spore framework automatically handles all core functionality (WiFi, clustering, API server, task management) while allowing easy registration of custom services. A minimal example that demonstrates the Spore framework with a custom RelayService and web interface. The Spore framework automatically handles all core functionality (WiFi, clustering, API server, task management) while allowing easy registration of custom services.
## Features
- **API Control**: RESTful API endpoints for programmatic control
- **Web Interface**: Beautiful web UI for manual control at `http://<device-ip>/relay.html`
- **Real-time Status**: Live status updates and visual feedback
- **Toggle Functionality**: One-click toggle between ON/OFF states
- Default relay pin: `GPIO0` (ESP-01). Override with `-DRELAY_PIN=<pin>`. - Default relay pin: `GPIO0` (ESP-01). Override with `-DRELAY_PIN=<pin>`.
- WiFi and API port are configured in `src/Config.cpp`. - WiFi and API port are configured in `src/Config.cpp`.
@@ -25,7 +32,7 @@ RelayService* relayService = nullptr;
void setup() { void setup() {
spore.setup(); spore.setup();
relayService = new RelayService(spore.getTaskManager(), RELAY_PIN); relayService = new RelayService(spore.getContext(), spore.getTaskManager(), RELAY_PIN);
spore.addService(relayService); spore.addService(relayService);
spore.begin(); spore.begin();
@@ -42,6 +49,7 @@ The Spore framework automatically provides:
- REST API server with core endpoints - REST API server with core endpoints
- Task scheduling and execution - Task scheduling and execution
- Node status monitoring - Node status monitoring
- Static file serving for web interfaces (core service)
## Build & Upload ## Build & Upload
@@ -61,6 +69,20 @@ pio device monitor -b 115200
Assume the device IP is 192.168.1.50 below (replace with your device's IP shown in serial output). Assume the device IP is 192.168.1.50 below (replace with your device's IP shown in serial output).
## Web Interface
The web interface is located in the `data/` folder and will be served by the core StaticFileService.
Access the web interface at: `http://192.168.1.50/relay.html`
The web interface provides:
- Visual status indicator (red for OFF, green for ON)
- Turn ON/OFF buttons
- Toggle button for quick switching
- Real-time status updates every 2 seconds
- Uptime display
- Error handling and user feedback
## Relay API ## Relay API
- Get relay status - Get relay status

View File

@@ -1,8 +1,9 @@
#include "RelayService.h" #include "RelayService.h"
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/util/Logging.h"
RelayService::RelayService(TaskManager& taskMgr, int pin) RelayService::RelayService(NodeContext& ctx, TaskManager& taskMgr, int pin)
: taskManager(taskMgr), relayPin(pin), relayOn(false) { : ctx(ctx), taskManager(taskMgr), relayPin(pin), relayOn(false) {
pinMode(relayPin, OUTPUT); pinMode(relayPin, OUTPUT);
// Many relay modules are active LOW. Start in OFF state (relay de-energized). // Many relay modules are active LOW. Start in OFF state (relay de-energized).
digitalWrite(relayPin, HIGH); digitalWrite(relayPin, HIGH);
@@ -64,13 +65,13 @@ void RelayService::turnOn() {
relayOn = true; relayOn = true;
// Active LOW relay // Active LOW relay
digitalWrite(relayPin, LOW); digitalWrite(relayPin, LOW);
Serial.println("[RelayService] Relay ON"); LOG_INFO("RelayService", "Relay ON");
} }
void RelayService::turnOff() { void RelayService::turnOff() {
relayOn = false; relayOn = false;
digitalWrite(relayPin, HIGH); digitalWrite(relayPin, HIGH);
Serial.println("[RelayService] Relay OFF"); LOG_INFO("RelayService", "Relay OFF");
} }
void RelayService::toggle() { void RelayService::toggle() {
@@ -83,7 +84,6 @@ void RelayService::toggle() {
void RelayService::registerTasks() { void RelayService::registerTasks() {
taskManager.registerTask("relay_status_print", 5000, [this]() { taskManager.registerTask("relay_status_print", 5000, [this]() {
Serial.printf("[RelayService] Status - pin: %d, state: %s\n", LOG_INFO("RelayService", "Status - pin: " + String(relayPin) + ", state: " + (relayOn ? "ON" : "OFF"));
relayPin, relayOn ? "ON" : "OFF");
}); });
} }

View File

@@ -1,11 +1,12 @@
#pragma once #pragma once
#include "spore/Service.h" #include "spore/Service.h"
#include "spore/core/TaskManager.h" #include "spore/core/TaskManager.h"
#include "spore/core/NodeContext.h"
#include <ArduinoJson.h> #include <ArduinoJson.h>
class RelayService : public Service { class RelayService : public Service {
public: public:
RelayService(TaskManager& taskMgr, int pin); RelayService(NodeContext& ctx, TaskManager& taskMgr, int pin);
void registerEndpoints(ApiServer& api) override; void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return "Relay"; } const char* getName() const override { return "Relay"; }
@@ -16,6 +17,7 @@ public:
private: private:
void registerTasks(); void registerTasks();
NodeContext& ctx;
TaskManager& taskManager; TaskManager& taskManager;
int relayPin; int relayPin;
bool relayOn; bool relayOn;

View File

@@ -0,0 +1,305 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Relay Control - Spore</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.container {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 20px;
padding: 40px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
text-align: center;
max-width: 400px;
width: 90%;
}
h1 {
margin-bottom: 30px;
font-size: 2.2em;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.relay-status {
margin-bottom: 30px;
}
.status-indicator {
width: 120px;
height: 120px;
border-radius: 50%;
margin: 0 auto 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2em;
font-weight: bold;
transition: all 0.3s ease;
border: 4px solid rgba(255, 255, 255, 0.3);
}
.status-indicator.off {
background: rgba(255, 0, 0, 0.3);
color: #ff6b6b;
}
.status-indicator.on {
background: rgba(0, 255, 0, 0.3);
color: #51cf66;
box-shadow: 0 0 20px rgba(81, 207, 102, 0.5);
}
.status-text {
font-size: 1.5em;
margin-bottom: 10px;
}
.pin-info {
font-size: 0.9em;
opacity: 0.8;
}
.controls {
display: flex;
gap: 15px;
justify-content: center;
flex-wrap: wrap;
}
.btn {
padding: 12px 24px;
border: none;
border-radius: 25px;
font-size: 1em;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
min-width: 100px;
text-transform: uppercase;
letter-spacing: 1px;
}
.btn-primary {
background: rgba(255, 255, 255, 0.2);
color: white;
border: 2px solid rgba(255, 255, 255, 0.3);
}
.btn-primary:hover {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
.btn-primary:active {
transform: translateY(0);
}
.btn-success {
background: rgba(81, 207, 102, 0.8);
color: white;
border: 2px solid rgba(81, 207, 102, 1);
}
.btn-success:hover {
background: rgba(81, 207, 102, 1);
transform: translateY(-2px);
}
.btn-danger {
background: rgba(255, 107, 107, 0.8);
color: white;
border: 2px solid rgba(255, 107, 107, 1);
}
.btn-danger:hover {
background: rgba(255, 107, 107, 1);
transform: translateY(-2px);
}
.loading {
opacity: 0.6;
pointer-events: none;
}
.error {
color: #ff6b6b;
margin-top: 15px;
font-size: 0.9em;
}
.success {
color: #51cf66;
margin-top: 15px;
font-size: 0.9em;
}
.uptime {
margin-top: 20px;
font-size: 0.8em;
opacity: 0.7;
}
</style>
</head>
<body>
<div class="container">
<h1>🔌 Relay Control</h1>
<div class="relay-status">
<div class="status-indicator off" id="statusIndicator">
OFF
</div>
<div class="status-text" id="statusText">Relay is OFF</div>
<div class="pin-info" id="pinInfo">Pin: Loading...</div>
</div>
<div class="controls">
<button class="btn btn-success" id="turnOnBtn" onclick="controlRelay('on')">
Turn ON
</button>
<button class="btn btn-danger" id="turnOffBtn" onclick="controlRelay('off')">
Turn OFF
</button>
<button class="btn btn-primary" id="toggleBtn" onclick="controlRelay('toggle')">
Toggle
</button>
</div>
<div id="message"></div>
<div class="uptime" id="uptime"></div>
</div>
<script>
let currentState = 'off';
let relayPin = '';
// Load initial relay status
async function loadRelayStatus() {
try {
const response = await fetch('/api/relay/status');
if (!response.ok) {
throw new Error('Failed to fetch relay status');
}
const data = await response.json();
currentState = data.state;
relayPin = data.pin;
updateUI();
updateUptime(data.uptime);
} catch (error) {
console.error('Error loading relay status:', error);
showMessage('Error loading relay status: ' + error.message, 'error');
}
}
// Control relay
async function controlRelay(action) {
const buttons = document.querySelectorAll('.btn');
buttons.forEach(btn => btn.classList.add('loading'));
try {
const response = await fetch('/api/relay', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `state=${action}`
});
const data = await response.json();
if (data.success) {
currentState = data.state;
updateUI();
showMessage(`Relay turned ${data.state.toUpperCase()}`, 'success');
} else {
showMessage(data.message || 'Failed to control relay', 'error');
}
} catch (error) {
console.error('Error controlling relay:', error);
showMessage('Error controlling relay: ' + error.message, 'error');
} finally {
buttons.forEach(btn => btn.classList.remove('loading'));
}
}
// Update UI based on current state
function updateUI() {
const statusIndicator = document.getElementById('statusIndicator');
const statusText = document.getElementById('statusText');
const pinInfo = document.getElementById('pinInfo');
if (currentState === 'on') {
statusIndicator.className = 'status-indicator on';
statusIndicator.textContent = 'ON';
statusText.textContent = 'Relay is ON';
} else {
statusIndicator.className = 'status-indicator off';
statusIndicator.textContent = 'OFF';
statusText.textContent = 'Relay is OFF';
}
if (relayPin) {
pinInfo.textContent = `Pin: ${relayPin}`;
}
}
// Update uptime display
function updateUptime(uptime) {
const uptimeElement = document.getElementById('uptime');
if (uptime) {
const seconds = Math.floor(uptime / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
let uptimeText = `Uptime: ${seconds}s`;
if (hours > 0) {
uptimeText = `Uptime: ${hours}h ${minutes % 60}m ${seconds % 60}s`;
} else if (minutes > 0) {
uptimeText = `Uptime: ${minutes}m ${seconds % 60}s`;
}
uptimeElement.textContent = uptimeText;
}
}
// Show message to user
function showMessage(message, type) {
const messageElement = document.getElementById('message');
messageElement.textContent = message;
messageElement.className = type;
// Clear message after 3 seconds
setTimeout(() => {
messageElement.textContent = '';
messageElement.className = '';
}, 3000);
}
// Load status on page load
loadRelayStatus();
// Refresh status every 2 seconds
setInterval(loadRelayStatus, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,177 @@
// Only initialize if not already done
if (!window.relayControlInitialized) {
class RelayControl {
constructor() {
this.currentState = 'off';
this.relayPin = '';
this.init();
}
init() {
this.createComponent();
this.loadRelayStatus();
this.setupEventListeners();
// Refresh status every 2 seconds
setInterval(() => this.loadRelayStatus(), 2000);
}
createComponent() {
// Create the main container
const container = document.createElement('div');
container.className = 'relay-component';
container.innerHTML = `
<h1>🔌 Relay Control</h1>
<div class="relay-status">
<div class="status-indicator off" id="statusIndicator">
OFF
</div>
<div class="status-text" id="statusText">Relay is OFF</div>
<div class="pin-info" id="pinInfo">Pin: Loading...</div>
</div>
<div class="controls">
<button class="btn btn-success" id="turnOnBtn">
Turn ON
</button>
<button class="btn btn-danger" id="turnOffBtn">
Turn OFF
</button>
<button class="btn btn-primary" id="toggleBtn">
Toggle
</button>
</div>
<div id="message"></div>
<div class="uptime" id="uptime"></div>
`;
// Append to component div
const componentDiv = document.getElementById('component');
if (componentDiv) {
componentDiv.appendChild(container);
} else {
// Fallback to body if component div not found
document.body.appendChild(container);
}
}
setupEventListeners() {
document.getElementById('turnOnBtn').addEventListener('click', () => this.controlRelay('on'));
document.getElementById('turnOffBtn').addEventListener('click', () => this.controlRelay('off'));
document.getElementById('toggleBtn').addEventListener('click', () => this.controlRelay('toggle'));
}
// Load initial relay status
async loadRelayStatus() {
try {
const response = await fetch('/api/relay/status');
if (!response.ok) {
throw new Error('Failed to fetch relay status');
}
const data = await response.json();
this.currentState = data.state;
this.relayPin = data.pin;
this.updateUI();
this.updateUptime(data.uptime);
} catch (error) {
console.error('Error loading relay status:', error);
this.showMessage('Error loading relay status: ' + error.message, 'error');
}
}
// Control relay
async controlRelay(action) {
const buttons = document.querySelectorAll('.btn');
buttons.forEach(btn => btn.classList.add('loading'));
try {
const response = await fetch('/api/relay', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `state=${action}`
});
const data = await response.json();
if (data.success) {
this.currentState = data.state;
this.updateUI();
this.showMessage(`Relay turned ${data.state.toUpperCase()}`, 'success');
} else {
this.showMessage(data.message || 'Failed to control relay', 'error');
}
} catch (error) {
console.error('Error controlling relay:', error);
this.showMessage('Error controlling relay: ' + error.message, 'error');
} finally {
buttons.forEach(btn => btn.classList.remove('loading'));
}
}
// Update UI based on current state
updateUI() {
const statusIndicator = document.getElementById('statusIndicator');
const statusText = document.getElementById('statusText');
const pinInfo = document.getElementById('pinInfo');
if (this.currentState === 'on') {
statusIndicator.className = 'status-indicator on';
statusIndicator.textContent = 'ON';
statusText.textContent = 'Relay is ON';
} else {
statusIndicator.className = 'status-indicator off';
statusIndicator.textContent = 'OFF';
statusText.textContent = 'Relay is OFF';
}
if (this.relayPin) {
pinInfo.textContent = `Pin: ${this.relayPin}`;
}
}
// Update uptime display
updateUptime(uptime) {
const uptimeElement = document.getElementById('uptime');
if (uptime) {
const seconds = Math.floor(uptime / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
let uptimeText = `Uptime: ${seconds}s`;
if (hours > 0) {
uptimeText = `Uptime: ${hours}h ${minutes % 60}m ${seconds % 60}s`;
} else if (minutes > 0) {
uptimeText = `Uptime: ${minutes}m ${seconds % 60}s`;
}
uptimeElement.textContent = uptimeText;
}
}
// Show message to user
showMessage(message, type) {
const messageElement = document.getElementById('message');
messageElement.textContent = message;
messageElement.className = type;
// Clear message after 3 seconds
setTimeout(() => {
messageElement.textContent = '';
messageElement.className = '';
}, 3000);
}
}
// Initialize the relay control when the page loads
document.addEventListener('DOMContentLoaded', () => {
new RelayControl();
});
window.relayControlInitialized = true;
}

View File

@@ -0,0 +1,141 @@
.relay-component {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 20px;
padding: 40px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
text-align: center;
max-width: 400px;
width: 100%;
color: white;
box-sizing: border-box;
}
.relay-component h1 {
margin: 0 0 30px 0;
font-size: 2.2em;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.relay-component .relay-status {
margin-bottom: 30px;
}
.relay-component .status-indicator {
width: 120px;
height: 120px;
border-radius: 50%;
margin: 0 auto 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2em;
font-weight: bold;
transition: all 0.3s ease;
border: 4px solid rgba(255, 255, 255, 0.3);
}
.relay-component .status-indicator.off {
background: rgba(255, 0, 0, 0.3);
color: #ff6b6b;
}
.relay-component .status-indicator.on {
background: rgba(0, 255, 0, 0.3);
color: #51cf66;
box-shadow: 0 0 20px rgba(81, 207, 102, 0.5);
}
.relay-component .status-text {
font-size: 1.5em;
margin-bottom: 10px;
}
.relay-component .pin-info {
font-size: 0.9em;
opacity: 0.8;
}
.relay-component .controls {
display: flex;
gap: 15px;
justify-content: center;
flex-wrap: wrap;
}
.relay-component .btn {
padding: 12px 24px;
border: none;
border-radius: 25px;
font-size: 1em;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
min-width: 100px;
text-transform: uppercase;
letter-spacing: 1px;
}
.relay-component .btn-primary {
background: rgba(255, 255, 255, 0.2);
color: #333;
border: 2px solid rgba(0, 0, 0, 0.8);
font-weight: bold;
}
.relay-component .btn-primary:hover {
background: rgba(255, 255, 255, 0.4);
color: #222;
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
.relay-component .btn-primary:active {
transform: translateY(0);
}
.relay-component .btn-success {
background: rgba(81, 207, 102, 0.8);
color: white;
border: 2px solid rgba(81, 207, 102, 1);
}
.relay-component .btn-success:hover {
background: rgba(81, 207, 102, 1);
transform: translateY(-2px);
}
.relay-component .btn-danger {
background: rgba(255, 107, 107, 0.8);
color: white;
border: 2px solid rgba(255, 107, 107, 1);
}
.relay-component .btn-danger:hover {
background: rgba(255, 107, 107, 1);
transform: translateY(-2px);
}
.relay-component .loading {
opacity: 0.6;
pointer-events: none;
}
.relay-component .error {
color: #ff6b6b;
margin-top: 15px;
font-size: 0.9em;
}
.relay-component .success {
color: #51cf66;
margin-top: 15px;
font-size: 0.9em;
}
.relay-component .uptime {
margin-top: 20px;
font-size: 0.8em;
opacity: 0.7;
}

View File

@@ -22,13 +22,14 @@ void setup() {
spore.setup(); spore.setup();
// Create and add custom service // Create and add custom service
relayService = new RelayService(spore.getTaskManager(), RELAY_PIN); relayService = new RelayService(spore.getContext(), spore.getTaskManager(), RELAY_PIN);
spore.addService(relayService); spore.addService(relayService);
// Start the API server and complete initialization // Start the API server and complete initialization
spore.begin(); spore.begin();
Serial.println("[Main] Relay service registered and ready!"); LOG_INFO("Main", "Relay service registered and ready!");
LOG_INFO("Main", "Web interface available at http://<node-ip>/relay.html");
} }
void loop() { void loop() {

View File

@@ -10,6 +10,8 @@
#include "core/ApiServer.h" #include "core/ApiServer.h"
#include "core/TaskManager.h" #include "core/TaskManager.h"
#include "Service.h" #include "Service.h"
#include "util/Logging.h"
#include "util/CpuUsage.h"
class Spore { class Spore {
public: public:
@@ -32,6 +34,11 @@ public:
TaskManager& getTaskManager() { return taskManager; } TaskManager& getTaskManager() { return taskManager; }
ClusterManager& getCluster() { return cluster; } ClusterManager& getCluster() { return cluster; }
ApiServer& getApiServer() { return apiServer; } ApiServer& getApiServer() { return apiServer; }
// CPU usage monitoring
CpuUsage& getCpuUsage() { return cpuUsage; }
float getCurrentCpuUsage() const { return cpuUsage.getCpuUsage(); }
float getAverageCpuUsage() const { return cpuUsage.getAverageCpuUsage(); }
private: private:
@@ -44,6 +51,7 @@ private:
TaskManager taskManager; TaskManager taskManager;
ClusterManager cluster; ClusterManager cluster;
ApiServer apiServer; ApiServer apiServer;
CpuUsage cpuUsage;
std::vector<std::shared_ptr<Service>> services; std::vector<std::shared_ptr<Service>> services;
bool initialized; bool initialized;

View File

@@ -11,6 +11,7 @@
#include "spore/types/NodeInfo.h" #include "spore/types/NodeInfo.h"
#include "spore/core/TaskManager.h" #include "spore/core/TaskManager.h"
#include "spore/types/ApiTypes.h" #include "spore/types/ApiTypes.h"
#include "spore/util/Logging.h"
class Service; // Forward declaration class Service; // Forward declaration
@@ -19,15 +20,20 @@ public:
ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port = 80); ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port = 80);
void begin(); void begin();
void addService(Service& service); void addService(Service& service);
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler);
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler, void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler); const String& serviceName = "unknown");
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
const std::vector<ParamSpec>& params);
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler, void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler, std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler,
const std::vector<ParamSpec>& params); const String& serviceName = "unknown");
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
const std::vector<ParamSpec>& params, const String& serviceName = "unknown");
void addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler,
const std::vector<ParamSpec>& params, const String& serviceName = "unknown");
// Static file serving
void serveStatic(const String& uri, fs::FS& fs, const String& path, const String& cache_header = "");
static const char* methodToStr(int method); static const char* methodToStr(int method);

View File

@@ -0,0 +1,51 @@
#pragma once
#include "spore/Service.h"
#include "spore/util/CpuUsage.h"
#include <functional>
class MonitoringService : public Service {
public:
MonitoringService(CpuUsage& cpuUsage);
void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return "Monitoring"; }
// System resource information
struct SystemResources {
// CPU information
float currentCpuUsage;
float averageCpuUsage;
float maxCpuUsage;
float minCpuUsage;
unsigned long measurementCount;
bool isMeasuring;
// Memory information
size_t freeHeap;
size_t totalHeap;
size_t minFreeHeap;
size_t maxAllocHeap;
size_t heapFragmentation;
// Filesystem information
size_t totalBytes;
size_t usedBytes;
size_t freeBytes;
float usagePercent;
// System uptime
unsigned long uptimeMs;
unsigned long uptimeSeconds;
};
// Get current system resources
SystemResources getSystemResources() const;
private:
void handleResourcesRequest(AsyncWebServerRequest* request);
// Helper methods
size_t calculateHeapFragmentation() const;
void getFilesystemInfo(size_t& totalBytes, size_t& usedBytes) const;
CpuUsage& cpuUsage;
};

View File

@@ -0,0 +1,18 @@
#pragma once
#include "spore/Service.h"
#include "spore/core/ApiServer.h"
#include "spore/core/NodeContext.h"
#include <FS.h>
#include <LittleFS.h>
class StaticFileService : public Service {
public:
StaticFileService(NodeContext& ctx, ApiServer& apiServer);
void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return name.c_str(); }
private:
static const String name;
NodeContext& ctx;
ApiServer& apiServer;
};

View File

@@ -0,0 +1,114 @@
#pragma once
#include "spore/util/JsonSerializable.h"
#include "spore/util/Logging.h"
#include <ArduinoJson.h>
namespace spore {
namespace types {
/**
* Base class for API responses that can be serialized to JSON
* Handles complete JsonDocument creation and serialization
*/
class ApiResponse {
protected:
mutable JsonDocument doc;
public:
virtual ~ApiResponse() = default;
/**
* Get the complete JSON string representation of this response
* @return JSON string ready to send as HTTP response
*/
virtual String toJsonString() const {
String json;
serializeJson(doc, json);
return json;
}
/**
* Get the JsonDocument for direct manipulation if needed
* @return Reference to the internal JsonDocument
*/
JsonDocument& getDocument() { return doc; }
const JsonDocument& getDocument() const { return doc; }
/**
* Clear the document and reset for reuse
*/
virtual void clear() {
doc.clear();
}
};
/**
* Base class for API responses that contain a collection of serializable items
*/
template<typename ItemType>
class CollectionResponse : public ApiResponse {
protected:
String collectionKey;
public:
explicit CollectionResponse(const String& key) : collectionKey(key) {}
/**
* Add a serializable item to the collection
* @param item The serializable item to add
*/
void addItem(const util::JsonSerializable& item) {
// Ensure the array exists and get a reference to it
if (!doc[collectionKey].is<JsonArray>()) {
doc[collectionKey] = JsonArray();
}
JsonArray arr = doc[collectionKey].as<JsonArray>();
JsonObject obj = arr.add<JsonObject>();
item.toJson(obj);
}
/**
* Add a serializable item to the collection (move version)
* @param item The serializable item to add
*/
void addItem(util::JsonSerializable&& item) {
// Ensure the array exists and get a reference to it
if (!doc[collectionKey].is<JsonArray>()) {
doc[collectionKey] = JsonArray();
}
JsonArray arr = doc[collectionKey].as<JsonArray>();
JsonObject obj = arr.add<JsonObject>();
item.toJson(obj);
}
/**
* Add multiple items from a container
* @param items Container of serializable items
*/
template<typename Container>
void addItems(const Container& items) {
// Ensure the array exists and get a reference to it
if (!doc[collectionKey].is<JsonArray>()) {
doc[collectionKey] = JsonArray();
}
JsonArray arr = doc[collectionKey].as<JsonArray>();
for (const auto& item : items) {
JsonObject obj = arr.add<JsonObject>();
item.toJson(obj);
}
}
/**
* Get the current number of items in the collection
* @return Number of items
*/
size_t getItemCount() const {
if (doc[collectionKey].is<JsonArray>()) {
return doc[collectionKey].as<JsonArray>().size();
}
return 0;
}
};
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,47 @@
#pragma once
#include "ApiResponse.h"
#include "NodeInfoSerializable.h"
#include <map>
namespace spore {
namespace types {
/**
* Response class for cluster members endpoint
* Handles complete JSON document creation for cluster member data
*/
class ClusterMembersResponse : public CollectionResponse<NodeInfoSerializable> {
public:
ClusterMembersResponse() : CollectionResponse("members") {}
/**
* Add a single node to the response
* @param node The NodeInfo to add
*/
void addNode(const NodeInfo& node) {
addItem(NodeInfoSerializable(const_cast<NodeInfo&>(node)));
}
/**
* Add multiple nodes from a member list
* @param memberList Map of hostname to NodeInfo
*/
void addNodes(const std::map<String, NodeInfo>& memberList) {
for (const auto& pair : memberList) {
addNode(pair.second);
}
}
/**
* Add nodes from a pointer to member list
* @param memberList Pointer to map of hostname to NodeInfo
*/
void addNodes(const std::map<String, NodeInfo>* memberList) {
if (memberList) {
addNodes(*memberList);
}
}
};
} // namespace types
} // namespace spore

View File

@@ -32,6 +32,11 @@ public:
unsigned long restart_delay_ms; unsigned long restart_delay_ms;
uint16_t json_doc_size; uint16_t json_doc_size;
// Memory Management
uint32_t low_memory_threshold_bytes;
uint32_t critical_memory_threshold_bytes;
size_t max_concurrent_http_requests;
// Constructor // Constructor
Config(); Config();
}; };

View File

@@ -0,0 +1,76 @@
#pragma once
#include "ApiTypes.h"
#include "spore/util/JsonSerializable.h"
#include <ArduinoJson.h>
namespace spore {
namespace types {
/**
* Serializable wrapper for EndpointInfo that implements JsonSerializable interface
* Handles conversion between EndpointInfo struct and JSON representation
*/
class EndpointInfoSerializable : public util::JsonSerializable {
private:
const EndpointInfo& endpoint;
public:
explicit EndpointInfoSerializable(const EndpointInfo& ep) : endpoint(ep) {}
/**
* Serialize EndpointInfo to JsonObject
*/
void toJson(JsonObject& obj) const override {
obj["uri"] = endpoint.uri;
obj["method"] = endpoint.method;
// Add parameters if present
if (!endpoint.params.empty()) {
JsonArray paramsArr = obj["params"].to<JsonArray>();
for (const auto& param : endpoint.params) {
JsonObject paramObj = paramsArr.add<JsonObject>();
paramObj["name"] = param.name;
paramObj["location"] = param.location;
paramObj["required"] = param.required;
paramObj["type"] = param.type;
if (!param.values.empty()) {
JsonArray valuesArr = paramObj["values"].to<JsonArray>();
for (const auto& value : param.values) {
valuesArr.add(value);
}
}
if (param.defaultValue.length() > 0) {
paramObj["default"] = param.defaultValue;
}
}
}
}
/**
* Deserialize EndpointInfo from JsonObject
*/
void fromJson(const JsonObject& obj) override {
// Note: This would require modifying the EndpointInfo struct to be mutable
// For now, this is a placeholder as EndpointInfo is typically read-only
// in the context where this serialization is used
}
};
/**
* Convenience function to create a JsonArray from a collection of EndpointInfo objects
*/
template<typename Container>
JsonArray endpointInfoToJsonArray(JsonDocument& doc, const Container& endpoints) {
JsonArray arr = doc.to<JsonArray>();
for (const auto& endpoint : endpoints) {
EndpointInfoSerializable serializable(endpoint);
JsonObject obj = arr.add<JsonObject>();
serializable.toJson(obj);
}
return arr;
}
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,141 @@
#pragma once
#include "NodeInfo.h"
#include "ApiTypes.h"
#include "spore/util/JsonSerializable.h"
#include <ArduinoJson.h>
namespace spore {
namespace types {
/**
* Serializable wrapper for NodeInfo that implements JsonSerializable interface
* Handles conversion between NodeInfo struct and JSON representation
*/
class NodeInfoSerializable : public util::JsonSerializable {
private:
NodeInfo& nodeInfo;
public:
explicit NodeInfoSerializable(NodeInfo& node) : nodeInfo(node) {}
/**
* Serialize NodeInfo to JsonObject
* Maps all NodeInfo fields to appropriate JSON structure
*/
void toJson(JsonObject& obj) const override {
obj["hostname"] = nodeInfo.hostname;
obj["ip"] = nodeInfo.ip.toString();
obj["lastSeen"] = nodeInfo.lastSeen;
obj["latency"] = nodeInfo.latency;
obj["status"] = statusToStr(nodeInfo.status);
// Serialize resources
JsonObject resources = obj["resources"].to<JsonObject>();
resources["freeHeap"] = nodeInfo.resources.freeHeap;
resources["chipId"] = nodeInfo.resources.chipId;
resources["sdkVersion"] = nodeInfo.resources.sdkVersion;
resources["cpuFreqMHz"] = nodeInfo.resources.cpuFreqMHz;
resources["flashChipSize"] = nodeInfo.resources.flashChipSize;
// Serialize labels if present
if (!nodeInfo.labels.empty()) {
JsonObject labels = obj["labels"].to<JsonObject>();
for (const auto& kv : nodeInfo.labels) {
labels[kv.first.c_str()] = kv.second;
}
}
// Serialize endpoints if present
if (!nodeInfo.endpoints.empty()) {
JsonArray endpoints = obj["api"].to<JsonArray>();
for (const auto& endpoint : nodeInfo.endpoints) {
JsonObject endpointObj = endpoints.add<JsonObject>();
endpointObj["uri"] = endpoint.uri;
endpointObj["method"] = endpoint.method;
}
}
}
/**
* Deserialize NodeInfo from JsonObject
* Populates NodeInfo fields from JSON structure
*/
void fromJson(const JsonObject& obj) override {
nodeInfo.hostname = obj["hostname"].as<String>();
// Parse IP address
const char* ipStr = obj["ip"];
if (ipStr) {
nodeInfo.ip.fromString(ipStr);
}
nodeInfo.lastSeen = obj["lastSeen"].as<unsigned long>();
nodeInfo.latency = obj["latency"].as<unsigned long>();
// Parse status
const char* statusStr = obj["status"];
if (statusStr) {
if (strcmp(statusStr, "ACTIVE") == 0) {
nodeInfo.status = NodeInfo::ACTIVE;
} else if (strcmp(statusStr, "INACTIVE") == 0) {
nodeInfo.status = NodeInfo::INACTIVE;
} else if (strcmp(statusStr, "DEAD") == 0) {
nodeInfo.status = NodeInfo::DEAD;
}
}
// Parse resources
if (obj["resources"].is<JsonObject>()) {
JsonObject resources = obj["resources"].as<JsonObject>();
nodeInfo.resources.freeHeap = resources["freeHeap"].as<uint32_t>();
nodeInfo.resources.chipId = resources["chipId"].as<uint32_t>();
nodeInfo.resources.sdkVersion = resources["sdkVersion"].as<String>();
nodeInfo.resources.cpuFreqMHz = resources["cpuFreqMHz"].as<uint32_t>();
nodeInfo.resources.flashChipSize = resources["flashChipSize"].as<uint32_t>();
}
// Parse labels
nodeInfo.labels.clear();
if (obj["labels"].is<JsonObject>()) {
JsonObject labels = obj["labels"].as<JsonObject>();
for (JsonPair kvp : labels) {
nodeInfo.labels[kvp.key().c_str()] = kvp.value().as<String>();
}
}
// Parse endpoints
nodeInfo.endpoints.clear();
if (obj["api"].is<JsonArray>()) {
JsonArray endpoints = obj["api"].as<JsonArray>();
for (JsonObject endpointObj : endpoints) {
EndpointInfo endpoint;
endpoint.uri = endpointObj["uri"].as<String>();
endpoint.method = endpointObj["method"].as<int>();
endpoint.isLocal = false;
endpoint.serviceName = "remote";
nodeInfo.endpoints.push_back(std::move(endpoint));
}
}
}
};
/**
* Convenience function to create a JsonArray from a collection of NodeInfo objects
* @param doc The JsonDocument to create the array in
* @param nodes Collection of NodeInfo objects
* @return A JsonArray containing all serialized NodeInfo objects
*/
template<typename Container>
JsonArray nodeInfoToJsonArray(JsonDocument& doc, const Container& nodes) {
JsonArray arr = doc.to<JsonArray>();
for (const auto& pair : nodes) {
const NodeInfo& node = pair.second;
NodeInfoSerializable serializable(const_cast<NodeInfo&>(node));
JsonObject obj = arr.add<JsonObject>();
serializable.toJson(obj);
}
return arr;
}
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,102 @@
#pragma once
#include "ApiResponse.h"
#include "EndpointInfoSerializable.h"
#include "NodeInfo.h"
#include "spore/util/Logging.h"
#include <vector>
namespace spore {
namespace types {
/**
* Response class for node status endpoint
* Handles complete JSON document creation for node status data
*/
class NodeStatusResponse : public ApiResponse {
public:
/**
* Set basic system information
*/
void setSystemInfo() {
doc["freeHeap"] = ESP.getFreeHeap();
doc["chipId"] = ESP.getChipId();
doc["sdkVersion"] = ESP.getSdkVersion();
doc["cpuFreqMHz"] = ESP.getCpuFreqMHz();
doc["flashChipSize"] = ESP.getFlashChipSize();
}
/**
* Add labels to the response
* @param labels Map of label key-value pairs
*/
void addLabels(const std::map<String, String>& labels) {
if (!labels.empty()) {
JsonObject labelsObj = doc["labels"].to<JsonObject>();
for (const auto& kv : labels) {
labelsObj[kv.first.c_str()] = kv.second;
}
}
}
/**
* Build complete response with system info and labels
* @param labels Optional labels to include
*/
void buildCompleteResponse(const std::map<String, String>& labels = {}) {
setSystemInfo();
addLabels(labels);
}
};
/**
* Response class for node endpoints endpoint
* Handles complete JSON document creation for endpoint data
*/
class NodeEndpointsResponse : public CollectionResponse<EndpointInfoSerializable> {
public:
NodeEndpointsResponse() : CollectionResponse("endpoints") {}
/**
* Add a single endpoint to the response
* @param endpoint The EndpointInfo to add
*/
void addEndpoint(const EndpointInfo& endpoint) {
addItem(EndpointInfoSerializable(endpoint));
}
/**
* Add multiple endpoints from a container
* @param endpoints Container of EndpointInfo objects
*/
void addEndpoints(const std::vector<EndpointInfo>& endpoints) {
for (const auto& endpoint : endpoints) {
addEndpoint(endpoint);
}
}
};
/**
* Response class for simple status operations (update, restart)
* Handles simple JSON responses for node operations
*/
class NodeOperationResponse : public ApiResponse {
public:
/**
* Set success response
* @param status Status message
*/
void setSuccess(const String& status) {
doc["status"] = status;
}
/**
* Set error response
* @param status Error status message
*/
void setError(const String& status) {
doc["status"] = status;
}
};
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,99 @@
#pragma once
#include "spore/util/JsonSerializable.h"
#include <ArduinoJson.h>
#include <Arduino.h>
namespace spore {
namespace types {
/**
* Serializable wrapper for task information that implements JsonSerializable interface
* Handles conversion between task data and JSON representation
*/
class TaskInfoSerializable : public util::JsonSerializable {
private:
String taskName;
const JsonObject& taskData;
public:
TaskInfoSerializable(const String& name, const JsonObject& data)
: taskName(name), taskData(data) {}
TaskInfoSerializable(const std::string& name, const JsonObject& data)
: taskName(name.c_str()), taskData(data) {}
/**
* Serialize task info to JsonObject
*/
void toJson(JsonObject& obj) const override {
obj["name"] = taskName;
obj["interval"] = taskData["interval"];
obj["enabled"] = taskData["enabled"];
obj["running"] = taskData["running"];
obj["autoStart"] = taskData["autoStart"];
}
/**
* Deserialize task info from JsonObject
* Note: This is read-only for task status, so fromJson is not implemented
*/
void fromJson(const JsonObject& obj) override {
// Task info is typically read-only in this context
// Implementation would go here if needed
}
};
/**
* Serializable wrapper for system information
*/
class SystemInfoSerializable : public util::JsonSerializable {
public:
/**
* Serialize system info to JsonObject
*/
void toJson(JsonObject& obj) const override {
obj["freeHeap"] = ESP.getFreeHeap();
obj["uptime"] = millis();
}
/**
* Deserialize system info from JsonObject
* Note: System info is typically read-only, so fromJson is not implemented
*/
void fromJson(const JsonObject& obj) override {
// System info is typically read-only
// Implementation would go here if needed
}
};
/**
* Serializable wrapper for task summary information
*/
class TaskSummarySerializable : public util::JsonSerializable {
private:
size_t totalTasks;
size_t activeTasks;
public:
TaskSummarySerializable(size_t total, size_t active)
: totalTasks(total), activeTasks(active) {}
/**
* Serialize task summary to JsonObject
*/
void toJson(JsonObject& obj) const override {
obj["totalTasks"] = totalTasks;
obj["activeTasks"] = activeTasks;
}
/**
* Deserialize task summary from JsonObject
*/
void fromJson(const JsonObject& obj) override {
totalTasks = obj["totalTasks"].as<size_t>();
activeTasks = obj["activeTasks"].as<size_t>();
}
};
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,194 @@
#pragma once
#include "ApiResponse.h"
#include "TaskInfoSerializable.h"
#include <map>
namespace spore {
namespace types {
/**
* Response class for task status endpoint
* Handles complete JSON document creation for task status data
*/
class TaskStatusResponse : public ApiResponse {
public:
/**
* Set the task summary information
* @param totalTasks Total number of tasks
* @param activeTasks Number of active tasks
*/
void setSummary(size_t totalTasks, size_t activeTasks) {
TaskSummarySerializable summary(totalTasks, activeTasks);
JsonObject summaryObj = doc["summary"].to<JsonObject>();
summary.toJson(summaryObj);
}
/**
* Add a single task to the response
* @param taskName Name of the task
* @param taskData Task data as JsonObject
*/
void addTask(const String& taskName, const JsonObject& taskData) {
TaskInfoSerializable serializable(taskName, taskData);
if (!doc["tasks"].is<JsonArray>()) {
doc["tasks"] = JsonArray();
}
JsonArray tasksArr = doc["tasks"].as<JsonArray>();
JsonObject taskObj = tasksArr.add<JsonObject>();
serializable.toJson(taskObj);
}
/**
* Add a single task to the response (std::string version)
* @param taskName Name of the task
* @param taskData Task data as JsonObject
*/
void addTask(const std::string& taskName, const JsonObject& taskData) {
TaskInfoSerializable serializable(taskName, taskData);
if (!doc["tasks"].is<JsonArray>()) {
doc["tasks"] = JsonArray();
}
JsonArray tasksArr = doc["tasks"].as<JsonArray>();
JsonObject taskObj = tasksArr.add<JsonObject>();
serializable.toJson(taskObj);
}
/**
* Add multiple tasks from a task statuses map
* @param taskStatuses Map of task name to task data
*/
void addTasks(const std::map<String, JsonObject>& taskStatuses) {
for (const auto& pair : taskStatuses) {
addTask(pair.first, pair.second);
}
}
/**
* Set the system information
*/
void setSystemInfo() {
SystemInfoSerializable systemInfo;
JsonObject systemObj = doc["system"].to<JsonObject>();
systemInfo.toJson(systemObj);
}
/**
* Build complete response with all components
* @param taskStatuses Map of task name to task data
*/
void buildCompleteResponse(const std::map<String, JsonObject>& taskStatuses) {
// Set summary
size_t totalTasks = taskStatuses.size();
size_t activeTasks = 0;
for (const auto& pair : taskStatuses) {
if (pair.second["enabled"]) {
activeTasks++;
}
}
setSummary(totalTasks, activeTasks);
// Add all tasks
addTasks(taskStatuses);
// Set system info
setSystemInfo();
}
/**
* Build complete response with all components from vector
* @param taskStatuses Vector of pairs of task name to task data
*/
void buildCompleteResponse(const std::vector<std::pair<std::string, JsonObject>>& taskStatuses) {
// Clear the document first since getAllTaskStatuses creates a root array
doc.clear();
// Set summary
size_t totalTasks = taskStatuses.size();
size_t activeTasks = 0;
for (const auto& pair : taskStatuses) {
if (pair.second["enabled"]) {
activeTasks++;
}
}
setSummary(totalTasks, activeTasks);
// Add all tasks - extract data before clearing to avoid invalid references
JsonArray tasksArr = doc["tasks"].to<JsonArray>();
for (const auto& pair : taskStatuses) {
// Extract data from JsonObject before it becomes invalid
String taskName = pair.first.c_str();
unsigned long interval = pair.second["interval"];
bool enabled = pair.second["enabled"];
bool running = pair.second["running"];
bool autoStart = pair.second["autoStart"];
// Create new JsonObject in our document
JsonObject taskObj = tasksArr.add<JsonObject>();
taskObj["name"] = taskName;
taskObj["interval"] = interval;
taskObj["enabled"] = enabled;
taskObj["running"] = running;
taskObj["autoStart"] = autoStart;
}
// Set system info
setSystemInfo();
}
};
/**
* Response class for task control operations
* Handles JSON responses for task enable/disable/start/stop operations
*/
class TaskControlResponse : public ApiResponse {
public:
/**
* Set the response data for a task control operation
* @param success Whether the operation was successful
* @param message Response message
* @param taskName Name of the task
* @param action Action performed
*/
void setResponse(bool success, const String& message, const String& taskName, const String& action) {
doc["success"] = success;
doc["message"] = message;
doc["task"] = taskName;
doc["action"] = action;
}
/**
* Add detailed task information to the response
* @param taskName Name of the task
* @param enabled Whether task is enabled
* @param running Whether task is running
* @param interval Task interval
*/
void addTaskDetails(const String& taskName, bool enabled, bool running, unsigned long interval) {
JsonObject taskDetails = doc["taskDetails"].to<JsonObject>();
taskDetails["name"] = taskName;
taskDetails["enabled"] = enabled;
taskDetails["running"] = running;
taskDetails["interval"] = interval;
// Add system info
SystemInfoSerializable systemInfo;
JsonObject systemObj = taskDetails["system"].to<JsonObject>();
systemInfo.toJson(systemObj);
}
/**
* Set error response
* @param message Error message
* @param example Optional example for correct usage
*/
void setError(const String& message, const String& example = "") {
doc["success"] = false;
doc["message"] = message;
if (example.length() > 0) {
doc["example"] = example;
}
}
};
} // namespace types
} // namespace spore

View File

@@ -0,0 +1,118 @@
#pragma once
#include <Arduino.h>
/**
* @brief CPU usage measurement utility for ESP32/ESP8266
*
* This class provides methods to measure CPU usage by tracking idle time
* and calculating the percentage of time the CPU is busy vs idle.
*/
class CpuUsage {
public:
/**
* @brief Construct a new CpuUsage object
*/
CpuUsage();
/**
* @brief Destructor
*/
~CpuUsage() = default;
/**
* @brief Initialize the CPU usage measurement
* Call this once during setup
*/
void begin();
/**
* @brief Start measuring CPU usage for the current cycle
* Call this at the beginning of your main loop
*/
void startMeasurement();
/**
* @brief End measuring CPU usage for the current cycle
* Call this at the end of your main loop
*/
void endMeasurement();
/**
* @brief Get the current CPU usage percentage
* @return float CPU usage percentage (0.0 to 100.0)
*/
float getCpuUsage() const;
/**
* @brief Get the average CPU usage over the measurement window
* @return float Average CPU usage percentage (0.0 to 100.0)
*/
float getAverageCpuUsage() const;
/**
* @brief Get the maximum CPU usage recorded
* @return float Maximum CPU usage percentage (0.0 to 100.0)
*/
float getMaxCpuUsage() const;
/**
* @brief Get the minimum CPU usage recorded
* @return float Minimum CPU usage percentage (0.0 to 100.0)
*/
float getMinCpuUsage() const;
/**
* @brief Reset all CPU usage statistics
*/
void reset();
/**
* @brief Check if measurement is currently active
* @return true if measurement is active, false otherwise
*/
bool isMeasuring() const;
/**
* @brief Get the number of measurements taken
* @return unsigned long Number of measurements
*/
unsigned long getMeasurementCount() const;
private:
// Measurement state
bool _initialized;
bool _measuring;
unsigned long _measurementCount;
// Timing variables
unsigned long _cycleStartTime;
unsigned long _idleStartTime;
unsigned long _totalIdleTime;
unsigned long _totalCycleTime;
// Statistics
float _currentCpuUsage;
float _averageCpuUsage;
float _maxCpuUsage;
float _minCpuUsage;
unsigned long _totalCpuTime;
// Rolling average window
static constexpr size_t ROLLING_WINDOW_SIZE = 10;
float _rollingWindow[ROLLING_WINDOW_SIZE];
size_t _rollingIndex;
bool _rollingWindowFull;
/**
* @brief Update rolling average calculation
* @param value New value to add to rolling average
*/
void updateRollingAverage(float value);
/**
* @brief Update min/max statistics
* @param value New value to check against min/max
*/
void updateMinMax(float value);
};

View File

@@ -0,0 +1,56 @@
#pragma once
#include <ArduinoJson.h>
namespace spore {
namespace util {
/**
* Abstract base class for objects that can be serialized to/from JSON
* Provides a clean interface for converting objects to JsonObject and back
*/
class JsonSerializable {
public:
virtual ~JsonSerializable() = default;
/**
* Serialize this object to a JsonObject
* @param obj The JsonObject to populate with this object's data
*/
virtual void toJson(JsonObject& obj) const = 0;
/**
* Deserialize this object from a JsonObject
* @param obj The JsonObject containing the data to populate this object
*/
virtual void fromJson(const JsonObject& obj) = 0;
/**
* Convenience method to create a JsonObject from this object
* @param doc The JsonDocument to create the object in
* @return A JsonObject containing this object's serialized data
*/
JsonObject toJsonObject(JsonDocument& doc) const {
JsonObject obj = doc.to<JsonObject>();
toJson(obj);
return obj;
}
/**
* Convenience method to create a JsonArray from a collection of serializable objects
* @param doc The JsonDocument to create the array in
* @param objects Collection of objects implementing JsonSerializable
* @return A JsonArray containing all serialized objects
*/
template<typename Container>
static JsonArray toJsonArray(JsonDocument& doc, const Container& objects) {
JsonArray arr = doc.to<JsonArray>();
for (const auto& obj : objects) {
JsonObject item = arr.add<JsonObject>();
obj.toJson(item);
}
return arr;
}
};
} // namespace util
} // namespace spore

View File

@@ -0,0 +1,29 @@
#pragma once
#include <Arduino.h>
enum class LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3
};
// Global log level - can be changed at runtime
extern LogLevel g_logLevel;
// Simple logging functions
void logMessage(LogLevel level, const String& component, const String& message);
void logDebug(const String& component, const String& message);
void logInfo(const String& component, const String& message);
void logWarn(const String& component, const String& message);
void logError(const String& component, const String& message);
// Set global log level
void setLogLevel(LogLevel level);
// Convenience macros - no context needed
#define LOG_DEBUG(component, message) logDebug(component, message)
#define LOG_INFO(component, message) logInfo(component, message)
#define LOG_WARN(component, message) logWarn(component, message)
#define LOG_ERROR(component, message) logError(component, message)

View File

@@ -1,6 +0,0 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, , 0x4000,
otadata, data, ota, , 0x2000,
app0, app, ota_0, , 0x3E000,
app1, app, ota_1, , 0x3E000,
spiffs, data, spiffs, , 0x1C000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x4000
3 otadata data ota 0x2000
4 app0 app ota_0 0x3E000
5 app1 app ota_1 0x3E000
6 spiffs data spiffs 0x1C000

View File

@@ -9,8 +9,9 @@
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[platformio] [platformio]
;default_envs = esp01_1m default_envs = base
src_dir = . src_dir = .
data_dir = ${PROJECT_DIR}/examples/${PIOENV}/data
[common] [common]
monitor_speed = 115200 monitor_speed = 115200
@@ -18,15 +19,17 @@ lib_deps =
esp32async/ESPAsyncWebServer@^3.8.0 esp32async/ESPAsyncWebServer@^3.8.0
bblanchon/ArduinoJson@^7.4.2 bblanchon/ArduinoJson@^7.4.2
[env:esp01_1m] [env:base]
platform = platformio/espressif8266@^4.2.1 platform = platformio/espressif8266@^4.2.1
board = esp01_1m board = esp01_1m
framework = arduino framework = arduino
upload_speed = 115200 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
board_build.partitions = partitions_ota_1M.csv board_build.f_cpu = 80000000L
board_build.flash_mode = dout ; ESP01S uses DOUT on 1 Mbit flash board_build.flash_mode = qio
board_build.flash_size = 1M board_build.filesystem = littlefs
; note: somehow partition table is not working, so we need to use the ldscript
board_build.ldscript = eagle.flash.1m64.ld ; 64KB -> FS Size
lib_deps = ${common.lib_deps} lib_deps = ${common.lib_deps}
build_src_filter = build_src_filter =
+<examples/base/*.cpp> +<examples/base/*.cpp>
@@ -34,6 +37,7 @@ build_src_filter =
+<src/spore/core/*.cpp> +<src/spore/core/*.cpp>
+<src/spore/services/*.cpp> +<src/spore/services/*.cpp>
+<src/spore/types/*.cpp> +<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp> +<src/internal/*.cpp>
[env:d1_mini] [env:d1_mini]
@@ -42,8 +46,10 @@ board = d1_mini
framework = arduino framework = arduino
upload_speed = 115200 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
board_build.filesystem = littlefs
board_build.flash_mode = dio ; D1 Mini uses DIO on 4 Mbit flash board_build.flash_mode = dio ; D1 Mini uses DIO on 4 Mbit flash
board_build.flash_size = 4M board_build.flash_size = 4M
board_build.ldscript = eagle.flash.4m1m.ld
lib_deps = ${common.lib_deps} lib_deps = ${common.lib_deps}
build_src_filter = build_src_filter =
+<examples/base/*.cpp> +<examples/base/*.cpp>
@@ -51,72 +57,38 @@ build_src_filter =
+<src/spore/core/*.cpp> +<src/spore/core/*.cpp>
+<src/spore/services/*.cpp> +<src/spore/services/*.cpp>
+<src/spore/types/*.cpp> +<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp> +<src/internal/*.cpp>
[env:esp01_1m_relay] [env:relay]
platform = platformio/espressif8266@^4.2.1 platform = platformio/espressif8266@^4.2.1
board = esp01_1m board = esp01_1m
framework = arduino framework = arduino
upload_speed = 115200 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
board_build.partitions = partitions_ota_1M.csv board_build.filesystem = littlefs
board_build.flash_mode = dout board_build.flash_mode = dout
board_build.flash_size = 1M board_build.ldscript = eagle.flash.1m64.ld
lib_deps = ${common.lib_deps} lib_deps = ${common.lib_deps}
;data_dir = examples/relay/data
build_src_filter = build_src_filter =
+<examples/relay/*.cpp> +<examples/relay/*.cpp>
+<src/spore/*.cpp> +<src/spore/*.cpp>
+<src/spore/core/*.cpp> +<src/spore/core/*.cpp>
+<src/spore/services/*.cpp> +<src/spore/services/*.cpp>
+<src/spore/types/*.cpp> +<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp> +<src/internal/*.cpp>
[env:esp01_1m_neopixel] [env:neopattern]
platform = platformio/espressif8266@^4.2.1 platform = platformio/espressif8266@^4.2.1
board = esp01_1m board = esp01_1m
framework = arduino framework = arduino
upload_speed = 115200 upload_speed = 115200
monitor_speed = 115200 monitor_speed = 115200
board_build.partitions = partitions_ota_1M.csv board_build.filesystem = littlefs
board_build.flash_mode = dout board_build.flash_mode = dout
board_build.flash_size = 1M board_build.ldscript = eagle.flash.1m64.ld
lib_deps = ${common.lib_deps}
adafruit/Adafruit NeoPixel@^1.15.1
build_src_filter =
+<examples/neopixel/*.cpp>
+<src/spore/*.cpp>
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/internal/*.cpp>
[env:d1_mini_neopixel]
platform = platformio/espressif8266@^4.2.1
board = d1_mini
framework = arduino
upload_speed = 115200
monitor_speed = 115200
board_build.flash_mode = dio
board_build.flash_size = 4M
lib_deps = ${common.lib_deps}
adafruit/Adafruit NeoPixel@^1.15.1
build_src_filter =
+<examples/neopixel/*.cpp>
+<src/spore/*.cpp>
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/internal/*.cpp>
[env:esp01_1m_neopattern]
platform = platformio/espressif8266@^4.2.1
board = esp01_1m
framework = arduino
upload_speed = 115200
monitor_speed = 115200
board_build.partitions = partitions_ota_1M.csv
board_build.flash_mode = dout
board_build.flash_size = 1M
lib_deps = ${common.lib_deps} lib_deps = ${common.lib_deps}
adafruit/Adafruit NeoPixel@^1.15.1 adafruit/Adafruit NeoPixel@^1.15.1
build_flags = -DLED_STRIP_PIN=2 build_flags = -DLED_STRIP_PIN=2
@@ -126,22 +98,5 @@ build_src_filter =
+<src/spore/core/*.cpp> +<src/spore/core/*.cpp>
+<src/spore/services/*.cpp> +<src/spore/services/*.cpp>
+<src/spore/types/*.cpp> +<src/spore/types/*.cpp>
+<src/internal/*.cpp> +<src/spore/util/*.cpp>
[env:d1_mini_neopattern]
platform = platformio/espressif8266@^4.2.1
board = d1_mini
framework = arduino
upload_speed = 115200
monitor_speed = 115200
board_build.flash_mode = dio
board_build.flash_size = 4M
lib_deps = ${common.lib_deps}
adafruit/Adafruit NeoPixel@^1.15.1
build_src_filter =
+<examples/neopattern/*.cpp>
+<src/spore/*.cpp>
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/internal/*.cpp> +<src/internal/*.cpp>

View File

@@ -3,17 +3,19 @@
#include "spore/services/NetworkService.h" #include "spore/services/NetworkService.h"
#include "spore/services/ClusterService.h" #include "spore/services/ClusterService.h"
#include "spore/services/TaskService.h" #include "spore/services/TaskService.h"
#include "spore/services/StaticFileService.h"
#include "spore/services/MonitoringService.h"
#include <Arduino.h> #include <Arduino.h>
Spore::Spore() : ctx(), network(ctx), taskManager(ctx), cluster(ctx, taskManager), Spore::Spore() : ctx(), network(ctx), taskManager(ctx), cluster(ctx, taskManager),
apiServer(ctx, taskManager, ctx.config.api_server_port), apiServer(ctx, taskManager, ctx.config.api_server_port),
initialized(false), apiServerStarted(false) { cpuUsage(), initialized(false), apiServerStarted(false) {
} }
Spore::Spore(std::initializer_list<std::pair<String, String>> initialLabels) Spore::Spore(std::initializer_list<std::pair<String, String>> initialLabels)
: ctx(initialLabels), network(ctx), taskManager(ctx), cluster(ctx, taskManager), : ctx(initialLabels), network(ctx), taskManager(ctx), cluster(ctx, taskManager),
apiServer(ctx, taskManager, ctx.config.api_server_port), apiServer(ctx, taskManager, ctx.config.api_server_port),
initialized(false), apiServerStarted(false) { cpuUsage(), initialized(false), apiServerStarted(false) {
} }
Spore::~Spore() { Spore::~Spore() {
@@ -22,35 +24,38 @@ Spore::~Spore() {
void Spore::setup() { void Spore::setup() {
if (initialized) { if (initialized) {
Serial.println("[Spore] Already initialized, skipping setup"); LOG_INFO("Spore", "Already initialized, skipping setup");
return; return;
} }
Serial.begin(115200); Serial.begin(115200);
Serial.println("[Spore] Starting Spore framework..."); LOG_INFO("Spore", "Starting Spore framework...");
// Initialize core components // Initialize core components
initializeCore(); initializeCore();
// Initialize CPU usage monitoring
cpuUsage.begin();
// Register core services // Register core services
registerCoreServices(); registerCoreServices();
initialized = true; initialized = true;
Serial.println("[Spore] Framework setup complete - call begin() to start API server"); LOG_INFO("Spore", "Framework setup complete - call begin() to start API server");
} }
void Spore::begin() { void Spore::begin() {
if (!initialized) { if (!initialized) {
Serial.println("[Spore] Framework not initialized, call setup() first"); LOG_ERROR("Spore", "Framework not initialized, call setup() first");
return; return;
} }
if (apiServerStarted) { if (apiServerStarted) {
Serial.println("[Spore] API server already started"); LOG_WARN("Spore", "API server already started");
return; return;
} }
Serial.println("[Spore] Starting API server..."); LOG_INFO("Spore", "Starting API server...");
// Start API server // Start API server
startApiServer(); startApiServer();
@@ -58,22 +63,31 @@ void Spore::begin() {
// Print initial task status // Print initial task status
taskManager.printTaskStatus(); taskManager.printTaskStatus();
Serial.println("[Spore] Framework ready!"); LOG_INFO("Spore", "Framework ready!");
} }
void Spore::loop() { void Spore::loop() {
if (!initialized) { if (!initialized) {
Serial.println("[Spore] Framework not initialized, call setup() first"); LOG_ERROR("Spore", "Framework not initialized, call setup() first");
return; return;
} }
// Start CPU usage measurement
cpuUsage.startMeasurement();
// Execute main tasks
taskManager.execute(); taskManager.execute();
// End CPU usage measurement before yield
cpuUsage.endMeasurement();
// Yield to allow other tasks to run
yield(); yield();
} }
void Spore::addService(std::shared_ptr<Service> service) { void Spore::addService(std::shared_ptr<Service> service) {
if (!service) { if (!service) {
Serial.println("[Spore] Warning: Attempted to add null service"); LOG_WARN("Spore", "Attempted to add null service");
return; return;
} }
@@ -82,15 +96,15 @@ void Spore::addService(std::shared_ptr<Service> service) {
if (apiServerStarted) { if (apiServerStarted) {
// If API server is already started, register the service immediately // If API server is already started, register the service immediately
apiServer.addService(*service); apiServer.addService(*service);
Serial.printf("[Spore] Added service '%s' to running API server\n", service->getName()); LOG_INFO("Spore", "Added service '" + String(service->getName()) + "' to running API server");
} else { } else {
Serial.printf("[Spore] Registered service '%s' (will be added to API server when begin() is called)\n", service->getName()); LOG_INFO("Spore", "Registered service '" + String(service->getName()) + "' (will be added to API server when begin() is called)");
} }
} }
void Spore::addService(Service* service) { void Spore::addService(Service* service) {
if (!service) { if (!service) {
Serial.println("[Spore] Warning: Attempted to add null service"); LOG_WARN("Spore", "Attempted to add null service");
return; return;
} }
@@ -100,7 +114,7 @@ void Spore::addService(Service* service) {
void Spore::initializeCore() { void Spore::initializeCore() {
Serial.println("[Spore] Initializing core components..."); LOG_INFO("Spore", "Initializing core components...");
// Setup WiFi first // Setup WiFi first
network.setupWiFi(); network.setupWiFi();
@@ -108,40 +122,44 @@ void Spore::initializeCore() {
// Initialize task manager // Initialize task manager
taskManager.initialize(); taskManager.initialize();
Serial.println("[Spore] Core components initialized"); LOG_INFO("Spore", "Core components initialized");
} }
void Spore::registerCoreServices() { void Spore::registerCoreServices() {
Serial.println("[Spore] Registering core services..."); LOG_INFO("Spore", "Registering core services...");
// Create core services // Create core services
auto nodeService = std::make_shared<NodeService>(ctx, apiServer); auto nodeService = std::make_shared<NodeService>(ctx, apiServer);
auto networkService = std::make_shared<NetworkService>(network); auto networkService = std::make_shared<NetworkService>(network);
auto clusterService = std::make_shared<ClusterService>(ctx); auto clusterService = std::make_shared<ClusterService>(ctx);
auto taskService = std::make_shared<TaskService>(taskManager); auto taskService = std::make_shared<TaskService>(taskManager);
auto staticFileService = std::make_shared<StaticFileService>(ctx, apiServer);
auto monitoringService = std::make_shared<MonitoringService>(cpuUsage);
// Add to services list // Add to services list
services.push_back(nodeService); services.push_back(nodeService);
services.push_back(networkService); services.push_back(networkService);
services.push_back(clusterService); services.push_back(clusterService);
services.push_back(taskService); services.push_back(taskService);
services.push_back(staticFileService);
services.push_back(monitoringService);
Serial.println("[Spore] Core services registered"); LOG_INFO("Spore", "Core services registered");
} }
void Spore::startApiServer() { void Spore::startApiServer() {
if (apiServerStarted) { if (apiServerStarted) {
Serial.println("[Spore] API server already started"); LOG_WARN("Spore", "API server already started");
return; return;
} }
Serial.println("[Spore] Starting API server..."); LOG_INFO("Spore", "Starting API server...");
// Register all services with API server // Register all services with API server
for (auto& service : services) { for (auto& service : services) {
if (service) { if (service) {
apiServer.addService(*service); apiServer.addService(*service);
Serial.printf("[Spore] Added service '%s' to API server\n", service->getName()); LOG_INFO("Spore", "Added service '" + String(service->getName()) + "' to API server");
} }
} }
@@ -149,5 +167,5 @@ void Spore::startApiServer() {
apiServer.begin(); apiServer.begin();
apiServerStarted = true; apiServerStarted = true;
Serial.println("[Spore] API server started"); LOG_INFO("Spore", "API server started");
} }

View File

@@ -1,5 +1,6 @@
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/Service.h" #include "spore/Service.h"
#include "spore/util/Logging.h"
#include <algorithm> #include <algorithm>
const char* ApiServer::methodToStr(int method) { const char* ApiServer::methodToStr(int method) {
@@ -20,71 +21,50 @@ void ApiServer::registerEndpoint(const String& uri, int method,
const String& serviceName) { const String& serviceName) {
// Add to local endpoints // Add to local endpoints
endpoints.push_back(EndpointInfo{uri, method, params, serviceName, true}); endpoints.push_back(EndpointInfo{uri, method, params, serviceName, true});
// Update cluster if needed
if (ctx.memberList && !ctx.memberList->empty()) {
auto it = ctx.memberList->find(ctx.hostname);
if (it != ctx.memberList->end()) {
it->second.endpoints.push_back(EndpointInfo{uri, method, params, serviceName, true});
}
}
} }
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler) { void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
// Get current service name if available const String& serviceName) {
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
registerEndpoint(uri, method, {}, serviceName); registerEndpoint(uri, method, {}, serviceName);
server.on(uri.c_str(), method, requestHandler); server.on(uri.c_str(), method, requestHandler);
} }
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler, void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler) { std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler,
// Get current service name if available const String& serviceName) {
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
registerEndpoint(uri, method, {}, serviceName); registerEndpoint(uri, method, {}, serviceName);
server.on(uri.c_str(), method, requestHandler, uploadHandler); server.on(uri.c_str(), method, requestHandler, uploadHandler);
} }
// Overloads that also record minimal capability specs // Overloads that also record minimal capability specs
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler, void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
const std::vector<ParamSpec>& params) { const std::vector<ParamSpec>& params, const String& serviceName) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
registerEndpoint(uri, method, params, serviceName); registerEndpoint(uri, method, params, serviceName);
server.on(uri.c_str(), method, requestHandler); server.on(uri.c_str(), method, requestHandler);
} }
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler, void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler, std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler,
const std::vector<ParamSpec>& params) { const std::vector<ParamSpec>& params, const String& serviceName) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
registerEndpoint(uri, method, params, serviceName); registerEndpoint(uri, method, params, serviceName);
server.on(uri.c_str(), method, requestHandler, uploadHandler); server.on(uri.c_str(), method, requestHandler, uploadHandler);
} }
void ApiServer::addService(Service& service) { void ApiServer::addService(Service& service) {
services.push_back(service); services.push_back(service);
Serial.printf("[API] Added service: %s\n", service.getName()); LOG_INFO("API", "Added service: " + String(service.getName()));
}
void ApiServer::serveStatic(const String& uri, fs::FS& fs, const String& path, const String& cache_header) {
server.serveStatic(uri.c_str(), fs, path.c_str(), cache_header.c_str()).setDefaultFile("index.html");
LOG_INFO("API", "Registered static file serving: " + uri + " -> " + path);
} }
void ApiServer::begin() { void ApiServer::begin() {
// Register all service endpoints // Register all service endpoints
for (auto& service : services) { for (auto& service : services) {
service.get().registerEndpoints(*this); service.get().registerEndpoints(*this);
Serial.printf("[API] Registered endpoints for service: %s\n", service.get().getName()); LOG_INFO("API", "Registered endpoints for service: " + String(service.get().getName()));
} }
server.begin(); server.begin();

View File

@@ -1,5 +1,6 @@
#include "spore/core/ClusterManager.h" #include "spore/core/ClusterManager.h"
#include "spore/internal/Globals.h" #include "spore/internal/Globals.h"
#include "spore/util/Logging.h"
ClusterManager::ClusterManager(NodeContext& ctx, TaskManager& taskMgr) : ctx(ctx), taskManager(taskMgr) { ClusterManager::ClusterManager(NodeContext& ctx, TaskManager& taskMgr) : ctx(ctx), taskManager(taskMgr) {
// Register callback for node_discovered event // Register callback for node_discovered event
@@ -18,11 +19,11 @@ void ClusterManager::registerTasks() {
taskManager.registerTask("print_members", ctx.config.print_interval_ms, [this]() { printMemberList(); }); taskManager.registerTask("print_members", ctx.config.print_interval_ms, [this]() { printMemberList(); });
taskManager.registerTask("heartbeat", ctx.config.heartbeat_interval_ms, [this]() { heartbeatTaskCallback(); }); taskManager.registerTask("heartbeat", ctx.config.heartbeat_interval_ms, [this]() { heartbeatTaskCallback(); });
taskManager.registerTask("update_members_info", ctx.config.member_info_update_interval_ms, [this]() { updateAllMembersInfoTaskCallback(); }); taskManager.registerTask("update_members_info", ctx.config.member_info_update_interval_ms, [this]() { updateAllMembersInfoTaskCallback(); });
Serial.println("[ClusterManager] Registered all cluster tasks"); LOG_INFO("ClusterManager", "Registered all cluster tasks");
} }
void ClusterManager::sendDiscovery() { void ClusterManager::sendDiscovery() {
//Serial.println("[Cluster] Sending discovery packet..."); //LOG_DEBUG(ctx, "Cluster", "Sending discovery packet...");
ctx.udp->beginPacket("255.255.255.255", ctx.config.udp_port); ctx.udp->beginPacket("255.255.255.255", ctx.config.udp_port);
ctx.udp->write(ClusterProtocol::DISCOVERY_MSG); ctx.udp->write(ClusterProtocol::DISCOVERY_MSG);
ctx.udp->endPacket(); ctx.udp->endPacket();
@@ -36,14 +37,14 @@ void ClusterManager::listenForDiscovery() {
if (len > 0) { if (len > 0) {
incoming[len] = 0; incoming[len] = 0;
} }
//Serial.printf("[UDP] Packet received: %s\n", incoming); //LOG_DEBUG(ctx, "UDP", "Packet received: " + String(incoming));
if (strcmp(incoming, ClusterProtocol::DISCOVERY_MSG) == 0) { if (strcmp(incoming, ClusterProtocol::DISCOVERY_MSG) == 0) {
//Serial.printf("[UDP] Discovery request from: %s\n", ctx.udp->remoteIP().toString().c_str()); //LOG_DEBUG(ctx, "UDP", "Discovery request from: " + ctx.udp->remoteIP().toString());
ctx.udp->beginPacket(ctx.udp->remoteIP(), ctx.config.udp_port); ctx.udp->beginPacket(ctx.udp->remoteIP(), ctx.config.udp_port);
String response = String(ClusterProtocol::RESPONSE_MSG) + ":" + ctx.hostname; String response = String(ClusterProtocol::RESPONSE_MSG) + ":" + ctx.hostname;
ctx.udp->write(response.c_str()); ctx.udp->write(response.c_str());
ctx.udp->endPacket(); ctx.udp->endPacket();
//Serial.printf("[UDP] Sent response with hostname: %s\n", ctx.hostname.c_str()); //LOG_DEBUG(ctx, "UDP", "Sent response with hostname: " + ctx.hostname);
} else if (strncmp(incoming, ClusterProtocol::RESPONSE_MSG, strlen(ClusterProtocol::RESPONSE_MSG)) == 0) { } else if (strncmp(incoming, ClusterProtocol::RESPONSE_MSG, strlen(ClusterProtocol::RESPONSE_MSG)) == 0) {
char* hostPtr = incoming + strlen(ClusterProtocol::RESPONSE_MSG) + 1; char* hostPtr = incoming + strlen(ClusterProtocol::RESPONSE_MSG) + 1;
String nodeHost = String(hostPtr); String nodeHost = String(hostPtr);
@@ -72,36 +73,52 @@ void ClusterManager::addOrUpdateNode(const String& nodeHost, IPAddress nodeIP) {
newNode.lastSeen = millis(); newNode.lastSeen = millis();
updateNodeStatus(newNode, newNode.lastSeen, ctx.config.node_inactive_threshold_ms, ctx.config.node_dead_threshold_ms); updateNodeStatus(newNode, newNode.lastSeen, ctx.config.node_inactive_threshold_ms, ctx.config.node_dead_threshold_ms);
memberList[nodeHost] = newNode; memberList[nodeHost] = newNode;
Serial.printf("[Cluster] Added node: %s @ %s | Status: %s | last update: 0\n", LOG_INFO("Cluster", "Added node: " + nodeHost + " @ " + newNode.ip.toString() + " | Status: " + statusToStr(newNode.status) + " | last update: 0");
nodeHost.c_str(),
newNode.ip.toString().c_str(),
statusToStr(newNode.status));
//fetchNodeInfo(nodeIP); // Do not fetch here, handled by periodic task //fetchNodeInfo(nodeIP); // Do not fetch here, handled by periodic task
} }
void ClusterManager::fetchNodeInfo(const IPAddress& ip) { void ClusterManager::fetchNodeInfo(const IPAddress& ip) {
if(ip == ctx.localIP) { if(ip == ctx.localIP) {
Serial.println("[Cluster] Skipping fetch for local node"); LOG_DEBUG("Cluster", "Skipping fetch for local node");
return; return;
} }
unsigned long requestStart = millis(); unsigned long requestStart = millis();
HTTPClient http; HTTPClient http;
WiFiClient client; WiFiClient client;
String url = "http://" + ip.toString() + ClusterProtocol::API_NODE_STATUS; String url = "http://" + ip.toString() + ClusterProtocol::API_NODE_STATUS;
http.begin(client, url);
// Use RAII pattern to ensure http.end() is always called
bool httpInitialized = false;
bool success = false;
httpInitialized = http.begin(client, url);
if (!httpInitialized) {
LOG_ERROR("Cluster", "Failed to initialize HTTP client for " + ip.toString());
return;
}
// Set timeout to prevent hanging
http.setTimeout(5000); // 5 second timeout
int httpCode = http.GET(); int httpCode = http.GET();
unsigned long requestEnd = millis(); unsigned long requestEnd = millis();
unsigned long requestDuration = requestEnd - requestStart; unsigned long requestDuration = requestEnd - requestStart;
if (httpCode == 200) { if (httpCode == 200) {
String payload = http.getString(); String payload = http.getString();
// Use stack-allocated JsonDocument with proper cleanup
JsonDocument doc; JsonDocument doc;
DeserializationError err = deserializeJson(doc, payload); DeserializationError err = deserializeJson(doc, payload);
if (!err) { if (!err) {
auto& memberList = *ctx.memberList; auto& memberList = *ctx.memberList;
// Still need to iterate since we're searching by IP, not hostname // Still need to iterate since we're searching by IP, not hostname
for (auto& pair : memberList) { for (auto& pair : memberList) {
NodeInfo& node = pair.second; NodeInfo& node = pair.second;
if (node.ip == ip) { if (node.ip == ip) {
// Update resources efficiently
node.resources.freeHeap = doc["freeHeap"]; node.resources.freeHeap = doc["freeHeap"];
node.resources.chipId = doc["chipId"]; node.resources.chipId = doc["chipId"];
node.resources.sdkVersion = (const char*)doc["sdkVersion"]; node.resources.sdkVersion = (const char*)doc["sdkVersion"];
@@ -110,40 +127,61 @@ void ClusterManager::fetchNodeInfo(const IPAddress& ip) {
node.status = NodeInfo::ACTIVE; node.status = NodeInfo::ACTIVE;
node.latency = requestDuration; node.latency = requestDuration;
node.lastSeen = millis(); node.lastSeen = millis();
// Clear and rebuild endpoints efficiently
node.endpoints.clear(); node.endpoints.clear();
node.endpoints.reserve(10); // Pre-allocate to avoid reallocations
if (doc["api"].is<JsonArray>()) { if (doc["api"].is<JsonArray>()) {
JsonArray apiArr = doc["api"].as<JsonArray>(); JsonArray apiArr = doc["api"].as<JsonArray>();
for (JsonObject apiObj : apiArr) { for (JsonObject apiObj : apiArr) {
String uri = (const char*)apiObj["uri"]; // Use const char* to avoid String copies
const char* uri = apiObj["uri"];
int method = apiObj["method"]; int method = apiObj["method"];
// Create basic EndpointInfo without params for cluster nodes // Create basic EndpointInfo without params for cluster nodes
EndpointInfo endpoint; EndpointInfo endpoint;
endpoint.uri = uri; endpoint.uri = uri; // String assignment is more efficient than construction
endpoint.method = method; endpoint.method = method;
endpoint.isLocal = false; endpoint.isLocal = false;
endpoint.serviceName = "remote"; endpoint.serviceName = "remote";
node.endpoints.push_back(endpoint); node.endpoints.push_back(std::move(endpoint));
} }
} }
// Parse labels if present
// Parse labels efficiently
node.labels.clear(); node.labels.clear();
if (doc["labels"].is<JsonObject>()) { if (doc["labels"].is<JsonObject>()) {
JsonObject labelsObj = doc["labels"].as<JsonObject>(); JsonObject labelsObj = doc["labels"].as<JsonObject>();
for (JsonPair kvp : labelsObj) { for (JsonPair kvp : labelsObj) {
String k = String(kvp.key().c_str()); // Use const char* to avoid String copies
String v = String(labelsObj[kvp.key()]); const char* key = kvp.key().c_str();
node.labels[k] = v; const char* value = labelsObj[kvp.key()];
node.labels[key] = value;
} }
} }
Serial.printf("[Cluster] Fetched info for node: %s @ %s\n", node.hostname.c_str(), ip.toString().c_str());
LOG_DEBUG("Cluster", "Fetched info for node: " + node.hostname + " @ " + ip.toString());
success = true;
break; break;
} }
} }
} else {
LOG_ERROR("Cluster", "JSON parse error for node @ " + ip.toString() + ": " + String(err.c_str()));
} }
} else { } else {
Serial.printf("[Cluster] Failed to fetch info for node @ %s, HTTP code: %d\n", ip.toString().c_str(), httpCode); LOG_ERROR("Cluster", "Failed to fetch info for node @ " + ip.toString() + ", HTTP code: " + String(httpCode));
}
// Always ensure HTTP client is properly closed
if (httpInitialized) {
http.end();
}
// Log success/failure for debugging
if (!success) {
LOG_DEBUG("Cluster", "Failed to update node info for " + ip.toString());
} }
http.end();
} }
void ClusterManager::heartbeatTaskCallback() { void ClusterManager::heartbeatTaskCallback() {
@@ -160,10 +198,25 @@ void ClusterManager::heartbeatTaskCallback() {
void ClusterManager::updateAllMembersInfoTaskCallback() { void ClusterManager::updateAllMembersInfoTaskCallback() {
auto& memberList = *ctx.memberList; auto& memberList = *ctx.memberList;
// Limit concurrent HTTP requests to prevent memory pressure
const size_t maxConcurrentRequests = ctx.config.max_concurrent_http_requests;
size_t requestCount = 0;
for (auto& pair : memberList) { for (auto& pair : memberList) {
const NodeInfo& node = pair.second; const NodeInfo& node = pair.second;
if (node.ip != ctx.localIP) { if (node.ip != ctx.localIP) {
// Only process a limited number of requests per cycle
if (requestCount >= maxConcurrentRequests) {
LOG_DEBUG("Cluster", "Limiting concurrent HTTP requests to prevent memory pressure");
break;
}
fetchNodeInfo(node.ip); fetchNodeInfo(node.ip);
requestCount++;
// Add small delay between requests to prevent overwhelming the system
delay(100);
} }
} }
} }
@@ -185,7 +238,7 @@ void ClusterManager::removeDeadNodes() {
for (auto it = memberList.begin(); it != memberList.end(); ) { for (auto it = memberList.begin(); it != memberList.end(); ) {
unsigned long diff = now - it->second.lastSeen; unsigned long diff = now - it->second.lastSeen;
if (it->second.status == NodeInfo::DEAD && diff > ctx.config.node_dead_threshold_ms) { if (it->second.status == NodeInfo::DEAD && diff > ctx.config.node_dead_threshold_ms) {
Serial.printf("[Cluster] Removing node: %s\n", it->second.hostname.c_str()); LOG_INFO("Cluster", "Removing node: " + it->second.hostname);
it = memberList.erase(it); it = memberList.erase(it);
} else { } else {
++it; ++it;
@@ -196,13 +249,13 @@ void ClusterManager::removeDeadNodes() {
void ClusterManager::printMemberList() { void ClusterManager::printMemberList() {
auto& memberList = *ctx.memberList; auto& memberList = *ctx.memberList;
if (memberList.empty()) { if (memberList.empty()) {
Serial.println("[Cluster] Member List: empty"); LOG_INFO("Cluster", "Member List: empty");
return; return;
} }
Serial.println("[Cluster] Member List:"); LOG_INFO("Cluster", "Member List:");
for (const auto& pair : memberList) { for (const auto& pair : memberList) {
const NodeInfo& node = pair.second; const NodeInfo& node = pair.second;
Serial.printf(" %s @ %s | Status: %s | last seen: %lu\n", node.hostname.c_str(), node.ip.toString().c_str(), statusToStr(node.status), millis() - node.lastSeen); LOG_INFO("Cluster", " " + node.hostname + " @ " + node.ip.toString() + " | Status: " + statusToStr(node.status) + " | last seen: " + String(millis() - node.lastSeen));
} }
} }
@@ -211,10 +264,18 @@ void ClusterManager::updateLocalNodeResources() {
auto it = memberList.find(ctx.hostname); auto it = memberList.find(ctx.hostname);
if (it != memberList.end()) { if (it != memberList.end()) {
NodeInfo& node = it->second; NodeInfo& node = it->second;
node.resources.freeHeap = ESP.getFreeHeap(); uint32_t freeHeap = ESP.getFreeHeap();
node.resources.freeHeap = freeHeap;
node.resources.chipId = ESP.getChipId(); node.resources.chipId = ESP.getChipId();
node.resources.sdkVersion = String(ESP.getSdkVersion()); node.resources.sdkVersion = String(ESP.getSdkVersion());
node.resources.cpuFreqMHz = ESP.getCpuFreqMHz(); node.resources.cpuFreqMHz = ESP.getCpuFreqMHz();
node.resources.flashChipSize = ESP.getFlashChipSize(); node.resources.flashChipSize = ESP.getFlashChipSize();
// Log memory warnings if heap is getting low
if (freeHeap < ctx.config.low_memory_threshold_bytes) {
LOG_WARN("Cluster", "Low memory warning: " + String(freeHeap) + " bytes free");
} else if (freeHeap < ctx.config.critical_memory_threshold_bytes) {
LOG_ERROR("Cluster", "Critical memory warning: " + String(freeHeap) + " bytes free");
}
} }
} }

View File

@@ -1,26 +1,27 @@
#include "spore/core/NetworkManager.h" #include "spore/core/NetworkManager.h"
#include "spore/util/Logging.h"
// SSID and password are now configured via Config class // SSID and password are now configured via Config class
void NetworkManager::scanWifi() { void NetworkManager::scanWifi() {
if (!isScanning) { if (!isScanning) {
isScanning = true; isScanning = true;
Serial.println("[WiFi] Starting WiFi scan..."); LOG_INFO("WiFi", "Starting WiFi scan...");
// Start async WiFi scan // Start async WiFi scan
WiFi.scanNetworksAsync([this](int networksFound) { WiFi.scanNetworksAsync([this](int networksFound) {
Serial.printf("[WiFi] Scan completed, found %d networks\n", networksFound); LOG_INFO("WiFi", "Scan completed, found " + String(networksFound) + " networks");
this->processAccessPoints(); this->processAccessPoints();
this->isScanning = false; this->isScanning = false;
}, true); }, true);
} else { } else {
Serial.println("[WiFi] Scan already in progress..."); LOG_WARN("WiFi", "Scan already in progress...");
} }
} }
void NetworkManager::processAccessPoints() { void NetworkManager::processAccessPoints() {
int numNetworks = WiFi.scanComplete(); int numNetworks = WiFi.scanComplete();
if (numNetworks <= 0) { if (numNetworks <= 0) {
Serial.println("[WiFi] No networks found or scan not complete"); LOG_WARN("WiFi", "No networks found or scan not complete");
return; return;
} }
@@ -43,8 +44,7 @@ void NetworkManager::processAccessPoints() {
accessPoints.push_back(ap); accessPoints.push_back(ap);
Serial.printf("[WiFi] Found network %d: %s, Ch: %d, RSSI: %d\n", LOG_DEBUG("WiFi", "Found network " + String(i + 1) + ": " + ap.ssid + ", Ch: " + String(ap.channel) + ", RSSI: " + String(ap.rssi));
i + 1, ap.ssid.c_str(), ap.channel, ap.rssi);
} }
// Free the memory used by the scan // Free the memory used by the scan
@@ -77,31 +77,26 @@ void NetworkManager::setHostnameFromMac() {
void NetworkManager::setupWiFi() { void NetworkManager::setupWiFi() {
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFi.begin(ctx.config.wifi_ssid.c_str(), ctx.config.wifi_password.c_str()); WiFi.begin(ctx.config.wifi_ssid.c_str(), ctx.config.wifi_password.c_str());
Serial.println("[WiFi] Connecting to AP..."); LOG_INFO("WiFi", "Connecting to AP...");
unsigned long startAttemptTime = millis(); unsigned long startAttemptTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < ctx.config.wifi_connect_timeout_ms) { while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < ctx.config.wifi_connect_timeout_ms) {
delay(ctx.config.wifi_retry_delay_ms); delay(ctx.config.wifi_retry_delay_ms);
Serial.print("."); // Progress dots handled by delay, no logging needed
} }
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
Serial.println(); LOG_INFO("WiFi", "Connected to AP, IP: " + WiFi.localIP().toString());
Serial.print("[WiFi] Connected to AP, IP: ");
Serial.println(WiFi.localIP());
} else { } else {
Serial.println(); LOG_WARN("WiFi", "Failed to connect to AP. Creating AP...");
Serial.println("[WiFi] Failed to connect to AP. Creating AP...");
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
WiFi.softAP(ctx.config.wifi_ssid.c_str(), ctx.config.wifi_password.c_str()); WiFi.softAP(ctx.config.wifi_ssid.c_str(), ctx.config.wifi_password.c_str());
Serial.print("[WiFi] AP created, IP: "); LOG_INFO("WiFi", "AP created, IP: " + WiFi.softAPIP().toString());
Serial.println(WiFi.softAPIP());
} }
setHostnameFromMac(); setHostnameFromMac();
ctx.udp->begin(ctx.config.udp_port); ctx.udp->begin(ctx.config.udp_port);
ctx.localIP = WiFi.localIP(); ctx.localIP = WiFi.localIP();
ctx.hostname = WiFi.hostname(); ctx.hostname = WiFi.hostname();
Serial.print("[WiFi] Hostname set to: "); LOG_INFO("WiFi", "Hostname set to: " + ctx.hostname);
Serial.println(ctx.hostname); LOG_INFO("WiFi", "UDP listening on port " + String(ctx.config.udp_port));
Serial.printf("[WiFi] UDP listening on port %d\n", ctx.config.udp_port);
// Populate self NodeInfo // Populate self NodeInfo
ctx.self.hostname = ctx.hostname; ctx.self.hostname = ctx.hostname;
@@ -112,7 +107,6 @@ void NetworkManager::setupWiFi() {
} }
ctx.self.lastSeen = millis(); ctx.self.lastSeen = millis();
ctx.self.status = NodeInfo::ACTIVE; ctx.self.status = NodeInfo::ACTIVE;
ctx.self.labels["hostname"] = ctx.hostname;
// Ensure member list has an entry for this node // Ensure member list has an entry for this node
auto &memberList = *ctx.memberList; auto &memberList = *ctx.memberList;

View File

@@ -1,4 +1,5 @@
#include "spore/core/TaskManager.h" #include "spore/core/TaskManager.h"
#include "spore/util/Logging.h"
#include <Arduino.h> #include <Arduino.h>
TaskManager::TaskManager(NodeContext& ctx) : ctx(ctx) {} TaskManager::TaskManager(NodeContext& ctx) : ctx(ctx) {}
@@ -31,9 +32,9 @@ void TaskManager::enableTask(const std::string& name) {
int idx = findTaskIndex(name); int idx = findTaskIndex(name);
if (idx >= 0) { if (idx >= 0) {
taskDefinitions[idx].enabled = true; taskDefinitions[idx].enabled = true;
Serial.printf("[TaskManager] Enabled task: %s\n", name.c_str()); LOG_INFO("TaskManager", "Enabled task: " + String(name.c_str()));
} else { } else {
Serial.printf("[TaskManager] Warning: Task not found: %s\n", name.c_str()); LOG_WARN("TaskManager", "Task not found: " + String(name.c_str()));
} }
} }
@@ -41,9 +42,9 @@ void TaskManager::disableTask(const std::string& name) {
int idx = findTaskIndex(name); int idx = findTaskIndex(name);
if (idx >= 0) { if (idx >= 0) {
taskDefinitions[idx].enabled = false; taskDefinitions[idx].enabled = false;
Serial.printf("[TaskManager] Disabled task: %s\n", name.c_str()); LOG_INFO("TaskManager", "Disabled task: " + String(name.c_str()));
} else { } else {
Serial.printf("[TaskManager] Warning: Task not found: %s\n", name.c_str()); LOG_WARN("TaskManager", "Task not found: " + String(name.c_str()));
} }
} }
@@ -51,9 +52,9 @@ void TaskManager::setTaskInterval(const std::string& name, unsigned long interva
int idx = findTaskIndex(name); int idx = findTaskIndex(name);
if (idx >= 0) { if (idx >= 0) {
taskDefinitions[idx].interval = interval; taskDefinitions[idx].interval = interval;
Serial.printf("[TaskManager] Set interval for task %s: %lu ms\n", name.c_str(), interval); LOG_INFO("TaskManager", "Set interval for task " + String(name.c_str()) + ": " + String(interval) + " ms");
} else { } else {
Serial.printf("[TaskManager] Warning: Task not found: %s\n", name.c_str()); LOG_WARN("TaskManager", "Task not found: " + String(name.c_str()));
} }
} }
@@ -84,27 +85,24 @@ void TaskManager::enableAllTasks() {
for (auto& taskDef : taskDefinitions) { for (auto& taskDef : taskDefinitions) {
taskDef.enabled = true; taskDef.enabled = true;
} }
Serial.println("[TaskManager] Enabled all tasks"); LOG_INFO("TaskManager", "Enabled all tasks");
} }
void TaskManager::disableAllTasks() { void TaskManager::disableAllTasks() {
for (auto& taskDef : taskDefinitions) { for (auto& taskDef : taskDefinitions) {
taskDef.enabled = false; taskDef.enabled = false;
} }
Serial.println("[TaskManager] Disabled all tasks"); LOG_INFO("TaskManager", "Disabled all tasks");
} }
void TaskManager::printTaskStatus() const { void TaskManager::printTaskStatus() const {
Serial.println("\n[TaskManager] Task Status:"); LOG_INFO("TaskManager", "\nTask Status:");
Serial.println("=========================="); LOG_INFO("TaskManager", "==========================");
for (const auto& taskDef : taskDefinitions) { for (const auto& taskDef : taskDefinitions) {
Serial.printf(" %s: %s (interval: %lu ms)\n", LOG_INFO("TaskManager", " " + String(taskDef.name.c_str()) + ": " + (taskDef.enabled ? "ENABLED" : "DISABLED") + " (interval: " + String(taskDef.interval) + " ms)");
taskDef.name.c_str(),
taskDef.enabled ? "ENABLED" : "DISABLED",
taskDef.interval);
} }
Serial.println("==========================\n"); LOG_INFO("TaskManager", "==========================\n");
} }
void TaskManager::execute() { void TaskManager::execute() {

View File

@@ -1,42 +1,19 @@
#include "spore/services/ClusterService.h" #include "spore/services/ClusterService.h"
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/types/ClusterResponse.h"
using spore::types::ClusterMembersResponse;
ClusterService::ClusterService(NodeContext& ctx) : ctx(ctx) {} ClusterService::ClusterService(NodeContext& ctx) : ctx(ctx) {}
void ClusterService::registerEndpoints(ApiServer& api) { void ClusterService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/cluster/members", HTTP_GET, api.addEndpoint("/api/cluster/members", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleMembersRequest(request); }, [this](AsyncWebServerRequest* request) { handleMembersRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "ClusterService");
} }
void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) { void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) {
JsonDocument doc; ClusterMembersResponse response;
JsonArray arr = doc["members"].to<JsonArray>(); response.addNodes(ctx.memberList);
request->send(200, "application/json", response.toJsonString());
for (const auto& pair : *ctx.memberList) {
const NodeInfo& node = pair.second;
JsonObject obj = arr.add<JsonObject>();
obj["hostname"] = node.hostname;
obj["ip"] = node.ip.toString();
obj["lastSeen"] = node.lastSeen;
obj["latency"] = node.latency;
obj["status"] = statusToStr(node.status);
obj["resources"]["freeHeap"] = node.resources.freeHeap;
obj["resources"]["chipId"] = node.resources.chipId;
obj["resources"]["sdkVersion"] = node.resources.sdkVersion;
obj["resources"]["cpuFreqMHz"] = node.resources.cpuFreqMHz;
obj["resources"]["flashChipSize"] = node.resources.flashChipSize;
// Add labels if present
if (!node.labels.empty()) {
JsonObject labelsObj = obj["labels"].to<JsonObject>();
for (const auto& kv : node.labels) {
labelsObj[kv.first.c_str()] = kv.second;
}
}
}
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
} }

View File

@@ -0,0 +1,115 @@
#include "spore/services/MonitoringService.h"
#include "spore/core/ApiServer.h"
#include "spore/util/Logging.h"
#include <Arduino.h>
#include <FS.h>
#include <LittleFS.h>
MonitoringService::MonitoringService(CpuUsage& cpuUsage)
: cpuUsage(cpuUsage) {
}
void MonitoringService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/monitoring/resources", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleResourcesRequest(request); },
std::vector<ParamSpec>{}, "MonitoringService");
}
MonitoringService::SystemResources MonitoringService::getSystemResources() const {
SystemResources resources;
// CPU information
resources.currentCpuUsage = cpuUsage.getCpuUsage();
resources.averageCpuUsage = cpuUsage.getAverageCpuUsage();
resources.maxCpuUsage = cpuUsage.getMaxCpuUsage();
resources.minCpuUsage = cpuUsage.getMinCpuUsage();
resources.measurementCount = cpuUsage.getMeasurementCount();
resources.isMeasuring = cpuUsage.isMeasuring();
// Memory information - ESP8266 compatible
resources.freeHeap = ESP.getFreeHeap();
resources.totalHeap = 81920; // ESP8266 has ~80KB RAM
resources.minFreeHeap = 0; // Not available on ESP8266
resources.maxAllocHeap = 0; // Not available on ESP8266
resources.heapFragmentation = calculateHeapFragmentation();
// Filesystem information
getFilesystemInfo(resources.totalBytes, resources.usedBytes);
resources.freeBytes = resources.totalBytes - resources.usedBytes;
resources.usagePercent = resources.totalBytes > 0 ?
(float)resources.usedBytes / (float)resources.totalBytes * 100.0f : 0.0f;
// System uptime
resources.uptimeMs = millis();
resources.uptimeSeconds = resources.uptimeMs / 1000;
return resources;
}
void MonitoringService::handleResourcesRequest(AsyncWebServerRequest* request) {
SystemResources resources = getSystemResources();
JsonDocument doc;
// CPU section
JsonObject cpu = doc["cpu"].to<JsonObject>();
cpu["current_usage"] = resources.currentCpuUsage;
cpu["average_usage"] = resources.averageCpuUsage;
cpu["max_usage"] = resources.maxCpuUsage;
cpu["min_usage"] = resources.minCpuUsage;
cpu["measurement_count"] = resources.measurementCount;
cpu["is_measuring"] = resources.isMeasuring;
// Memory section
JsonObject memory = doc["memory"].to<JsonObject>();
memory["free_heap"] = resources.freeHeap;
memory["total_heap"] = resources.totalHeap;
memory["min_free_heap"] = resources.minFreeHeap;
memory["max_alloc_heap"] = resources.maxAllocHeap;
memory["heap_fragmentation"] = resources.heapFragmentation;
memory["heap_usage_percent"] = resources.totalHeap > 0 ?
(float)(resources.totalHeap - resources.freeHeap) / (float)resources.totalHeap * 100.0f : 0.0f;
// Filesystem section
JsonObject filesystem = doc["filesystem"].to<JsonObject>();
filesystem["total_bytes"] = resources.totalBytes;
filesystem["used_bytes"] = resources.usedBytes;
filesystem["free_bytes"] = resources.freeBytes;
filesystem["usage_percent"] = resources.usagePercent;
// System section
JsonObject system = doc["system"].to<JsonObject>();
system["uptime_ms"] = resources.uptimeMs;
system["uptime_seconds"] = resources.uptimeSeconds;
system["uptime_formatted"] = String(resources.uptimeSeconds / 3600) + "h " +
String((resources.uptimeSeconds % 3600) / 60) + "m " +
String(resources.uptimeSeconds % 60) + "s";
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
}
size_t MonitoringService::calculateHeapFragmentation() const {
size_t freeHeap = ESP.getFreeHeap();
size_t maxAllocHeap = 0; // Not available on ESP8266
if (maxAllocHeap == 0) return 0;
// Calculate fragmentation as percentage of free heap that can't be allocated in one block
return (freeHeap - maxAllocHeap) * 100 / freeHeap;
}
void MonitoringService::getFilesystemInfo(size_t& totalBytes, size_t& usedBytes) const {
totalBytes = 0;
usedBytes = 0;
if (LittleFS.begin()) {
FSInfo fsInfo;
if (LittleFS.info(fsInfo)) {
totalBytes = fsInfo.totalBytes;
usedBytes = fsInfo.usedBytes;
}
LittleFS.end();
}
}

View File

@@ -8,16 +8,16 @@ void NetworkService::registerEndpoints(ApiServer& api) {
// WiFi scanning endpoints // WiFi scanning endpoints
api.addEndpoint("/api/network/wifi/scan", HTTP_POST, api.addEndpoint("/api/network/wifi/scan", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleWifiScanRequest(request); }, [this](AsyncWebServerRequest* request) { handleWifiScanRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NetworkService");
api.addEndpoint("/api/network/wifi/scan", HTTP_GET, api.addEndpoint("/api/network/wifi/scan", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleGetWifiNetworks(request); }, [this](AsyncWebServerRequest* request) { handleGetWifiNetworks(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NetworkService");
// Network status and configuration endpoints // Network status and configuration endpoints
api.addEndpoint("/api/network/status", HTTP_GET, api.addEndpoint("/api/network/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleNetworkStatus(request); }, [this](AsyncWebServerRequest* request) { handleNetworkStatus(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NetworkService");
api.addEndpoint("/api/network/wifi/config", HTTP_POST, api.addEndpoint("/api/network/wifi/config", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleSetWifiConfig(request); }, [this](AsyncWebServerRequest* request) { handleSetWifiConfig(request); },
@@ -26,7 +26,7 @@ void NetworkService::registerEndpoints(ApiServer& api) {
ParamSpec{String("password"), true, String("body"), String("string"), {}, String("")}, ParamSpec{String("password"), true, String("body"), String("string"), {}, String("")},
ParamSpec{String("connect_timeout_ms"), false, String("body"), String("number"), {}, String("10000")}, ParamSpec{String("connect_timeout_ms"), false, String("body"), String("number"), {}, String("10000")},
ParamSpec{String("retry_delay_ms"), false, String("body"), String("number"), {}, String("500")} ParamSpec{String("retry_delay_ms"), false, String("body"), String("number"), {}, String("500")}
}); }, "NetworkService");
} }
void NetworkService::handleWifiScanRequest(AsyncWebServerRequest* request) { void NetworkService::handleWifiScanRequest(AsyncWebServerRequest* request) {

View File

@@ -1,5 +1,11 @@
#include "spore/services/NodeService.h" #include "spore/services/NodeService.h"
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/util/Logging.h"
#include "spore/types/NodeResponse.h"
using spore::types::NodeStatusResponse;
using spore::types::NodeOperationResponse;
using spore::types::NodeEndpointsResponse;
NodeService::NodeService(NodeContext& ctx, ApiServer& apiServer) : ctx(ctx), apiServer(apiServer) {} NodeService::NodeService(NodeContext& ctx, ApiServer& apiServer) : ctx(ctx), apiServer(apiServer) {}
@@ -7,7 +13,7 @@ void NodeService::registerEndpoints(ApiServer& api) {
// Status endpoint // Status endpoint
api.addEndpoint("/api/node/status", HTTP_GET, api.addEndpoint("/api/node/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); }, [this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NodeService");
// Update endpoint with file upload // Update endpoint with file upload
api.addEndpoint("/api/node/update", HTTP_POST, api.addEndpoint("/api/node/update", HTTP_POST,
@@ -17,56 +23,47 @@ void NodeService::registerEndpoints(ApiServer& api) {
}, },
std::vector<ParamSpec>{ std::vector<ParamSpec>{
ParamSpec{String("firmware"), true, String("body"), String("file"), {}, String("")} ParamSpec{String("firmware"), true, String("body"), String("file"), {}, String("")}
}); }, "NodeService");
// Restart endpoint // Restart endpoint
api.addEndpoint("/api/node/restart", HTTP_POST, api.addEndpoint("/api/node/restart", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleRestartRequest(request); }, [this](AsyncWebServerRequest* request) { handleRestartRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NodeService");
// Endpoints endpoint // Endpoints endpoint
api.addEndpoint("/api/node/endpoints", HTTP_GET, api.addEndpoint("/api/node/endpoints", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleEndpointsRequest(request); }, [this](AsyncWebServerRequest* request) { handleEndpointsRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "NodeService");
} }
void NodeService::handleStatusRequest(AsyncWebServerRequest* request) { void NodeService::handleStatusRequest(AsyncWebServerRequest* request) {
JsonDocument doc; NodeStatusResponse response;
doc["freeHeap"] = ESP.getFreeHeap();
doc["chipId"] = ESP.getChipId(); // Get labels from member list or self
doc["sdkVersion"] = ESP.getSdkVersion(); std::map<String, String> labels;
doc["cpuFreqMHz"] = ESP.getCpuFreqMHz();
doc["flashChipSize"] = ESP.getFlashChipSize();
// Include local node labels if present
if (ctx.memberList) { if (ctx.memberList) {
auto it = ctx.memberList->find(ctx.hostname); auto it = ctx.memberList->find(ctx.hostname);
if (it != ctx.memberList->end()) { if (it != ctx.memberList->end()) {
JsonObject labelsObj = doc["labels"].to<JsonObject>(); labels = it->second.labels;
for (const auto& kv : it->second.labels) {
labelsObj[kv.first.c_str()] = kv.second;
}
} else if (!ctx.self.labels.empty()) { } else if (!ctx.self.labels.empty()) {
JsonObject labelsObj = doc["labels"].to<JsonObject>(); labels = ctx.self.labels;
for (const auto& kv : ctx.self.labels) {
labelsObj[kv.first.c_str()] = kv.second;
}
} }
} }
String json; response.buildCompleteResponse(labels);
serializeJson(doc, json); request->send(200, "application/json", response.toJsonString());
request->send(200, "application/json", json);
} }
void NodeService::handleUpdateRequest(AsyncWebServerRequest* request) { void NodeService::handleUpdateRequest(AsyncWebServerRequest* request) {
bool success = !Update.hasError(); bool success = !Update.hasError();
AsyncWebServerResponse* response = request->beginResponse(200, "application/json", NodeOperationResponse response;
success ? "{\"status\": \"OK\"}" : "{\"status\": \"FAIL\"}"); response.setSuccess(success ? "OK" : "FAIL");
response->addHeader("Connection", "close");
request->send(response); AsyncWebServerResponse* httpResponse = request->beginResponse(200, "application/json", response.toJsonString());
request->onDisconnect([]() { httpResponse->addHeader("Connection", "close");
Serial.println("[API] Restart device"); request->send(httpResponse);
request->onDisconnect([this]() {
LOG_INFO("API", "Restart device");
delay(10); delay(10);
ESP.restart(); ESP.restart();
}); });
@@ -75,11 +72,10 @@ void NodeService::handleUpdateRequest(AsyncWebServerRequest* request) {
void NodeService::handleUpdateUpload(AsyncWebServerRequest* request, const String& filename, void NodeService::handleUpdateUpload(AsyncWebServerRequest* request, const String& filename,
size_t index, uint8_t* data, size_t len, bool final) { size_t index, uint8_t* data, size_t len, bool final) {
if (!index) { if (!index) {
Serial.print("[OTA] Update Start "); LOG_INFO("OTA", "Update Start " + String(filename));
Serial.println(filename);
Update.runAsync(true); Update.runAsync(true);
if(!Update.begin(request->contentLength(), U_FLASH)) { if(!Update.begin(request->contentLength(), U_FLASH)) {
Serial.println("[OTA] Update failed: not enough space"); LOG_ERROR("OTA", "Update failed: not enough space");
Update.printError(Serial); Update.printError(Serial);
AsyncWebServerResponse* response = request->beginResponse(500, "application/json", AsyncWebServerResponse* response = request->beginResponse(500, "application/json",
"{\"status\": \"FAIL\"}"); "{\"status\": \"FAIL\"}");
@@ -96,62 +92,33 @@ void NodeService::handleUpdateUpload(AsyncWebServerRequest* request, const Strin
if (final) { if (final) {
if (Update.end(true)) { if (Update.end(true)) {
if(Update.isFinished()) { if(Update.isFinished()) {
Serial.print("[OTA] Update Success with "); LOG_INFO("OTA", "Update Success with " + String(index + len) + "B");
Serial.print(index + len);
Serial.println("B");
} else { } else {
Serial.println("[OTA] Update not finished"); LOG_WARN("OTA", "Update not finished");
} }
} else { } else {
Serial.print("[OTA] Update failed: "); LOG_ERROR("OTA", "Update failed: " + String(Update.getError()));
Update.printError(Serial); Update.printError(Serial);
} }
} }
} }
void NodeService::handleRestartRequest(AsyncWebServerRequest* request) { void NodeService::handleRestartRequest(AsyncWebServerRequest* request) {
AsyncWebServerResponse* response = request->beginResponse(200, "application/json", NodeOperationResponse response;
"{\"status\": \"restarting\"}"); response.setSuccess("restarting");
response->addHeader("Connection", "close");
request->send(response); AsyncWebServerResponse* httpResponse = request->beginResponse(200, "application/json", response.toJsonString());
request->onDisconnect([]() { httpResponse->addHeader("Connection", "close");
Serial.println("[API] Restart device"); request->send(httpResponse);
request->onDisconnect([this]() {
LOG_INFO("API", "Restart device");
delay(10); delay(10);
ESP.restart(); ESP.restart();
}); });
} }
void NodeService::handleEndpointsRequest(AsyncWebServerRequest* request) { void NodeService::handleEndpointsRequest(AsyncWebServerRequest* request) {
JsonDocument doc; NodeEndpointsResponse response;
JsonArray endpointsArr = doc["endpoints"].to<JsonArray>(); response.addEndpoints(apiServer.getEndpoints());
request->send(200, "application/json", response.toJsonString());
// Add all registered endpoints from ApiServer
for (const auto& endpoint : apiServer.getEndpoints()) {
JsonObject obj = endpointsArr.add<JsonObject>();
obj["uri"] = endpoint.uri;
obj["method"] = ApiServer::methodToStr(endpoint.method);
if (!endpoint.params.empty()) {
JsonArray paramsArr = obj["params"].to<JsonArray>();
for (const auto& ps : endpoint.params) {
JsonObject p = paramsArr.add<JsonObject>();
p["name"] = ps.name;
p["location"] = ps.location;
p["required"] = ps.required;
p["type"] = ps.type;
if (!ps.values.empty()) {
JsonArray allowed = p["values"].to<JsonArray>();
for (const auto& v : ps.values) {
allowed.add(v);
}
}
if (ps.defaultValue.length() > 0) {
p["default"] = ps.defaultValue;
}
}
}
}
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
} }

View File

@@ -0,0 +1,22 @@
#include "spore/services/StaticFileService.h"
#include "spore/util/Logging.h"
#include <Arduino.h>
const String StaticFileService::name = "StaticFileService";
StaticFileService::StaticFileService(NodeContext& ctx, ApiServer& apiServer)
: ctx(ctx), apiServer(apiServer) {
}
void StaticFileService::registerEndpoints(ApiServer& api) {
// Initialize LittleFS
if (!LittleFS.begin()) {
LOG_ERROR("StaticFileService", "LittleFS Mount Failed");
return;
}
LOG_INFO("StaticFileService", "LittleFS mounted successfully");
// Use the built-in static file serving from ESPAsyncWebServer
api.serveStatic("/", LittleFS, "/public", "max-age=3600");
}

View File

@@ -1,13 +1,17 @@
#include "spore/services/TaskService.h" #include "spore/services/TaskService.h"
#include "spore/core/ApiServer.h" #include "spore/core/ApiServer.h"
#include "spore/types/TaskResponse.h"
#include <algorithm> #include <algorithm>
using spore::types::TaskStatusResponse;
using spore::types::TaskControlResponse;
TaskService::TaskService(TaskManager& taskManager) : taskManager(taskManager) {} TaskService::TaskService(TaskManager& taskManager) : taskManager(taskManager) {}
void TaskService::registerEndpoints(ApiServer& api) { void TaskService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/tasks/status", HTTP_GET, api.addEndpoint("/api/tasks/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); }, [this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{}); std::vector<ParamSpec>{}, "TaskService");
api.addEndpoint("/api/tasks/control", HTTP_POST, api.addEndpoint("/api/tasks/control", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleControlRequest(request); }, [this](AsyncWebServerRequest* request) { handleControlRequest(request); },
@@ -28,36 +32,19 @@ void TaskService::registerEndpoints(ApiServer& api) {
{String("enable"), String("disable"), String("start"), String("stop"), String("status")}, {String("enable"), String("disable"), String("start"), String("stop"), String("status")},
String("") String("")
} }
}); }, "TaskService");
} }
void TaskService::handleStatusRequest(AsyncWebServerRequest* request) { void TaskService::handleStatusRequest(AsyncWebServerRequest* request) {
TaskStatusResponse response;
// Get task statuses using a separate document to avoid reference issues
JsonDocument scratch; JsonDocument scratch;
auto taskStatuses = taskManager.getAllTaskStatuses(scratch); auto taskStatuses = taskManager.getAllTaskStatuses(scratch);
JsonDocument doc; // Build the complete response with the task data
JsonObject summaryObj = doc["summary"].to<JsonObject>(); response.buildCompleteResponse(taskStatuses);
summaryObj["totalTasks"] = taskStatuses.size(); request->send(200, "application/json", response.toJsonString());
summaryObj["activeTasks"] = std::count_if(taskStatuses.begin(), taskStatuses.end(),
[](const auto& pair) { return pair.second["enabled"]; });
JsonArray tasksArr = doc["tasks"].to<JsonArray>();
for (const auto& taskPair : taskStatuses) {
JsonObject taskObj = tasksArr.add<JsonObject>();
taskObj["name"] = taskPair.first;
taskObj["interval"] = taskPair.second["interval"];
taskObj["enabled"] = taskPair.second["enabled"];
taskObj["running"] = taskPair.second["running"];
taskObj["autoStart"] = taskPair.second["autoStart"];
}
JsonObject systemObj = doc["system"].to<JsonObject>();
systemObj["freeHeap"] = ESP.getFreeHeap();
systemObj["uptime"] = millis();
String json;
serializeJson(doc, json);
request->send(200, "application/json", json);
} }
void TaskService::handleControlRequest(AsyncWebServerRequest* request) { void TaskService::handleControlRequest(AsyncWebServerRequest* request) {
@@ -88,50 +75,27 @@ void TaskService::handleControlRequest(AsyncWebServerRequest* request) {
success = true; success = true;
message = "Task status retrieved"; message = "Task status retrieved";
JsonDocument statusDoc; TaskControlResponse response;
statusDoc["success"] = success; response.setResponse(success, message, taskName, action);
statusDoc["message"] = message; response.addTaskDetails(taskName,
statusDoc["task"] = taskName; taskManager.isTaskEnabled(taskName.c_str()),
statusDoc["action"] = action; taskManager.isTaskRunning(taskName.c_str()),
taskManager.getTaskInterval(taskName.c_str()));
statusDoc["taskDetails"] = JsonObject(); request->send(200, "application/json", response.toJsonString());
JsonObject taskDetails = statusDoc["taskDetails"];
taskDetails["name"] = taskName;
taskDetails["enabled"] = taskManager.isTaskEnabled(taskName.c_str());
taskDetails["running"] = taskManager.isTaskRunning(taskName.c_str());
taskDetails["interval"] = taskManager.getTaskInterval(taskName.c_str());
taskDetails["system"] = JsonObject();
JsonObject systemInfo = taskDetails["system"];
systemInfo["freeHeap"] = ESP.getFreeHeap();
systemInfo["uptime"] = millis();
String statusJson;
serializeJson(statusDoc, statusJson);
request->send(200, "application/json", statusJson);
return; return;
} else { } else {
success = false; success = false;
message = "Invalid action. Use: enable, disable, start, stop, or status"; message = "Invalid action. Use: enable, disable, start, stop, or status";
} }
JsonDocument doc; TaskControlResponse response;
doc["success"] = success; response.setResponse(success, message, taskName, action);
doc["message"] = message; request->send(success ? 200 : 400, "application/json", response.toJsonString());
doc["task"] = taskName;
doc["action"] = action;
String json;
serializeJson(doc, json);
request->send(success ? 200 : 400, "application/json", json);
} else { } else {
JsonDocument doc; TaskControlResponse response;
doc["success"] = false; response.setError("Missing parameters. Required: task, action",
doc["message"] = "Missing parameters. Required: task, action"; "{\"task\": \"discovery_send\", \"action\": \"status\"}");
doc["example"] = "{\"task\": \"discovery_send\", \"action\": \"status\"}"; request->send(400, "application/json", response.toJsonString());
String json;
serializeJson(doc, json);
request->send(400, "application/json", json);
} }
} }

View File

@@ -28,4 +28,9 @@ Config::Config() {
// System Configuration // System Configuration
restart_delay_ms = 10; restart_delay_ms = 10;
json_doc_size = 1024; json_doc_size = 1024;
// Memory Management
low_memory_threshold_bytes = 10000; // 10KB
critical_memory_threshold_bytes = 5000; // 5KB
max_concurrent_http_requests = 3;
} }

185
src/spore/util/CpuUsage.cpp Normal file
View File

@@ -0,0 +1,185 @@
#include "spore/util/CpuUsage.h"
CpuUsage::CpuUsage()
: _initialized(false)
, _measuring(false)
, _measurementCount(0)
, _cycleStartTime(0)
, _idleStartTime(0)
, _totalIdleTime(0)
, _totalCycleTime(0)
, _currentCpuUsage(0.0f)
, _averageCpuUsage(0.0f)
, _maxCpuUsage(0.0f)
, _minCpuUsage(100.0f)
, _totalCpuTime(0)
, _rollingIndex(0)
, _rollingWindowFull(false) {
// Initialize rolling window
for (size_t i = 0; i < ROLLING_WINDOW_SIZE; ++i) {
_rollingWindow[i] = 0.0f;
}
}
void CpuUsage::begin() {
if (_initialized) {
return;
}
_initialized = true;
_measurementCount = 0;
_totalIdleTime = 0;
_totalCycleTime = 0;
_totalCpuTime = 0;
_currentCpuUsage = 0.0f;
_averageCpuUsage = 0.0f;
_maxCpuUsage = 0.0f;
_minCpuUsage = 100.0f;
_rollingIndex = 0;
_rollingWindowFull = false;
// Initialize rolling window
for (size_t i = 0; i < ROLLING_WINDOW_SIZE; ++i) {
_rollingWindow[i] = 0.0f;
}
}
void CpuUsage::startMeasurement() {
if (!_initialized) {
return;
}
if (_measuring) {
// If already measuring, end the previous measurement first
endMeasurement();
}
_measuring = true;
_cycleStartTime = millis();
_idleStartTime = millis();
}
void CpuUsage::endMeasurement() {
if (!_initialized || !_measuring) {
return;
}
unsigned long cycleEndTime = millis();
unsigned long cycleDuration = cycleEndTime - _cycleStartTime;
// Calculate idle time (time spent in yield() calls)
unsigned long idleTime = cycleEndTime - _idleStartTime;
// Calculate CPU usage
if (cycleDuration > 0) {
_currentCpuUsage = ((float)(cycleDuration - idleTime) / (float)cycleDuration) * 100.0f;
// Clamp to valid range
if (_currentCpuUsage < 0.0f) {
_currentCpuUsage = 0.0f;
} else if (_currentCpuUsage > 100.0f) {
_currentCpuUsage = 100.0f;
}
// Update statistics
_totalCycleTime += cycleDuration;
_totalIdleTime += idleTime;
_totalCpuTime += (cycleDuration - idleTime);
_measurementCount++;
// Update rolling average
updateRollingAverage(_currentCpuUsage);
// Update min/max
updateMinMax(_currentCpuUsage);
// Calculate overall average
if (_measurementCount > 0) {
_averageCpuUsage = ((float)_totalCpuTime / (float)_totalCycleTime) * 100.0f;
}
}
_measuring = false;
}
float CpuUsage::getCpuUsage() const {
return _currentCpuUsage;
}
float CpuUsage::getAverageCpuUsage() const {
if (_rollingWindowFull) {
return _averageCpuUsage;
} else if (_measurementCount > 0) {
// Calculate average from rolling window
float sum = 0.0f;
for (size_t i = 0; i < _rollingIndex; ++i) {
sum += _rollingWindow[i];
}
return sum / (float)_rollingIndex;
}
return 0.0f;
}
float CpuUsage::getMaxCpuUsage() const {
return _maxCpuUsage;
}
float CpuUsage::getMinCpuUsage() const {
return _minCpuUsage;
}
void CpuUsage::reset() {
_measurementCount = 0;
_totalIdleTime = 0;
_totalCycleTime = 0;
_totalCpuTime = 0;
_currentCpuUsage = 0.0f;
_averageCpuUsage = 0.0f;
_maxCpuUsage = 0.0f;
_minCpuUsage = 100.0f;
_rollingIndex = 0;
_rollingWindowFull = false;
// Reset rolling window
for (size_t i = 0; i < ROLLING_WINDOW_SIZE; ++i) {
_rollingWindow[i] = 0.0f;
}
}
bool CpuUsage::isMeasuring() const {
return _measuring;
}
unsigned long CpuUsage::getMeasurementCount() const {
return _measurementCount;
}
void CpuUsage::updateRollingAverage(float value) {
_rollingWindow[_rollingIndex] = value;
_rollingIndex++;
if (_rollingIndex >= ROLLING_WINDOW_SIZE) {
_rollingIndex = 0;
_rollingWindowFull = true;
}
// Calculate rolling average
float sum = 0.0f;
size_t count = _rollingWindowFull ? ROLLING_WINDOW_SIZE : _rollingIndex;
for (size_t i = 0; i < count; ++i) {
sum += _rollingWindow[i];
}
_averageCpuUsage = sum / (float)count;
}
void CpuUsage::updateMinMax(float value) {
if (value > _maxCpuUsage) {
_maxCpuUsage = value;
}
if (value < _minCpuUsage) {
_minCpuUsage = value;
}
}

View File

@@ -0,0 +1,47 @@
#include "spore/util/Logging.h"
// Global log level - defaults to INFO
LogLevel g_logLevel = LogLevel::INFO;
void logMessage(LogLevel level, const String& component, const String& message) {
// Skip if below current log level
if (level < g_logLevel) {
return;
}
// Format: [timestamp] [level] [component] message
String timestamp = String(millis());
String levelStr;
switch (level) {
case LogLevel::DEBUG: levelStr = "DEBUG"; break;
case LogLevel::INFO: levelStr = "INFO"; break;
case LogLevel::WARN: levelStr = "WARN"; break;
case LogLevel::ERROR: levelStr = "ERROR"; break;
default: levelStr = "UNKNOWN"; break;
}
String formatted = "[" + timestamp + "] [" + levelStr + "] [" + component + "] " + message;
Serial.println(formatted);
}
void logDebug(const String& component, const String& message) {
logMessage(LogLevel::DEBUG, component, message);
}
void logInfo(const String& component, const String& message) {
logMessage(LogLevel::INFO, component, message);
}
void logWarn(const String& component, const String& message) {
logMessage(LogLevel::WARN, component, message);
}
void logError(const String& component, const String& message) {
logMessage(LogLevel::ERROR, component, message);
}
void setLogLevel(LogLevel level) {
g_logLevel = level;
logInfo("Logging", "Log level set to " + String((int)level));
}