Millibyte platforms and specific configuration#29
Open
millibyte-products wants to merge 43 commits into
Open
Conversation
1) Consolidate tasks, no need to spawn a separate stack for each 2) Support pullup/down modes for lube button pin, default to pulldown 3) Add lube button pin mode setting to settings factory and UI 4) Remove old minified web assets that are no longer used 5) Update index.html and settings.js to reflect pin mode setting 6) Update platformio.ini to reflect new source files and dependencies
Cleans up codebase, adds task management Adds explicit millibyte build targets Switches from LEDC to MCPWM for servo control on ESP32 Cleans up serial handling code, adds more robust serial parsing Cleans up some HTTP handling code, adds more robust error handling
…esptool on Windows
…m tool-esptoolpy for Windows
…tforms # Conflicts: # ESP32/data/www/bldc-motor-min.js.gz # ESP32/data/www/buttons-min.js.gz # ESP32/data/www/esp-timer-setup-min.js.gz # ESP32/data/www/index-min.html.gz # ESP32/data/www/modal-component-min.js.gz # ESP32/data/www/motion-generator-min.js.gz # ESP32/data/www/settings-min.js.gz # ESP32/data/www/style-min.css.gz # ESP32/data/www/utils-min.js.gz # ESP32/dataEdit/www/esp-timer-setup.js # ESP32/dataEdit/www/index.html # ESP32/dataEdit/www/settings.js # ESP32/lib/constants.h # ESP32/lib/enum.h # ESP32/lib/pinMap.h # ESP32/lib/settingConstants.h # ESP32/lib/settingsFactory.h # ESP32/platformio.ini # ESP32/sdkconfig.defaults # ESP32/src/BatteryHandler.h # ESP32/src/DisplayHandler.h # ESP32/src/HTTP/SecureWebSocketHandler.hpp # ESP32/src/HTTP/WebSocketBase.h # ESP32/src/MDNSHandler.hpp # ESP32/src/SettingsHandler.h # ESP32/src/SystemCommandHandler.h # ESP32/src/TCode/MotorHandler.h # ESP32/src/TCode/v0.3/BLDCHandler0_3.h # ESP32/src/TCode/v0.3/MotorHandler0_3.h # ESP32/src/TCode/v0.3/ServoHandler0_3.h # ESP32/src/TCode/v0.4/BLDCHandler0_4.h # ESP32/src/TCode/v0.4/MotorHandler0_4.h # ESP32/src/TCode/v0.4/OutputStream.h # ESP32/src/TCode/v0.4/ServoHandler0_4.h # ESP32/src/TagHandler.h # ESP32/src/TemperatureHandler.h # ESP32/src/UdpHandler.h # ESP32/src/VoiceHandler.hpp # ESP32/src/WebHandler.h # ESP32/src/WebSocketHandler.h # ESP32/src/WifiHandler.h # ESP32/src/bluetooth/BLE/BLEHandler.hpp # ESP32/src/bluetooth/BluetoothHandler.h # ESP32/src/logging/LogHandler.h # ESP32/src/main.cpp # ESP32/src/sensors/ButtonHandler.hpp
Lean toward MillibytePlatforms patterns (Tags namespace, callback.h typedefs, void setup() with m_initFailed, numeric MOTOR_TYPE). Servo build envs (sr6_pcb, esp32doit-devkit-v1) now compile. BLDC envs (ssr1_pcb, *-bldc) still have pre-existing issues in BLDCHandler0_3.h / 0_4.h (undeclared bootmode/xLin/xPosition/zeroAngle/motorB/_TAG) that need separate work.
…apSSR1PCB The merge introduced a half-finished SSR2 dual-motor refactor in BLDCHandler0_3.h/0_4.h with duplicate motorA/driverA declarations and undeclared bootmode/xLin/xPosition/zeroAngle/motorVoltage/motorB/sensorB/driverB/m_deviceType/_TAG/BLDCBootMode usages. Reverted to the pre-merge (v1.0.0) versions and re-applied the only intended change (TCODE_FUNCTION_PTR_T -> TCodeCommandCallback) plus the rename of PinMapSSR1 to PinMapSSR1PCB. Also fix DEFAULT_DEVICE=DeviceType::SR1 typo (should be SSR1) in esp32doit-devkit-v1-bldc env.
Drop 21 stale upstream-style flat headers in src/ plus src/HTTP/ that duplicate the refactored versions in src/network/, src/messages/, src/settings/, src/sensors/, src/serial/, src/tasks/. None were reachable from main.cpp; they only included each other (InitHandler.hpp, InstanceHandler.h, TaskHandler.hpp, etc.). All 4 active build envs (sr6_pcb, ssr1_pcb, esp32doit-devkit-v1, esp32doit-devkit-v1-bldc) still build successfully.
High-frequency vibe attaches (e.g. 8 kHz x 15-bit = 262 MHz) caused IDF mcpwm_new_timer to compute prescale = src_clk / resolution_hz = 0, then later divide by prescale -> IntegerDivideByZero panic during boot. Reject configurations where resolution_hz exceeds the MCPWM source clock so callers get a clean failure instead of a hardware panic.
The per-chip config headers were unconditionally redefining BOARD_TYPE_DEFAULT, clobbering the BoardType passed via -D DEFAULT_BOARD in platformio.ini. As a result ssr1_pcb (and other PCB envs) booted with DEVKIT pins instead of their actual board pinout. Guard each cfg with #ifndef DEFAULT_BOARD so the build flag wins.
lib/settingConstants.h had a duplicate #define block that re-declared BLDC_MOTORA_VOLTAGE/SUPPLY/CURRENT/ZEROELECANGLE etc. with the truncated string keys 'BLDC_Motor_VoltageLimit'... overriding the earlier canonical 'BLDC_MotorA_VoltageLimit' names. Saved JSON written via SettingsFactory then used the wrong keys and the BLDC handler always read defaults (ZeroElecAngle = -12345 sentinel), which broke FOC initialization.
The AsyncWebServer-based WebHandler (the one main.cpp actually instantiates) was missing /debugInfo, so the settings UI got a 404 and the polling chain faulted. GET streams /debugInfo.json (or returns an empty doc when absent), POST clears the file.
pingDevice() declared 'let polling = false' as a function-local variable, so every other function (getSystemInfo/getDebugInfo/...) referencing bare 'polling' threw ReferenceError on the first call from onDocumentLoad. Move the declaration to module scope. Also stop treating a missing /debugInfo endpoint as a fatal error so older firmware keeps loading.
Makes it possible to tell from the boot log whether BLDCDriver3PWM->init() succeeded and whether the EN pin was actually asserted before initFOC() attempts sensor alignment. Calls driverA->enable() right after init so the gate-driver chip is unambiguously enabled when the alignment voltage is applied.
The class-based rewrite was incomplete: it generated DOM elements with IDs like BLDC_Motor_VoltageLimit (no 'A') that don't match the static HTML form (BLDC_MotorA_VoltageLimit), it expected motorA/motorB instances that were never constructed, and it left BLDCMotor.setup() calls hanging on a class with no static method. Restoring the prior object-literal singleton fixes the 'BLDCMotor.setup is not a function' TypeError thrown from setUserSettings during settings load.
The BLDC branch in setPinoutSettings was a no-op with a comment claiming pins were populated from user settings, but they weren't populated anywhere else either - the BLDC pin inputs in the web UI were always blank. Call BLDCMotor.setupPins() to populate them from /pins like the pre-merge build.
…sed PWM resolution UI - settingsFactory: register BLDC_PIDProportionalConstant and BLDC_LowPassFilter so they appear in /settings JSON and persist. - BLDCHandler0_3: load PID P-const and low-pass filter from settings (m_pConst/m_lowPass) replacing compile-time P_CONST/LOW_PASS macros; force encoder type to MT6701 SSI (SSR1PCB always ships with MT6701, ignore stale BLDC_Encoder=0/NONE in saved settings). - bldc-motor.js: populate and persist BLDC_PIDProportionalConstant and BLDC_LowPassFilter; for SSR1PCB lock the BLDC_Encoder dropdown to MT6701 (=1) and force-save corrected value. - settings.js: declare module-level upDateTimeout to fix ReferenceError in updateBLDCPins/updatePins; remove servo/vibe/lube/heater/case-fan resolution setters that were assigning undefined into the inputs. - index.html: hide servo/vibe/lube/heater/case-fan resolution rows (PwmManager auto-derives resolution per timer). - scripts/tcode-stroke-test.ps1: helper script that drives the L0 axis Max/Min/Center over T-Code on a serial port.
- MotorHandler0_3/0_4: default servoResolution/vibeResolution/lubeResolution to SERVO_PWM_RES before getValue() and clamp to 1..16. Previously the uninitialized local could produce m_servoPWMMaxDuty = UINT32_MAX, which saturated every map() call and made all servos appear idle. - battery.js: hold-off window so server-broadcast powerStatus does not overwrite the user's VMOTOR toggle for 2.5s. - settings.js: declare upDatePinsTimeout; suppress 'Error loading <name>' toasts during the polling/restart wait loop. - index-min.html.gz: regenerate minified bundles. - scripts/: add capture-boot-log, ws-listen, ws-stroke-test, test-vser-* helpers.
- TaskHandler: collapse the unused two-list (core0/core1) split into a single cooperatively-polled list. The old critical/priority/auxiliary/ realtime/lazy aliases are kept as no-op wrappers around add() so call sites compile without churn. - main.cpp: header doc block enumerates every task/thread (motor pinned to PRO_CPU, servoWiggle, Arduino loop poll on APP_CPU, WiFi/AsyncTCP SDK tasks, AsyncWebServer task) and the motorCmdQueue bridge. - main.cpp + NetworkHandler.h + OperatingModeHandler.h: switch all task registrations from priority() to add() now that there's only one list. - UdpHandler: drop dead TaskHandle_t m_task field (never assigned).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I did some rearchitecting in my fork.
These changes may be interesting, or they might be too much in which case, no worries.
The biggest change is collecting tasks into a task manager. This reduces the need for additional stack allocations and lets tasks share resources (heap) more efficiently.
I've also taken a whack at reducing/optimizing some of the HTTP server files, tried to add chunking and fix some memory alloc issues I ran into.
Added SSR1PCB and SR6PCB as first-class build targets, extending the existing common content and setting some different defaults.
Added pull-up config to the web interface, just for the lube button for now.
Added some helper provisioning scripts I found useful, and an #ip command to support them.
Switched tags to a binary format. Easier to send between threads and more memory efficient.