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}
}
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 update {
echo "Updating node at $1 with $2... "

View File

@@ -73,6 +73,37 @@ lib_deps =
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
### Basic Build Commands

View File

@@ -52,6 +52,7 @@ Complete development and deployment guide.
**Includes:**
- PlatformIO configuration
- Filesystem, linker scripts, and flash layout mapping
- Build and flash instructions
- OTA update procedures
- Cluster management commands
@@ -59,6 +60,9 @@ Complete development and deployment guide.
- Troubleshooting guide
- Best practices
### 📖 [StaticFileService.md](./StaticFileService.md)
Static file hosting over HTTP using LittleFS.
## Quick Links
- **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,90 +1,38 @@
/**
* 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 "NeoPattern.h"
#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
};
// Patern 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;
// 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))
// Constructor - calls base-class constructor to initialize strip
NeoPattern::NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)(int))
: Adafruit_NeoPixel(pixels, pin, type)
{
{
frameBuffer = (uint8_t *)malloc(768);
OnComplete = callback;
TotalSteps = numPixels();
begin();
}
}
NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type)
NeoPattern::NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type)
: Adafruit_NeoPixel(pixels, pin, type)
{
{
frameBuffer = (uint8_t *)malloc(768);
TotalSteps = numPixels();
begin();
}
}
void handleStream(uint8_t *data, size_t len)
{
NeoPattern::~NeoPattern() {
if (frameBuffer) {
free(frameBuffer);
}
}
void NeoPattern::handleStream(uint8_t *data, size_t len)
{
//const uint16_t *data16 = (uint16_t *)data;
bufferSize = len;
memcpy(frameBuffer, data, len);
}
}
void drawFrameBuffer(int w, uint8_t *frame, int length)
{
void NeoPattern::drawFrameBuffer(int w, uint8_t *frame, int length)
{
for (int i = 0; i < length; i++)
{
uint8_t r = frame[i];
@@ -92,10 +40,10 @@ class NeoPattern : public Adafruit_NeoPixel
uint8_t b = frame[i + 2];
setPixelColor(i, r, g, b);
}
}
}
void onCompleteDefault(int pixels)
{
void NeoPattern::onCompleteDefault(int pixels)
{
//Serial.println("onCompleteDefault");
// FIXME no specific code
if (ActivePattern == THEATER_CHASE)
@@ -104,52 +52,11 @@ class NeoPattern : public Adafruit_NeoPixel
}
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()
{
// Increment the Index and reset at the end
void NeoPattern::Increment()
{
completed = 0;
if (Direction == FORWARD)
{
@@ -185,11 +92,11 @@ class NeoPattern : public Adafruit_NeoPixel
}
}
}
}
}
// Reverse pattern direction
void Reverse()
{
// Reverse pattern direction
void NeoPattern::Reverse()
{
if (Direction == FORWARD)
{
Direction = REVERSE;
@@ -200,32 +107,32 @@ class NeoPattern : public Adafruit_NeoPixel
Direction = FORWARD;
Index = 0;
}
}
}
// Initialize for a RainbowCycle
void RainbowCycle(uint8_t interval, direction dir = FORWARD)
{
// Initialize for a RainbowCycle
void NeoPattern::RainbowCycle(uint8_t interval, direction dir)
{
ActivePattern = RAINBOW_CYCLE;
Interval = interval;
TotalSteps = 255;
Index = 0;
Direction = dir;
}
}
// Update the Rainbow Cycle Pattern
void RainbowCycleUpdate()
{
// Update the Rainbow Cycle Pattern
void NeoPattern::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)
{
// 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();
@@ -233,11 +140,11 @@ class NeoPattern : public Adafruit_NeoPixel
Color2 = color2;
Index = 0;
Direction = dir;
}
}
// Update the Theater Chase Pattern
void TheaterChaseUpdate()
{
// Update the Theater Chase Pattern
void NeoPattern::TheaterChaseUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
if ((i + Index) % 3 == 0)
@@ -251,40 +158,40 @@ class NeoPattern : public Adafruit_NeoPixel
}
show();
Increment();
}
}
// Initialize for a ColorWipe
void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD)
{
// 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 ColorWipeUpdate()
{
// Update the Color Wipe Pattern
void NeoPattern::ColorWipeUpdate()
{
setPixelColor(Index, Color1);
show();
Increment();
}
}
// Initialize for a SCANNNER
void Scanner(uint32_t color1, uint8_t interval)
{
// 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 ScannerUpdate()
{
// Update the Scanner Pattern
void NeoPattern::ScannerUpdate()
{
for (int i = 0; i < numPixels(); i++)
{
if (i == Index) // Scan Pixel to the right
@@ -302,11 +209,11 @@ class NeoPattern : public Adafruit_NeoPixel
}
show();
Increment();
}
}
// Initialize for a Fade
void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD)
{
// 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;
@@ -314,11 +221,11 @@ class NeoPattern : public Adafruit_NeoPixel
Color2 = color2;
Index = 0;
Direction = dir;
}
}
// Update the Fade Pattern
void FadeUpdate()
{
// 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;
@@ -328,48 +235,48 @@ class NeoPattern : public Adafruit_NeoPixel
ColorSet(Color(red, green, blue));
show();
Increment();
}
}
// Calculate 50% dimmed version of a color (used by ScannerUpdate)
uint32_t DimColor(uint32_t color)
{
// 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 ColorSet(uint32_t color)
{
// 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 Red(uint32_t color)
{
// 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 Green(uint32_t color)
{
// 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 Blue(uint32_t color)
{
// 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 Wheel(uint8_t WheelPos)
{
// 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)
@@ -386,12 +293,13 @@ class NeoPattern : public Adafruit_NeoPixel
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)
{
void NeoPattern::Fire(int Cooling, int Sparking)
{
uint8_t heat[numPixels()];
int cooldown;
@@ -431,10 +339,10 @@ class NeoPattern : public Adafruit_NeoPixel
}
showStrip();
}
}
void setPixelHeatColor(int Pixel, uint8_t temperature)
{
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);
@@ -455,16 +363,14 @@ class NeoPattern : public Adafruit_NeoPixel
{ // coolest
setPixel(Pixel, heatramp, 0, 0);
}
}
}
void setPixel(int Pixel, uint8_t red, uint8_t green, uint8_t blue)
{
void NeoPattern::setPixel(int Pixel, uint8_t red, uint8_t green, uint8_t blue)
{
setPixelColor(Pixel, Color(red, green, blue));
}
void showStrip()
{
show();
}
};
}
#endif
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 "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),
pixels(numPixels, pin, type),
updateIntervalMs(100),
brightness(48) {
pixels.setBrightness(brightness);
pixels.show();
config(config),
activePattern(NeoPatternType::RAINBOW_CYCLE),
direction(NeoDirection::FORWARD),
updateIntervalMs(config.updateInterval),
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();
setPatternByName("rainbow_cycle");
initialized = true;
LOG_INFO("NeoPattern", "Service initialized");
}
NeoPatternService::~NeoPatternService() {
if (neoPattern) {
delete neoPattern;
}
}
void NeoPatternService::registerEndpoints(ApiServer& api) {
// Status endpoint
api.addEndpoint("/api/neopattern/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{});
// Patterns list endpoint
api.addEndpoint("/api/neopattern/patterns", HTTP_GET,
[this](AsyncWebServerRequest* request) { handlePatternsRequest(request); },
std::vector<ParamSpec>{});
// Control endpoint
api.addEndpoint("/api/neopattern", 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")}}
ParamSpec{String("brightness"), false, String("body"), String("numberRange"), {}, String("80")},
ParamSpec{String("total_steps"), false, String("body"), String("numberRange"), {}, String("16")},
ParamSpec{String("direction"), false, String("body"), String("string"), {String("forward"), String("reverse")}},
ParamSpec{String("interval"), false, String("body"), String("number"), {}, String("100")}
});
// 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) {
JsonDocument doc;
doc["pin"] = pixels.getPin();
doc["count"] = pixels.numPixels();
doc["interval_ms"] = updateIntervalMs;
doc["brightness"] = brightness;
doc["pin"] = config.pin;
doc["length"] = config.length;
doc["brightness"] = currentState.brightness;
doc["pattern"] = currentPatternName();
doc["total_steps"] = pixels.TotalSteps;
doc["color1"] = pixels.Color1;
doc["color2"] = pixels.Color2;
doc["color"] = String(currentState.color, HEX);
doc["color2"] = String(currentState.color2, HEX);
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;
serializeJson(doc, json);
@@ -60,7 +100,17 @@ void NeoPatternService::handleStatusRequest(AsyncWebServerRequest* request) {
void NeoPatternService::handlePatternsRequest(AsyncWebServerRequest* request) {
JsonDocument doc;
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;
serializeJson(doc, json);
@@ -68,120 +118,334 @@ void NeoPatternService::handlePatternsRequest(AsyncWebServerRequest* request) {
}
void NeoPatternService::handleControlRequest(AsyncWebServerRequest* request) {
bool updated = false;
if (request->hasParam("pattern", true)) {
String name = request->getParam("pattern", true)->value();
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)) {
unsigned long v = request->getParam("interval_ms", true)->value().toInt();
if (v < 1) v = 1;
updateIntervalMs = v;
taskManager.setTaskInterval("neopattern_update", updateIntervalMs);
if (request->hasParam("color", true)) {
String colorStr = request->getParam("color", true)->value();
uint32_t color = parseColor(colorStr);
setColor(color);
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)) {
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)) {
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 (b < 0) b = 0;
if (b > 255) b = 255;
setBrightness(static_cast<uint8_t>(b));
updated = 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)) {
String dir = request->getParam("direction", true)->value();
if (dir.equalsIgnoreCase("forward")) pixels.Direction = FORWARD;
else if (dir.equalsIgnoreCase("reverse")) pixels.Direction = REVERSE;
String dirStr = request->getParam("direction", true)->value();
NeoDirection dir = (dirStr.equalsIgnoreCase("reverse")) ? NeoDirection::REVERSE : NeoDirection::FORWARD;
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;
resp["ok"] = true;
resp["pattern"] = currentPatternName();
resp["interval_ms"] = updateIntervalMs;
resp["brightness"] = brightness;
resp["color"] = String(currentState.color, HEX);
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;
serializeJson(resp, json);
request->send(200, "application/json", json);
}
void NeoPatternService::setBrightness(uint8_t b) {
brightness = b;
pixels.setBrightness(brightness);
pixels.show();
void NeoPatternService::handleStateRequest(AsyncWebServerRequest* request) {
if (request->contentType() != "application/json") {
request->send(400, "application/json", "{\"error\":\"Content-Type must be application/json\"}");
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() {
taskManager.registerTask("neopattern_update", updateIntervalMs, [this]() { update(); });
taskManager.registerTask("neopattern_status_print", 10000, [this]() {
Serial.printf("[NeoPattern] pattern=%s interval=%lu ms brightness=%u\n",
currentPatternName().c_str(), updateIntervalMs, brightness);
LOG_INFO("NeoPattern", "Status update");
});
}
void NeoPatternService::registerPatterns() {
patternSetters["off"] = [this]() { pixels.ActivePattern = NONE; };
patternSetters["rainbow_cycle"] = [this]() { pixels.RainbowCycle(updateIntervalMs); };
patternSetters["theater_chase"] = [this]() { pixels.TheaterChase(pixels.Color1 ? pixels.Color1 : pixels.Color(127,127,127), pixels.Color2, updateIntervalMs); };
patternSetters["color_wipe"] = [this]() { pixels.ColorWipe(pixels.Color1 ? pixels.Color1 : pixels.Color(255,0,0), updateIntervalMs); };
patternSetters["scanner"] = [this]() { pixels.Scanner(pixels.Color1 ? pixels.Color1 : pixels.Color(0,0,255), updateIntervalMs); };
patternSetters["fade"] = [this]() { pixels.Fade(pixels.Color1, pixels.Color2, pixels.TotalSteps ? pixels.TotalSteps : 32, updateIntervalMs); };
patternSetters["fire"] = [this]() { pixels.ActivePattern = FIRE; pixels.Interval = updateIntervalMs; };
// Register all patterns with their metadata and callbacks
patternRegistry.registerPattern(
"none",
static_cast<uint8_t>(NeoPatternType::NONE),
"No pattern - solid color",
[this]() { /* No initialization needed */ },
[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() {
if (patternSetters.empty()) registerPatterns();
std::vector<String> v;
v.reserve(patternSetters.size());
for (const auto& kv : patternSetters) v.push_back(kv.first);
return v;
std::vector<String> NeoPatternService::patternNamesVector() const {
return patternRegistry.getAllPatternNames();
}
String NeoPatternService::currentPatternName() {
switch (pixels.ActivePattern) {
case NONE: return String("off");
case RAINBOW_CYCLE: return String("rainbow_cycle");
case THEATER_CHASE: return String("theater_chase");
case COLOR_WIPE: return String("color_wipe");
case SCANNER: return String("scanner");
case FADE: return String("fade");
case FIRE: return String("fire");
String NeoPatternService::currentPatternName() const {
return patternRegistry.getPatternName(static_cast<uint8_t>(activePattern));
}
NeoPatternService::NeoPatternType NeoPatternService::nameToPattern(const String& name) const {
uint8_t type = patternRegistry.getPatternType(name);
return static_cast<NeoPatternType>(type);
}
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) {
if (patternSetters.empty()) registerPatterns();
auto it = patternSetters.find(name);
if (it != patternSetters.end()) {
pixels.Index = 0;
pixels.Direction = FORWARD;
it->second();
}
bool NeoPatternService::isValidPattern(const String& name) const {
return patternRegistry.isValidPattern(name);
}
bool NeoPatternService::isValidPattern(NeoPatternType type) const {
return patternRegistry.isValidPattern(static_cast<uint8_t>(type));
}
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() {
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
#include "spore/Service.h"
#include "spore/core/TaskManager.h"
#include "NeoPattern.cpp"
#include "NeoPattern.h"
#include "NeoPatternState.h"
#include "NeoPixelConfig.h"
#include "PatternRegistry.h"
#include <map>
#include <vector>
#include <functional>
class NeoPatternService : public Service {
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;
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 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:
void registerTasks();
void registerPatterns();
std::vector<String> patternNamesVector();
String currentPatternName();
void update();
// Handlers
// Pattern updaters
void updateRainbowCycle();
void updateTheaterChase();
void updateColorWipe();
void updateScanner();
void updateFade();
void updateFire();
void updateNone();
// API handlers
void handleStatusRequest(AsyncWebServerRequest* request);
void handlePatternsRequest(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;
NeoPattern pixels;
NeoPattern* neoPattern;
NeoPixelConfig config;
NeoPatternState currentState;
// Pattern registry for centralized pattern management
PatternRegistry patternRegistry;
NeoPatternType activePattern;
NeoDirection direction;
unsigned long updateIntervalMs;
uint8_t brightness;
std::map<String, std::function<void()>> patternSetters;
unsigned long lastUpdateMs;
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 "spore/Spore.h"
#include "spore/util/Logging.h"
#include "NeoPatternService.h"
#include "NeoPixelConfig.h"
#ifndef LED_STRIP_PIN
#define LED_STRIP_PIN 2
// Configuration constants
#ifndef NEOPIXEL_PIN
#define NEOPIXEL_PIN 2
#endif
#ifndef LED_STRIP_LENGTH
#define LED_STRIP_LENGTH 8
#ifndef NEOPIXEL_LENGTH
#define NEOPIXEL_LENGTH 8
#endif
#ifndef LED_STRIP_TYPE
#define LED_STRIP_TYPE (NEO_GRB + NEO_KHZ800)
#ifndef NEOPIXEL_BRIGHTNESS
#define NEOPIXEL_BRIGHTNESS 100
#endif
#ifndef NEOPIXEL_UPDATE_INTERVAL
#define NEOPIXEL_UPDATE_INTERVAL 100
#endif
// Create Spore instance with custom labels
Spore spore({
{"app", "neopattern"},
{"device", "light"},
{"pixels", String(LED_STRIP_LENGTH)},
{"pin", String(LED_STRIP_PIN)}
{"role", "led"},
{"pixels", String(NEOPIXEL_LENGTH)},
{"pin", String(NEOPIXEL_PIN)}
});
// Create custom service
@@ -29,14 +36,22 @@ void setup() {
// Initialize the Spore framework
spore.setup();
// Create configuration
NeoPixelConfig config(
NEOPIXEL_PIN,
NEOPIXEL_LENGTH,
NEOPIXEL_BRIGHTNESS,
NEOPIXEL_UPDATE_INTERVAL
);
// 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);
// Start the API server and complete initialization
spore.begin();
Serial.println("[Main] NeoPattern service registered and ready!");
LOG_INFO("Main", "NeoPattern service registered and ready!");
}
void 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
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>`.
- WiFi and API port are configured in `src/Config.cpp`.
@@ -25,7 +32,7 @@ RelayService* relayService = nullptr;
void setup() {
spore.setup();
relayService = new RelayService(spore.getTaskManager(), RELAY_PIN);
relayService = new RelayService(spore.getContext(), spore.getTaskManager(), RELAY_PIN);
spore.addService(relayService);
spore.begin();
@@ -42,6 +49,7 @@ The Spore framework automatically provides:
- REST API server with core endpoints
- Task scheduling and execution
- Node status monitoring
- Static file serving for web interfaces (core service)
## 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).
## 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
- Get relay status

View File

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

View File

@@ -1,11 +1,12 @@
#pragma once
#include "spore/Service.h"
#include "spore/core/TaskManager.h"
#include "spore/core/NodeContext.h"
#include <ArduinoJson.h>
class RelayService : public Service {
public:
RelayService(TaskManager& taskMgr, int pin);
RelayService(NodeContext& ctx, TaskManager& taskMgr, int pin);
void registerEndpoints(ApiServer& api) override;
const char* getName() const override { return "Relay"; }
@@ -16,6 +17,7 @@ public:
private:
void registerTasks();
NodeContext& ctx;
TaskManager& taskManager;
int relayPin;
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();
// Create and add custom service
relayService = new RelayService(spore.getTaskManager(), RELAY_PIN);
relayService = new RelayService(spore.getContext(), spore.getTaskManager(), RELAY_PIN);
spore.addService(relayService);
// Start the API server and complete initialization
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() {

View File

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

View File

@@ -11,6 +11,7 @@
#include "spore/types/NodeInfo.h"
#include "spore/core/TaskManager.h"
#include "spore/types/ApiTypes.h"
#include "spore/util/Logging.h"
class Service; // Forward declaration
@@ -19,15 +20,20 @@ public:
ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port = 80);
void begin();
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,
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler);
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");
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);

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;
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
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
[platformio]
;default_envs = esp01_1m
default_envs = base
src_dir = .
data_dir = ${PROJECT_DIR}/examples/${PIOENV}/data
[common]
monitor_speed = 115200
@@ -18,15 +19,17 @@ lib_deps =
esp32async/ESPAsyncWebServer@^3.8.0
bblanchon/ArduinoJson@^7.4.2
[env:esp01_1m]
[env:base]
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 ; ESP01S uses DOUT on 1 Mbit flash
board_build.flash_size = 1M
board_build.f_cpu = 80000000L
board_build.flash_mode = qio
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}
build_src_filter =
+<examples/base/*.cpp>
@@ -34,6 +37,7 @@ build_src_filter =
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp>
[env:d1_mini]
@@ -42,8 +46,10 @@ board = d1_mini
framework = arduino
upload_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_size = 4M
board_build.ldscript = eagle.flash.4m1m.ld
lib_deps = ${common.lib_deps}
build_src_filter =
+<examples/base/*.cpp>
@@ -51,72 +57,38 @@ build_src_filter =
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp>
[env:esp01_1m_relay]
[env:relay]
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.filesystem = littlefs
board_build.flash_mode = dout
board_build.flash_size = 1M
board_build.ldscript = eagle.flash.1m64.ld
lib_deps = ${common.lib_deps}
;data_dir = examples/relay/data
build_src_filter =
+<examples/relay/*.cpp>
+<src/spore/*.cpp>
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/spore/util/*.cpp>
+<src/internal/*.cpp>
[env:esp01_1m_neopixel]
[env: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.filesystem = littlefs
board_build.flash_mode = dout
board_build.flash_size = 1M
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
board_build.ldscript = eagle.flash.1m64.ld
lib_deps = ${common.lib_deps}
adafruit/Adafruit NeoPixel@^1.15.1
build_flags = -DLED_STRIP_PIN=2
@@ -126,22 +98,5 @@ build_src_filter =
+<src/spore/core/*.cpp>
+<src/spore/services/*.cpp>
+<src/spore/types/*.cpp>
+<src/internal/*.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/spore/util/*.cpp>
+<src/internal/*.cpp>

View File

@@ -3,17 +3,19 @@
#include "spore/services/NetworkService.h"
#include "spore/services/ClusterService.h"
#include "spore/services/TaskService.h"
#include "spore/services/StaticFileService.h"
#include "spore/services/MonitoringService.h"
#include <Arduino.h>
Spore::Spore() : ctx(), network(ctx), taskManager(ctx), cluster(ctx, taskManager),
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)
: ctx(initialLabels), network(ctx), taskManager(ctx), cluster(ctx, taskManager),
apiServer(ctx, taskManager, ctx.config.api_server_port),
initialized(false), apiServerStarted(false) {
cpuUsage(), initialized(false), apiServerStarted(false) {
}
Spore::~Spore() {
@@ -22,35 +24,38 @@ Spore::~Spore() {
void Spore::setup() {
if (initialized) {
Serial.println("[Spore] Already initialized, skipping setup");
LOG_INFO("Spore", "Already initialized, skipping setup");
return;
}
Serial.begin(115200);
Serial.println("[Spore] Starting Spore framework...");
LOG_INFO("Spore", "Starting Spore framework...");
// Initialize core components
initializeCore();
// Initialize CPU usage monitoring
cpuUsage.begin();
// Register core services
registerCoreServices();
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() {
if (!initialized) {
Serial.println("[Spore] Framework not initialized, call setup() first");
LOG_ERROR("Spore", "Framework not initialized, call setup() first");
return;
}
if (apiServerStarted) {
Serial.println("[Spore] API server already started");
LOG_WARN("Spore", "API server already started");
return;
}
Serial.println("[Spore] Starting API server...");
LOG_INFO("Spore", "Starting API server...");
// Start API server
startApiServer();
@@ -58,22 +63,31 @@ void Spore::begin() {
// Print initial task status
taskManager.printTaskStatus();
Serial.println("[Spore] Framework ready!");
LOG_INFO("Spore", "Framework ready!");
}
void Spore::loop() {
if (!initialized) {
Serial.println("[Spore] Framework not initialized, call setup() first");
LOG_ERROR("Spore", "Framework not initialized, call setup() first");
return;
}
// Start CPU usage measurement
cpuUsage.startMeasurement();
// Execute main tasks
taskManager.execute();
// End CPU usage measurement before yield
cpuUsage.endMeasurement();
// Yield to allow other tasks to run
yield();
}
void Spore::addService(std::shared_ptr<Service> service) {
if (!service) {
Serial.println("[Spore] Warning: Attempted to add null service");
LOG_WARN("Spore", "Attempted to add null service");
return;
}
@@ -82,15 +96,15 @@ void Spore::addService(std::shared_ptr<Service> service) {
if (apiServerStarted) {
// If API server is already started, register the service immediately
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 {
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) {
if (!service) {
Serial.println("[Spore] Warning: Attempted to add null service");
LOG_WARN("Spore", "Attempted to add null service");
return;
}
@@ -100,7 +114,7 @@ void Spore::addService(Service* service) {
void Spore::initializeCore() {
Serial.println("[Spore] Initializing core components...");
LOG_INFO("Spore", "Initializing core components...");
// Setup WiFi first
network.setupWiFi();
@@ -108,40 +122,44 @@ void Spore::initializeCore() {
// Initialize task manager
taskManager.initialize();
Serial.println("[Spore] Core components initialized");
LOG_INFO("Spore", "Core components initialized");
}
void Spore::registerCoreServices() {
Serial.println("[Spore] Registering core services...");
LOG_INFO("Spore", "Registering core services...");
// Create core services
auto nodeService = std::make_shared<NodeService>(ctx, apiServer);
auto networkService = std::make_shared<NetworkService>(network);
auto clusterService = std::make_shared<ClusterService>(ctx);
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
services.push_back(nodeService);
services.push_back(networkService);
services.push_back(clusterService);
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() {
if (apiServerStarted) {
Serial.println("[Spore] API server already started");
LOG_WARN("Spore", "API server already started");
return;
}
Serial.println("[Spore] Starting API server...");
LOG_INFO("Spore", "Starting API server...");
// Register all services with API server
for (auto& service : services) {
if (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();
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/Service.h"
#include "spore/util/Logging.h"
#include <algorithm>
const char* ApiServer::methodToStr(int method) {
@@ -20,71 +21,50 @@ void ApiServer::registerEndpoint(const String& uri, int method,
const String& serviceName) {
// Add to local endpoints
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) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
const String& serviceName) {
registerEndpoint(uri, method, {}, serviceName);
server.on(uri.c_str(), method, 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) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
std::function<void(AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool)> uploadHandler,
const String& serviceName) {
registerEndpoint(uri, method, {}, serviceName);
server.on(uri.c_str(), method, requestHandler, uploadHandler);
}
// Overloads that also record minimal capability specs
void ApiServer::addEndpoint(const String& uri, int method, std::function<void(AsyncWebServerRequest*)> requestHandler,
const std::vector<ParamSpec>& params) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
const std::vector<ParamSpec>& params, const String& serviceName) {
registerEndpoint(uri, method, params, serviceName);
server.on(uri.c_str(), method, 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,
const std::vector<ParamSpec>& params) {
// Get current service name if available
String serviceName = "unknown";
if (!services.empty()) {
serviceName = services.back().get().getName();
}
const std::vector<ParamSpec>& params, const String& serviceName) {
registerEndpoint(uri, method, params, serviceName);
server.on(uri.c_str(), method, requestHandler, uploadHandler);
}
void ApiServer::addService(Service& 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() {
// Register all service endpoints
for (auto& service : services) {
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();

View File

@@ -1,5 +1,6 @@
#include "spore/core/ClusterManager.h"
#include "spore/internal/Globals.h"
#include "spore/util/Logging.h"
ClusterManager::ClusterManager(NodeContext& ctx, TaskManager& taskMgr) : ctx(ctx), taskManager(taskMgr) {
// 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("heartbeat", ctx.config.heartbeat_interval_ms, [this]() { heartbeatTaskCallback(); });
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() {
//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->write(ClusterProtocol::DISCOVERY_MSG);
ctx.udp->endPacket();
@@ -36,14 +37,14 @@ void ClusterManager::listenForDiscovery() {
if (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) {
//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);
String response = String(ClusterProtocol::RESPONSE_MSG) + ":" + ctx.hostname;
ctx.udp->write(response.c_str());
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) {
char* hostPtr = incoming + strlen(ClusterProtocol::RESPONSE_MSG) + 1;
String nodeHost = String(hostPtr);
@@ -72,36 +73,52 @@ void ClusterManager::addOrUpdateNode(const String& nodeHost, IPAddress nodeIP) {
newNode.lastSeen = millis();
updateNodeStatus(newNode, newNode.lastSeen, ctx.config.node_inactive_threshold_ms, ctx.config.node_dead_threshold_ms);
memberList[nodeHost] = newNode;
Serial.printf("[Cluster] Added node: %s @ %s | Status: %s | last update: 0\n",
nodeHost.c_str(),
newNode.ip.toString().c_str(),
statusToStr(newNode.status));
LOG_INFO("Cluster", "Added node: " + nodeHost + " @ " + newNode.ip.toString() + " | Status: " + statusToStr(newNode.status) + " | last update: 0");
//fetchNodeInfo(nodeIP); // Do not fetch here, handled by periodic task
}
void ClusterManager::fetchNodeInfo(const IPAddress& ip) {
if(ip == ctx.localIP) {
Serial.println("[Cluster] Skipping fetch for local node");
LOG_DEBUG("Cluster", "Skipping fetch for local node");
return;
}
unsigned long requestStart = millis();
HTTPClient http;
WiFiClient client;
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();
unsigned long requestEnd = millis();
unsigned long requestDuration = requestEnd - requestStart;
if (httpCode == 200) {
String payload = http.getString();
// Use stack-allocated JsonDocument with proper cleanup
JsonDocument doc;
DeserializationError err = deserializeJson(doc, payload);
if (!err) {
auto& memberList = *ctx.memberList;
// Still need to iterate since we're searching by IP, not hostname
for (auto& pair : memberList) {
NodeInfo& node = pair.second;
if (node.ip == ip) {
// Update resources efficiently
node.resources.freeHeap = doc["freeHeap"];
node.resources.chipId = doc["chipId"];
node.resources.sdkVersion = (const char*)doc["sdkVersion"];
@@ -110,40 +127,61 @@ void ClusterManager::fetchNodeInfo(const IPAddress& ip) {
node.status = NodeInfo::ACTIVE;
node.latency = requestDuration;
node.lastSeen = millis();
// Clear and rebuild endpoints efficiently
node.endpoints.clear();
node.endpoints.reserve(10); // Pre-allocate to avoid reallocations
if (doc["api"].is<JsonArray>()) {
JsonArray apiArr = doc["api"].as<JsonArray>();
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"];
// Create basic EndpointInfo without params for cluster nodes
EndpointInfo endpoint;
endpoint.uri = uri;
endpoint.uri = uri; // String assignment is more efficient than construction
endpoint.method = method;
endpoint.isLocal = false;
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();
if (doc["labels"].is<JsonObject>()) {
JsonObject labelsObj = doc["labels"].as<JsonObject>();
for (JsonPair kvp : labelsObj) {
String k = String(kvp.key().c_str());
String v = String(labelsObj[kvp.key()]);
node.labels[k] = v;
// Use const char* to avoid String copies
const char* key = kvp.key().c_str();
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;
}
}
} else {
LOG_ERROR("Cluster", "JSON parse error for node @ " + ip.toString() + ": " + String(err.c_str()));
}
} 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());
}
}
void ClusterManager::heartbeatTaskCallback() {
@@ -160,10 +198,25 @@ void ClusterManager::heartbeatTaskCallback() {
void ClusterManager::updateAllMembersInfoTaskCallback() {
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) {
const NodeInfo& node = pair.second;
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);
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(); ) {
unsigned long diff = now - it->second.lastSeen;
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);
} else {
++it;
@@ -196,13 +249,13 @@ void ClusterManager::removeDeadNodes() {
void ClusterManager::printMemberList() {
auto& memberList = *ctx.memberList;
if (memberList.empty()) {
Serial.println("[Cluster] Member List: empty");
LOG_INFO("Cluster", "Member List: empty");
return;
}
Serial.println("[Cluster] Member List:");
LOG_INFO("Cluster", "Member List:");
for (const auto& pair : memberList) {
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);
if (it != memberList.end()) {
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.sdkVersion = String(ESP.getSdkVersion());
node.resources.cpuFreqMHz = ESP.getCpuFreqMHz();
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/util/Logging.h"
// SSID and password are now configured via Config class
void NetworkManager::scanWifi() {
if (!isScanning) {
isScanning = true;
Serial.println("[WiFi] Starting WiFi scan...");
LOG_INFO("WiFi", "Starting WiFi scan...");
// Start async WiFi scan
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->isScanning = false;
}, true);
} else {
Serial.println("[WiFi] Scan already in progress...");
LOG_WARN("WiFi", "Scan already in progress...");
}
}
void NetworkManager::processAccessPoints() {
int numNetworks = WiFi.scanComplete();
if (numNetworks <= 0) {
Serial.println("[WiFi] No networks found or scan not complete");
LOG_WARN("WiFi", "No networks found or scan not complete");
return;
}
@@ -43,8 +44,7 @@ void NetworkManager::processAccessPoints() {
accessPoints.push_back(ap);
Serial.printf("[WiFi] Found network %d: %s, Ch: %d, RSSI: %d\n",
i + 1, ap.ssid.c_str(), ap.channel, ap.rssi);
LOG_DEBUG("WiFi", "Found network " + String(i + 1) + ": " + ap.ssid + ", Ch: " + String(ap.channel) + ", RSSI: " + String(ap.rssi));
}
// Free the memory used by the scan
@@ -77,31 +77,26 @@ void NetworkManager::setHostnameFromMac() {
void NetworkManager::setupWiFi() {
WiFi.mode(WIFI_STA);
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();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < ctx.config.wifi_connect_timeout_ms) {
delay(ctx.config.wifi_retry_delay_ms);
Serial.print(".");
// Progress dots handled by delay, no logging needed
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.print("[WiFi] Connected to AP, IP: ");
Serial.println(WiFi.localIP());
LOG_INFO("WiFi", "Connected to AP, IP: " + WiFi.localIP().toString());
} else {
Serial.println();
Serial.println("[WiFi] Failed to connect to AP. Creating AP...");
LOG_WARN("WiFi", "Failed to connect to AP. Creating AP...");
WiFi.mode(WIFI_AP);
WiFi.softAP(ctx.config.wifi_ssid.c_str(), ctx.config.wifi_password.c_str());
Serial.print("[WiFi] AP created, IP: ");
Serial.println(WiFi.softAPIP());
LOG_INFO("WiFi", "AP created, IP: " + WiFi.softAPIP().toString());
}
setHostnameFromMac();
ctx.udp->begin(ctx.config.udp_port);
ctx.localIP = WiFi.localIP();
ctx.hostname = WiFi.hostname();
Serial.print("[WiFi] Hostname set to: ");
Serial.println(ctx.hostname);
Serial.printf("[WiFi] UDP listening on port %d\n", ctx.config.udp_port);
LOG_INFO("WiFi", "Hostname set to: " + ctx.hostname);
LOG_INFO("WiFi", "UDP listening on port " + String(ctx.config.udp_port));
// Populate self NodeInfo
ctx.self.hostname = ctx.hostname;
@@ -112,7 +107,6 @@ void NetworkManager::setupWiFi() {
}
ctx.self.lastSeen = millis();
ctx.self.status = NodeInfo::ACTIVE;
ctx.self.labels["hostname"] = ctx.hostname;
// Ensure member list has an entry for this node
auto &memberList = *ctx.memberList;

View File

@@ -1,4 +1,5 @@
#include "spore/core/TaskManager.h"
#include "spore/util/Logging.h"
#include <Arduino.h>
TaskManager::TaskManager(NodeContext& ctx) : ctx(ctx) {}
@@ -31,9 +32,9 @@ void TaskManager::enableTask(const std::string& name) {
int idx = findTaskIndex(name);
if (idx >= 0) {
taskDefinitions[idx].enabled = true;
Serial.printf("[TaskManager] Enabled task: %s\n", name.c_str());
LOG_INFO("TaskManager", "Enabled task: " + String(name.c_str()));
} 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);
if (idx >= 0) {
taskDefinitions[idx].enabled = false;
Serial.printf("[TaskManager] Disabled task: %s\n", name.c_str());
LOG_INFO("TaskManager", "Disabled task: " + String(name.c_str()));
} 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);
if (idx >= 0) {
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 {
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) {
taskDef.enabled = true;
}
Serial.println("[TaskManager] Enabled all tasks");
LOG_INFO("TaskManager", "Enabled all tasks");
}
void TaskManager::disableAllTasks() {
for (auto& taskDef : taskDefinitions) {
taskDef.enabled = false;
}
Serial.println("[TaskManager] Disabled all tasks");
LOG_INFO("TaskManager", "Disabled all tasks");
}
void TaskManager::printTaskStatus() const {
Serial.println("\n[TaskManager] Task Status:");
Serial.println("==========================");
LOG_INFO("TaskManager", "\nTask Status:");
LOG_INFO("TaskManager", "==========================");
for (const auto& taskDef : taskDefinitions) {
Serial.printf(" %s: %s (interval: %lu ms)\n",
taskDef.name.c_str(),
taskDef.enabled ? "ENABLED" : "DISABLED",
taskDef.interval);
LOG_INFO("TaskManager", " " + String(taskDef.name.c_str()) + ": " + (taskDef.enabled ? "ENABLED" : "DISABLED") + " (interval: " + String(taskDef.interval) + " ms)");
}
Serial.println("==========================\n");
LOG_INFO("TaskManager", "==========================\n");
}
void TaskManager::execute() {

View File

@@ -1,42 +1,19 @@
#include "spore/services/ClusterService.h"
#include "spore/core/ApiServer.h"
#include "spore/types/ClusterResponse.h"
using spore::types::ClusterMembersResponse;
ClusterService::ClusterService(NodeContext& ctx) : ctx(ctx) {}
void ClusterService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/cluster/members", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleMembersRequest(request); },
std::vector<ParamSpec>{});
std::vector<ParamSpec>{}, "ClusterService");
}
void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) {
JsonDocument doc;
JsonArray arr = doc["members"].to<JsonArray>();
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);
ClusterMembersResponse response;
response.addNodes(ctx.memberList);
request->send(200, "application/json", response.toJsonString());
}

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
api.addEndpoint("/api/network/wifi/scan", HTTP_POST,
[this](AsyncWebServerRequest* request) { handleWifiScanRequest(request); },
std::vector<ParamSpec>{});
std::vector<ParamSpec>{}, "NetworkService");
api.addEndpoint("/api/network/wifi/scan", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleGetWifiNetworks(request); },
std::vector<ParamSpec>{});
std::vector<ParamSpec>{}, "NetworkService");
// Network status and configuration endpoints
api.addEndpoint("/api/network/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleNetworkStatus(request); },
std::vector<ParamSpec>{});
std::vector<ParamSpec>{}, "NetworkService");
api.addEndpoint("/api/network/wifi/config", HTTP_POST,
[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("connect_timeout_ms"), false, String("body"), String("number"), {}, String("10000")},
ParamSpec{String("retry_delay_ms"), false, String("body"), String("number"), {}, String("500")}
});
}, "NetworkService");
}
void NetworkService::handleWifiScanRequest(AsyncWebServerRequest* request) {

View File

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

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/core/ApiServer.h"
#include "spore/types/TaskResponse.h"
#include <algorithm>
using spore::types::TaskStatusResponse;
using spore::types::TaskControlResponse;
TaskService::TaskService(TaskManager& taskManager) : taskManager(taskManager) {}
void TaskService::registerEndpoints(ApiServer& api) {
api.addEndpoint("/api/tasks/status", HTTP_GET,
[this](AsyncWebServerRequest* request) { handleStatusRequest(request); },
std::vector<ParamSpec>{});
std::vector<ParamSpec>{}, "TaskService");
api.addEndpoint("/api/tasks/control", HTTP_POST,
[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("")
}
});
}, "TaskService");
}
void TaskService::handleStatusRequest(AsyncWebServerRequest* request) {
TaskStatusResponse response;
// Get task statuses using a separate document to avoid reference issues
JsonDocument scratch;
auto taskStatuses = taskManager.getAllTaskStatuses(scratch);
JsonDocument doc;
JsonObject summaryObj = doc["summary"].to<JsonObject>();
summaryObj["totalTasks"] = taskStatuses.size();
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);
// Build the complete response with the task data
response.buildCompleteResponse(taskStatuses);
request->send(200, "application/json", response.toJsonString());
}
void TaskService::handleControlRequest(AsyncWebServerRequest* request) {
@@ -88,50 +75,27 @@ void TaskService::handleControlRequest(AsyncWebServerRequest* request) {
success = true;
message = "Task status retrieved";
JsonDocument statusDoc;
statusDoc["success"] = success;
statusDoc["message"] = message;
statusDoc["task"] = taskName;
statusDoc["action"] = action;
TaskControlResponse response;
response.setResponse(success, message, taskName, action);
response.addTaskDetails(taskName,
taskManager.isTaskEnabled(taskName.c_str()),
taskManager.isTaskRunning(taskName.c_str()),
taskManager.getTaskInterval(taskName.c_str()));
statusDoc["taskDetails"] = JsonObject();
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);
request->send(200, "application/json", response.toJsonString());
return;
} else {
success = false;
message = "Invalid action. Use: enable, disable, start, stop, or status";
}
JsonDocument doc;
doc["success"] = success;
doc["message"] = message;
doc["task"] = taskName;
doc["action"] = action;
String json;
serializeJson(doc, json);
request->send(success ? 200 : 400, "application/json", json);
TaskControlResponse response;
response.setResponse(success, message, taskName, action);
request->send(success ? 200 : 400, "application/json", response.toJsonString());
} else {
JsonDocument doc;
doc["success"] = false;
doc["message"] = "Missing parameters. Required: task, action";
doc["example"] = "{\"task\": \"discovery_send\", \"action\": \"status\"}";
String json;
serializeJson(doc, json);
request->send(400, "application/json", json);
TaskControlResponse response;
response.setError("Missing parameters. Required: task, action",
"{\"task\": \"discovery_send\", \"action\": \"status\"}");
request->send(400, "application/json", response.toJsonString());
}
}

View File

@@ -28,4 +28,9 @@ Config::Config() {
// System Configuration
restart_delay_ms = 10;
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));
}