[platformio] default_envs = default build_cache_dir = .cache extra_configs = platformio.local.ini [crosspoint] version = 1.4.1 [base] platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.37/platform-espressif32.zip board = esp32-c3-devkitm-1 framework = arduino monitor_speed = 115200 upload_speed = 921600 check_tool = cppcheck ; missingInclude (project headers) is suppressed alongside missingIncludeSystem: on a ; fresh CI checkout cppcheck has no resolved include paths, so it reports every ; project header as missing (~470 information-level lines) and fails the job. check_flags = --enable=all --suppress=missingIncludeSystem --suppress=missingInclude --suppress=unusedFunction --suppress=unmatchedSuppression --suppress=*:*/.pio/* --inline-suppr check_skip_packages = yes board_upload.flash_size = 16MB board_upload.maximum_size = 16777216 board_upload.offset_address = 0x10000 build_flags = -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DEINK_DISPLAY_SINGLE_BUFFER_MODE=1 -DDISABLE_FS_H_WARNING=1 -DDESTRUCTOR_CLOSES_FILE=1 # https://libexpat.github.io/doc/api/latest/#XML_GE -DXML_GE=0 -DXML_CONTEXT_BYTES=1024 -std=gnu++2a # Enable UTF-8 long file names in SdFat -DUSE_UTF8_LONG_NAMES=1 # Increase PNG scanline buffer to support up to 2048px wide images # Default is (320*4+1)*2=2562, we need more for larger images -DPNG_MAX_BUFFERED_PIXELS=16416 -DFREEINK_DEVICE_X4=1 -DFREEINK_DEVICE_X3=1 -DFREEINK_NET_WOLFSSL=1 -DWOLFSSL_USER_SETTINGS -DWOLFSSL_OPTIONS_H -DWOLFSSL_CLIENT_EXAMPLE -DWOLFSSL_TLS13 # MEMFIX-PORT: single-precision ECC (sp_c32.c). Without it every P-256 operation # (TLS 1.3 key_share keygen, ECDHE, ECDSA cert verify) runs on fast-math bignums # that WOLFSSL_SMALL_STACK heap-allocates at FP_MAX_BITS size -- tens of KB of # temporaries, which OOMs (MP_MEM) at the ~50KB free heap a reading session # leaves. SP uses fixed 256-bit arrays: a few KB, and several times faster. # SP_SMALL trades the large precomputed point tables for smaller flash. -DWOLFSSL_HAVE_SP_ECC -DWOLFSSL_SP_SMALL -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES -DHAVE_HKDF -DHAVE_FFDHE_2048 -DHAVE_CURVE25519 -DWC_RSA_PSS -DHAVE_SNI -Wno-bidi-chars -Wl,--wrap=panic_print_backtrace,--wrap=panic_abort,--wrap=bootloader_common_check_efuse_blk_validity -fno-exceptions # FreeInk panel profiles: compile both X3 (792x528/UC8253) and X4 (800x480/SSD1677); # the firmware picks the active one at runtime via HalDisplay setDisplayX3(). -DFREEINK_DEVICE_X3=1 -DFREEINK_DEVICE_X4=1 # BLE HID page-turner host (BleKeyboardHost). NimBLE role/bond config is baked into # the prebuilt arduino-esp32 framework's sdkconfig.h, so we don't redefine it here # (doing so only warns and has no effect). The host only compiles when # FREEINK_CAP_BLE_HID_HOST is set on the env (below); with the capability off, # BleKeyboardHost links stubs and pulls in zero NimBLE code. -DFREEINK_BLE_HID_SHOW_UNNAMED_DEVICES=0 build_unflags = -std=gnu++11 -fexceptions ; Board configuration board_build.flash_mode = dio board_build.flash_size = 16MB board_build.partitions = partitions.csv ; Shrink the NimBLE footprint for a 1-connection HID host moving 3-6 byte reports. ; Field-measured: begin() costs ~52 KB with these trims vs ~68 KB with the prebuilt ; framework defaults — and that 15 KB is the difference between the stack landing ; above the reader's render shed floor (stable coexistence) and below it (a ; guaranteed shed/restart flap). Rebuilds the Arduino core libs on first build ; (slower once, cached after; needs the CMake pin in platformio.local.ini on macOS). custom_sdkconfig = CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1 CONFIG_BT_NIMBLE_MAX_CCCDS=2 CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=23 CONFIG_BT_NIMBLE_MSYS_1_BLOCK_COUNT=6 CONFIG_BT_NIMBLE_MSYS_2_BLOCK_COUNT=6 ; was 24 x 320 B CONFIG_BT_NIMBLE_ACL_BUF_COUNT=6 ; was 24 x 255 B CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=12 ; was 30 x 70 B; only scan bursts need many ; IDF 5.5 sizes the HCI transport pools under TRANSPORT_* names; pin both spellings. CONFIG_BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT=6 CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=12 CONFIG_BT_NIMBLE_ATT_MAX_PREP_ENTRIES=4 ; was 64; a HID host never does prepared writes CONFIG_BT_CTRL_BLE_MAX_ACT=3 ; was 6; need conn + scan + initiate only CONFIG_BT_CTRL_BLE_ADV_REPORT_FLOW_CTRL_NUM=50 ; was 100; pairing-time scan only CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10 ; was 30 ; MEMFIX-PORT: task stack right-sizing (~7 KB); NOTE develop has no ; custom_sdkconfig block — port via sdkconfig.defaults or equivalent. ; Task stack right-sizing from measured high-water marks (heap block map + ; per-task stack audit, July 2026): esp_timer used ~0.8 KB of 8 KB across ; every capture incl. BLE sessions; the FreeRTOS timer service used ~0.5 KB ; of 4 KB. Neither runs TLS or app code. ~7 KB back to the heap. CONFIG_ESP_TIMER_TASK_STACK_SIZE=4096 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2560 ; Move the WiFi stack's non-critical hot paths out of IRAM into flash. ; On the C3, IRAM and DRAM share one SRAM pool, so the ~25-30 KB this ; frees lands directly in the heap — paid for with lower WiFi throughput ; during transfers (occasional sync/OTA use, not streaming: acceptable). ; IRAM cost is static, so the heap gain applies even with WiFi off. CONFIG_ESP_WIFI_IRAM_OPT=n CONFIG_ESP_WIFI_RX_IRAM_OPT=n ; Keep the Arduino wrappers for the removed cloud components (below) out of ; the core source list; all other bundled libraries default to enabled. CONFIG_ARDUINO_SELECTIVE_COMPILATION=y CONFIG_ARDUINO_SELECTIVE_RainMaker=n CONFIG_ARDUINO_SELECTIVE_Insights=n ; Drop unused cloud components from the core rebuild. esp_insights/rainmaker ; require embedded server certs the lib builder can't generate ; ("https_server.crt.S not found"); this firmware uses none of them. custom_component_remove = espressif/esp_insights espressif/esp_rainmaker espressif/esp_diagnostics espressif/esp_diag_data_store espressif/esp_schedule espressif/esp_rcp_update espressif/esp_secure_cert_mgr espressif/cbor extra_scripts = pre:scripts/patch_wolfssl.py pre:scripts/build_html.py pre:scripts/gen_i18n.py pre:scripts/git_branch.py pre:scripts/patch_jpegdec.py post:scripts/register_unit_tests_target.py ; Libraries lib_deps = BatteryMonitor=symlink://freeink-sdk/libs/hardware/BatteryMonitor InputManager=symlink://freeink-sdk/libs/hardware/InputManager EInkDisplay=symlink://freeink-sdk/libs/display/FreeInkDisplay SDCardManager=symlink://freeink-sdk/libs/hardware/SDCardManager ; FreeInk HAL support libs the above depend on (BoardConfig pin maps, etc.). BoardConfig=symlink://freeink-sdk/libs/hardware/BoardConfig PowerManager=symlink://freeink-sdk/libs/hardware/PowerManager Rtc=symlink://freeink-sdk/libs/hardware/Rtc Imu=symlink://freeink-sdk/libs/hardware/Imu SecureNet=symlink://freeink-sdk/libs/network/SecureNet FreeInkUI=symlink://freeink-sdk/libs/ui/FreeInkUI Icons=symlink://freeink-sdk/libs/assets/Icons BleKeyboardHost=symlink://freeink-sdk/libs/network/BleKeyboardHost h2zero/NimBLE-Arduino @ ^2.3.8 bblanchon/ArduinoJson @ 7.4.2 ricmoo/QRCode @ 0.0.1 bitbank2/PNGdec @ 1.1.6 https://github.com/bitbank2/JPEGDEC.git#86282979224c8a32fd51e091ed5a35b0c699a52b links2004/WebSockets @ 2.7.3 wolfssl/Arduino-wolfSSL @ 5.7.2 lib_ignore = BLE [env:default] extends = base build_flags = ${base.build_flags} ; CROSSPOINT_VERSION is set by scripts/git_branch.py (includes branch + short SHA) -DENABLE_SERIAL_LOG -DLOG_LEVEL=2 ; Set log level to debug for development builds -DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE) -DFREEINK_BLE_HID_SCAN_DEBUG=1 ; verbose BLE scan lifecycle/advertisement logs for bring-up -DFREEINK_BLE_HID_REPORT_DEBUG=1 ; raw HID report hex dumps + report-map hints (bring-up) [env:gh_release] extends = base build_flags = ${base.build_flags} -DCROSSPOINT_VERSION=\"${crosspoint.version}\" -DENABLE_SERIAL_LOG -DLOG_LEVEL=1 ; Set log level to info for release builds -DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE) [env:gh_release_rc] extends = base build_flags = ${base.build_flags} -DCROSSPOINT_VERSION=\"${crosspoint.version}-rc+${sysenv.CROSSPOINT_RC_HASH}\" -DENABLE_SERIAL_LOG -DLOG_LEVEL=1 ; Set log level to info for release candidate builds -DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE) [env:slim] extends = base build_flags = ${base.build_flags} -DCROSSPOINT_VERSION=\"${crosspoint.version}-slim\" ; serial output is disabled in slim builds to save space -UENABLE_SERIAL_LOG