Compare commits
6 commits
Author | SHA1 | Date | |
---|---|---|---|
|
8a818c66a0 | ||
|
9889e983ec | ||
|
03dbb8add6 | ||
|
753838b122 | ||
|
46c0f3a22b | ||
|
fb70d435a9 |
29 changed files with 719 additions and 968 deletions
12
README.md
12
README.md
|
@ -16,21 +16,21 @@ Biggest differences with v2 are:
|
||||||
|
|
||||||
New features:
|
New features:
|
||||||
- BitAxe integration
|
- BitAxe integration
|
||||||
- Zap notifier
|
- Nostr Zap notifier
|
||||||
- Braiins Pool and Ocean mining stats integration
|
- Multiple mining pool stats integrations
|
||||||
|
|
||||||
"Steal focus on new block" means that when a new block is mined, the display will switch to the block height screen if it's not on it already.
|
"Steal focus on new block" means that when a new block is mined, the display will switch to the block height screen if it's not on it already.
|
||||||
|
|
||||||
Most [information](https://github.com/btclock/btclock_v2/wiki) about BTClock v2 is still valid for this version.
|
See the [docs](https://git.btclock.dev/btclock/docs) repo for more information and building instructions.
|
||||||
|
|
||||||
**NOTE**: The software assumes that the hardware is run in a controlled private network. ~~The Web UI and the OTA update mechanism are not password protected and accessible to anyone in the network. Also, since the device only fetches numbers through WebSockets it will skip server certificate verification to save resources.~~ Since 3.2.0 the WebUI is password protectable and all certificates are verified. OTA update mechanism is not password-protected.
|
**NOTE**: The software assumes that the hardware is run in a controlled private network. ~~The Web UI and the OTA update mechanism are not password protected and accessible to anyone in the network. Also, since the device only fetches numbers through WebSockets it will skip server certificate verification to save resources.~~ Since 3.2.0 the WebUI is password protectable and all certificates are verified. OTA update mechanism is not password-protected.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
Use PlatformIO to build it yourself. Make sure you fetch the [WebUI](https://github.com/btclock/webui) submodule.
|
Use PlatformIO to build it yourself. Make sure you fetch the [WebUI](https://git.btclock.dev/btclock/webui) submodule.
|
||||||
|
|
||||||
|
|
||||||
## Braiins Pool and Ocean integration
|
## Mining pool stats
|
||||||
Enable mining pool stats by accessing your btclock's web UI (point a web browser at the device's IP address).
|
Enable mining pool stats by accessing your btclock's web UI (point a web browser at the device's IP address).
|
||||||
|
|
||||||
Under Settings -> Extra Features: toggle Enable Mining Pool Stats.
|
Under Settings -> Extra Features: toggle Enable Mining Pool Stats.
|
||||||
|
@ -41,6 +41,8 @@ The Mining Pool Earnings screen displays:
|
||||||
* Braiins: Today's mining reward thus far
|
* Braiins: Today's mining reward thus far
|
||||||
* Ocean: Your estimated earnings if the pool were to find a block right now
|
* Ocean: Your estimated earnings if the pool were to find a block right now
|
||||||
|
|
||||||
|
For solo mining pools, there are no earning estimations. Your username is the onchain withdrawal address, without the worker name.
|
||||||
|
|
||||||
|
|
||||||
### Braiins Pool integration
|
### Braiins Pool integration
|
||||||
Create an API key based on the steps [here](https://academy.braiins.com/en/braiins-pool/monitoring/#api-configuration).
|
Create an API key based on the steps [here](https://academy.braiins.com/en/braiins-pool/monitoring/#api-configuration).
|
||||||
|
|
2
data
2
data
|
@ -1 +1 @@
|
||||||
Subproject commit fd328d4f05345eaa73cf27d05bb542eaa6915cdb
|
Subproject commit 924be8fc2eb02fe384a20b53da1a9fa3d8db8a05
|
227
platformio.ini
227
platformio.ini
|
@ -7,119 +7,137 @@
|
||||||
;
|
;
|
||||||
; Please visit documentation for the other options and examples
|
; Please visit documentation for the other options and examples
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[platformio]
|
[platformio]
|
||||||
data_dir = data/build_gz
|
data_dir = data/build_gz
|
||||||
default_envs = lolin_s3_mini_213epd, lolin_s3_mini_29epd, btclock_rev_b_213epd, btclock_v8_213epd
|
default_envs = lolin_s3_mini_213epd, lolin_s3_mini_29epd, btclock_rev_b_213epd, btclock_v8_213epd
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
|
|
||||||
|
|
||||||
[btclock_base]
|
[btclock_base]
|
||||||
platform = espressif32 @ ^6.9.0
|
platform = espressif32 @ ^6.9.0
|
||||||
framework = arduino, espidf
|
framework = arduino, espidf
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters = esp32_exception_decoder, colorize
|
monitor_filters = esp32_exception_decoder, colorize
|
||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
extra_scripts = pre:scripts/pre_script.py, post:scripts/extra_script.py
|
extra_scripts = pre:scripts/pre_script.py, post:scripts/extra_script.py
|
||||||
|
platform_packages =
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower
|
||||||
board_build.embed_files =
|
board_build.embed_files =
|
||||||
x509_crt_bundle
|
x509_crt_bundle
|
||||||
build_flags =
|
build_flags =
|
||||||
!python scripts/git_rev.py
|
!python scripts/git_rev.py
|
||||||
-DLAST_BUILD_TIME=$UNIX_TIME
|
-DLAST_BUILD_TIME=$UNIX_TIME
|
||||||
-DARDUINO_USB_CDC_ON_BOOT
|
-DARDUINO_USB_CDC_ON_BOOT
|
||||||
-DCORE_DEBUG_LEVEL=0
|
-DCORE_DEBUG_LEVEL=0
|
||||||
-fexceptions
|
-fexceptions
|
||||||
build_unflags =
|
build_unflags =
|
||||||
-Werror=all
|
-Werror=all
|
||||||
-fno-exceptions
|
-fno-exceptions
|
||||||
lib_deps =
|
lib_deps =
|
||||||
https://github.com/joltwallet/esp_littlefs.git
|
https://github.com/joltwallet/esp_littlefs.git
|
||||||
bblanchon/ArduinoJson@^7.2.1
|
bblanchon/ArduinoJson@^7.2.1
|
||||||
mathieucarbou/ESPAsyncWebServer @ 3.3.23
|
mathieucarbou/ESPAsyncWebServer @ 3.3.23
|
||||||
robtillaart/MCP23017@^0.8.0
|
robtillaart/MCP23017@^0.8.0
|
||||||
adafruit/Adafruit NeoPixel@^1.12.3
|
adafruit/Adafruit NeoPixel@^1.12.3
|
||||||
https://github.com/dsbaars/universal_pin#feature/mcp23017_rt
|
https://github.com/dsbaars/universal_pin#feature/mcp23017_rt
|
||||||
https://github.com/dsbaars/GxEPD2#universal_pin
|
https://github.com/dsbaars/GxEPD2#universal_pin
|
||||||
https://github.com/tzapu/WiFiManager.git#v2.0.17
|
https://github.com/tzapu/WiFiManager.git#v2.0.17
|
||||||
rblb/Nostrduino@1.2.8
|
rblb/Nostrduino@1.2.8
|
||||||
|
|
||||||
[env:lolin_s3_mini]
|
[env:lolin_s3_mini]
|
||||||
extends = btclock_base
|
extends = btclock_base
|
||||||
board = lolin_s3_mini
|
board = lolin_s3_mini
|
||||||
board_build.partitions = partition.csv
|
board_build.partitions = partition.csv
|
||||||
build_flags =
|
build_flags =
|
||||||
${btclock_base.build_flags}
|
${btclock_base.build_flags}
|
||||||
-D MCP_INT_PIN=8
|
-D MCP_INT_PIN=8
|
||||||
-D NEOPIXEL_PIN=34
|
-D NEOPIXEL_PIN=34
|
||||||
-D NEOPIXEL_COUNT=4
|
-D NEOPIXEL_COUNT=4
|
||||||
-D NUM_SCREENS=7
|
-D NUM_SCREENS=7
|
||||||
-D I2C_SDA_PIN=35
|
-D I2C_SDA_PIN=35
|
||||||
-D I2C_SCK_PIN=36
|
-D I2C_SCK_PIN=36
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||||
-D IS_HW_REV_A
|
-D IS_HW_REV_A
|
||||||
build_unflags =
|
build_unflags =
|
||||||
${btclock_base.build_unflags}
|
${btclock_base.build_unflags}
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:btclock_rev_b]
|
[env:btclock_rev_b]
|
||||||
extends = btclock_base
|
extends = btclock_base
|
||||||
board = btclock_rev_b
|
board = btclock_rev_b
|
||||||
board_build.partitions = partition_8mb.csv
|
board_build.partitions = partition_8mb.csv
|
||||||
build_flags =
|
build_flags =
|
||||||
${btclock_base.build_flags}
|
${btclock_base.build_flags}
|
||||||
-D MCP_INT_PIN=8
|
-D MCP_INT_PIN=8
|
||||||
-D NEOPIXEL_PIN=15
|
-D NEOPIXEL_PIN=15
|
||||||
-D NEOPIXEL_COUNT=4
|
-D NEOPIXEL_COUNT=4
|
||||||
-D NUM_SCREENS=7
|
-D NUM_SCREENS=7
|
||||||
-D I2C_SDA_PIN=35
|
-D I2C_SDA_PIN=35
|
||||||
-D I2C_SCK_PIN=36
|
-D I2C_SCK_PIN=36
|
||||||
-D HAS_FRONTLIGHT
|
-D HAS_FRONTLIGHT
|
||||||
-D PCA_OE_PIN=45
|
-D PCA_OE_PIN=45
|
||||||
-D PCA_I2C_ADDR=0x42
|
-D PCA_I2C_ADDR=0x42
|
||||||
-D IS_HW_REV_B
|
-D IS_HW_REV_B
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${btclock_base.lib_deps}
|
${btclock_base.lib_deps}
|
||||||
robtillaart/PCA9685@^0.7.1
|
robtillaart/PCA9685@^0.7.1
|
||||||
claws/BH1750@^1.3.0
|
claws/BH1750@^1.3.0
|
||||||
build_unflags =
|
build_unflags =
|
||||||
${btclock_base.build_unflags}
|
${btclock_base.build_unflags}
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:lolin_s3_mini_213epd]
|
[env:lolin_s3_mini_213epd]
|
||||||
extends = env:lolin_s3_mini
|
extends = env:lolin_s3_mini
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:lolin_s3_mini.build_flags}
|
${env:lolin_s3_mini.build_flags}
|
||||||
-D USE_QR
|
-D USE_QR
|
||||||
-D VERSION_EPD_2_13
|
-D VERSION_EPD_2_13
|
||||||
-D HW_REV=\"REV_A_EPD_2_13\"
|
-D HW_REV=\"REV_A_EPD_2_13\"
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:btclock_rev_b_213epd]
|
[env:btclock_rev_b_213epd]
|
||||||
extends = env:btclock_rev_b
|
extends = env:btclock_rev_b
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:btclock_rev_b.build_flags}
|
${env:btclock_rev_b.build_flags}
|
||||||
-D USE_QR
|
-D USE_QR
|
||||||
-D VERSION_EPD_2_13
|
-D VERSION_EPD_2_13
|
||||||
-D HW_REV=\"REV_B_EPD_2_13\"
|
-D HW_REV=\"REV_B_EPD_2_13\"
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:lolin_s3_mini_29epd]
|
[env:lolin_s3_mini_29epd]
|
||||||
extends = env:lolin_s3_mini
|
extends = env:lolin_s3_mini
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:lolin_s3_mini.build_flags}
|
${env:lolin_s3_mini.build_flags}
|
||||||
-D USE_QR
|
-D USE_QR
|
||||||
-D VERSION_EPD_2_9
|
-D VERSION_EPD_2_9
|
||||||
-D HW_REV=\"REV_A_EPD_2_9\"
|
-D HW_REV=\"REV_A_EPD_2_9\"
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:btclock_rev_b_29epd]
|
[env:btclock_rev_b_29epd]
|
||||||
extends = env:btclock_rev_b
|
extends = env:btclock_rev_b
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:btclock_rev_b.build_flags}
|
${env:btclock_rev_b.build_flags}
|
||||||
-D USE_QR
|
-D USE_QR
|
||||||
-D VERSION_EPD_2_9
|
-D VERSION_EPD_2_9
|
||||||
-D HW_REV=\"REV_B_EPD_2_9\"
|
-D HW_REV=\"REV_B_EPD_2_9\"
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:btclock_v8]
|
[env:btclock_v8]
|
||||||
extends = btclock_base
|
extends = btclock_base
|
||||||
|
@ -127,43 +145,52 @@ board = btclock_v8
|
||||||
board_build.partitions = partition_16mb.csv
|
board_build.partitions = partition_16mb.csv
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${btclock_base.build_flags}
|
${btclock_base.build_flags}
|
||||||
-D MCP_INT_PIN=4
|
-D MCP_INT_PIN=4
|
||||||
-D NEOPIXEL_PIN=5
|
-D NEOPIXEL_PIN=5
|
||||||
-D NEOPIXEL_COUNT=4
|
-D NEOPIXEL_COUNT=4
|
||||||
-D NUM_SCREENS=8
|
-D NUM_SCREENS=8
|
||||||
-D SPI_SDA_PIN=11
|
-D SPI_SDA_PIN=11
|
||||||
-D SPI_SCK_PIN=12
|
-D SPI_SCK_PIN=12
|
||||||
-D I2C_SDA_PIN=1
|
-D I2C_SDA_PIN=1
|
||||||
-D I2C_SCK_PIN=2
|
-D I2C_SCK_PIN=2
|
||||||
-D MCP_RESET_PIN=21
|
-D MCP_RESET_PIN=21
|
||||||
-D MCP1_A0_PIN=6
|
-D MCP1_A0_PIN=6
|
||||||
-D MCP1_A1_PIN=7
|
-D MCP1_A1_PIN=7
|
||||||
-D MCP1_A2_PIN=8
|
-D MCP1_A2_PIN=8
|
||||||
-D MCP2_A0_PIN=9
|
-D MCP2_A0_PIN=9
|
||||||
-D MCP2_A1_PIN=10
|
-D MCP2_A1_PIN=10
|
||||||
-D MCP2_A2_PIN=14
|
-D MCP2_A2_PIN=14
|
||||||
build_unflags =
|
build_unflags =
|
||||||
${btclock_base.build_unflags}
|
${btclock_base.build_unflags}
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:btclock_v8_213epd]
|
[env:btclock_v8_213epd]
|
||||||
extends = env:btclock_v8
|
extends = env:btclock_v8
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:btclock_v8.build_flags}
|
${env:btclock_v8.build_flags}
|
||||||
-D USE_QR
|
-D USE_QR
|
||||||
-D VERSION_EPD_2_13
|
-D VERSION_EPD_2_13
|
||||||
-D HW_REV=\"REV_V8_EPD_2_13\"
|
-D HW_REV=\"REV_V8_EPD_2_13\"
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
||||||
[env:native_test_only]
|
[env:native_test_only]
|
||||||
platform = native
|
platform = native
|
||||||
test_framework = unity
|
test_framework = unity
|
||||||
build_flags =
|
build_flags =
|
||||||
${btclock_base.build_flags}
|
${btclock_base.build_flags}
|
||||||
-D MCP_INT_PIN=8
|
-D MCP_INT_PIN=8
|
||||||
-D NEOPIXEL_PIN=34
|
-D NEOPIXEL_PIN=34
|
||||||
-D NEOPIXEL_COUNT=4
|
-D NEOPIXEL_COUNT=4
|
||||||
-D NUM_SCREENS=7
|
-D NUM_SCREENS=7
|
||||||
-D UNITY_TEST
|
-D UNITY_TEST
|
||||||
-std=gnu++17
|
-std=gnu++17
|
||||||
|
platform_packages =
|
||||||
|
platformio/tool-mklittlefs@^1.203.210628
|
||||||
|
earlephilhower/tool-mklittlefs-rp2040-earlephilhower@^5.100300.230216
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Import("env")
|
Import("env")
|
||||||
import os
|
import os
|
||||||
import gzip
|
import gzip
|
||||||
from shutil import copyfileobj, rmtree
|
from shutil import copyfileobj, rmtree, copyfile, copytree
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ def process_directory(input_dir, output_dir):
|
||||||
Path(output_root).mkdir(parents=True, exist_ok=True)
|
Path(output_root).mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
for file in files:
|
for file in files:
|
||||||
# if file.endswith(('.html', '.css', '.js')):
|
# if not file.endswith(('.bin')):
|
||||||
input_file_path = os.path.join(root, file)
|
input_file_path = os.path.join(root, file)
|
||||||
output_file_path = os.path.join(output_root, file + '.gz')
|
output_file_path = os.path.join(output_root, file + '.gz')
|
||||||
gzip_file(input_file_path, output_file_path)
|
gzip_file(input_file_path, output_file_path)
|
||||||
|
@ -41,11 +41,72 @@ def process_directory(input_dir, output_dir):
|
||||||
|
|
||||||
# Build web interface before building FS
|
# Build web interface before building FS
|
||||||
def before_buildfs(source, target, env):
|
def before_buildfs(source, target, env):
|
||||||
|
|
||||||
env.Execute("cd data && yarn && yarn postinstall && yarn build")
|
env.Execute("cd data && yarn && yarn postinstall && yarn build")
|
||||||
input_directory = 'data/dist'
|
input_directory = 'data/dist'
|
||||||
output_directory = 'data/build_gz'
|
output_directory = 'data/build_gz'
|
||||||
|
# copytree("assets", "data/dist/assets")
|
||||||
|
|
||||||
process_directory(input_directory, output_directory)
|
process_directory(input_directory, output_directory)
|
||||||
|
|
||||||
|
def get_fs_partition_size(env):
|
||||||
|
import csv
|
||||||
|
|
||||||
|
# Get partition table path - first try custom, then default
|
||||||
|
board_config = env.BoardConfig()
|
||||||
|
partition_table = board_config.get("build.partitions", "default.csv")
|
||||||
|
|
||||||
|
# Handle default partition table path
|
||||||
|
if partition_table == "default.csv" or partition_table == "huge_app.csv":
|
||||||
|
partition_table = os.path.join(env.PioPlatform().get_package_dir("framework-arduinoespressif32"),
|
||||||
|
"tools", "partitions", partition_table)
|
||||||
|
|
||||||
|
# Parse CSV to find spiffs/littlefs partition
|
||||||
|
with open(partition_table, 'r') as f:
|
||||||
|
for row in csv.reader(f):
|
||||||
|
if len(row) < 5:
|
||||||
|
continue
|
||||||
|
# Remove comments and whitespace
|
||||||
|
row = [cell.strip().split('#')[0] for cell in row]
|
||||||
|
# Check if this is a spiffs or littlefs partition
|
||||||
|
if row[0].startswith(('spiffs', 'littlefs')):
|
||||||
|
# Size is in hex format
|
||||||
|
return int(row[4], 16)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def get_littlefs_used_size(binary_path):
|
||||||
|
mklittlefs_path = os.path.join(env.PioPlatform().get_package_dir("tool-mklittlefs-rp2040-earlephilhower"), "mklittlefs")
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run([mklittlefs_path, '-l', binary_path], capture_output=True, text=True)
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
# Parse the output to sum up file sizes
|
||||||
|
total_size = 0
|
||||||
|
for line in result.stdout.splitlines():
|
||||||
|
if line.strip() and not line.startswith('<dir>') and not line.startswith('Creation'):
|
||||||
|
# Each line format: size filename
|
||||||
|
size = line.split()[0]
|
||||||
|
total_size += int(size)
|
||||||
|
return total_size
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error getting filesystem size: {e}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def after_littlefs(source, target, env):
|
||||||
|
binary_path = str(target[0])
|
||||||
|
partition_size = get_fs_partition_size(env)
|
||||||
|
used_size = get_littlefs_used_size(binary_path)
|
||||||
|
|
||||||
|
percentage = (used_size / partition_size) * 100
|
||||||
|
bar_width = 50
|
||||||
|
filled = int(bar_width * percentage / 100)
|
||||||
|
bar = '=' * filled + '-' * (bar_width - filled)
|
||||||
|
|
||||||
|
print(f"\nLittleFS Actual Usage: [{bar}] {percentage:.1f}% ({used_size}/{partition_size} bytes)")
|
||||||
|
|
||||||
|
|
||||||
flash_size = env.BoardConfig().get("upload.flash_size", "4MB")
|
flash_size = env.BoardConfig().get("upload.flash_size", "4MB")
|
||||||
fs_image_name = f"littlefs_{flash_size}"
|
fs_image_name = f"littlefs_{flash_size}"
|
||||||
env.Replace(ESP32_FS_IMAGE_NAME=fs_image_name)
|
env.Replace(ESP32_FS_IMAGE_NAME=fs_image_name)
|
||||||
|
@ -58,3 +119,7 @@ fs_name = env.get("ESP32_FS_IMAGE_NAME", "littlefs.bin")
|
||||||
|
|
||||||
# Use the variable in the pre-action
|
# Use the variable in the pre-action
|
||||||
env.AddPreAction(f"$BUILD_DIR/{fs_name}.bin", before_buildfs)
|
env.AddPreAction(f"$BUILD_DIR/{fs_name}.bin", before_buildfs)
|
||||||
|
env.AddPostAction(f"$BUILD_DIR/{fs_name}.bin", after_littlefs)
|
||||||
|
# LittleFS Actual Usage: [==============================--------------------] 60.4% (254165/420864 bytes)
|
||||||
|
# LittleFS Actual Usage: [==============================--------------------] 60.2% (253476/420864 bytes)
|
||||||
|
# 372736 used
|
|
@ -532,472 +532,11 @@ const unsigned char epd_icons_bitaxe_logo [] PROGMEM = {
|
||||||
0xff, 0xff, 0xff, 0xff
|
0xff, 0xff, 0xff, 0xff
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// // 'ocean_logo', 122x250px
|
|
||||||
const unsigned char epd_icons_ocean_logo [] PROGMEM = {
|
|
||||||
// 'ocean_logo', 122x122px
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xfc, 0x00, 0x3f, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xfc, 0x00, 0x7f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xfe, 0x00, 0x7f, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfc, 0x00, 0x7f, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xc0,
|
|
||||||
0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xc0,
|
|
||||||
0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xc0,
|
|
||||||
0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0,
|
|
||||||
0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xc0,
|
|
||||||
0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xc0,
|
|
||||||
0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xc0,
|
|
||||||
0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x3f, 0xc0,
|
|
||||||
0xfe, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x1f, 0xc0,
|
|
||||||
0xfc, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xe0, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x80, 0x00, 0x1f, 0xff, 0xf0, 0x07, 0xc0,
|
|
||||||
0xf8, 0x03, 0xe0, 0x01, 0xff, 0xff, 0xe3, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xf8, 0x00, 0xff, 0xff, 0xe3, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xfc, 0x00, 0x7f, 0xff, 0xe3, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xfe, 0x00, 0x3f, 0xff, 0xe7, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xff, 0x80, 0x1f, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xc0, 0x0f, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xe0, 0x0f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xf8, 0x07, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0xc0,
|
|
||||||
0xfe, 0x0f, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x1f, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xc0,
|
|
||||||
0xff, 0x1f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xc0,
|
|
||||||
0xff, 0x1f, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xc0,
|
|
||||||
0xff, 0x9f, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xc0,
|
|
||||||
0xff, 0xdf, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xfe, 0xff, 0xc0,
|
|
||||||
0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xfe, 0x7f, 0xc0,
|
|
||||||
0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xfe, 0x7f, 0xc0,
|
|
||||||
0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xfe, 0x3f, 0xc0,
|
|
||||||
0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xfc, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xfc, 0x1f, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xfc, 0x1f, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfc, 0x01, 0xff, 0xfc, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfc, 0x00, 0xff, 0xfc, 0x0f, 0xc0,
|
|
||||||
0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0x00, 0x7f, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xf9, 0xff, 0xff, 0x00, 0x1f, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xf1, 0xff, 0xff, 0x80, 0x0f, 0xf8, 0x07, 0xc0,
|
|
||||||
0xf8, 0x07, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xf1, 0xff, 0xff, 0xc0, 0x07, 0xf0, 0x07, 0xc0,
|
|
||||||
0xf8, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xf1, 0xff, 0xff, 0xe0, 0x01, 0xf0, 0x07, 0xc0,
|
|
||||||
0xf8, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xe3, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x01, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x30, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xc0,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xc0,
|
|
||||||
0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xc0,
|
|
||||||
0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xc0,
|
|
||||||
0xfe, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xc0,
|
|
||||||
0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xc0,
|
|
||||||
0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xc0,
|
|
||||||
0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xc0,
|
|
||||||
0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xc0,
|
|
||||||
0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0,
|
|
||||||
0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xc0,
|
|
||||||
0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfc, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0x80, 0x1f, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0x80, 0x0f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0x00, 0x0f, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3c, 0x00, 0x03, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// // 'braiins_pool', 122x250px
|
|
||||||
const unsigned char epd_icons_braiins_logo [] PROGMEM = {
|
|
||||||
// 'braiins-vector-logo', 37x230px
|
|
||||||
0xff, 0xff, 0xf8, 0x0f, 0xf8, 0xff, 0xff, 0xe0, 0x01, 0xf8, 0x01, 0xff, 0xc0, 0x00, 0xf8, 0x01,
|
|
||||||
0xff, 0x80, 0x00, 0x78, 0x01, 0xff, 0x00, 0x00, 0x38, 0x01, 0xff, 0x00, 0x00, 0x18, 0x01, 0xfe,
|
|
||||||
0x00, 0x00, 0x18, 0x01, 0xfe, 0x00, 0x00, 0x18, 0x01, 0xfe, 0x01, 0xf0, 0x08, 0x01, 0xfc, 0x03,
|
|
||||||
0xf8, 0x08, 0x01, 0xfc, 0x03, 0xf8, 0x08, 0x01, 0xfc, 0x07, 0xf8, 0x08, 0x01, 0xfc, 0x07, 0xfc,
|
|
||||||
0x08, 0x01, 0xfc, 0x07, 0xfc, 0x08, 0x01, 0xfc, 0x07, 0xfc, 0x08, 0x01, 0xf8, 0x07, 0xf8, 0x08,
|
|
||||||
0x00, 0xf8, 0x07, 0xf8, 0x08, 0x80, 0xf0, 0x07, 0xf8, 0x08, 0x80, 0x00, 0x0f, 0xf0, 0x08, 0x80,
|
|
||||||
0x00, 0x0f, 0xf0, 0x08, 0xc0, 0x00, 0x0f, 0xe0, 0x18, 0xc0, 0x00, 0x1f, 0xc0, 0x18, 0xe0, 0x00,
|
|
||||||
0x3f, 0xc0, 0x38, 0xf0, 0x00, 0x3f, 0xe0, 0x38, 0xf8, 0x00, 0xff, 0xf0, 0x78, 0xfe, 0x03, 0xff,
|
|
||||||
0xf8, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x00,
|
|
||||||
0x08, 0xff, 0xff, 0xfc, 0x00, 0x08, 0xff, 0xff, 0xf0, 0x00, 0x38, 0xff, 0xff, 0xc0, 0x00, 0xf8,
|
|
||||||
0xff, 0xff, 0x00, 0x03, 0xf8, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0xff, 0xf0, 0x00, 0x1f, 0xf8, 0xff,
|
|
||||||
0xc0, 0x00, 0x7f, 0xf8, 0xff, 0x80, 0x01, 0xff, 0xf8, 0xfe, 0x00, 0x03, 0xff, 0xf8, 0xf8, 0x00,
|
|
||||||
0x0f, 0xff, 0xf8, 0xf0, 0x00, 0x3f, 0xff, 0xf8, 0xc0, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff,
|
|
||||||
0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8,
|
|
||||||
0x08, 0xff, 0xff, 0xff, 0x80, 0x08, 0xff, 0xff, 0xfc, 0x00, 0x08, 0xff, 0xff, 0xc0, 0x00, 0x08,
|
|
||||||
0xff, 0xfe, 0x00, 0x00, 0x08, 0xff, 0xf0, 0x00, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x08, 0xf8,
|
|
||||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00,
|
|
||||||
0x03, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff,
|
|
||||||
0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf0, 0x08, 0xff,
|
|
||||||
0xff, 0xff, 0x80, 0x08, 0xff, 0xff, 0xf8, 0x00, 0x08, 0xff, 0xff, 0xc0, 0x00, 0x08, 0xff, 0xfe,
|
|
||||||
0x00, 0x00, 0x08, 0xff, 0xf0, 0x00, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x08, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0x03, 0xff,
|
|
||||||
0xf8, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf8,
|
|
||||||
0x00, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf0, 0x08, 0xff, 0xff, 0xff,
|
|
||||||
0x00, 0x08, 0xff, 0xff, 0xf8, 0x00, 0x08, 0xff, 0xff, 0xc0, 0x00, 0x08, 0xff, 0xfe, 0x00, 0x00,
|
|
||||||
0x08, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x00, 0x08,
|
|
||||||
0x80, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00,
|
|
||||||
0x00, 0x3f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0xff,
|
|
||||||
0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff,
|
|
||||||
0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff,
|
|
||||||
0xf8, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0xe0, 0x00, 0x00, 0x03, 0xf8, 0xfc, 0x00, 0x00, 0x00, 0x08,
|
|
||||||
0xff, 0xc0, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00, 0x00, 0x08, 0xff,
|
|
||||||
0xff, 0xf0, 0x00, 0x08, 0xff, 0xff, 0xfe, 0x00, 0x08, 0xff, 0xff, 0xff, 0xc0, 0x08, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe8,
|
|
||||||
0xfe, 0x00, 0xff, 0xff, 0x88, 0xf0, 0x00, 0x3f, 0xfe, 0x08, 0xe0, 0x00, 0x1f, 0xf8, 0x08, 0xc0,
|
|
||||||
0x00, 0x0f, 0xe0, 0x08, 0xc0, 0x00, 0x07, 0x80, 0x08, 0x80, 0x00, 0x06, 0x00, 0x08, 0x80, 0x00,
|
|
||||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0x00, 0x00, 0x38, 0x01, 0xff, 0x00,
|
|
||||||
0x00, 0xf8, 0x01, 0xff, 0x00, 0x03, 0xf8, 0x01, 0xff, 0x00, 0x0f, 0xf8, 0x01, 0xff, 0x00, 0x3f,
|
|
||||||
0xf8, 0x01, 0xff, 0x00, 0xff, 0xf8, 0x01, 0xff, 0x01, 0xff, 0xf8, 0x01, 0xff, 0x01, 0xff, 0xf8,
|
|
||||||
0x01, 0xff, 0x01, 0xff, 0xf8, 0x01, 0xff, 0x01, 0xff, 0xf8, 0x01, 0xff, 0x01, 0xff, 0xf8, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xbf, 0xf8, 0xff, 0xff,
|
|
||||||
0xf8, 0x03, 0xf8, 0xf8, 0x07, 0xf0, 0x00, 0xf8, 0xf0, 0x01, 0xe0, 0x00, 0x78, 0xc0, 0x00, 0xc0,
|
|
||||||
0x00, 0x38, 0xc0, 0x00, 0x80, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00,
|
|
||||||
0x18, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0xf0, 0x08, 0x00, 0xfc, 0x07, 0xf8, 0x08,
|
|
||||||
0x01, 0xfc, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01,
|
|
||||||
0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe,
|
|
||||||
0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07, 0xf8, 0x08, 0x01, 0xfe, 0x07,
|
|
||||||
0xf8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x03,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xf8
|
|
||||||
};
|
|
||||||
|
|
||||||
const unsigned char epd_icons_noderunners_logo [] PROGMEM = {
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x01, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x01, 0xff, 0x00, 0x01, 0xfb, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x01, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x01, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x01, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x01, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x01, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xdf, 0xf0, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xdf, 0xf0, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xcf, 0xf8, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xcf, 0xfc, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xc7, 0xfe, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe7, 0xfe, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe3, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe1, 0xff, 0x81, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe1, 0xff, 0x81, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0xff, 0xc1, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x7f, 0xe1, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x3f, 0xe1, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x3f, 0xf1, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x1f, 0xf9, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x0f, 0xf9, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x0f, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x07, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x03, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x01, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe1, 0xc0, 0x00, 0x3f, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe7, 0xf0, 0x00, 0x3f, 0xe0, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x07, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
|
|
||||||
};
|
|
||||||
|
|
||||||
// 'gobrrr', 122x122px
|
|
||||||
const unsigned char epd_icons_gobrrr_logo [] PROGMEM = {
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x48, 0x84, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x24, 0x84, 0x20, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x82, 0x25, 0x19, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf8, 0x28, 0x18, 0x20, 0x41, 0x4c, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xe0, 0x83, 0x21, 0x88, 0x84, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x8c, 0x48, 0x24, 0x09, 0x24, 0x82, 0x60, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x21, 0x08, 0x80, 0x61, 0x08, 0x18, 0x0a, 0x3f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfc, 0x02, 0x22, 0x19, 0x04, 0x42, 0x41, 0x88, 0x0f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x98, 0x82, 0x42, 0x1b, 0x11, 0x04, 0x21, 0x23, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xe2, 0x20, 0x50, 0x42, 0xff, 0xe4, 0x64, 0x24, 0x83, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xc8, 0x46, 0x14, 0x93, 0xff, 0xf8, 0x01, 0x84, 0x28, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0x03, 0x10, 0x81, 0x0f, 0xff, 0xfe, 0x98, 0x11, 0x08, 0x3f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfe, 0x24, 0x01, 0x24, 0x5f, 0xff, 0xff, 0x02, 0x42, 0x42, 0x3f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfc, 0x88, 0xa9, 0x04, 0x3f, 0xff, 0xff, 0x90, 0x48, 0x21, 0x0f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf8, 0x42, 0x22, 0x51, 0xbf, 0xf3, 0xff, 0xc5, 0x09, 0x0c, 0x47, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf3, 0x10, 0x40, 0x00, 0x7f, 0xc0, 0x7f, 0xc4, 0x21, 0x10, 0x93, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe0, 0x25, 0x14, 0xaa, 0xff, 0x0c, 0x1f, 0xc8, 0x84, 0x42, 0x09, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe4, 0x80, 0x04, 0x82, 0xfe, 0x21, 0x0f, 0x82, 0x50, 0x88, 0x63, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x84, 0x4a, 0xc8, 0x11, 0xfc, 0x81, 0x27, 0x21, 0x06, 0x23, 0x00, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x91, 0x10, 0x02, 0x45, 0xfc, 0x18, 0x42, 0x18, 0x3f, 0xf0, 0x18, 0x7f, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x10, 0x91, 0x31, 0x13, 0xf9, 0x42, 0x10, 0x82, 0x7f, 0xfc, 0x82, 0x3f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfe, 0x46, 0x04, 0x04, 0x43, 0xf8, 0x04, 0x8c, 0x21, 0xff, 0xfe, 0x62, 0x1f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0x00, 0x62, 0x42, 0x13, 0xf8, 0xb0, 0x41, 0x0c, 0xff, 0xff, 0x08, 0xcf, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0xa9, 0x08, 0x98, 0x8b, 0xf2, 0x03, 0x10, 0xc3, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xc0,
|
|
||||||
0xff, 0xf8, 0x81, 0x04, 0x80, 0x8b, 0xf2, 0x48, 0x26, 0x13, 0xf8, 0x3f, 0xd5, 0x27, 0xff, 0xc0,
|
|
||||||
0xff, 0xf2, 0x14, 0x61, 0x24, 0x23, 0xf0, 0x88, 0x80, 0x17, 0xf0, 0x0f, 0xc4, 0x23, 0xff, 0xc0,
|
|
||||||
0xff, 0xf0, 0x44, 0x08, 0x05, 0x27, 0xf4, 0x22, 0x17, 0xe7, 0xe5, 0x27, 0xe0, 0x8b, 0xff, 0xc0,
|
|
||||||
0xff, 0xe4, 0x41, 0x86, 0x50, 0x43, 0xf1, 0x04, 0x47, 0xf7, 0xc1, 0x0f, 0xe9, 0x01, 0xff, 0xc0,
|
|
||||||
0xff, 0xc3, 0x18, 0x30, 0x42, 0x13, 0xf9, 0x31, 0x27, 0xf7, 0xd0, 0x43, 0xe1, 0x31, 0xff, 0xc0,
|
|
||||||
0xff, 0xd0, 0x02, 0x01, 0x08, 0x8b, 0xf8, 0x00, 0x8f, 0xef, 0xc6, 0x33, 0xe4, 0x04, 0xff, 0xc0,
|
|
||||||
0xff, 0xc4, 0xa0, 0xc9, 0x22, 0x23, 0xfa, 0x4c, 0x17, 0xef, 0xc0, 0x87, 0xf0, 0xc4, 0xff, 0xc0,
|
|
||||||
0xff, 0x88, 0x8c, 0x08, 0x21, 0x05, 0xfc, 0x41, 0x47, 0xf7, 0xc8, 0x03, 0xe2, 0x10, 0x7f, 0xc0,
|
|
||||||
0xff, 0x82, 0x11, 0x22, 0x0c, 0x51, 0xfc, 0x10, 0x27, 0xe7, 0xc9, 0x5b, 0xe8, 0x12, 0x7f, 0xc0,
|
|
||||||
0xff, 0x24, 0x41, 0x22, 0xc0, 0x83, 0xfe, 0x86, 0x0f, 0xf7, 0xc2, 0x07, 0xe3, 0x42, 0x3f, 0xc0,
|
|
||||||
0xff, 0x09, 0x08, 0x78, 0x3a, 0x28, 0xff, 0x20, 0xc3, 0xf7, 0xe2, 0x27, 0xe0, 0x08, 0xbf, 0xc0,
|
|
||||||
0xfe, 0x40, 0x92, 0x79, 0x38, 0x40, 0xff, 0x88, 0x1f, 0xe7, 0xf0, 0x8f, 0xcc, 0xa1, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x14, 0x27, 0xff, 0xfd, 0x14, 0x7f, 0xe3, 0x3f, 0xf3, 0xf4, 0x9f, 0xc0, 0x24, 0x5f, 0xc0,
|
|
||||||
0xfe, 0x21, 0x0f, 0xff, 0xff, 0xc1, 0x3f, 0xff, 0xff, 0xf3, 0xfe, 0x7f, 0x93, 0x04, 0x1f, 0xc0,
|
|
||||||
0xfc, 0x88, 0xcf, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xf1, 0xff, 0xff, 0x84, 0x49, 0x2f, 0xc0,
|
|
||||||
0xfc, 0x46, 0x0f, 0xff, 0xff, 0xf8, 0x8f, 0xff, 0xff, 0xf0, 0xff, 0xfe, 0x20, 0x40, 0x8f, 0xc0,
|
|
||||||
0xfc, 0x10, 0x27, 0xff, 0xff, 0xfc, 0xa7, 0xff, 0xfe, 0xf2, 0x7f, 0xfe, 0x29, 0x12, 0x1f, 0xc0,
|
|
||||||
0xf9, 0x81, 0x27, 0xf0, 0x2f, 0xfe, 0x01, 0xff, 0xf8, 0x12, 0x3f, 0xf8, 0x82, 0x12, 0x47, 0xc0,
|
|
||||||
0xf8, 0x29, 0x0f, 0xe2, 0x01, 0xff, 0x18, 0x7f, 0xc1, 0x00, 0x87, 0x80, 0x12, 0x40, 0x47, 0xc0,
|
|
||||||
0xfa, 0x22, 0x4f, 0xe8, 0xc4, 0xff, 0x22, 0x00, 0x04, 0x4c, 0x10, 0x25, 0x40, 0x4c, 0x17, 0xc0,
|
|
||||||
0xf8, 0x84, 0x17, 0xe1, 0x10, 0xff, 0x00, 0x80, 0x24, 0x41, 0x40, 0x04, 0x19, 0x01, 0x87, 0xc0,
|
|
||||||
0xf1, 0x11, 0x27, 0xe4, 0x12, 0x7f, 0x4c, 0x24, 0x91, 0x11, 0x0c, 0xd0, 0x81, 0x30, 0x27, 0xc0,
|
|
||||||
0xf4, 0x40, 0x8f, 0xe4, 0x82, 0x7f, 0x11, 0x12, 0x01, 0x12, 0x21, 0x02, 0x44, 0x06, 0x23, 0xc0,
|
|
||||||
0xf0, 0x8c, 0x07, 0xe0, 0xa4, 0xff, 0x13, 0x12, 0x64, 0xc2, 0x42, 0x32, 0x30, 0xc0, 0x8b, 0xc0,
|
|
||||||
0xf2, 0x21, 0x67, 0xea, 0x08, 0xff, 0x7f, 0x4f, 0xcf, 0xe5, 0xfb, 0xf8, 0xfe, 0x18, 0x43, 0xc0,
|
|
||||||
0xf2, 0x10, 0x0f, 0xe0, 0x42, 0xfe, 0x3f, 0xbf, 0xcf, 0xef, 0xfb, 0xf9, 0xfe, 0x03, 0x13, 0xc0,
|
|
||||||
0xf0, 0xc6, 0x27, 0xe5, 0x17, 0xfe, 0xbf, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xfc, 0xa0, 0x27, 0xc0,
|
|
||||||
0xf1, 0x00, 0x87, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xcf, 0xff, 0xf3, 0xff, 0xfe, 0x0c, 0x83, 0xc0,
|
|
||||||
0xf2, 0x28, 0x97, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xcf, 0xff, 0xf9, 0xff, 0xfc, 0x40, 0x4b, 0xc0,
|
|
||||||
0xf0, 0x82, 0x17, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xc7, 0xff, 0xf1, 0xff, 0xfd, 0x23, 0x13, 0xc0,
|
|
||||||
0xe4, 0x12, 0x47, 0xff, 0xff, 0xf8, 0x9f, 0xf3, 0x97, 0xfc, 0xf3, 0xff, 0x5c, 0x24, 0x13, 0xc0,
|
|
||||||
0xf1, 0x48, 0x4f, 0xff, 0xff, 0xfc, 0x7f, 0xc0, 0x07, 0xf0, 0x01, 0xfc, 0x00, 0x84, 0x83, 0xc0,
|
|
||||||
0xf1, 0x01, 0x07, 0xff, 0xff, 0xff, 0x1f, 0xc8, 0x67, 0xf3, 0x0d, 0xfc, 0x82, 0x10, 0x63, 0xc0,
|
|
||||||
0xe4, 0x31, 0x27, 0xe0, 0x03, 0xff, 0x1f, 0xc6, 0x0f, 0xf0, 0x41, 0xfc, 0x52, 0x43, 0x09, 0xc0,
|
|
||||||
0xf0, 0x84, 0x27, 0xe0, 0x08, 0xff, 0x3f, 0x90, 0x87, 0xe4, 0x21, 0xfc, 0x44, 0x48, 0x0b, 0xc0,
|
|
||||||
0xf2, 0x08, 0x8f, 0xec, 0xc0, 0x7f, 0x9f, 0x80, 0x97, 0xf1, 0x8d, 0xf9, 0x09, 0x08, 0xa3, 0xc0,
|
|
||||||
0xf1, 0x48, 0x87, 0xe1, 0x14, 0x7f, 0x9f, 0xcc, 0x27, 0xe4, 0x11, 0xfc, 0x20, 0x22, 0x07, 0xc0,
|
|
||||||
0xf0, 0x42, 0x37, 0xe1, 0x05, 0x3f, 0x9f, 0x91, 0x27, 0xe0, 0x41, 0xfc, 0x84, 0x84, 0x53, 0xc0,
|
|
||||||
0xf2, 0x12, 0x07, 0xe8, 0x60, 0x7f, 0x9f, 0x81, 0x07, 0xf3, 0x09, 0xf8, 0x92, 0x51, 0x03, 0xc0,
|
|
||||||
0xf2, 0x20, 0xcf, 0xe2, 0x09, 0x7f, 0x9f, 0xc8, 0x4f, 0xf0, 0x25, 0xfc, 0x10, 0x02, 0x2b, 0xc0,
|
|
||||||
0xf0, 0x89, 0x07, 0xe4, 0x84, 0x7f, 0x9f, 0x92, 0x27, 0xe4, 0x91, 0xfc, 0x45, 0x88, 0x83, 0xc0,
|
|
||||||
0xf9, 0x08, 0x37, 0xe0, 0x30, 0xff, 0x9f, 0x84, 0x87, 0xe4, 0x83, 0xf9, 0x20, 0x24, 0x4f, 0xc0,
|
|
||||||
0xf8, 0x62, 0x0f, 0xea, 0x43, 0xff, 0x3f, 0xc0, 0x4f, 0xf0, 0x28, 0x99, 0x08, 0x91, 0x07, 0xc0,
|
|
||||||
0xf8, 0x82, 0x4f, 0xf2, 0x4f, 0xff, 0x1f, 0x99, 0x17, 0xf2, 0x4f, 0xef, 0x8a, 0x02, 0x37, 0xc0,
|
|
||||||
0xf9, 0x10, 0x87, 0xff, 0xff, 0xfe, 0x5f, 0xc1, 0x07, 0xe2, 0x1f, 0xff, 0xa0, 0xa4, 0x87, 0xc0,
|
|
||||||
0xf8, 0x44, 0x9f, 0xff, 0xff, 0xfe, 0x1f, 0xc4, 0x67, 0xf0, 0x8f, 0xff, 0x84, 0x10, 0x47, 0xc0,
|
|
||||||
0xfc, 0x12, 0x0f, 0xff, 0xff, 0xfc, 0x9f, 0x90, 0x8f, 0xf4, 0x4f, 0xff, 0x91, 0x42, 0x1f, 0xc0,
|
|
||||||
0xfd, 0x20, 0x67, 0xff, 0xff, 0xf8, 0x5f, 0xc6, 0x07, 0xf1, 0x1f, 0xff, 0x91, 0x09, 0x8f, 0xc0,
|
|
||||||
0xfc, 0x49, 0x0f, 0xff, 0xff, 0xe1, 0x1f, 0xc0, 0x57, 0xf0, 0x8f, 0xff, 0x84, 0x24, 0x2f, 0xc0,
|
|
||||||
0xfc, 0x42, 0x0f, 0xfb, 0x7e, 0x04, 0x3f, 0x19, 0x07, 0xc6, 0x2f, 0xff, 0xa4, 0x90, 0x0f, 0xc0,
|
|
||||||
0xfe, 0x10, 0xa0, 0x78, 0x78, 0x90, 0x80, 0x01, 0x20, 0x00, 0x0f, 0xff, 0x88, 0x42, 0xdf, 0xc0,
|
|
||||||
0xfe, 0x84, 0x80, 0x38, 0x38, 0x86, 0x00, 0xc4, 0x20, 0x29, 0x40, 0x00, 0x42, 0x08, 0x1f, 0xc0,
|
|
||||||
0xfe, 0x24, 0x12, 0x02, 0x02, 0x20, 0x64, 0x10, 0x8c, 0x81, 0x13, 0xfc, 0x11, 0x89, 0x3f, 0xc0,
|
|
||||||
0xff, 0x11, 0x24, 0xc2, 0x90, 0x22, 0x09, 0x26, 0x10, 0x94, 0x24, 0xf9, 0x88, 0x21, 0x3f, 0xc0,
|
|
||||||
0xff, 0x41, 0x21, 0x10, 0x85, 0x89, 0x88, 0x20, 0x42, 0x10, 0x80, 0xf2, 0x22, 0x24, 0x3f, 0xc0,
|
|
||||||
0xff, 0x8c, 0x08, 0x11, 0x24, 0x08, 0x22, 0x89, 0x22, 0x42, 0x4a, 0x64, 0x10, 0x84, 0xff, 0xc0,
|
|
||||||
0xff, 0x80, 0xc4, 0x88, 0x10, 0x42, 0x02, 0x08, 0x88, 0x49, 0x10, 0x09, 0x44, 0x90, 0x7f, 0xc0,
|
|
||||||
0xff, 0xd2, 0x17, 0xef, 0xdf, 0xff, 0xfd, 0xf6, 0xff, 0xff, 0xff, 0xc0, 0x08, 0x12, 0xff, 0xc0,
|
|
||||||
0xff, 0xc2, 0x1b, 0x76, 0xed, 0xb5, 0xb7, 0x77, 0x66, 0xb6, 0x6d, 0xe4, 0xa3, 0x02, 0xff, 0xc0,
|
|
||||||
0xff, 0xe8, 0xdb, 0x5b, 0x36, 0x6d, 0xb6, 0xd9, 0xbb, 0xad, 0xb6, 0x64, 0x20, 0x61, 0xff, 0xc0,
|
|
||||||
0xff, 0xe0, 0x1d, 0xdb, 0xdb, 0xce, 0x6d, 0xbe, 0xdb, 0x6d, 0xb7, 0xb1, 0x0c, 0x0d, 0xff, 0xc0,
|
|
||||||
0xff, 0xf5, 0x06, 0xdc, 0xdb, 0x73, 0xdb, 0x66, 0xdc, 0xdb, 0x6d, 0x81, 0x11, 0x83, 0xff, 0xc0,
|
|
||||||
0xff, 0xf1, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x48, 0x40, 0x33, 0xff, 0xc0,
|
|
||||||
0xff, 0xf8, 0x25, 0x26, 0xac, 0x89, 0x2c, 0xb3, 0x26, 0x26, 0x9a, 0x4c, 0xca, 0x07, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xbc, 0x8f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfc, 0x9a, 0xd9, 0x53, 0x66, 0xd3, 0x4c, 0xd9, 0x99, 0x6d, 0xb6, 0xe6, 0x3f, 0xff, 0xc0,
|
|
||||||
0xff, 0xfe, 0x1b, 0x6f, 0x7d, 0xbb, 0x7d, 0xf7, 0x6e, 0xef, 0x6d, 0xbb, 0x7a, 0x1f, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x4d, 0xb3, 0xa6, 0xdb, 0x4d, 0x37, 0x6e, 0xed, 0xb6, 0xcd, 0x98, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x26, 0xdc, 0xfb, 0x6d, 0xf7, 0xd9, 0xb3, 0x35, 0xb6, 0xf6, 0xec, 0x3f, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe4, 0x22, 0x04, 0x92, 0x08, 0x24, 0x48, 0x88, 0x49, 0x09, 0x11, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xe2, 0x48, 0x90, 0x00, 0x82, 0x04, 0x84, 0x92, 0x00, 0x40, 0x45, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf8, 0x84, 0x93, 0x29, 0x31, 0x90, 0x91, 0x11, 0x96, 0x14, 0x87, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xf9, 0x21, 0x00, 0x44, 0x04, 0x22, 0x10, 0x44, 0x10, 0x91, 0x2f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfe, 0x08, 0x4c, 0x44, 0x90, 0x22, 0x46, 0x00, 0x40, 0x82, 0x1f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xfe, 0x92, 0x21, 0x10, 0x84, 0x88, 0x40, 0xaa, 0x4a, 0x24, 0x9f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0x81, 0x01, 0x02, 0x22, 0x09, 0x18, 0x21, 0x08, 0x20, 0x7f, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xcc, 0x54, 0x62, 0x28, 0xc1, 0x03, 0x04, 0x21, 0x8a, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf0, 0x84, 0x08, 0x81, 0x14, 0x60, 0x48, 0x84, 0x0b, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x89, 0x08, 0x44, 0x10, 0x0c, 0x22, 0x50, 0x67, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xfe, 0x20, 0xc3, 0x12, 0x43, 0x01, 0x84, 0x06, 0x1f, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x06, 0x10, 0x20, 0x88, 0x60, 0x11, 0x20, 0xbf, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xd0, 0x11, 0x24, 0x20, 0x8c, 0x48, 0x91, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xf1, 0x44, 0x43, 0x0c, 0x01, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xfc, 0x08, 0x90, 0x41, 0x31, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x22, 0x04, 0x31, 0x04, 0x05, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x21, 0x84, 0x42, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x28, 0x04, 0x48, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x51, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 8032)
|
// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 8032)
|
||||||
const int epd_icons_allArray_LEN = 8;
|
const int epd_icons_allArray_LEN = 4;
|
||||||
const unsigned char* epd_icons_allArray[epd_icons_allArray_LEN] = {
|
const unsigned char* epd_icons_allArray[epd_icons_allArray_LEN] = {
|
||||||
epd_icons_pickaxe,
|
epd_icons_pickaxe,
|
||||||
epd_icons_rocket_launch,
|
epd_icons_rocket_launch,
|
||||||
epd_icons_lightning_bolt,
|
epd_icons_lightning_bolt,
|
||||||
epd_icons_bitaxe_logo,
|
epd_icons_bitaxe_logo
|
||||||
epd_icons_ocean_logo,
|
|
||||||
epd_icons_braiins_logo,
|
|
||||||
epd_icons_noderunners_logo,
|
|
||||||
epd_icons_gobrrr_logo
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -296,45 +296,27 @@ void restartBlockNotify()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int getBlockFetch()
|
int getBlockFetch() {
|
||||||
{
|
try {
|
||||||
try {
|
String mempoolInstance = preferences.getString("mempoolInstance", DEFAULT_MEMPOOL_INSTANCE);
|
||||||
WiFiClientSecure client;
|
const String protocol = preferences.getBool("mempoolSecure", DEFAULT_MEMPOOL_SECURE) ? "https" : "http";
|
||||||
|
String url = protocol + "://" + mempoolInstance + "/api/blocks/tip/height";
|
||||||
|
|
||||||
if (preferences.getBool("mempoolSecure", DEFAULT_MEMPOOL_SECURE)) {
|
HTTPClient* http = HttpHelper::begin(url);
|
||||||
client.setCACertBundle(rootca_crt_bundle_start);
|
Serial.println("Fetching block height from " + url);
|
||||||
|
int httpCode = http->GET();
|
||||||
|
|
||||||
|
if (httpCode > 0 && httpCode == HTTP_CODE_OK) {
|
||||||
|
String blockHeightStr = http->getString();
|
||||||
|
HttpHelper::end(http);
|
||||||
|
return blockHeightStr.toInt();
|
||||||
|
}
|
||||||
|
HttpHelper::end(http);
|
||||||
|
Serial.println("HTTP code" + String(httpCode));
|
||||||
|
} catch (...) {
|
||||||
|
Serial.println(F("An exception occurred while trying to get the latest block"));
|
||||||
}
|
}
|
||||||
|
return 2203; // B-T-C
|
||||||
String mempoolInstance =
|
|
||||||
preferences.getString("mempoolInstance", DEFAULT_MEMPOOL_INSTANCE);
|
|
||||||
|
|
||||||
// Get current block height through regular API
|
|
||||||
HTTPClient http;
|
|
||||||
|
|
||||||
const String protocol = preferences.getBool("mempoolSecure", DEFAULT_MEMPOOL_SECURE) ? "https" : "http";
|
|
||||||
|
|
||||||
if (preferences.getBool("mempoolSecure", DEFAULT_MEMPOOL_SECURE))
|
|
||||||
http.begin(client, protocol + "://" + mempoolInstance + "/api/blocks/tip/height");
|
|
||||||
else
|
|
||||||
http.begin(protocol + "://" + mempoolInstance + "/api/blocks/tip/height");
|
|
||||||
|
|
||||||
Serial.println("Fetching block height from " + protocol + "://" + mempoolInstance + "/api/blocks/tip/height");
|
|
||||||
int httpCode = http.GET();
|
|
||||||
|
|
||||||
if (httpCode > 0 && httpCode == HTTP_CODE_OK)
|
|
||||||
{
|
|
||||||
String blockHeightStr = http.getString();
|
|
||||||
return blockHeightStr.toInt();
|
|
||||||
} else {
|
|
||||||
Serial.println("HTTP code" + String(httpCode));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
Serial.println(F("An exception occured while trying to get the latest block"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 2203; // B-T-C
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint getLastBlockUpdate()
|
uint getLastBlockUpdate()
|
||||||
|
|
|
@ -439,15 +439,19 @@ void setupHardware()
|
||||||
Serial.println(F("Error loading WebUI"));
|
Serial.println(F("Error loading WebUI"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (!LittleFS.exists("/qr.txt"))
|
|
||||||
// {
|
// {
|
||||||
// File f = LittleFS.open("/qr.txt", "w");
|
// File f = LittleFS.open("/qr.txt", "w");
|
||||||
|
|
||||||
// if(f) {
|
// if(f) {
|
||||||
|
// if (f.print("Hello")) {
|
||||||
|
// Serial.println(F("Written QR to FS"));
|
||||||
|
// Serial.printf("\nLittleFS free: %zu\n", LittleFS.totalBytes() - LittleFS.usedBytes());
|
||||||
|
// }
|
||||||
// } else {
|
// } else {
|
||||||
// Serial.println(F("Can't write QR to FS"));
|
// Serial.println(F("Can't write QR to FS"));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// f.close();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
setupLeds();
|
setupLeds();
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
|
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define DEFAULT_TIME_OFFSET_SECONDS 3600
|
#define DEFAULT_TIME_OFFSET_SECONDS 3600
|
||||||
#define USER_AGENT "BTClock/3.0"
|
|
||||||
#ifndef MCP_DEV_ADDR
|
#ifndef MCP_DEV_ADDR
|
||||||
#define MCP_DEV_ADDR 0x20
|
#define MCP_DEV_ADDR 0x20
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -75,3 +75,5 @@
|
||||||
|
|
||||||
#define DEFAULT_GIT_RELEASE_URL "https://git.btclock.dev/api/v1/repos/btclock/btclock_v3/releases/latest"
|
#define DEFAULT_GIT_RELEASE_URL "https://git.btclock.dev/api/v1/repos/btclock/btclock_v3/releases/latest"
|
||||||
#define DEFAULT_VERTICAL_DESC true
|
#define DEFAULT_VERTICAL_DESC true
|
||||||
|
|
||||||
|
#define DEFAULT_MINING_POOL_LOGOS_URL "https://git.btclock.dev/btclock/mining-pool-logos/raw/branch/main"
|
||||||
|
|
159
src/lib/epd.cpp
159
src/lib/epd.cpp
|
@ -138,6 +138,9 @@ uint8_t qrcode[800];
|
||||||
#define EPD_TASK_STACK_SIZE 2048
|
#define EPD_TASK_STACK_SIZE 2048
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define BUSY_TIMEOUT_COUNT 200
|
||||||
|
#define BUSY_RETRY_DELAY pdMS_TO_TICKS(10)
|
||||||
|
|
||||||
void forceFullRefresh()
|
void forceFullRefresh()
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < NUM_SCREENS; i++)
|
for (uint i = 0; i < NUM_SCREENS; i++)
|
||||||
|
@ -176,7 +179,7 @@ void setupDisplays()
|
||||||
|
|
||||||
updateQueue = xQueueCreate(UPDATE_QUEUE_SIZE, sizeof(UpdateDisplayTaskItem));
|
updateQueue = xQueueCreate(UPDATE_QUEUE_SIZE, sizeof(UpdateDisplayTaskItem));
|
||||||
|
|
||||||
xTaskCreate(prepareDisplayUpdateTask, "PrepareUpd", EPD_TASK_STACK_SIZE, NULL, 11, NULL);
|
xTaskCreate(prepareDisplayUpdateTask, "PrepareUpd", EPD_TASK_STACK_SIZE*2, NULL, 11, NULL);
|
||||||
|
|
||||||
for (uint i = 0; i < NUM_SCREENS; i++)
|
for (uint i = 0; i < NUM_SCREENS; i++)
|
||||||
{
|
{
|
||||||
|
@ -275,7 +278,10 @@ void prepareDisplayUpdateTask(void *pvParameters)
|
||||||
}
|
}
|
||||||
else if (epdContent[epdIndex].startsWith(F("mdi")))
|
else if (epdContent[epdIndex].startsWith(F("mdi")))
|
||||||
{
|
{
|
||||||
renderIcon(epdIndex, epdContent[epdIndex], updatePartial);
|
bool updated = renderIcon(epdIndex, epdContent[epdIndex], updatePartial);
|
||||||
|
if (!updated) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (epdContent[epdIndex].length() > 5)
|
else if (epdContent[epdIndex].length() > 5)
|
||||||
{
|
{
|
||||||
|
@ -414,89 +420,36 @@ void splitText(const uint dispNum, const String &top, const String &bottom,
|
||||||
displays[dispNum].print(bottom);
|
displays[dispNum].print(bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
// void showChars(const uint dispNum, const String &chars, bool partial,
|
// Consolidate common display setup code into a helper function
|
||||||
// const GFXfont *font)
|
void setupDisplay(const uint dispNum, const GFXfont *font) {
|
||||||
// {
|
displays[dispNum].setRotation(2);
|
||||||
// displays[dispNum].setRotation(2);
|
displays[dispNum].setFont(font);
|
||||||
// displays[dispNum].setFont(font);
|
displays[dispNum].setTextColor(getFgColor());
|
||||||
// displays[dispNum].setTextColor(getFgColor());
|
displays[dispNum].fillScreen(getBgColor());
|
||||||
// int16_t tbx, tby;
|
}
|
||||||
// uint16_t tbw, tbh;
|
|
||||||
|
|
||||||
// displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh);
|
void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font) {
|
||||||
|
String str(chr);
|
||||||
|
if (chr == '.') {
|
||||||
|
str = "!";
|
||||||
|
}
|
||||||
|
|
||||||
|
setupDisplay(dispNum, font);
|
||||||
|
|
||||||
|
int16_t tbx, tby;
|
||||||
|
uint16_t tbw, tbh;
|
||||||
|
displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||||
|
|
||||||
// // center the bounding box by transposition of the origin:
|
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
|
||||||
// uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
|
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
|
||||||
// uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
|
|
||||||
|
|
||||||
// displays[dispNum].fillScreen(getBgColor());
|
displays[dispNum].setCursor(x, y);
|
||||||
|
displays[dispNum].print(str);
|
||||||
|
|
||||||
// displays[dispNum].setCursor(x, y);
|
if (chr == '.') {
|
||||||
// displays[dispNum].print(chars);
|
displays[dispNum].fillRect(x, y, displays[dispNum].width(),
|
||||||
|
round(displays[dispNum].height() * 0.9), getBgColor());
|
||||||
// // displays[dispNum].setCursor(10, 3);
|
}
|
||||||
// // displays[dispNum].setFont(&FONT_SMALL);
|
|
||||||
// // displays[dispNum].setTextColor(getFgColor());
|
|
||||||
// // displays[dispNum].println("Y = " + y);
|
|
||||||
// }
|
|
||||||
|
|
||||||
void showDigit(const uint dispNum, char chr, bool partial,
|
|
||||||
const GFXfont *font)
|
|
||||||
{
|
|
||||||
String str(chr);
|
|
||||||
|
|
||||||
if (chr == '.')
|
|
||||||
{
|
|
||||||
str = "!";
|
|
||||||
}
|
|
||||||
displays[dispNum].setRotation(2);
|
|
||||||
displays[dispNum].setFont(font);
|
|
||||||
displays[dispNum].setTextColor(getFgColor());
|
|
||||||
int16_t tbx, tby;
|
|
||||||
uint16_t tbw, tbh;
|
|
||||||
|
|
||||||
displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
|
|
||||||
|
|
||||||
// center the bounding box by transposition of the origin:
|
|
||||||
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
|
|
||||||
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
|
|
||||||
|
|
||||||
// if (str.equals("."))
|
|
||||||
// {
|
|
||||||
// // int16_t yAdvance = font->yAdvance;
|
|
||||||
// // uint8_t charIndex = 46 - font->first;
|
|
||||||
// // GFXglyph *glyph = (&font->glyph)[charIndex];
|
|
||||||
// int16_t tbx2, tby2;
|
|
||||||
// uint16_t tbw2, tbh2;
|
|
||||||
// displays[dispNum].getTextBounds(".!", 0, 0, &tbx2, &tby2, &tbw2, &tbh2);
|
|
||||||
|
|
||||||
// y = ((displays[dispNum].height() - tbh2) / 2) - tby2;
|
|
||||||
// // Serial.print("yAdvance");
|
|
||||||
// // Serial.println(yAdvance);
|
|
||||||
// // if (glyph != nullptr) {
|
|
||||||
// // Serial.print("height");
|
|
||||||
// // Serial.println(glyph->height);
|
|
||||||
// // Serial.print("yOffset");
|
|
||||||
// // Serial.println(glyph->yOffset);
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// // y = 250-99+18+19;
|
|
||||||
// }
|
|
||||||
|
|
||||||
displays[dispNum].fillScreen(getBgColor());
|
|
||||||
|
|
||||||
displays[dispNum].setCursor(x, y);
|
|
||||||
displays[dispNum].print(str);
|
|
||||||
|
|
||||||
if (chr == '.')
|
|
||||||
{
|
|
||||||
displays[dispNum].fillRect(x, y, displays[dispNum].width(), round(displays[dispNum].height() * 0.9), getBgColor());
|
|
||||||
}
|
|
||||||
|
|
||||||
// displays[dispNum].setCursor(10, 3);
|
|
||||||
// displays[dispNum].setFont(&FONT_SMALL);
|
|
||||||
// displays[dispNum].setTextColor(getFgColor());
|
|
||||||
// displays[dispNum].println("Y = " + y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t calculateDescent(const GFXfont *font) {
|
int16_t calculateDescent(const GFXfont *font) {
|
||||||
|
@ -514,21 +467,16 @@ int16_t calculateDescent(const GFXfont *font) {
|
||||||
void showChars(const uint dispNum, const String &chars, bool partial,
|
void showChars(const uint dispNum, const String &chars, bool partial,
|
||||||
const GFXfont *font)
|
const GFXfont *font)
|
||||||
{
|
{
|
||||||
displays[dispNum].setRotation(2);
|
setupDisplay(dispNum, font);
|
||||||
displays[dispNum].setFont(font);
|
|
||||||
displays[dispNum].setTextColor(getFgColor());
|
|
||||||
int16_t tbx, tby;
|
int16_t tbx, tby;
|
||||||
uint16_t tbw, tbh;
|
uint16_t tbw, tbh;
|
||||||
displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh);
|
displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||||
|
|
||||||
int16_t descent = calculateDescent(font);
|
|
||||||
|
|
||||||
// center the bounding box by transposition of the origin:
|
// center the bounding box by transposition of the origin:
|
||||||
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
|
uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx;
|
||||||
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
|
uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby;
|
||||||
displays[dispNum].fillScreen(getBgColor());
|
|
||||||
// displays[dispNum].setCursor(x, y);
|
|
||||||
// displays[dispNum].print(chars);
|
|
||||||
|
|
||||||
for (int i = 0; i < chars.length(); i++) {
|
for (int i = 0; i < chars.length(); i++) {
|
||||||
char c = chars[i];
|
char c = chars[i];
|
||||||
|
@ -594,14 +542,14 @@ void renderText(const uint dispNum, const String &text, bool partial)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderIcon(const uint dispNum, const String &text, bool partial)
|
bool renderIcon(const uint dispNum, const String &text, bool partial)
|
||||||
{
|
{
|
||||||
displays[dispNum].setRotation(2);
|
displays[dispNum].setRotation(2);
|
||||||
|
|
||||||
displays[dispNum].setPartialWindow(0, 0, displays[dispNum].width(),
|
displays[dispNum].setPartialWindow(0, 0, displays[dispNum].width(),
|
||||||
displays[dispNum].height());
|
displays[dispNum].height());
|
||||||
displays[dispNum].fillScreen(getBgColor());
|
displays[dispNum].fillScreen(getBgColor());
|
||||||
displays[dispNum].setTextColor(getFgColor());
|
displays[dispNum].setTextColor(getFgColor());
|
||||||
|
|
||||||
uint iconIndex = 0;
|
uint iconIndex = 0;
|
||||||
uint width = 122;
|
uint width = 122;
|
||||||
|
@ -620,12 +568,17 @@ void renderIcon(const uint dispNum, const String &text, bool partial)
|
||||||
else if (text.endsWith("miningpool")) {
|
else if (text.endsWith("miningpool")) {
|
||||||
LogoData logo = getMiningPoolLogo();
|
LogoData logo = getMiningPoolLogo();
|
||||||
|
|
||||||
|
if (logo.size == 0) {
|
||||||
|
Serial.println("No logo found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int x_offset = (displays[dispNum].width() - logo.width) / 2;
|
int x_offset = (displays[dispNum].width() - logo.width) / 2;
|
||||||
int y_offset = (displays[dispNum].height() - logo.height) / 2;
|
int y_offset = (displays[dispNum].height() - logo.height) / 2;
|
||||||
// Close the file
|
// Close the file
|
||||||
|
|
||||||
displays[dispNum].drawInvertedBitmap(x_offset,y_offset, logo.data, logo.width, logo.height, getFgColor());
|
displays[dispNum].drawInvertedBitmap(x_offset,y_offset, logo.data, logo.width, logo.height, getFgColor());
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -635,15 +588,12 @@ void renderIcon(const uint dispNum, const String &text, bool partial)
|
||||||
|
|
||||||
displays[dispNum].drawInvertedBitmap(x_offset,y_offset, epd_icons_allArray[iconIndex], width, height, getFgColor());
|
displays[dispNum].drawInvertedBitmap(x_offset,y_offset, epd_icons_allArray[iconIndex], width, height, getFgColor());
|
||||||
|
|
||||||
|
return true;
|
||||||
// displays[dispNum].drawInvertedBitmap(0,0, getOceanIcon(), 122, 250, getFgColor());
|
// displays[dispNum].drawInvertedBitmap(0,0, getOceanIcon(), 122, 250, getFgColor());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void renderQr(const uint dispNum, const String &text, bool partial)
|
void renderQr(const uint dispNum, const String &text, bool partial)
|
||||||
{
|
{
|
||||||
#ifdef USE_QR
|
#ifdef USE_QR
|
||||||
|
@ -687,15 +637,12 @@ void waitUntilNoneBusy()
|
||||||
while (EPD_BUSY[i].digitalRead())
|
while (EPD_BUSY[i].digitalRead())
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
vTaskDelay(10);
|
vTaskDelay(BUSY_RETRY_DELAY);
|
||||||
if (count == 200)
|
|
||||||
{
|
if (count == BUSY_TIMEOUT_COUNT) {
|
||||||
// displays[i].init(0, false);
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
vTaskDelay(100);
|
} else if (count > BUSY_TIMEOUT_COUNT + 5) {
|
||||||
}
|
log_e("Display %d busy timeout", i);
|
||||||
else if (count > 205)
|
|
||||||
{
|
|
||||||
Serial.printf("Busy timeout %d", i);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ int getFgColor();
|
||||||
void setBgColor(int color);
|
void setBgColor(int color);
|
||||||
void setFgColor(int color);
|
void setFgColor(int color);
|
||||||
|
|
||||||
void renderIcon(const uint dispNum, const String &text, bool partial);
|
bool renderIcon(const uint dispNum, const String &text, bool partial);
|
||||||
void renderText(const uint dispNum, const String &text, bool partial);
|
void renderText(const uint dispNum, const String &text, bool partial);
|
||||||
void renderQr(const uint dispNum, const String &text, bool partial);
|
void renderQr(const uint dispNum, const String &text, bool partial);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,13 @@ std::string BraiinsPool::getApiUrl() const {
|
||||||
|
|
||||||
PoolStats BraiinsPool::parseResponse(const JsonDocument &doc) const
|
PoolStats BraiinsPool::parseResponse(const JsonDocument &doc) const
|
||||||
{
|
{
|
||||||
|
if (doc["btc"].isNull()) {
|
||||||
|
return PoolStats{
|
||||||
|
.hashrate = "0",
|
||||||
|
.dailyEarnings = 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
std::string unit = doc["btc"]["hash_rate_unit"].as<std::string>();
|
std::string unit = doc["btc"]["hash_rate_unit"].as<std::string>();
|
||||||
|
|
||||||
static const std::unordered_map<std::string, int> multipliers = {
|
static const std::unordered_map<std::string, int> multipliers = {
|
||||||
|
@ -23,10 +30,3 @@ PoolStats BraiinsPool::parseResponse(const JsonDocument &doc) const
|
||||||
.dailyEarnings = static_cast<int64_t>(doc["btc"]["today_reward"].as<float>() * 100000000)};
|
.dailyEarnings = static_cast<int64_t>(doc["btc"]["today_reward"].as<float>() * 100000000)};
|
||||||
}
|
}
|
||||||
|
|
||||||
LogoData BraiinsPool::getLogo() const {
|
|
||||||
return LogoData{
|
|
||||||
.data = epd_icons_allArray[5],
|
|
||||||
.width = 37,
|
|
||||||
.height = 230
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -11,9 +11,23 @@ public:
|
||||||
void prepareRequest(HTTPClient &http) const override;
|
void prepareRequest(HTTPClient &http) const override;
|
||||||
std::string getApiUrl() const override;
|
std::string getApiUrl() const override;
|
||||||
PoolStats parseResponse(const JsonDocument &doc) const override;
|
PoolStats parseResponse(const JsonDocument &doc) const override;
|
||||||
LogoData getLogo() const override;
|
|
||||||
bool supportsDailyEarnings() const override { return true; }
|
bool supportsDailyEarnings() const override { return true; }
|
||||||
bool hasLogo() const override { return true; }
|
bool hasLogo() const override { return true; }
|
||||||
std::string getDisplayLabel() const override { return "BRAIINS/POOL"; } // Fallback if needed
|
std::string getDisplayLabel() const override { return "BRAIINS/POOL"; } // Fallback if needed
|
||||||
std::string getDailyEarningsLabel() const override { return "sats/earned"; }
|
std::string getDailyEarningsLabel() const override { return "sats/earned"; }
|
||||||
|
std::string getLogoFilename() const override {
|
||||||
|
return "braiins.bin";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getPoolName() const override {
|
||||||
|
return "braiins";
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoWidth() const override {
|
||||||
|
return 37;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoHeight() const override {
|
||||||
|
return 230;
|
||||||
|
}
|
||||||
};
|
};
|
|
@ -3,12 +3,4 @@
|
||||||
|
|
||||||
std::string GoBrrrPool::getApiUrl() const {
|
std::string GoBrrrPool::getApiUrl() const {
|
||||||
return "https://pool.gobrrr.me/api/client/" + poolUser;
|
return "https://pool.gobrrr.me/api/client/" + poolUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogoData GoBrrrPool::getLogo() const {
|
|
||||||
return LogoData {
|
|
||||||
.data = epd_icons_allArray[7],
|
|
||||||
.width = 122,
|
|
||||||
.height = 122
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -11,5 +11,20 @@ public:
|
||||||
std::string getApiUrl() const override;
|
std::string getApiUrl() const override;
|
||||||
bool hasLogo() const override { return true; }
|
bool hasLogo() const override { return true; }
|
||||||
std::string getDisplayLabel() const override { return "GOBRRR/POOL"; }
|
std::string getDisplayLabel() const override { return "GOBRRR/POOL"; }
|
||||||
LogoData getLogo() const override;
|
|
||||||
|
std::string getLogoFilename() const override {
|
||||||
|
return "gobrrr.bin";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getPoolName() const override {
|
||||||
|
return "gobrrr_pool";
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoWidth() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoHeight() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
};
|
};
|
|
@ -6,5 +6,6 @@
|
||||||
struct LogoData {
|
struct LogoData {
|
||||||
const uint8_t* data;
|
const uint8_t* data;
|
||||||
size_t width;
|
size_t width;
|
||||||
size_t height;
|
size_t height;
|
||||||
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
18
src/lib/mining_pool/mining_pool_interface.cpp
Normal file
18
src/lib/mining_pool/mining_pool_interface.cpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include "mining_pool_interface.hpp"
|
||||||
|
#include "pool_factory.hpp"
|
||||||
|
|
||||||
|
LogoData MiningPoolInterface::getLogo() const {
|
||||||
|
if (!hasLogo()) {
|
||||||
|
return LogoData{nullptr, 0, 0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if logo exists
|
||||||
|
String logoPath = String(PoolFactory::getLogosDir()) + "/" + String(getPoolName().c_str()) + "_logo.bin";
|
||||||
|
|
||||||
|
if (!LittleFS.exists(logoPath)) {
|
||||||
|
return LogoData{nullptr, 0, 0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now load the logo (whether it was just downloaded or already existed)
|
||||||
|
return PoolFactory::loadLogoFromFS(getPoolName(), this);
|
||||||
|
}
|
|
@ -4,6 +4,7 @@
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include "pool_stats.hpp"
|
#include "pool_stats.hpp"
|
||||||
#include "logo_data.hpp"
|
#include "logo_data.hpp"
|
||||||
|
#include "lib/shared.hpp"
|
||||||
|
|
||||||
class MiningPoolInterface {
|
class MiningPoolInterface {
|
||||||
public:
|
public:
|
||||||
|
@ -13,10 +14,21 @@ public:
|
||||||
virtual std::string getApiUrl() const = 0;
|
virtual std::string getApiUrl() const = 0;
|
||||||
virtual PoolStats parseResponse(const JsonDocument& doc) const = 0;
|
virtual PoolStats parseResponse(const JsonDocument& doc) const = 0;
|
||||||
virtual bool hasLogo() const = 0;
|
virtual bool hasLogo() const = 0;
|
||||||
virtual LogoData getLogo() const = 0;
|
virtual LogoData getLogo() const;
|
||||||
virtual std::string getDisplayLabel() const = 0;
|
virtual std::string getDisplayLabel() const = 0;
|
||||||
virtual bool supportsDailyEarnings() const = 0;
|
virtual bool supportsDailyEarnings() const = 0;
|
||||||
virtual std::string getDailyEarningsLabel() const = 0;
|
virtual std::string getDailyEarningsLabel() const = 0;
|
||||||
|
virtual std::string getLogoFilename() const { return ""; }
|
||||||
|
virtual std::string getPoolName() const = 0;
|
||||||
|
virtual int getLogoWidth() const { return 0; }
|
||||||
|
virtual int getLogoHeight() const { return 0; }
|
||||||
|
std::string getLogoUrl() const {
|
||||||
|
if (!hasLogo() || getLogoFilename().empty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
std::string baseUrl = preferences.getString("poolLogosUrl", DEFAULT_MINING_POOL_LOGOS_URL).c_str();
|
||||||
|
return baseUrl + "/" + getLogoFilename().c_str();
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string poolUser;
|
std::string poolUser;
|
||||||
|
|
|
@ -24,12 +24,4 @@ PoolStats NoderunnersPool::parseResponse(const JsonDocument& doc) const {
|
||||||
.hashrate = buffer,
|
.hashrate = buffer,
|
||||||
.dailyEarnings = std::nullopt
|
.dailyEarnings = std::nullopt
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
LogoData NoderunnersPool::getLogo() const {
|
|
||||||
return LogoData {
|
|
||||||
.data = epd_icons_allArray[6],
|
|
||||||
.width = 122,
|
|
||||||
.height = 122
|
|
||||||
};
|
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "lib/mining_pool/mining_pool_interface.hpp"
|
#include "lib/mining_pool/mining_pool_interface.hpp"
|
||||||
|
@ -12,9 +11,23 @@ public:
|
||||||
void prepareRequest(HTTPClient& http) const override;
|
void prepareRequest(HTTPClient& http) const override;
|
||||||
std::string getApiUrl() const override;
|
std::string getApiUrl() const override;
|
||||||
PoolStats parseResponse(const JsonDocument& doc) const override;
|
PoolStats parseResponse(const JsonDocument& doc) const override;
|
||||||
LogoData getLogo() const override;
|
|
||||||
bool supportsDailyEarnings() const override { return false; }
|
bool supportsDailyEarnings() const override { return false; }
|
||||||
std::string getDailyEarningsLabel() const override { return ""; }
|
std::string getDailyEarningsLabel() const override { return ""; }
|
||||||
bool hasLogo() const override { return true; }
|
bool hasLogo() const override { return true; }
|
||||||
std::string getDisplayLabel() const override { return "NODE/RUNNERS"; } // Fallback if needed
|
std::string getDisplayLabel() const override { return "NODE/RUNNERS"; } // Fallback if needed
|
||||||
|
std::string getLogoFilename() const override {
|
||||||
|
return "noderunners.bin";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getPoolName() const override {
|
||||||
|
return "noderunners";
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoWidth() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoHeight() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
};
|
};
|
|
@ -16,11 +16,3 @@ PoolStats OceanPool::parseResponse(const JsonDocument& doc) const {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
LogoData OceanPool::getLogo() const {
|
|
||||||
return LogoData{
|
|
||||||
.data = epd_icons_allArray[4],
|
|
||||||
.width = 122,
|
|
||||||
.height = 122
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -9,10 +9,23 @@ public:
|
||||||
void prepareRequest(HTTPClient& http) const override;
|
void prepareRequest(HTTPClient& http) const override;
|
||||||
std::string getApiUrl() const override;
|
std::string getApiUrl() const override;
|
||||||
PoolStats parseResponse(const JsonDocument& doc) const override;
|
PoolStats parseResponse(const JsonDocument& doc) const override;
|
||||||
LogoData getLogo() const override;
|
|
||||||
bool hasLogo() const override { return true; }
|
bool hasLogo() const override { return true; }
|
||||||
std::string getDisplayLabel() const override { return "OCEAN/POOL"; } // Fallback if needed
|
std::string getDisplayLabel() const override { return "OCEAN/POOL"; } // Fallback if needed
|
||||||
bool supportsDailyEarnings() const override { return true; }
|
bool supportsDailyEarnings() const override { return true; }
|
||||||
std::string getDailyEarningsLabel() const override { return "sats/block"; }
|
std::string getDailyEarningsLabel() const override { return "sats/block"; }
|
||||||
|
std::string getLogoFilename() const override {
|
||||||
|
return "ocean.bin";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getPoolName() const override {
|
||||||
|
return "ocean";
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoWidth() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLogoHeight() const override {
|
||||||
|
return 122;
|
||||||
|
}
|
||||||
};
|
};
|
|
@ -6,6 +6,7 @@ const char* PoolFactory::MINING_POOL_NAME_BRAIINS = "braiins";
|
||||||
const char* PoolFactory::MINING_POOL_NAME_SATOSHI_RADIO = "satoshi_radio";
|
const char* PoolFactory::MINING_POOL_NAME_SATOSHI_RADIO = "satoshi_radio";
|
||||||
const char* PoolFactory::MINING_POOL_NAME_PUBLIC_POOL = "public_pool";
|
const char* PoolFactory::MINING_POOL_NAME_PUBLIC_POOL = "public_pool";
|
||||||
const char* PoolFactory::MINING_POOL_NAME_GOBRRR_POOL = "gobrrr_pool";
|
const char* PoolFactory::MINING_POOL_NAME_GOBRRR_POOL = "gobrrr_pool";
|
||||||
|
const char* PoolFactory::LOGOS_DIR = "/logos";
|
||||||
|
|
||||||
std::unique_ptr<MiningPoolInterface> PoolFactory::createPool(const std::string& poolName) {
|
std::unique_ptr<MiningPoolInterface> PoolFactory::createPool(const std::string& poolName) {
|
||||||
static const std::unordered_map<std::string, std::function<std::unique_ptr<MiningPoolInterface>()>> poolFactories = {
|
static const std::unordered_map<std::string, std::function<std::unique_ptr<MiningPoolInterface>()>> poolFactories = {
|
||||||
|
@ -22,4 +23,112 @@ std::unique_ptr<MiningPoolInterface> PoolFactory::createPool(const std::string&
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return it->second();
|
return it->second();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PoolFactory::downloadPoolLogo(const std::string& poolName, const MiningPoolInterface* poolInterface)
|
||||||
|
{
|
||||||
|
const int MAX_RETRIES = 5;
|
||||||
|
const int RETRY_DELAY_MS = 1000; // 1 second between retries
|
||||||
|
|
||||||
|
if (!poolInterface || !poolInterface->hasLogo()) {
|
||||||
|
Serial.println(F("No pool interface or logo"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure logos directory exists
|
||||||
|
if (!LittleFS.exists(LOGOS_DIR)) {
|
||||||
|
LittleFS.mkdir(LOGOS_DIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
String logoPath = String(LOGOS_DIR) + "/" + String(poolName.c_str()) + "_logo.bin";
|
||||||
|
|
||||||
|
// Only download if the logo doesn't exist
|
||||||
|
if (!LittleFS.exists(logoPath)) {
|
||||||
|
// Clean up logos directory first
|
||||||
|
File root = LittleFS.open(LOGOS_DIR, "r");
|
||||||
|
if (root) {
|
||||||
|
File file = root.openNextFile();
|
||||||
|
while (file) {
|
||||||
|
String path = file.path();
|
||||||
|
file.close();
|
||||||
|
LittleFS.remove(path);
|
||||||
|
file = root.openNextFile();
|
||||||
|
}
|
||||||
|
root.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download new logo with retries
|
||||||
|
std::string logoUrl = poolInterface->getLogoUrl();
|
||||||
|
if (!logoUrl.empty()) {
|
||||||
|
for (int attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
||||||
|
Serial.printf("Downloading pool logo (attempt %d of %d)...\n", attempt, MAX_RETRIES);
|
||||||
|
|
||||||
|
HTTPClient http;
|
||||||
|
http.setUserAgent(USER_AGENT);
|
||||||
|
http.begin(logoUrl.c_str());
|
||||||
|
int httpCode = http.GET();
|
||||||
|
|
||||||
|
if (httpCode == 200) {
|
||||||
|
File file = LittleFS.open(logoPath, "w");
|
||||||
|
if (file) {
|
||||||
|
http.writeToStream(&file);
|
||||||
|
file.close();
|
||||||
|
Serial.println(F("Logo downloaded successfully"));
|
||||||
|
http.end();
|
||||||
|
return; // Success!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
http.end();
|
||||||
|
|
||||||
|
if (attempt < MAX_RETRIES) {
|
||||||
|
Serial.printf("Failed to download logo, HTTP code: %d. Retrying...\n", httpCode);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(RETRY_DELAY_MS));
|
||||||
|
} else {
|
||||||
|
Serial.printf("Failed to download logo after %d attempts\n", MAX_RETRIES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Serial.println(F("Logo already exists"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogoData PoolFactory::loadLogoFromFS(const std::string& poolName, const MiningPoolInterface* poolInterface)
|
||||||
|
{
|
||||||
|
// Initialize with dimensions from the pool interface
|
||||||
|
LogoData logo = {nullptr,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0};
|
||||||
|
|
||||||
|
String logoPath = String(LOGOS_DIR) + "/" + String(poolName.c_str()) + "_logo.bin";
|
||||||
|
if (!LittleFS.exists(logoPath)) {
|
||||||
|
return logo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only set dimensions if file exists
|
||||||
|
logo.width = static_cast<size_t>(poolInterface->getLogoWidth());
|
||||||
|
logo.height = static_cast<size_t>(poolInterface->getLogoHeight());
|
||||||
|
|
||||||
|
File file = LittleFS.open(logoPath, "r");
|
||||||
|
if (!file) {
|
||||||
|
return logo;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size = file.size();
|
||||||
|
uint8_t* buffer = new uint8_t[size];
|
||||||
|
|
||||||
|
|
||||||
|
if (file.read(buffer, size) == size) {
|
||||||
|
logo.data = buffer;
|
||||||
|
logo.size = size;
|
||||||
|
} else {
|
||||||
|
delete[] buffer;
|
||||||
|
logo.data = nullptr;
|
||||||
|
logo.size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return logo;
|
||||||
}
|
}
|
|
@ -2,15 +2,22 @@
|
||||||
#include "mining_pool_interface.hpp"
|
#include "mining_pool_interface.hpp"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "lib/shared.hpp"
|
||||||
|
#include "lib/config.hpp"
|
||||||
|
|
||||||
#include "noderunners/noderunners_pool.hpp"
|
#include "noderunners/noderunners_pool.hpp"
|
||||||
#include "braiins/brains_pool.hpp"
|
#include "braiins/brains_pool.hpp"
|
||||||
#include "ocean/ocean_pool.hpp"
|
#include "ocean/ocean_pool.hpp"
|
||||||
#include "satoshi_radio/satoshi_radio_pool.hpp"
|
#include "satoshi_radio/satoshi_radio_pool.hpp"
|
||||||
#include "public_pool/public_pool.hpp"
|
#include "public_pool/public_pool.hpp"
|
||||||
#include "gobrrr_pool/gobrrr_pool.hpp"
|
#include "gobrrr_pool/gobrrr_pool.hpp"
|
||||||
|
#include <LittleFS.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
|
||||||
|
|
||||||
class PoolFactory {
|
class PoolFactory {
|
||||||
public:
|
public:
|
||||||
|
static const char* getLogosDir() { return LOGOS_DIR; }
|
||||||
static std::unique_ptr<MiningPoolInterface> createPool(const std::string& poolName);
|
static std::unique_ptr<MiningPoolInterface> createPool(const std::string& poolName);
|
||||||
static std::vector<std::string> getAvailablePools() {
|
static std::vector<std::string> getAvailablePools() {
|
||||||
return {
|
return {
|
||||||
|
@ -34,6 +41,10 @@ class PoolFactory {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void downloadPoolLogo(const std::string& poolName, const MiningPoolInterface* poolInterface);
|
||||||
|
static LogoData loadLogoFromFS(const std::string& poolName, const MiningPoolInterface* poolInterface);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const char* MINING_POOL_NAME_OCEAN;
|
static const char* MINING_POOL_NAME_OCEAN;
|
||||||
static const char* MINING_POOL_NAME_NODERUNNERS;
|
static const char* MINING_POOL_NAME_NODERUNNERS;
|
||||||
|
@ -41,4 +52,5 @@ class PoolFactory {
|
||||||
static const char* MINING_POOL_NAME_SATOSHI_RADIO;
|
static const char* MINING_POOL_NAME_SATOSHI_RADIO;
|
||||||
static const char* MINING_POOL_NAME_PUBLIC_POOL;
|
static const char* MINING_POOL_NAME_PUBLIC_POOL;
|
||||||
static const char* MINING_POOL_NAME_GOBRRR_POOL;
|
static const char* MINING_POOL_NAME_GOBRRR_POOL;
|
||||||
|
static const char* LOGOS_DIR;
|
||||||
};
|
};
|
|
@ -18,6 +18,12 @@ int getMiningPoolStatsDailyEarnings()
|
||||||
|
|
||||||
void taskMiningPoolStatsFetch(void *pvParameters)
|
void taskMiningPoolStatsFetch(void *pvParameters)
|
||||||
{
|
{
|
||||||
|
std::string poolName = preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME).c_str();
|
||||||
|
auto poolInterface = PoolFactory::createPool(poolName);
|
||||||
|
|
||||||
|
std::string poolUser = preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER).c_str();
|
||||||
|
|
||||||
|
// Main stats fetching loop
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
||||||
|
@ -25,16 +31,8 @@ void taskMiningPoolStatsFetch(void *pvParameters)
|
||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
http.setUserAgent(USER_AGENT);
|
http.setUserAgent(USER_AGENT);
|
||||||
|
|
||||||
std::string poolName = preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME).c_str();
|
|
||||||
std::string poolUser = preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER).c_str();
|
|
||||||
|
|
||||||
auto poolInterface = PoolFactory::createPool(poolName);
|
|
||||||
if (!poolInterface)
|
|
||||||
{
|
|
||||||
Serial.println("Unknown mining pool: \"" + String(poolName.c_str()) + "\"");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
poolInterface->setPoolUser(poolUser);
|
poolInterface->setPoolUser(poolUser);
|
||||||
std::string apiUrl = poolInterface->getApiUrl();
|
std::string apiUrl = poolInterface->getApiUrl();
|
||||||
http.begin(apiUrl.c_str());
|
http.begin(apiUrl.c_str());
|
||||||
|
@ -74,12 +72,36 @@ void taskMiningPoolStatsFetch(void *pvParameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupMiningPoolStatsFetchTask()
|
void downloadMiningPoolLogoTask(void *pvParameters) {
|
||||||
{
|
std::string poolName = preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME).c_str();
|
||||||
xTaskCreate(taskMiningPoolStatsFetch, "miningPoolStatsFetch", (6 * 1024), NULL, tskIDLE_PRIORITY,
|
auto poolInterface = PoolFactory::createPool(poolName);
|
||||||
&miningPoolStatsFetchTaskHandle);
|
PoolFactory::downloadPoolLogo(poolName, poolInterface.get());
|
||||||
|
|
||||||
|
// If we're on the mining pool stats screen, trigger a display update
|
||||||
|
if (getCurrentScreen() == SCREEN_MINING_POOL_STATS_HASHRATE) {
|
||||||
|
WorkItem priceUpdate = {TASK_MINING_POOL_STATS_UPDATE, 0};
|
||||||
|
xQueueSend(workQueue, &priceUpdate, portMAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
xTaskNotifyGive(miningPoolStatsFetchTaskHandle);
|
xTaskNotifyGive(miningPoolStatsFetchTaskHandle);
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupMiningPoolStatsFetchTask()
|
||||||
|
{
|
||||||
|
xTaskCreate(downloadMiningPoolLogoTask,
|
||||||
|
"logoDownload",
|
||||||
|
(6 * 1024),
|
||||||
|
NULL,
|
||||||
|
12,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
xTaskCreate(taskMiningPoolStatsFetch,
|
||||||
|
"miningPoolStatsFetch",
|
||||||
|
(6 * 1024),
|
||||||
|
NULL,
|
||||||
|
tskIDLE_PRIORITY,
|
||||||
|
&miningPoolStatsFetchTaskHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<MiningPoolInterface>& getMiningPool()
|
std::unique_ptr<MiningPoolInterface>& getMiningPool()
|
||||||
|
@ -96,5 +118,6 @@ std::unique_ptr<MiningPoolInterface>& getMiningPool()
|
||||||
|
|
||||||
LogoData getMiningPoolLogo()
|
LogoData getMiningPoolLogo()
|
||||||
{
|
{
|
||||||
return getMiningPool()->getLogo();
|
LogoData logo = getMiningPool()->getLogo();
|
||||||
|
return logo;
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,4 +151,32 @@ String calculateSHA256(WiFiClient *stream, size_t contentLength) {
|
||||||
// uint8_t *pUncompressed;
|
// uint8_t *pUncompressed;
|
||||||
// pUncompressed = (uint8_t *)malloc(iUncompSize+4);
|
// pUncompressed = (uint8_t *)malloc(iUncompSize+4);
|
||||||
// zt.gunzip((uint8_t *)ocean_logo_comp, ocean_logo_size, pUncompressed);
|
// zt.gunzip((uint8_t *)ocean_logo_comp, ocean_logo_size, pUncompressed);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
WiFiClientSecure HttpHelper::secureClient;
|
||||||
|
WiFiClient HttpHelper::insecureClient;
|
||||||
|
bool HttpHelper::certBundleSet = false;
|
||||||
|
|
||||||
|
HTTPClient* HttpHelper::begin(const String& url) {
|
||||||
|
HTTPClient* http = new HTTPClient();
|
||||||
|
|
||||||
|
if (url.startsWith("https://")) {
|
||||||
|
if (!certBundleSet) {
|
||||||
|
secureClient.setCACertBundle(rootca_crt_bundle_start);
|
||||||
|
certBundleSet = true;
|
||||||
|
}
|
||||||
|
http->begin(secureClient, url);
|
||||||
|
} else {
|
||||||
|
http->begin(insecureClient, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
http->setUserAgent(USER_AGENT);
|
||||||
|
return http;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpHelper::end(HTTPClient* http) {
|
||||||
|
if (http) {
|
||||||
|
http->end();
|
||||||
|
delete http;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,12 +12,15 @@
|
||||||
#include <mbedtls/md.h>
|
#include <mbedtls/md.h>
|
||||||
#include "esp_crt_bundle.h"
|
#include "esp_crt_bundle.h"
|
||||||
#include <Update.h>
|
#include <Update.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <utils.hpp>
|
#include <utils.hpp>
|
||||||
|
|
||||||
#include "defaults.hpp"
|
#include "defaults.hpp"
|
||||||
|
|
||||||
|
#define USER_AGENT "BTClock/3.0"
|
||||||
|
|
||||||
extern MCP23017 mcp1;
|
extern MCP23017 mcp1;
|
||||||
#ifdef IS_BTCLOCK_V8
|
#ifdef IS_BTCLOCK_V8
|
||||||
extern MCP23017 mcp2;
|
extern MCP23017 mcp2;
|
||||||
|
@ -94,4 +97,15 @@ namespace ArduinoJson {
|
||||||
array.add(item);
|
array.add(item);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class HttpHelper {
|
||||||
|
public:
|
||||||
|
static HTTPClient* begin(const String& url);
|
||||||
|
static void end(HTTPClient* http);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static WiFiClientSecure secureClient;
|
||||||
|
static bool certBundleSet;
|
||||||
|
static WiFiClient insecureClient;
|
||||||
|
};
|
|
@ -1,26 +1,37 @@
|
||||||
#include "webserver.hpp"
|
#include "webserver.hpp"
|
||||||
|
|
||||||
|
static const char* JSON_CONTENT = "application/json";
|
||||||
|
|
||||||
|
static const char *const PROGMEM strSettings[] = {
|
||||||
|
"hostnamePrefix", "mempoolInstance", "nostrPubKey", "nostrRelay", "bitaxeHostname", "miningPoolName", "miningPoolUser", "nostrZapPubkey", "httpAuthUser", "httpAuthPass", "gitReleaseUrl", "poolLogosUrl"};
|
||||||
|
|
||||||
|
static const char *const PROGMEM uintSettings[] = {"minSecPriceUpd", "fullRefreshMin", "ledBrightness", "flMaxBrightness", "flEffectDelay", "luxLightToggle", "wpTimeout", "srcV2Currency"};
|
||||||
|
|
||||||
|
static const char *const PROGMEM boolSettings[] = {"fetchEurPrice", "ledTestOnPower", "ledFlashOnUpd",
|
||||||
|
"mdnsEnabled", "otaEnabled", "stealFocus",
|
||||||
|
"mcapBigChar", "useSatsSymbol", "useBlkCountdown",
|
||||||
|
"suffixPrice", "disableLeds", "ownDataSource",
|
||||||
|
"mowMode", "suffixShareDot", "flOffWhenDark",
|
||||||
|
"flAlwaysOn", "flDisable", "flFlashOnUpd",
|
||||||
|
"mempoolSecure", "useNostr", "bitaxeEnabled",
|
||||||
|
"miningPoolStats", "verticalDesc",
|
||||||
|
"nostrZapNotify", "stagingSource", "httpAuthEnabled"};
|
||||||
|
|
||||||
AsyncWebServer server(80);
|
AsyncWebServer server(80);
|
||||||
AsyncEventSource events("/events");
|
AsyncEventSource events("/events");
|
||||||
TaskHandle_t eventSourceTaskHandle;
|
TaskHandle_t eventSourceTaskHandle;
|
||||||
|
|
||||||
|
#define HTTP_OK 200
|
||||||
|
#define HTTP_BAD_REQUEST 400
|
||||||
|
|
||||||
void setupWebserver()
|
void setupWebserver()
|
||||||
{
|
{
|
||||||
events.onConnect([](AsyncEventSourceClient *client)
|
events.onConnect([](AsyncEventSourceClient *client)
|
||||||
{ client->send("welcome", NULL, millis(), 1000); });
|
{ client->send("welcome", NULL, millis(), 1000); });
|
||||||
server.addHandler(&events);
|
server.addHandler(&events);
|
||||||
|
|
||||||
// server.ad.
|
|
||||||
// server.serveStatic("/css", LittleFS, "/css/");
|
|
||||||
// server.serveStatic("/fonts", LittleFS, "/fonts/");
|
|
||||||
// server.serveStatic("/build", LittleFS, "/build");
|
|
||||||
// server.serveStatic("/swagger.json", LittleFS, "/swagger.json");
|
|
||||||
// server.serveStatic("/api.html", LittleFS, "/api.html");
|
|
||||||
// server.serveStatic("/fs_hash.txt", LittleFS, "/fs_hash.txt");
|
|
||||||
|
|
||||||
AsyncStaticWebHandler &staticHandler = server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
|
AsyncStaticWebHandler &staticHandler = server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
|
||||||
|
|
||||||
|
|
||||||
server.rewrite("/convert", "/");
|
server.rewrite("/convert", "/");
|
||||||
server.rewrite("/api", "/");
|
server.rewrite("/api", "/");
|
||||||
|
|
||||||
|
@ -31,7 +42,6 @@ void setupWebserver()
|
||||||
preferences.getString("httpAuthPass", DEFAULT_HTTP_AUTH_PASSWORD));
|
preferences.getString("httpAuthPass", DEFAULT_HTTP_AUTH_PASSWORD));
|
||||||
}
|
}
|
||||||
// server.on("/", HTTP_GET, onIndex);
|
// server.on("/", HTTP_GET, onIndex);
|
||||||
|
|
||||||
server.on("/api/status", HTTP_GET, onApiStatus);
|
server.on("/api/status", HTTP_GET, onApiStatus);
|
||||||
server.on("/api/system_status", HTTP_GET, onApiSystemStatus);
|
server.on("/api/system_status", HTTP_GET, onApiSystemStatus);
|
||||||
server.on("/api/wifi_set_tx_power", HTTP_GET, onApiSetWifiTxPower);
|
server.on("/api/wifi_set_tx_power", HTTP_GET, onApiSetWifiTxPower);
|
||||||
|
@ -51,8 +61,8 @@ void setupWebserver()
|
||||||
|
|
||||||
server.on("/api/show/text", HTTP_GET, onApiShowText);
|
server.on("/api/show/text", HTTP_GET, onApiShowText);
|
||||||
|
|
||||||
server.on("/api/screen/next", HTTP_GET, onApiScreenNext);
|
server.on("/api/screen/next", HTTP_GET, onApiScreenControl);
|
||||||
server.on("/api/screen/previous", HTTP_GET, onApiScreenPrevious);
|
server.on("/api/screen/previous", HTTP_GET, onApiScreenControl);
|
||||||
|
|
||||||
AsyncCallbackJsonWebHandler *settingsPatchHandler =
|
AsyncCallbackJsonWebHandler *settingsPatchHandler =
|
||||||
new AsyncCallbackJsonWebHandler("/api/json/settings", onApiSettingsPatch);
|
new AsyncCallbackJsonWebHandler("/api/json/settings", onApiSettingsPatch);
|
||||||
|
@ -212,36 +222,6 @@ void asyncFileUpdateHandler(AsyncWebServerRequest *request, String filename, siz
|
||||||
void asyncFirmwareUpdateHandler(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final)
|
void asyncFirmwareUpdateHandler(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final)
|
||||||
{
|
{
|
||||||
asyncFileUpdateHandler(request, filename, index, data, len, final, U_FLASH);
|
asyncFileUpdateHandler(request, filename, index, data, len, final, U_FLASH);
|
||||||
|
|
||||||
// if (!index)
|
|
||||||
// {
|
|
||||||
// Serial.printf("Update Start: %s\n", filename.c_str());
|
|
||||||
|
|
||||||
// // Update.runAsync(true);
|
|
||||||
// if (!Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000))
|
|
||||||
// {
|
|
||||||
// Update.printError(Serial);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (!Update.hasError())
|
|
||||||
// {
|
|
||||||
// if (Update.write(data, len) != len)
|
|
||||||
// {
|
|
||||||
// Update.printError(Serial);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (final)
|
|
||||||
// {
|
|
||||||
// if (Update.end(true))
|
|
||||||
// {
|
|
||||||
// Serial.printf("Update Success: %uB\n", index + len);
|
|
||||||
// onApiRestart(request);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// Update.printError(Serial);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonDocument getStatusObject()
|
JsonDocument getStatusObject()
|
||||||
|
@ -260,7 +240,7 @@ JsonDocument getStatusObject()
|
||||||
// root["espPsramSize"] = ESP.getPsramSize();
|
// root["espPsramSize"] = ESP.getPsramSize();
|
||||||
|
|
||||||
JsonObject conStatus = root["connectionStatus"].to<JsonObject>();
|
JsonObject conStatus = root["connectionStatus"].to<JsonObject>();
|
||||||
|
|
||||||
conStatus["price"] = isPriceNotifyConnected();
|
conStatus["price"] = isPriceNotifyConnected();
|
||||||
conStatus["blocks"] = isBlockNotifyConnected();
|
conStatus["blocks"] = isBlockNotifyConnected();
|
||||||
conStatus["V2"] = V2Notify::isV2NotifyConnected();
|
conStatus["V2"] = V2Notify::isV2NotifyConnected();
|
||||||
|
@ -295,7 +275,6 @@ JsonDocument getLedStatusObject()
|
||||||
for (uint i = 0; i < pixels.numPixels(); i++)
|
for (uint i = 0; i < pixels.numPixels(); i++)
|
||||||
{
|
{
|
||||||
uint32_t pixColor = pixels.getPixelColor(pixels.numPixels() - i - 1);
|
uint32_t pixColor = pixels.getPixelColor(pixels.numPixels() - i - 1);
|
||||||
uint alpha = (pixColor >> 24) & 0xFF;
|
|
||||||
uint red = (pixColor >> 16) & 0xFF;
|
uint red = (pixColor >> 16) & 0xFF;
|
||||||
uint green = (pixColor >> 8) & 0xFF;
|
uint green = (pixColor >> 8) & 0xFF;
|
||||||
uint blue = pixColor & 0xFF;
|
uint blue = pixColor & 0xFF;
|
||||||
|
@ -313,25 +292,26 @@ JsonDocument getLedStatusObject()
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
void eventSourceUpdate()
|
void eventSourceUpdate() {
|
||||||
{
|
if (!events.count()) return;
|
||||||
if (!events.count())
|
|
||||||
return;
|
JsonDocument doc = getStatusObject();
|
||||||
JsonDocument root = getStatusObject();
|
doc["leds"] = getLedStatusObject()["data"];
|
||||||
JsonArray data = root["data"].to<JsonArray>();
|
|
||||||
|
|
||||||
root["leds"] = getLedStatusObject()["data"];
|
// Get current EPD content directly as array
|
||||||
|
std::array<String, NUM_SCREENS> epdContent = getCurrentEpdContent();
|
||||||
|
|
||||||
|
// Add EPD content arrays
|
||||||
|
JsonArray data = doc["data"].to<JsonArray>();
|
||||||
|
|
||||||
|
// Copy array elements directly
|
||||||
|
for(const auto& content : epdContent) {
|
||||||
|
data.add(content);
|
||||||
|
}
|
||||||
|
|
||||||
String epdContent[NUM_SCREENS];
|
String buffer;
|
||||||
std::array<String, NUM_SCREENS> retEpdContent = getCurrentEpdContent();
|
serializeJson(doc, buffer);
|
||||||
std::copy(std::begin(retEpdContent), std::end(retEpdContent), epdContent);
|
events.send(buffer.c_str(), "status");
|
||||||
|
|
||||||
copyArray(epdContent, data);
|
|
||||||
|
|
||||||
String bufString;
|
|
||||||
serializeJson(root, bufString);
|
|
||||||
|
|
||||||
events.send(bufString.c_str(), "status");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -341,21 +321,22 @@ void eventSourceUpdate()
|
||||||
void onApiStatus(AsyncWebServerRequest *request)
|
void onApiStatus(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
JsonDocument root = getStatusObject();
|
JsonDocument root = getStatusObject();
|
||||||
|
|
||||||
|
// Get current EPD content directly as array
|
||||||
|
std::array<String, NUM_SCREENS> epdContent = getCurrentEpdContent();
|
||||||
|
|
||||||
|
// Add EPD content arrays
|
||||||
JsonArray data = root["data"].to<JsonArray>();
|
JsonArray data = root["data"].to<JsonArray>();
|
||||||
JsonArray rendered = root["rendered"].to<JsonArray>();
|
|
||||||
String epdContent[NUM_SCREENS];
|
// Copy array elements directly
|
||||||
|
for(const auto& content : epdContent) {
|
||||||
|
data.add(content);
|
||||||
|
}
|
||||||
|
|
||||||
root["leds"] = getLedStatusObject()["data"];
|
root["leds"] = getLedStatusObject()["data"];
|
||||||
|
|
||||||
std::array<String, NUM_SCREENS> retEpdContent = getCurrentEpdContent();
|
|
||||||
|
|
||||||
std::copy(std::begin(retEpdContent), std::end(retEpdContent), epdContent);
|
|
||||||
|
|
||||||
copyArray(epdContent, data);
|
|
||||||
copyArray(epdContent, rendered);
|
|
||||||
serializeJson(root, *response);
|
serializeJson(root, *response);
|
||||||
|
|
||||||
request->send(response);
|
request->send(response);
|
||||||
|
@ -368,7 +349,7 @@ void onApiStatus(AsyncWebServerRequest *request)
|
||||||
void onApiActionPause(AsyncWebServerRequest *request)
|
void onApiActionPause(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
setTimerActive(false);
|
setTimerActive(false);
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -378,7 +359,7 @@ void onApiActionPause(AsyncWebServerRequest *request)
|
||||||
void onApiActionTimerRestart(AsyncWebServerRequest *request)
|
void onApiActionTimerRestart(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
setTimerActive(true);
|
setTimerActive(true);
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -392,7 +373,7 @@ void onApiFullRefresh(AsyncWebServerRequest *request)
|
||||||
|
|
||||||
setEpdContent(newEpdContent, true);
|
setEpdContent(newEpdContent, true);
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -407,28 +388,21 @@ void onApiShowScreen(AsyncWebServerRequest *request)
|
||||||
uint currentScreen = p->value().toInt();
|
uint currentScreen = p->value().toInt();
|
||||||
setCurrentScreen(currentScreen);
|
setCurrentScreen(currentScreen);
|
||||||
}
|
}
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Api
|
* @Api
|
||||||
* @Path("/api/screen/next")
|
* @Path("/api/screen/next")
|
||||||
*/
|
*/
|
||||||
void onApiScreenNext(AsyncWebServerRequest *request)
|
void onApiScreenControl(AsyncWebServerRequest *request) {
|
||||||
{
|
const String& action = request->url();
|
||||||
nextScreen();
|
if (action.endsWith("/next")) {
|
||||||
request->send(200);
|
nextScreen();
|
||||||
}
|
} else if (action.endsWith("/previous")) {
|
||||||
|
previousScreen();
|
||||||
/**
|
}
|
||||||
* @Api
|
request->send(HTTP_OK);
|
||||||
* @Path("/api/screen/previous")
|
|
||||||
*/
|
|
||||||
void onApiScreenPrevious(AsyncWebServerRequest *request)
|
|
||||||
{
|
|
||||||
previousScreen();
|
|
||||||
|
|
||||||
request->send(200);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiShowText(AsyncWebServerRequest *request)
|
void onApiShowText(AsyncWebServerRequest *request)
|
||||||
|
@ -448,7 +422,7 @@ void onApiShowText(AsyncWebServerRequest *request)
|
||||||
setEpdContent(textEpdContent);
|
setEpdContent(textEpdContent);
|
||||||
}
|
}
|
||||||
setCurrentScreen(SCREEN_CUSTOM);
|
setCurrentScreen(SCREEN_CUSTOM);
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiShowTextAdvanced(AsyncWebServerRequest *request, JsonVariant &json)
|
void onApiShowTextAdvanced(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
|
@ -466,7 +440,7 @@ void onApiShowTextAdvanced(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
setEpdContent(epdContent);
|
setEpdContent(epdContent);
|
||||||
|
|
||||||
setCurrentScreen(SCREEN_CUSTOM);
|
setCurrentScreen(SCREEN_CUSTOM);
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
|
@ -484,49 +458,49 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
|
|
||||||
bool settingsChanged = true;
|
bool settingsChanged = true;
|
||||||
|
|
||||||
if (settings.containsKey("fgColor"))
|
if (settings["fgColor"].is<String>())
|
||||||
{
|
{
|
||||||
String fgColor = settings["fgColor"].as<String>();
|
String fgColor = settings["fgColor"].as<String>();
|
||||||
preferences.putUInt("fgColor", strtol(fgColor.c_str(), NULL, 16));
|
uint32_t color = strtol(fgColor.c_str(), NULL, 16);
|
||||||
setFgColor(int(strtol(fgColor.c_str(), NULL, 16)));
|
preferences.putUInt("fgColor", color);
|
||||||
|
setFgColor(color);
|
||||||
Serial.print(F("Setting foreground color to "));
|
Serial.print(F("Setting foreground color to "));
|
||||||
Serial.println(strtol(fgColor.c_str(), NULL, 16));
|
Serial.println(color);
|
||||||
settingsChanged = true;
|
settingsChanged = true;
|
||||||
}
|
}
|
||||||
if (settings.containsKey("bgColor"))
|
if (settings["bgColor"].is<String>())
|
||||||
{
|
{
|
||||||
String bgColor = settings["bgColor"].as<String>();
|
String bgColor = settings["bgColor"].as<String>();
|
||||||
|
|
||||||
preferences.putUInt("bgColor", strtol(bgColor.c_str(), NULL, 16));
|
uint32_t color = strtol(bgColor.c_str(), NULL, 16);
|
||||||
setBgColor(int(strtol(bgColor.c_str(), NULL, 16)));
|
preferences.putUInt("bgColor", color);
|
||||||
|
setBgColor(color);
|
||||||
Serial.print(F("Setting background color to "));
|
Serial.print(F("Setting background color to "));
|
||||||
Serial.println(bgColor.c_str());
|
Serial.println(bgColor.c_str());
|
||||||
settingsChanged = true;
|
settingsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.containsKey("timePerScreen"))
|
if (settings["timePerScreen"].is<uint>())
|
||||||
{
|
{
|
||||||
preferences.putUInt("timerSeconds",
|
preferences.putUInt("timerSeconds",
|
||||||
settings["timePerScreen"].as<uint>() * 60);
|
settings["timePerScreen"].as<uint>() * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
String strSettings[] = {"hostnamePrefix", "mempoolInstance", "nostrPubKey", "nostrRelay", "bitaxeHostname", "miningPoolName", "miningPoolUser", "nostrZapPubkey", "httpAuthUser", "httpAuthPass", "gitReleaseUrl"};
|
|
||||||
|
|
||||||
for (String setting : strSettings)
|
for (String setting : strSettings)
|
||||||
{
|
{
|
||||||
if (settings.containsKey(setting))
|
if (settings[setting].is<String>())
|
||||||
{
|
{
|
||||||
preferences.putString(setting.c_str(), settings[setting].as<String>());
|
preferences.putString(setting.c_str(), settings[setting].as<String>());
|
||||||
Serial.printf("Setting %s to %s\r\n", setting.c_str(),
|
Serial.printf("Setting %s to %s\r\n", setting.c_str(),
|
||||||
settings[setting].as<String>());
|
settings[setting].as<String>().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String uintSettings[] = {"minSecPriceUpd", "fullRefreshMin", "ledBrightness", "flMaxBrightness", "flEffectDelay", "luxLightToggle", "wpTimeout", "srcV2Currency"};
|
|
||||||
|
|
||||||
for (String setting : uintSettings)
|
for (String setting : uintSettings)
|
||||||
{
|
{
|
||||||
if (settings.containsKey(setting))
|
if (settings[setting].is<uint>())
|
||||||
{
|
{
|
||||||
preferences.putUInt(setting.c_str(), settings[setting].as<uint>());
|
preferences.putUInt(setting.c_str(), settings[setting].as<uint>());
|
||||||
Serial.printf("Setting %s to %d\r\n", setting.c_str(),
|
Serial.printf("Setting %s to %d\r\n", setting.c_str(),
|
||||||
|
@ -534,7 +508,7 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.containsKey("tzOffset"))
|
if (settings["tzOffset"].is<int>())
|
||||||
{
|
{
|
||||||
int gmtOffset = settings["tzOffset"].as<int>() * 60;
|
int gmtOffset = settings["tzOffset"].as<int>() * 60;
|
||||||
size_t written = preferences.putInt("gmtOffset", gmtOffset);
|
size_t written = preferences.putInt("gmtOffset", gmtOffset);
|
||||||
|
@ -542,27 +516,17 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
gmtOffset, settings["tzOffset"].as<int>(), written);
|
gmtOffset, settings["tzOffset"].as<int>(), written);
|
||||||
}
|
}
|
||||||
|
|
||||||
String boolSettings[] = {"fetchEurPrice", "ledTestOnPower", "ledFlashOnUpd",
|
|
||||||
"mdnsEnabled", "otaEnabled", "stealFocus",
|
|
||||||
"mcapBigChar", "useSatsSymbol", "useBlkCountdown",
|
|
||||||
"suffixPrice", "disableLeds", "ownDataSource",
|
|
||||||
"mowMode", "suffixShareDot", "flOffWhenDark",
|
|
||||||
"flAlwaysOn", "flDisable", "flFlashOnUpd",
|
|
||||||
"mempoolSecure", "useNostr", "bitaxeEnabled",
|
|
||||||
"miningPoolStats", "verticalDesc",
|
|
||||||
"nostrZapNotify", "stagingSource", "httpAuthEnabled"};
|
|
||||||
|
|
||||||
for (String setting : boolSettings)
|
for (String setting : boolSettings)
|
||||||
{
|
{
|
||||||
if (settings.containsKey(setting))
|
if (settings[setting].is<bool>())
|
||||||
{
|
{
|
||||||
preferences.putBool(setting.c_str(), settings[setting].as<boolean>());
|
preferences.putBool(setting.c_str(), settings[setting].as<bool>());
|
||||||
Serial.printf("Setting %s to %d\r\n", setting.c_str(),
|
Serial.printf("Setting %s to %d\r\n", setting.c_str(),
|
||||||
settings[setting].as<boolean>());
|
settings[setting].as<bool>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.containsKey("screens"))
|
if (settings["screens"].is<JsonArray>())
|
||||||
{
|
{
|
||||||
for (JsonVariant screen : settings["screens"].as<JsonArray>())
|
for (JsonVariant screen : settings["screens"].as<JsonArray>())
|
||||||
{
|
{
|
||||||
|
@ -570,12 +534,12 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
uint id = s["id"].as<uint>();
|
uint id = s["id"].as<uint>();
|
||||||
String key = "screen[" + String(id) + "]";
|
String key = "screen[" + String(id) + "]";
|
||||||
String prefKey = "screen" + String(id) + "Visible";
|
String prefKey = "screen" + String(id) + "Visible";
|
||||||
bool visible = s["enabled"].as<boolean>();
|
bool visible = s["enabled"].as<bool>();
|
||||||
preferences.putBool(prefKey.c_str(), visible);
|
preferences.putBool(prefKey.c_str(), visible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.containsKey("actCurrencies"))
|
if (settings["actCurrencies"].is<JsonArray>())
|
||||||
{
|
{
|
||||||
String actCurrencies;
|
String actCurrencies;
|
||||||
|
|
||||||
|
@ -589,10 +553,10 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
}
|
}
|
||||||
|
|
||||||
preferences.putString("actCurrencies", actCurrencies.c_str());
|
preferences.putString("actCurrencies", actCurrencies.c_str());
|
||||||
Serial.printf("Set actCurrencies: %s\n", actCurrencies);
|
Serial.printf("Set actCurrencies: %s\n", actCurrencies.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.containsKey("txPower"))
|
if (settings["txPower"].is<int>())
|
||||||
{
|
{
|
||||||
int txPower = settings["txPower"].as<int>();
|
int txPower = settings["txPower"].as<int>();
|
||||||
|
|
||||||
|
@ -619,7 +583,7 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
if (settingsChanged)
|
if (settingsChanged)
|
||||||
{
|
{
|
||||||
queueLedEffect(LED_FLASH_SUCCESS);
|
queueLedEffect(LED_FLASH_SUCCESS);
|
||||||
|
@ -628,7 +592,7 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
|
|
||||||
void onApiRestart(AsyncWebServerRequest *request)
|
void onApiRestart(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
|
|
||||||
if (events.count())
|
if (events.count())
|
||||||
events.send("closing");
|
events.send("closing");
|
||||||
|
@ -642,7 +606,7 @@ void onApiIdentify(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
queueLedEffect(LED_FLASH_IDENTIFY);
|
queueLedEffect(LED_FLASH_IDENTIFY);
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -768,8 +732,10 @@ void onApiSettingsGet(AsyncWebServerRequest *request)
|
||||||
o["enabled"] = preferences.getBool(key.c_str(), true);
|
o["enabled"] = preferences.getBool(key.c_str(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root["poolLogosUrl"] = preferences.getString("poolLogosUrl", DEFAULT_MINING_POOL_LOGOS_URL);
|
||||||
|
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
serializeJson(root, *response);
|
serializeJson(root, *response);
|
||||||
|
|
||||||
request->send(response);
|
request->send(response);
|
||||||
|
@ -781,8 +747,9 @@ bool processEpdColorSettings(AsyncWebServerRequest *request)
|
||||||
if (request->hasParam("fgColor", true))
|
if (request->hasParam("fgColor", true))
|
||||||
{
|
{
|
||||||
const AsyncWebParameter *fgColor = request->getParam("fgColor", true);
|
const AsyncWebParameter *fgColor = request->getParam("fgColor", true);
|
||||||
preferences.putUInt("fgColor", strtol(fgColor->value().c_str(), NULL, 16));
|
uint32_t color = strtol(fgColor->value().c_str(), NULL, 16);
|
||||||
setFgColor(int(strtol(fgColor->value().c_str(), NULL, 16)));
|
preferences.putUInt("fgColor", color);
|
||||||
|
setFgColor(color);
|
||||||
// Serial.print(F("Setting foreground color to "));
|
// Serial.print(F("Setting foreground color to "));
|
||||||
// Serial.println(fgColor->value().c_str());
|
// Serial.println(fgColor->value().c_str());
|
||||||
settingsChanged = true;
|
settingsChanged = true;
|
||||||
|
@ -791,8 +758,9 @@ bool processEpdColorSettings(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
const AsyncWebParameter *bgColor = request->getParam("bgColor", true);
|
const AsyncWebParameter *bgColor = request->getParam("bgColor", true);
|
||||||
|
|
||||||
preferences.putUInt("bgColor", strtol(bgColor->value().c_str(), NULL, 16));
|
uint32_t color = strtol(bgColor->value().c_str(), NULL, 16);
|
||||||
setBgColor(int(strtol(bgColor->value().c_str(), NULL, 16)));
|
preferences.putUInt("bgColor", color);
|
||||||
|
setBgColor(color);
|
||||||
// Serial.print(F("Setting background color to "));
|
// Serial.print(F("Setting background color to "));
|
||||||
// Serial.println(bgColor->value().c_str());
|
// Serial.println(bgColor->value().c_str());
|
||||||
settingsChanged = true;
|
settingsChanged = true;
|
||||||
|
@ -804,7 +772,7 @@ bool processEpdColorSettings(AsyncWebServerRequest *request)
|
||||||
void onApiSystemStatus(AsyncWebServerRequest *request)
|
void onApiSystemStatus(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
JsonDocument root;
|
JsonDocument root;
|
||||||
|
|
||||||
|
@ -812,6 +780,9 @@ void onApiSystemStatus(AsyncWebServerRequest *request)
|
||||||
root["espHeapSize"] = ESP.getHeapSize();
|
root["espHeapSize"] = ESP.getHeapSize();
|
||||||
root["espFreePsram"] = ESP.getFreePsram();
|
root["espFreePsram"] = ESP.getFreePsram();
|
||||||
root["espPsramSize"] = ESP.getPsramSize();
|
root["espPsramSize"] = ESP.getPsramSize();
|
||||||
|
root["fsUsedBytes"] = LittleFS.usedBytes();
|
||||||
|
root["fsTotalBytes"] = LittleFS.totalBytes();
|
||||||
|
|
||||||
root["rssi"] = WiFi.RSSI();
|
root["rssi"] = WiFi.RSSI();
|
||||||
root["txPower"] = WiFi.getTxPower();
|
root["txPower"] = WiFi.getTxPower();
|
||||||
|
|
||||||
|
@ -843,19 +814,19 @@ void onApiSetWifiTxPower(AsyncWebServerRequest *request)
|
||||||
if (WiFi.setTxPower(static_cast<wifi_power_t>(txPower)))
|
if (WiFi.setTxPower(static_cast<wifi_power_t>(txPower)))
|
||||||
{
|
{
|
||||||
preferences.putInt("txPower", txPower);
|
preferences.putInt("txPower", txPower);
|
||||||
request->send(200, "application/json", "{\"setTxPower\": \"ok\"}");
|
request->send(HTTP_OK, "application/json", "{\"setTxPower\": \"ok\"}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return request->send(400);
|
return request->send(HTTP_BAD_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiLightsStatus(AsyncWebServerRequest *request)
|
void onApiLightsStatus(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
serializeJson(getLedStatusObject()["data"], *response);
|
serializeJson(getLedStatusObject()["data"], *response);
|
||||||
|
|
||||||
|
@ -865,7 +836,7 @@ void onApiLightsStatus(AsyncWebServerRequest *request)
|
||||||
void onApiStopDataSources(AsyncWebServerRequest *request)
|
void onApiStopDataSources(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
stopPriceNotify();
|
stopPriceNotify();
|
||||||
stopBlockNotify();
|
stopBlockNotify();
|
||||||
|
@ -876,7 +847,7 @@ void onApiStopDataSources(AsyncWebServerRequest *request)
|
||||||
void onApiRestartDataSources(AsyncWebServerRequest *request)
|
void onApiRestartDataSources(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
restartPriceNotify();
|
restartPriceNotify();
|
||||||
restartBlockNotify();
|
restartBlockNotify();
|
||||||
|
@ -889,7 +860,7 @@ void onApiRestartDataSources(AsyncWebServerRequest *request)
|
||||||
void onApiLightsOff(AsyncWebServerRequest *request)
|
void onApiLightsOff(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
setLights(0, 0, 0);
|
setLights(0, 0, 0);
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiLightsSetColor(AsyncWebServerRequest *request)
|
void onApiLightsSetColor(AsyncWebServerRequest *request)
|
||||||
|
@ -897,7 +868,7 @@ void onApiLightsSetColor(AsyncWebServerRequest *request)
|
||||||
if (request->hasParam("c"))
|
if (request->hasParam("c"))
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
String rgbColor = request->getParam("c")->value();
|
String rgbColor = request->getParam("c")->value();
|
||||||
|
|
||||||
|
@ -921,7 +892,7 @@ void onApiLightsSetColor(AsyncWebServerRequest *request)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
request->send(400);
|
request->send(HTTP_BAD_REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -938,7 +909,7 @@ void onApiLightsSetJson(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.printf("Invalid values for LED set %d\n", lights.size());
|
Serial.printf("Invalid values for LED set %d\n", lights.size());
|
||||||
request->send(400);
|
request->send(HTTP_BAD_REQUEST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -946,27 +917,27 @@ void onApiLightsSetJson(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
{
|
{
|
||||||
unsigned int red, green, blue;
|
unsigned int red, green, blue;
|
||||||
|
|
||||||
if (lights[i].containsKey("red") && lights[i].containsKey("green") &&
|
if (lights[i]["red"].is<uint>() && lights[i]["green"].is<uint>() &&
|
||||||
lights[i].containsKey("blue"))
|
lights[i]["blue"].is<uint>())
|
||||||
{
|
{
|
||||||
red = lights[i]["red"].as<uint>();
|
red = lights[i]["red"].as<uint>();
|
||||||
green = lights[i]["green"].as<uint>();
|
green = lights[i]["green"].as<uint>();
|
||||||
blue = lights[i]["blue"].as<uint>();
|
blue = lights[i]["blue"].as<uint>();
|
||||||
}
|
}
|
||||||
else if (lights[i].containsKey("hex"))
|
else if (lights[i]["hex"].is<const char*>())
|
||||||
{
|
{
|
||||||
if (!sscanf(lights[i]["hex"].as<String>().c_str(), "#%02X%02X%02X", &red,
|
if (!sscanf(lights[i]["hex"].as<String>().c_str(), "#%02X%02X%02X", &red,
|
||||||
&green, &blue) == 3)
|
&green, &blue) == 3)
|
||||||
{
|
{
|
||||||
Serial.printf("Invalid hex for LED %d\n", i);
|
Serial.printf("Invalid hex for LED %d\n", i);
|
||||||
request->send(400);
|
request->send(HTTP_BAD_REQUEST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Serial.printf("No valid color for LED %d\n", i);
|
Serial.printf("No valid color for LED %d\n", i);
|
||||||
request->send(400);
|
request->send(HTTP_BAD_REQUEST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -977,7 +948,7 @@ void onApiLightsSetJson(AsyncWebServerRequest *request, JsonVariant &json)
|
||||||
pixels.show();
|
pixels.show();
|
||||||
saveLedState();
|
saveLedState();
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onIndex(AsyncWebServerRequest *request)
|
void onIndex(AsyncWebServerRequest *request)
|
||||||
|
@ -987,48 +958,14 @@ void onIndex(AsyncWebServerRequest *request)
|
||||||
|
|
||||||
void onNotFound(AsyncWebServerRequest *request)
|
void onNotFound(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
// Serial.printf("NotFound, URL[%s]\n", request->url());
|
// Access-Control-Request-Method == POST might be better
|
||||||
|
|
||||||
// Serial.printf("NotFound, METHOD[%s]\n", request->methodToString());
|
|
||||||
|
|
||||||
// int headers = request->headers();
|
|
||||||
// int i;
|
|
||||||
// for (i = 0; i < headers; i++)
|
|
||||||
// {
|
|
||||||
// AsyncWebHeader *h = request->getHeader(i);
|
|
||||||
// Serial.printf("NotFound HEADER[%s]: %s\n", h->name().c_str(),
|
|
||||||
// h->value().c_str());
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int params = request->params();
|
|
||||||
// for (int i = 0; i < params; i++)
|
|
||||||
// {
|
|
||||||
// const AsyncWebParameter *p = request->getParam(i);
|
|
||||||
// if (p->isFile())
|
|
||||||
// { // p->isPost() is also true
|
|
||||||
// Serial.printf("NotFound FILE[%s]: %s, size: %u\n",
|
|
||||||
// p->name().c_str(), p->value().c_str(), p->size());
|
|
||||||
// }
|
|
||||||
// else if (p->isPost())
|
|
||||||
// {
|
|
||||||
// Serial.printf("NotFound POST[%s]: %s\n", p->name().c_str(),
|
|
||||||
// p->value().c_str());
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// Serial.printf("NotFound GET[%s]: %s\n", p->name().c_str(),
|
|
||||||
// p->value().c_str());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Access-Control-Request-Method == POST might be better
|
|
||||||
|
|
||||||
if (request->method() == HTTP_OPTIONS ||
|
if (request->method() == HTTP_OPTIONS ||
|
||||||
request->hasHeader("Sec-Fetch-Mode"))
|
request->hasHeader("Sec-Fetch-Mode"))
|
||||||
{
|
{
|
||||||
// Serial.printf("NotFound, Return[%d]\n", 200);
|
// Serial.printf("NotFound, Return[%d]\n", 200);
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1064,7 +1001,7 @@ void onApiShowCurrency(AsyncWebServerRequest *request)
|
||||||
setCurrentCurrency(curChar);
|
setCurrentCurrency(curChar);
|
||||||
setCurrentScreen(getCurrentScreen());
|
setCurrentScreen(getCurrentScreen());
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
request->send(404);
|
request->send(404);
|
||||||
|
@ -1075,13 +1012,13 @@ void onApiFrontlightOn(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
frontlightFadeInAll();
|
frontlightFadeInAll();
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiFrontlightStatus(AsyncWebServerRequest *request)
|
void onApiFrontlightStatus(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream(JSON_CONTENT);
|
||||||
|
|
||||||
JsonDocument root;
|
JsonDocument root;
|
||||||
|
|
||||||
|
@ -1100,7 +1037,7 @@ void onApiFrontlightFlash(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
frontlightFlash(preferences.getUInt("flEffectDelay"));
|
frontlightFlash(preferences.getUInt("flEffectDelay"));
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onApiFrontlightSetBrightness(AsyncWebServerRequest *request)
|
void onApiFrontlightSetBrightness(AsyncWebServerRequest *request)
|
||||||
|
@ -1108,11 +1045,11 @@ void onApiFrontlightSetBrightness(AsyncWebServerRequest *request)
|
||||||
if (request->hasParam("b"))
|
if (request->hasParam("b"))
|
||||||
{
|
{
|
||||||
frontlightSetBrightness(request->getParam("b")->value().toInt());
|
frontlightSetBrightness(request->getParam("b")->value().toInt());
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
request->send(400);
|
request->send(HTTP_BAD_REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1120,6 +1057,6 @@ void onApiFrontlightOff(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
frontlightFadeOutAll();
|
frontlightFadeOutAll();
|
||||||
|
|
||||||
request->send(200);
|
request->send(HTTP_OK);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -28,8 +28,7 @@ void onApiStatus(AsyncWebServerRequest *request);
|
||||||
void onApiSystemStatus(AsyncWebServerRequest *request);
|
void onApiSystemStatus(AsyncWebServerRequest *request);
|
||||||
void onApiSetWifiTxPower(AsyncWebServerRequest *request);
|
void onApiSetWifiTxPower(AsyncWebServerRequest *request);
|
||||||
|
|
||||||
void onApiScreenNext(AsyncWebServerRequest *request);
|
void onApiScreenControl(AsyncWebServerRequest *request);
|
||||||
void onApiScreenPrevious(AsyncWebServerRequest *request);
|
|
||||||
|
|
||||||
void onApiShowScreen(AsyncWebServerRequest *request);
|
void onApiShowScreen(AsyncWebServerRequest *request);
|
||||||
void onApiShowCurrency(AsyncWebServerRequest *request);
|
void onApiShowCurrency(AsyncWebServerRequest *request);
|
||||||
|
|
Loading…
Reference in a new issue