Showing preview only (4,960K chars total). Download the full file or copy to clipboard to get everything.
Repository: wled/WLED
Branch: main
Commit: a7212642058b
Files: 490
Total size: 4.6 MB
Directory structure:
gitextract_clh_9b3z/
├── .devcontainer/
│ ├── Dockerfile
│ └── devcontainer.json
├── .envrc
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── copilot-instructions.md
│ └── workflows/
│ ├── build.yml
│ ├── nightly.yml
│ ├── pr-merge.yaml
│ ├── release.yml
│ ├── stale.yml
│ ├── test.yaml
│ ├── usermods.yml
│ └── wled-ci.yml
├── .gitignore
├── .gitpod.Dockerfile
├── .gitpod.yml
├── .nvmrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── boards/
│ ├── adafruit_matrixportal_esp32s3_wled.json
│ ├── lilygo-t7-s3.json
│ └── lolin_s3_mini.json
├── images/
│ └── Readme.md
├── include/
│ └── README
├── lib/
│ ├── ESP8266PWM/
│ │ └── src/
│ │ └── core_esp8266_waveform_phase.cpp
│ ├── NeoESP32RmtHI/
│ │ ├── include/
│ │ │ └── NeoEsp32RmtHIMethod.h
│ │ ├── library.json
│ │ └── src/
│ │ ├── NeoEsp32RmtHI.S
│ │ └── NeoEsp32RmtHIMethod.cpp
│ └── README
├── package.json
├── pio-scripts/
│ ├── build_ui.py
│ ├── dynarray.py
│ ├── load_usermods.py
│ ├── obj-dump.py
│ ├── output_bins.py
│ ├── set_metadata.py
│ ├── strip-floats.py
│ ├── user_config_copy.py
│ └── validate_modules.py
├── platformio.ini
├── platformio_override.sample.ini
├── readme.md
├── requirements.in
├── requirements.txt
├── test/
│ └── README
├── tools/
│ ├── AutoCubeMap.xlsx
│ ├── WLED_ESP32-wrover_4MB.csv
│ ├── WLED_ESP32_16MB.csv
│ ├── WLED_ESP32_16MB_9MB_FS.csv
│ ├── WLED_ESP32_2MB_noOTA.csv
│ ├── WLED_ESP32_32MB.csv
│ ├── WLED_ESP32_4MB_1MB_FS.csv
│ ├── WLED_ESP32_4MB_256KB_FS.csv
│ ├── WLED_ESP32_4MB_512KB_FS.csv
│ ├── WLED_ESP32_4MB_700k_FS.csv
│ ├── WLED_ESP32_8MB.csv
│ ├── all_xml.sh
│ ├── cdata-test.js
│ ├── cdata.js
│ ├── dynarray_espressif32.ld
│ ├── fps_test.htm
│ ├── json_test.htm
│ ├── multi-update.cmd
│ ├── multi-update.sh
│ ├── partitions-16MB_spiffs-tinyuf2.csv
│ ├── partitions-4MB_spiffs-tinyuf2.csv
│ ├── partitions-8MB_spiffs-tinyuf2.csv
│ ├── stress_test.sh
│ ├── udp_test.py
│ └── wled-tools
├── usermods/
│ ├── ADS1115_v2/
│ │ ├── ADS1115_v2.cpp
│ │ ├── ChannelSettings.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── AHT10_v2/
│ │ ├── AHT10_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Analog_Clock/
│ │ ├── Analog_Clock.cpp
│ │ └── library.json
│ ├── Animated_Staircase/
│ │ ├── Animated_Staircase.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Artemis_reciever/
│ │ ├── readme.md
│ │ └── usermod.cpp
│ ├── BH1750_v2/
│ │ ├── BH1750_v2.cpp
│ │ ├── BH1750_v2.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── BME280_v2/
│ │ ├── BME280_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── BME68X_v2/
│ │ ├── BME68X_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Battery/
│ │ ├── Battery.cpp
│ │ ├── UMBattery.h
│ │ ├── battery_defaults.h
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── types/
│ │ ├── LionUMBattery.h
│ │ ├── LipoUMBattery.h
│ │ └── UnkownUMBattery.h
│ ├── Cronixie/
│ │ ├── Cronixie.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── DHT/
│ │ ├── DHT.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── EXAMPLE/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_example.cpp
│ ├── EleksTube_IPS/
│ │ ├── ChipSelect.h
│ │ ├── EleksTube_IPS.cpp
│ │ ├── Hardware.h
│ │ ├── TFTs.h
│ │ ├── User_Setup.h
│ │ ├── library.json.disabled
│ │ └── readme.md
│ ├── Enclosure_with_OLED_temp_ESP07/
│ │ ├── assets/
│ │ │ └── readme.md
│ │ ├── readme.md
│ │ ├── usermod.cpp
│ │ └── usermod_bme280.cpp
│ ├── Fix_unreachable_netservices_v2/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_Fix_unreachable_netservices.cpp
│ ├── INA226_v2/
│ │ ├── INA226_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Internal_Temperature_v2/
│ │ ├── Internal_Temperature_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── JSON_IR_remote/
│ │ ├── 21-key_ir.json
│ │ ├── 24-key_ir.json
│ │ ├── 32-key_ir.json
│ │ ├── 40-key-black_ir.json
│ │ ├── 40-key-blue_ir.json
│ │ ├── 44-key_ir.json
│ │ ├── 6-key_ir.json
│ │ ├── 9-key_ir.json
│ │ ├── IR_Remote_Codes.xlsx
│ │ ├── ir_json_maker.py
│ │ └── readme.md
│ ├── LD2410_v2/
│ │ ├── LD2410_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── LDR_Dusk_Dawn_v2/
│ │ ├── LDR_Dusk_Dawn_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── MAX17048_v2/
│ │ ├── MAX17048_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── MY9291/
│ │ ├── MY9291.cpp
│ │ ├── MY92xx.h
│ │ └── library.json
│ ├── PIR_sensor_switch/
│ │ ├── PIR_Highlight_Standby
│ │ ├── PIR_sensor_switch.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── PS_Comet/
│ │ ├── PS_Comet.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── PWM_fan/
│ │ ├── PWM_fan.cpp
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── setup_deps.py
│ ├── RTC/
│ │ ├── RTC.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── RelayBlinds/
│ │ ├── index.htm
│ │ ├── presets.json
│ │ ├── readme.md
│ │ └── usermod.cpp
│ ├── SN_Photoresistor/
│ │ ├── SN_Photoresistor.cpp
│ │ ├── SN_Photoresistor.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── ST7789_display/
│ │ ├── README.md
│ │ ├── ST7789_display.cpp
│ │ └── library.json.disabled
│ ├── Si7021_MQTT_HA/
│ │ ├── Si7021_MQTT_HA.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── TTGO-T-Display/
│ │ ├── README.md
│ │ └── usermod.cpp
│ ├── Temperature/
│ │ ├── Temperature.cpp
│ │ ├── UsermodTemperature.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── TetrisAI_v2/
│ │ ├── TetrisAI_v2.cpp
│ │ ├── gridbw.h
│ │ ├── gridcolor.h
│ │ ├── library.json
│ │ ├── pieces.h
│ │ ├── rating.h
│ │ ├── readme.md
│ │ ├── tetrisai.h
│ │ ├── tetrisaigame.h
│ │ └── tetrisbag.h
│ ├── VL53L0X_gestures/
│ │ ├── VL53L0X_gestures.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── Wemos_D1_mini+Wemos32_mini_shield/
│ │ ├── readme.md
│ │ ├── usermod.cpp
│ │ └── usermod_bme280.cpp
│ ├── audioreactive/
│ │ ├── audio_reactive.cpp
│ │ ├── audio_source.h
│ │ ├── library.json
│ │ ├── override_sqrt.py
│ │ └── readme.md
│ ├── battery_keypad_controller/
│ │ ├── README.md
│ │ └── wled06_usermod.ino
│ ├── boblight/
│ │ ├── boblight.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── buzzer/
│ │ ├── buzzer.cpp
│ │ └── library.json
│ ├── deep_sleep/
│ │ ├── deep_sleep.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── mpu6050_imu/
│ │ ├── library.json
│ │ ├── mpu6050_imu.cpp
│ │ ├── readme.md
│ │ └── usermod_gyro_surge.h
│ ├── multi_relay/
│ │ ├── library.json
│ │ ├── multi_relay.cpp
│ │ └── readme.md
│ ├── photoresistor_sensor_mqtt_v1/
│ │ ├── README.md
│ │ └── usermod.cpp
│ ├── pixels_dice_tray/
│ │ ├── BLE_REQUIREMENT.md
│ │ ├── README.md
│ │ ├── WLED_ESP32_4MB_64KB_FS.csv
│ │ ├── dice_state.h
│ │ ├── generate_roll_info.py
│ │ ├── led_effects.h
│ │ ├── mqtt_client/
│ │ │ ├── mqtt_logger.py
│ │ │ ├── mqtt_plotter.py
│ │ │ └── requirements.txt
│ │ ├── pixels_dice_tray.cpp
│ │ ├── platformio_override.ini.sample
│ │ ├── roll_info.h
│ │ └── tft_menu.h
│ ├── platformio_override.usermods.ini
│ ├── pov_display/
│ │ ├── README.md
│ │ ├── bmpimage.cpp
│ │ ├── bmpimage.h
│ │ ├── library.json
│ │ ├── pov.cpp
│ │ ├── pov.h
│ │ └── pov_display.cpp
│ ├── project_cars_shiftlight/
│ │ ├── readme.md
│ │ └── wled06_usermod.ino
│ ├── pwm_outputs/
│ │ ├── library.json
│ │ ├── pwm_outputs.cpp
│ │ └── readme.md
│ ├── quinled-an-penta/
│ │ ├── library.json
│ │ ├── quinled-an-penta.cpp
│ │ └── readme.md
│ ├── readme.md
│ ├── rgb-rotary-encoder/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── rgb-rotary-encoder.cpp
│ ├── rotary_encoder_change_effect/
│ │ └── wled06_usermod.ino
│ ├── sd_card/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sd_card.cpp
│ ├── sensors_to_mqtt/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sensors_to_mqtt.cpp
│ ├── seven_segment_display/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── seven_segment_display.cpp
│ ├── seven_segment_display_reloaded/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── setup_deps.py
│ │ └── seven_segment_display_reloaded.cpp
│ ├── sht/
│ │ ├── ShtUsermod.h
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sht.cpp
│ ├── smartnest/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── smartnest.cpp
│ ├── stairway_wipe_basic/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── stairway_wipe_basic.cpp
│ ├── udp_name_sync/
│ │ ├── library.json
│ │ └── udp_name_sync.cpp
│ ├── user_fx/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── user_fx.cpp
│ ├── usermod_rotary_brightness_color/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── usermod_rotary_brightness_color.cpp
│ ├── usermod_v2_HttpPullLightControl/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── usermod_v2_HttpPullLightControl.cpp
│ │ └── usermod_v2_HttpPullLightControl.h
│ ├── usermod_v2_RF433/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── remote433.json
│ │ └── usermod_v2_RF433.cpp
│ ├── usermod_v2_animartrix/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_animartrix.cpp
│ ├── usermod_v2_auto_save/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_auto_save.cpp
│ ├── usermod_v2_brightness_follow_sun/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── usermod_v2_brightness_follow_sun.cpp
│ ├── usermod_v2_four_line_display_ALT/
│ │ ├── 4LD_wled_fonts.h
│ │ ├── library.json
│ │ ├── platformio_override.sample.ini
│ │ ├── readme.md
│ │ ├── usermod_v2_four_line_display.h
│ │ └── usermod_v2_four_line_display_ALT.cpp
│ ├── usermod_v2_klipper_percentage/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_klipper_percentage.cpp
│ ├── usermod_v2_ping_pong_clock/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_ping_pong_clock.cpp
│ ├── usermod_v2_rotary_encoder_ui_ALT/
│ │ ├── library.json
│ │ ├── platformio_override.sample.ini
│ │ ├── readme.md
│ │ ├── setup_deps.py
│ │ └── usermod_v2_rotary_encoder_ui_ALT.cpp
│ ├── usermod_v2_word_clock/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_word_clock.cpp
│ ├── wireguard/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── wireguard.cpp
│ ├── wizlights/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── wizlights.cpp
│ └── word-clock-matrix/
│ ├── Word Clock Baffle.stl
│ ├── library.json
│ ├── readme.md
│ └── word-clock-matrix.cpp
└── wled00/
├── FX.cpp
├── FX.h
├── FX_2Dfcn.cpp
├── FX_fcn.cpp
├── FXparticleSystem.cpp
├── FXparticleSystem.h
├── NodeStruct.h
├── alexa.cpp
├── bus_manager.cpp
├── bus_manager.h
├── bus_wrapper.h
├── button.cpp
├── cfg.cpp
├── colors.cpp
├── colors.h
├── const.h
├── data/
│ ├── 404.htm
│ ├── common.js
│ ├── cpal/
│ │ └── cpal.htm
│ ├── dmxmap.htm
│ ├── edit.htm
│ ├── icons-ui/
│ │ ├── HowTo_AddNewIcons.txt
│ │ ├── Read Me.txt
│ │ ├── demo-files/
│ │ │ ├── demo.css
│ │ │ └── demo.js
│ │ ├── demo.html
│ │ ├── selection.json
│ │ └── style.css
│ ├── index.css
│ ├── index.htm
│ ├── index.js
│ ├── iro.js
│ ├── liveview.htm
│ ├── liveviewws2D.htm
│ ├── msg.htm
│ ├── pixart/
│ │ ├── boxdraw.js
│ │ ├── getPixelValues.js
│ │ ├── pixart.css
│ │ ├── pixart.htm
│ │ ├── pixart.js
│ │ ├── site.webmanifest
│ │ └── statics.js
│ ├── pixelforge/
│ │ ├── omggif.js
│ │ └── pixelforge.htm
│ ├── pxmagic/
│ │ └── pxmagic.htm
│ ├── rangetouch.js
│ ├── settings.htm
│ ├── settings_2D.htm
│ ├── settings_dmx.htm
│ ├── settings_leds.htm
│ ├── settings_pin.htm
│ ├── settings_pininfo.htm
│ ├── settings_sec.htm
│ ├── settings_sync.htm
│ ├── settings_time.htm
│ ├── settings_ui.htm
│ ├── settings_um.htm
│ ├── settings_wifi.htm
│ ├── style.css
│ ├── update.htm
│ ├── usermod.htm
│ └── welcome.htm
├── dmx_input.cpp
├── dmx_input.h
├── dmx_output.cpp
├── dynarray.h
├── e131.cpp
├── fcn_declare.h
├── file.cpp
├── hue.cpp
├── image_loader.cpp
├── improv.cpp
├── ir.cpp
├── ir_codes.h
├── json.cpp
├── led.cpp
├── lx_parser.cpp
├── mqtt.cpp
├── my_config_sample.h
├── net_debug.cpp
├── net_debug.h
├── network.cpp
├── ntp.cpp
├── ota_update.cpp
├── ota_update.h
├── overlay.cpp
├── palettes.cpp
├── pin_manager.cpp
├── pin_manager.h
├── playlist.cpp
├── presets.cpp
├── remote.cpp
├── set.cpp
├── src/
│ ├── dependencies/
│ │ ├── dmx/
│ │ │ ├── ESPDMX.cpp
│ │ │ ├── ESPDMX.h
│ │ │ ├── LICENSE.md
│ │ │ ├── SparkFunDMX.cpp
│ │ │ └── SparkFunDMX.h
│ │ ├── e131/
│ │ │ ├── ESPAsyncE131.cpp
│ │ │ └── ESPAsyncE131.h
│ │ ├── espalexa/
│ │ │ ├── Espalexa.h
│ │ │ ├── EspalexaDevice.cpp
│ │ │ ├── EspalexaDevice.h
│ │ │ └── LICENSE
│ │ ├── json/
│ │ │ ├── ArduinoJson-v6.h
│ │ │ └── AsyncJson-v6.h
│ │ ├── network/
│ │ │ ├── Network.cpp
│ │ │ └── Network.h
│ │ ├── time/
│ │ │ ├── DS1307RTC.cpp
│ │ │ ├── DS1307RTC.h
│ │ │ ├── DateStrings.cpp
│ │ │ ├── LICENSE.txt
│ │ │ ├── Readme.txt
│ │ │ ├── Time.cpp
│ │ │ ├── TimeLib.h
│ │ │ ├── library.json
│ │ │ └── library.properties
│ │ ├── timezone/
│ │ │ ├── LICENSE.md
│ │ │ ├── ReadMe.md
│ │ │ ├── Timezone.cpp
│ │ │ └── Timezone.h
│ │ ├── toki/
│ │ │ └── Toki.h
│ │ └── ws2812fx/
│ │ ├── LICENSE.txt
│ │ └── readme.txt
│ └── font/
│ ├── console_font_4x6.h
│ ├── console_font_5x12.h
│ ├── console_font_5x8.h
│ ├── console_font_6x8.h
│ └── console_font_7x9.h
├── udp.cpp
├── um_manager.cpp
├── usermod.cpp
├── util.cpp
├── wled.cpp
├── wled.h
├── wled_ethernet.h
├── wled_main.cpp
├── wled_math.cpp
├── wled_metadata.cpp
├── wled_metadata.h
├── wled_serial.cpp
├── wled_server.cpp
├── ws.cpp
└── xml.cpp
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/Dockerfile
================================================
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.devcontainer/base.Dockerfile
# [Choice] Python version: 3, 3.9, 3.8, 3.7, 3.6
ARG VARIANT="3"
FROM mcr.microsoft.com/devcontainers/python:0-${VARIANT}
# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
# COPY requirements.txt /tmp/pip-tmp/
# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
# && rm -rf /tmp/pip-tmp
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
# [Optional] Uncomment this line to install global node packages.
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "Python 3",
"build": {
"dockerfile": "Dockerfile",
"context": "..",
"args": {
// Update 'VARIANT' to pick a Python version: 3, 3.6, 3.7, 3.8, 3.9
"VARIANT": "3"
}
},
// To give the container access to a device serial port, you can uncomment one of the following lines.
// Note: If running on Windows, you will have to do some additional steps:
// https://stackoverflow.com/questions/68527888/how-can-i-use-a-usb-com-port-inside-of-a-vscode-development-container
//
// You can explicitly just forward the port you want to connect to. Replace `/dev/ttyACM0` with the serial port for
// your device. This will only work if the device is plugged in from the start without reconnecting. Adding the
// `dialout` group is needed if read/write permisions for the port are limitted to the dialout user.
// "runArgs": ["--device=/dev/ttyACM0", "--group-add", "dialout"],
//
// Alternatively, you can give more comprehensive access to the host system. This will expose all the host devices to
// the container. Adding the `dialout` group is needed if read/write permisions for the port are limitted to the
// dialout user. This could allow the container to modify unrelated serial devices, which would be a similar level of
// risk to running the build directly on the host.
// "runArgs": ["--privileged", "-v", "/dev/bus/usb:/dev/bus/usb", "--group-add", "dialout"],
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"python.pythonPath": "/usr/local/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint"
},
"extensions": [
"ms-python.python",
"platformio.platformio-ide"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "bash -i -c 'nvm install && npm ci'",
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"
}
================================================
FILE: .envrc
================================================
layout python-venv python3
================================================
FILE: .github/FUNDING.yml
================================================
github: [DedeHai,lost-hope,willmmiles,netmindz,softhack007]
custom: ['https://paypal.me/Aircoookie','https://paypal.me/blazoncek']
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: Bug Report
description: File a bug report
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Please quickly search existing issues first before submitting a bug.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: A clear and concise description of what the bug is.
placeholder: Tell us what the problem is.
validations:
required: true
- type: textarea
id: how-to-reproduce
attributes:
label: To Reproduce Bug
description: Steps to reproduce the behavior, if consistently possible.
placeholder: Tell us how to make the bug appear.
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
placeholder: Tell us what you expected to happen.
validations:
required: true
- type: dropdown
id: install_format
attributes:
label: Install Method
description: How did you install WLED?
options:
- Binary from WLED.me
- Self-Compiled
validations:
required: true
- type: input
id: version
attributes:
label: What version of WLED?
description: |-
Find this by going to <kbd><samp>⚙️ Config</samp></kbd> → <kbd><samp>Security & Updates</samp></kbd> → Scroll to Bottom.
Copy and paste the rest of the line that begins “<samp>Installed version: </samp>”,
or, for older versions, the entire line after “<samp>Server message</samp>”.
placeholder: "e.g. WLED 0.13.1 (build 2203150)"
validations:
required: true
- type: dropdown
id: Board
attributes:
label: Which microcontroller/board are you seeing the problem on?
multiple: true
options:
- ESP8266
- ESP32
- ESP32-S3
- ESP32-S2
- ESP32-C3
- Other
- ESP32-C6 (experimental)
- ESP32-C5 (experimental)
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log/trace output
description: Please copy and paste any relevant log output if you have it. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: textarea
attributes:
label: Anything else?
description: |
Links? References? Anything that will give us more context about the issue you are encountering!
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: false
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/wled-dev/WLED/blob/main/CODE_OF_CONDUCT.md)
options:
- label: I agree to follow this project's Code of Conduct
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: WLED Discord community
url: https://discord.gg/KuqP7NE
about: Please ask and answer questions and discuss setup issues here!
- name: WLED community forum
url: https://wled.discourse.group/
about: For issues and ideas that might need longer discussion.
- name: kno.wled.ge base
url: https://kno.wled.ge/basics/faq/
about: Take a look at the frequently asked questions and documentation, perhaps your question is already answered!
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an improvement idea for WLED!
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
Thank you for your ideas for making WLED better!
================================================
FILE: .github/copilot-instructions.md
================================================
# WLED - ESP32/ESP8266 LED Controller Firmware
WLED is a fast and feature-rich implementation of an ESP32 and ESP8266 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs and SPI-based chipsets. The project consists of C++ firmware for microcontrollers and a modern web interface.
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
## Working Effectively
### Initial Setup
- Install Node.js 20+ (specified in `.nvmrc`): Check your version with `node --version`
- Install dependencies: `npm ci` (takes ~5 seconds)
- Install PlatformIO for hardware builds: `pip install -r requirements.txt` (takes ~60 seconds)
### Build and Test Workflow
- **ALWAYS build web UI first**: `npm run build` -- takes 3 seconds. NEVER CANCEL.
- **Run tests**: `npm test` -- takes 40 seconds. NEVER CANCEL. Set timeout to 2+ minutes.
- **Development mode**: `npm run dev` -- monitors file changes and auto-rebuilds web UI
- **Hardware firmware build**: `pio run -e [environment]` -- takes 15+ minutes. NEVER CANCEL. Set timeout to 30+ minutes.
### Build Process Details
The build has two main phases:
1. **Web UI Generation** (`npm run build`):
- Processes files in `wled00/data/` (HTML, CSS, JS)
- Minifies and compresses web content
- Generates `wled00/html_*.h` files with embedded web content
- **CRITICAL**: Must be done before any hardware build
2. **Hardware Compilation** (`pio run`):
- Compiles C++ firmware for various ESP32/ESP8266 targets
- Common environments: `nodemcuv2`, `esp32dev`, `esp8266_2m`
- List all targets: `pio run --list-targets`
## Before Finishing Work
**CRITICAL: You MUST complete ALL of these steps before marking your work as complete:**
1. **Run the test suite**: `npm test` -- Set timeout to 2+ minutes. NEVER CANCEL.
- All tests MUST pass
- If tests fail, fix the issue before proceeding
2. **Build at least one hardware environment**: `pio run -e esp32dev` -- Set timeout to 30+ minutes. NEVER CANCEL.
- Choose `esp32dev` as it's a common, representative environment
- See "Hardware Compilation" section above for the full list of common environments
- The build MUST complete successfully without errors
- If the build fails, fix the issue before proceeding
- **DO NOT skip this step** - it validates that firmware compiles with your changes
3. **For web UI changes only**: Manually test the interface
- See "Manual Testing Scenarios" section below
- Verify the UI loads and functions correctly
**If any of these validation steps fail, you MUST fix the issues before finishing. Do NOT mark work as complete with failing builds or tests.**
## Validation and Testing
### Web UI Testing
- **ALWAYS validate web UI changes manually**:
- Start local server: `cd wled00/data && python3 -m http.server 8080`
- Open `http://localhost:8080/index.htm` in browser
- Test basic functionality: color picker, effects, settings pages
- **Check for JavaScript errors** in browser console
### Code Validation
- **No automated linting configured** - follow existing code style in files you edit
- **Code style**: Use tabs for web files (.html/.css/.js), spaces (2 per level) for C++ files
- **Language**: The repository language is English (british, american, canadian, or australian). If you find other languages, suggest a translation into English.
- **C++ formatting available**: `clang-format` is installed but not in CI
- **Always run tests before finishing**: `npm test`
- **MANDATORY: Always run a hardware build before finishing** (see "Before Finishing Work" section below)
### Manual Testing Scenarios
After making changes to web UI, always test:
- **Load main interface**: Verify index.htm loads without errors
- **Navigation**: Test switching between main page and settings pages
- **Color controls**: Verify color picker and brightness controls work
- **Effects**: Test effect selection and parameter changes
- **Settings**: Test form submission and validation
## Common Tasks
### Repository Structure
```
wled00/ # Main firmware source (C++)
├── data/ # Web interface files
│ ├── index.htm # Main UI
│ ├── settings*.htm # Settings pages
│ └── *.js/*.css # Frontend resources
├── *.cpp/*.h # Firmware source files
└── html_*.h # Auto-generated embedded web files (DO NOT EDIT, DO NOT COMMIT)
tools/ # Build tools (Node.js)
├── cdata.js # Web UI build script
└── cdata-test.js # Test suite
platformio.ini # Hardware build configuration
package.json # Node.js dependencies and scripts
.github/workflows/ # CI/CD pipelines
```
### Key Files and Their Purpose
- `wled00/data/index.htm` - Main web interface
- `wled00/data/settings*.htm` - Configuration pages
- `tools/cdata.js` - Converts web files to C++ headers
- `wled00/wled.h` - Main firmware configuration
- `platformio.ini` - Hardware build targets and settings
### Development Workflow (applies to agent mode only)
1. **For web UI changes**:
- Edit files in `wled00/data/`
- Run `npm run build` to regenerate headers
- Test with local HTTP server
- Run `npm test` to validate build system
2. **For firmware changes**:
- Edit files in `wled00/` (but NOT `html_*.h` files)
- Ensure web UI is built first (`npm run build`)
- Build firmware: `pio run -e [target]`
- Flash to device: `pio run -e [target] --target upload`
3. **For both web and firmware**:
- Always build web UI first
- Test web interface manually
- Build and test firmware if making firmware changes
## Build Timing and Timeouts
**IMPORTANT: Use these timeout values when running builds:**
- **Web UI build** (`npm run build`): 3 seconds typical - Set timeout to 30 seconds minimum
- **Test suite** (`npm test`): 40 seconds typical - Set timeout to 120 seconds (2 minutes) minimum
- **Hardware builds** (`pio run -e [target]`): 15-20 minutes typical for first build - Set timeout to 1800 seconds (30 minutes) minimum
- Subsequent builds are faster due to caching
- First builds download toolchains and dependencies which takes significant time
- **NEVER CANCEL long-running builds** - PlatformIO downloads and compilation require patience
**When validating your changes before finishing, you MUST wait for the hardware build to complete successfully. Set the timeout appropriately and be patient.**
## Troubleshooting
### Common Issues
- **Build fails with missing html_*.h**: Run `npm run build` first
- **Web UI looks broken**: Check browser console for JavaScript errors
- **PlatformIO network errors**: Try again, downloads can be flaky
- **Node.js version issues**: Ensure Node.js 20+ is installed (check `.nvmrc`)
### When Things Go Wrong
- **Clear generated files**: `rm -f wled00/html_*.h` then rebuild
- **Force web UI rebuild**: `npm run build -- --force` or `npm run build -- -f`
- **Clean PlatformIO cache**: `pio run --target clean`
- **Reinstall dependencies**: `rm -rf node_modules && npm install`
## Important Notes
- **Always commit source files**
- **Web UI re-built is part of the platformio firmware compilation**
- **do not commit generated html_*.h files**
- **DO NOT edit `wled00/html_*.h` files** - they are auto-generated. If needed, modify Web UI files in `wled00/data/`.
- **Test web interface manually after any web UI changes**
- When reviewing a PR: the PR author does not need to update/commit generated html_*.h files - these files will be auto-generated when building the firmware binary.
- If updating Web UI files in `wled00/data/`, make use of common functions availeable in `wled00/data/common.js` where possible.
- **Use VS Code with PlatformIO extension for best development experience**
- **Hardware builds require appropriate ESP32/ESP8266 development board**
## CI/CD Pipeline
**The GitHub Actions CI workflow will:**
1. Installs Node.js and Python dependencies
2. Runs `npm test` to validate build system (MUST pass)
3. Builds web UI with `npm run build` (automatically run by PlatformIO)
4. Compiles firmware for ALL hardware targets listed in `default_envs` (MUST succeed for all)
5. Uploads build artifacts
**To ensure CI success, you MUST locally:**
- Run `npm test` and ensure it passes
- Run `pio run -e esp32dev` (or another common environment from "Hardware Compilation" section) and ensure it completes successfully
- If either fails locally, it WILL fail in CI
**Match this workflow in your local development to ensure CI success. Do not mark work complete until you have validated builds locally.**
================================================
FILE: .github/workflows/build.yml
================================================
name: WLED Build
# Only included into other workflows
on:
workflow_call:
jobs:
get_default_envs:
name: Gather Environments
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: Install PlatformIO
run: pip install -r requirements.txt
- name: Get default environments
id: envs
run: |
echo "environments=$(pio project config --json-output | jq -cr '.[0][1][0][1]')" >> $GITHUB_OUTPUT
outputs:
environments: ${{ steps.envs.outputs.environments }}
build:
name: Build Environments
runs-on: ubuntu-latest
needs: get_default_envs
strategy:
fail-fast: false
matrix:
environment: ${{ fromJSON(needs.get_default_envs.outputs.environments) }}
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- run: |
npm ci
VERSION=`date +%y%m%d0`
sed -i -r -e "s/define VERSION .+/define VERSION $VERSION/" wled00/wled.h
- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.platformio/.cache
~/.buildcache
build_output
key: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-${{ hashFiles('wled00/**', 'usermods/**') }}
restore-keys: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: Install PlatformIO
run: pip install -r requirements.txt
- name: Build firmware
run: pio run -e ${{ matrix.environment }}
- uses: actions/upload-artifact@v4
with:
name: firmware-${{ matrix.environment }}
path: |
build_output/release/*.bin
build_output/release/*_ESP02*.bin.gz
testCdata:
name: Test cdata.js
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- run: npm ci
- run: npm test
================================================
FILE: .github/workflows/nightly.yml
================================================
name: Deploy Nightly
on:
# This can be used to automatically publish nightlies at UTC nighttime
schedule:
- cron: '0 2 * * *' # run at 2 AM UTC
# This can be used to allow manually triggering nightlies from the web interface
workflow_dispatch:
jobs:
wled_build:
uses: ./.github/workflows/build.yml
nightly:
name: Deploy nightly
runs-on: ubuntu-latest
needs: wled_build
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Show Files
run: ls -la
- name: "✏️ Generate release changelog"
id: changelog
uses: janheinrichmerker/action-github-changelog-generator@v2.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
sinceTag: v0.15.0
output: CHANGELOG_NIGHTLY.md
# Exclude issues that were closed without resolution from changelog
excludeLabels: 'stale,wontfix,duplicate,invalid,external,question,use-as-is,not_planned'
- name: Update Nightly Release
uses: andelf/nightly-release@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: nightly
name: 'Nightly Release $$'
prerelease: true
body_path: CHANGELOG_NIGHTLY.md
files: |
*.bin
*.bin.gz
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v3
with:
repository: wled/WLED-WebInstaller
event-type: release-nightly
token: ${{ secrets.PAT_PUBLIC }}
================================================
FILE: .github/workflows/pr-merge.yaml
================================================
name: Notify Discord on PR Merge
on:
workflow_dispatch:
pull_request_target:
types: [closed]
jobs:
notify:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- name: Get User Permission
id: checkAccess
uses: actions-cool/check-user-permission@v2
with:
require: write
username: ${{ github.triggering_actor }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check User Permission
if: steps.checkAccess.outputs.require-result == 'false'
run: |
echo "${{ github.triggering_actor }} does not have permissions on this repo."
echo "Current permission level is ${{ steps.checkAccess.outputs.user-permission }}"
echo "Job originally triggered by ${{ github.actor }}"
exit 1
- name: Send Discord notification
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_URL: ${{ github.event.pull_request.html_url }}
ACTOR: ${{ github.actor }}
run: |
jq -n \
--arg content "Pull Request #${PR_NUMBER} \"${PR_TITLE}\" merged by ${ACTOR}
${PR_URL} . It will be included in the next nightly builds, please test" \
'{content: $content}' \
| curl -H "Content-Type: application/json" -d @- ${{ secrets.DISCORD_WEBHOOK_BETA_TESTERS }}
================================================
FILE: .github/workflows/release.yml
================================================
name: WLED Release CI
on:
push:
tags:
- '*'
jobs:
wled_build:
uses: ./.github/workflows/build.yml
release:
name: Create Release
runs-on: ubuntu-latest
needs: wled_build
steps:
- uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: "✏️ Generate release changelog"
id: changelog
uses: janheinrichmerker/action-github-changelog-generator@v2.4
with:
token: ${{ secrets.GITHUB_TOKEN }}
sinceTag: v0.15.0
maxIssues: 500
# Exclude issues that were closed without resolution from changelog
excludeLabels: 'stale,wontfix,duplicate,invalid,external,question,use-as-is,not_planned'
- name: Create draft release
uses: softprops/action-gh-release@v1
with:
body: ${{ steps.changelog.outputs.changelog }}
draft: True
files: |
*.bin
*.bin.gz
================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '0 12 * * *'
workflow_dispatch:
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
days-before-stale: 120
days-before-close: 7
stale-issue-label: 'stale'
stale-pr-label: 'stale'
exempt-issue-labels: 'pinned,keep,enhancement,confirmed'
exempt-pr-labels: 'pinned,keep,enhancement,confirmed'
exempt-all-milestones: true
operations-per-run: 1000
stale-issue-message: >
Hey! This issue has been open for quite some time without any new comments now.
It will be closed automatically in a week if no further activity occurs.
Thank you for using WLED! ✨
stale-pr-message: >
Hey! This pull request has been open for quite some time without any new comments now.
It will be closed automatically in a week if no further activity occurs.
Thank you for contributing to WLED! ❤️
================================================
FILE: .github/workflows/test.yaml
================================================
on:
workflow_dispatch:
jobs:
dispatch:
runs-on: ubuntu-latest
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v3
with:
repository: wled/WLED-WebInstaller
event-type: release-nightly
token: ${{ secrets.PAT_PUBLIC }}
================================================
FILE: .github/workflows/usermods.yml
================================================
name: Usermod CI
on:
pull_request:
paths:
- usermods/**
jobs:
get_usermod_envs:
# Only run for pull requests from forks (not from branches within wled/WLED)
if: github.event.pull_request.head.repo.full_name != github.repository
name: Gather Usermods
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: Install PlatformIO
run: pip install -r requirements.txt
- name: Get default environments
id: envs
run: |
echo "usermods=$(find usermods/ -name library.json | xargs dirname | xargs -n 1 basename | jq -R | grep -v PWM_fan | grep -v BME68X_v2| grep -v pixels_dice_tray | jq --slurp -c)" >> $GITHUB_OUTPUT
outputs:
usermods: ${{ steps.envs.outputs.usermods }}
build:
# Only run for pull requests from forks (not from branches within wled/WLED)
if: github.event.pull_request.head.repo.full_name != github.repository
name: Build Enviornments
runs-on: ubuntu-latest
needs: get_usermod_envs
strategy:
fail-fast: false
matrix:
usermod: ${{ fromJSON(needs.get_usermod_envs.outputs.usermods) }}
environment: [usermods_esp32, usermods_esp32c3, usermods_esp32s2, usermods_esp32s3]
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
- run: npm ci
- name: Cache PlatformIO
uses: actions/cache@v4
with:
path: |
~/.platformio/.cache
~/.buildcache
build_output
key: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-${{ hashFiles('wled00/**', 'usermods/**') }}
restore-keys: pio-${{ runner.os }}-${{ matrix.environment }}-${{ hashFiles('platformio.ini', 'pio-scripts/output_bins.py') }}-
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: Install PlatformIO
run: pip install -r requirements.txt
- name: Add usermods environment
run: |
cp -v usermods/platformio_override.usermods.ini platformio_override.ini
echo >> platformio_override.ini
echo "custom_usermods = ${{ matrix.usermod }}" >> platformio_override.ini
cat platformio_override.ini
- name: Build firmware
run: pio run -e ${{ matrix.environment }}
================================================
FILE: .github/workflows/wled-ci.yml
================================================
name: WLED CI
on:
push:
branches:
- '*'
pull_request:
jobs:
wled_build:
uses: ./.github/workflows/build.yml
================================================
FILE: .gitignore
================================================
.cache
.clang-format
.direnv
.DS_Store
.idea
.pio
.pioenvs
.piolibdeps
.vscode
compile_commands.json
__pycache__/
/.dummy
/dependencies.lock
/managed_components
esp01-update.sh
platformio_override.ini
replace_fs.py
wled-update.sh
/build_output/
/node_modules/
/logs/
/wled00/extLibs
/wled00/LittleFS
/wled00/my_config.h
/wled00/Release
/wled00/wled00.ino.cpp
/wled00/html_*.h
/wled00/js_*.h
================================================
FILE: .gitpod.Dockerfile
================================================
FROM gitpod/workspace-full
USER gitpod
================================================
FILE: .gitpod.yml
================================================
tasks:
- command: pip3 install -U platformio && platformio run
image:
file: .gitpod.Dockerfile
vscode:
extensions:
- Atishay-Jain.All-Autocomplete
- esbenp.prettier-vscode
- shardulm94.trailing-spaces
================================================
FILE: .nvmrc
================================================
20.18
================================================
FILE: CHANGELOG.md
================================================
## WLED changelog
#### Build 2410270
- WLED 0.15.0-b7 release
- Re-license the WLED project from MIT to EUPL (#4194 by @Aircoookie)
- Fix alexa devices invisible/uncontrollable (#4214 by @Svennte)
- Add visual expand button on hover (#4172)
- Usermod: Audioreactive tuning and performance enhancements (by @softhack007)
- `/json/live` (JSON live data/peek) only enabled when WebSockets are disabled
- Various bugfixes and optimisations: #4179, #4215, #4219, #4222, #4223, #4224, #4228, #4230
#### Build 2410140
- WLED 0.15.0-b6 release
- Added BRT timezone (#4188 by @LuisFadini)
- Fixed the positioning of the "Download the latest binary" button (#4184 by @maxi4329)
- Add WLED_AUTOSEGMENTS compile flag (#4183 by @PaoloTK)
- New 512kB FS parition map for 4MB devices
- Internal API change: Static PinManager & UsermodManager
- Change in Improv chip ID and version generation
- Various optimisations, bugfixes and enhancements (#4005, #4174 & #4175 by @Xevel, #4180, #4168, #4154, #4189 by @dosipod)
#### Build 2409170
- UI: Introduce common.js in settings pages (size optimisation)
- Add the ability to toggle the reception of palette synchronizations (#4137 by @felddy)
- Usermod/FX: Temperature usermod added Temperature effect (example usermod effect by @blazoncek)
- Fix AsyncWebServer version pin
#### Build 2409140
- Configure different kinds of busses at compile (#4107 by @PaoloTK)
- BREAKING: removes LEDPIN and DEFAULT_LED_TYPE compile overrides
- Fetch LED types from Bus classes (dynamic UI) (#4129 by @netmindz, @blazoncek, @dedehai)
- Temperature usermod: update OneWire to 2.3.8 (#4131 by @iammattcoleman)
#### Build 2409100
- WLED 0.15.0-b5 release
- Audioreactive usermod included by default in all compatible builds (including ESP8266)
- Demystified some byte definitions of WiZmote ESP-NOW message (#4114 by @ChuckMash)
- Update usermod "Battery" improved MQTT support (#4110 by @itCarl)
- Added a usermod for interacting with BLE Pixels Dice (#4093 by @axlan)
- Allow lower values for touch threshold (#4081 by @RobinMeis)
- Added POV image effect usermod (#3539 by @Liliputech)
- Remove repeating code to fetch audio data (#4103 by @netmindz)
- Loxone JSON parser doesn't handle lx=0 correctly (#4104 by @FreakyJ, fixes #3809)
- Rename wled00.ino to wled_main.cpp (#4090 by @willmmiles)
- SM16825 chip support including WW & CW channel swap (#4092)
- Add stress testing scripts (#4088 by @willmmiles)
- Improve jsonBufferLock management (#4089 by @willmmiles)
- Fix incorrect PWM bit depth on Esp32 with XTAL clock (#4082 by @PaoloTK)
- Devcontainer args (#4073 by @axlan)
- Effect: Fire2012 optional blur amount (#4078 by @apanteleev)
- Effect: GEQ fix bands (#4077 by @adrianschroeter)
- Boot delay option (#4060 by @DedeHai)
- ESP8266 Audioreactive sync (#3962 by @gaaat98, @netmindz, @softhack007)
- ESP8266 PWM crash fix (#4035 by @willmmiles)
- Usermod: Battery fix (#4051 by @Nickbert7)
- Usermod: Mpu6050 usermod crash fix (#4048 by @willmmiles)
- Usermod: Internal Temperature V2 (#4033 by @adamsthws)
- Various fixes and improvements (including build environments to emulate 0.14.0 for ESP8266)
#### Build 2407070
- Various fixes and improvements (mainly LED settings fix)
#### Build 2406290
- WLED 0.15.0-b4 release
- LED settings bus management update (WARNING: only allows available outputs)
- Add ETH support for LILYGO-POE-Pro (#4030 by @rorosaurus)
- Update usermod_sn_photoresistor (#4017 by @xkvmoto)
- Several internal fixes and optimisations
- move LED_BUILTIN handling to BusManager class
- reduce max panels (web server limitation)
- edit WiFi TX power (ESP32)
- keep current ledmap ID in UI
- limit outputs in UI based on length
- wifi.ap addition to JSON Info (JSON API)
- relay pin init bugfix
- file editor button in UI
- ESP8266: update was restarting device on some occasions
- a bit of throttling in UI (for ESP8266)
#### Build 2406120
- Update NeoPixelBus to v2.8.0
- Increased LED outputs one ESP32 using parallel I2S (up to 17)
- use single/mono I2S + 4x RMT for 5 outputs or less
- use parallel x8 I2S + 8x RMT for >5 outputs (limit of 300 LEDs per output)
- Fixed code of Smartnest and updated documentation (#4001 by @DevilPro1)
- ESP32-S3 WiFi fix (#4010 by @cstruck)
- TetrisAI usermod fix (#3897 by @muebau)
- ESP-NOW usermod hook
- Update wled.h regarding OTA Password (#3993 by @gsieben)
- Usermod BME68X Sensor Implementation (#3994 by @gsieben)
- Add a usermod for AHT10, AHT15 and AHT20 temperature/humidity sensors (#3977 by @LordMike)
- Update Battery usermod documentation (#3968 by @adamsthws)
- Add INA226 usermod for reading current and power over i2c (#3986 by @LordMike)
- Bugfixes: #3991
- Several internal fixes and optimisations (WARNING: some effects may be broken that rely on overflow/narrow width)
- replace uint8_t and uint16_t with unsigned
- replace in8_t and int16_t with int
- reduces code by 1kB
#### Build 2405180
- WLED 0.14.4 release
- Fix for #3978
- Official 0.15.0-b3 release
- Merge 0.14.3 fixes into 0_15
- Added Pinwheel Expand 1D->2D effect mapping mode (#3961 by @Brandon502)
- Add changeable i2c address to BME280 usermod (#3966 by @LordMike)
- Effect: Firenoise - add palette selection
- Experimental parallel I2S support for ESP32 (compile time option)
- increased outputs to 17
- increased max possible color order overrides
- use WLED_USE_PARALLEL_I2S during compile
WARNING: Do not set up more than 256 LEDs per output when using parallel I2S with NeoPixelBus less than 2.9.0
- Update Usermod: Battery (#3964 by @adamsthws)
- Update Usermod: BME280 (#3965 by @LordMike)
- TM1914 chip support (#3913)
- Ignore brightness in Peek
- Antialiased line & circle drawing functions
- Enabled some audioreactive effects for single pixel strips/segments (#3942 by @gaaat98)
- Usermod Battery: Added Support for different battery types, Optimized file structure (#3003 by @itCarl)
- Skip playlist entry API (#3946 by @freakintoddles2)
- various optimisations and bugfixes (#3987, #3978)
#### Build 2405030
- Using brightness in analog clock overlay (#3944 by @paspiz85)
- Add Webpage shortcuts (#3945 by @w00000dy)
- ArtNet Poll reply (#3892 by @askask)
- Improved brightness change via long button presses (#3933 by @gaaat98)
- Relay open drain output (#3920 by @Suxsem)
- NEW JSON API: release info (update page, `info.release`)
- update esp32 platform to arduino-esp32 v2.0.9 (#3902)
- various optimisations and bugfixes (#3952, #3922, #3878, #3926, #3919, #3904 @DedeHai)
#### Build 2404120
- v0.15.0-b3
- fix for #3896 & WS2815 current saving
- conditional compile for AA setPixelColor()
#### Build 2404100
- Internals: #3859, #3862, #3873, #3875
- Prefer I2S1 over RMT on ESP32
- usermod for Adafruit MAX17048 (#3667 by @ccruz09)
- Runtime detection of ESP32 PICO, general PSRAM support
- Extend JSON API "info" object
- add "clock" - CPU clock in MHz
- add "flash" - flash size in MB
- Fix for #3879
- Analog PWM fix for ESP8266 (#3887 by @gaaat98)
- Fix for #3870 (#3880 by @DedeHai)
- ESP32 S3/S2 touch fix (#3798 by @DedeHai)
- PIO env. PSRAM fix for S3 & S3 with 4M flash
- audioreactive always included for S3 & S2
- Fix for #3889
- BREAKING: Effect: modified KITT (Scanner) (#3763)
#### Build 2404040
- WLED 0.14.3 release
- Fix for transition 0 (#3854, #3832, #3720)
- Fix for #3855 via #3873 (by @willmmiles)
#### Build 2403280
- Individual color channel control for JSON API (fixes #3860)
- "col":[int|string|object|array, int|string|object|array, int|string|object|array]
int = Kelvin temperature or 0 for black
string = hex representation of [WW]RRGGBB
object = individual channel control {"r":0,"g":127,"b":255,"w":255}, each being optional (valid to send {})
array = direct channel values [r,g,b,w] (w element being optional)
- runtime selection for CCT IC (Athom 15W bulb)
- #3850 (by @w00000dy)
- Rotary encoder palette count bugfix
- bugfixes and optimisations
#### Build 2403240
- v0.15.0-b2
- WS2805 support (RGB + WW + CW, 600kbps)
- Unified PSRAM use
- NeoPixelBus v2.7.9 (for future WS2805 support)
- Ubiquitous PSRAM mode for all variants of ESP32
- SSD1309_64 I2C Support for FLD Usermod (#3836 by @THATDONFC)
- Palette cycling fix (add support for `{"seg":[{"pal":"X~Y~"}]}` or `{"seg":[{"pal":"X~Yr"}]}`)
- FW1906 Support (#3810 by @deece and @Robert-github-com)
- ESPAsyncWebServer 2.2.0 (#3828 by @willmmiles)
- Bugfixes: #3843, #3844
#### Build 2403190
- limit max PWM frequency (fix incorrect PWM resolution)
- Segment UI bugfix
- Updated AsyncWebServer (by @wlillmmiles)
- Simpler boot preset (fix for #3806)
- Effect: Fix for 2D Drift animation (#3816 by @BaptisteHudyma)
- Effect: Add twin option to 2D Drift
- MQTT cleanup
- DDP: Support sources that don't push (#3833 by @willmmiles)
- Usermod: Tetris AI usermod (#3711 by @muebau)
#### Build 2403171
- merge 0.14.2 changes into 0.15
#### Build 2403070
- Add additional segment options when controlling over e1.31 (#3616 by @demophoon)
- LockedJsonResponse: Release early if possible (#3760 by @willmmiles)
- Update setup-node and cache usermods in wled-ci.yml (#3737 by @WoodyLetsCode)
- Fix preset sorting (#3790 by @WoodyLetsCode)
- compile time button configuration #3792
- remove IR config if not compiled
- additional string optimisations
- Better low brightness level PWM handling (fixes #2767, #2868)
#### Build 2402290
- Multiple analog button fix for #3549
- Preset caching on chips with PSRAM (credit @akaricchi)
- Fixing stairway usermod and adding buildflags (by @lost-hope)
- ESP-NOW packet modification
- JSON buffer lock error messages / Reduce wait time for lock to 100ms
- Reduce string RAM usage for ESP8266
- Fixing a potential array bounds violation in ESPDMX
- Move timezone table to PROGMEM (#3766 by @willmmiles)
- Reposition upload warning message. (fixes #3778)
- ABL display fix & optimisation
- Add virtual Art-Net RGBW option (#3783 by @shammy642)
#### Build 2402090
- Added new Ethernet controller RGB2Go Tetra (duplicate of ESP3DEUXQuattro)
- Usermod: httpPullLightControl (#3560 by @roelbroersma)
- DMX: S2 & C3 support via modified ESPDMX
- Bugfix: prevent cleaning of JSON buffer after a failed lock attempt (BufferGuard)
- Product/Brand override (API & AP SSID) (#3750 by @moustachauve)
#### Build 2402060
- WLED version 0.15.0-b1
- Harmonic Random Cycle palette (#3729 by @dedehai)
- Multi PIR sensor usermod (added support for attaching multiple PIR sensors)
- Removed obsolete (and nonfunctional) usermods
#### Build 2309120 till build 2402010
- WLED version 0.15.0-a0
- Multi-WiFi support. Add up to 3 (or more via cusom compile) WiFis to connect to (with help from @JPZV)
- Temporary AP. Use your WLED in public with temporary AP.
- Github CI build system enhancements (#3718 by @WoodyLetsCode)
- Accessibility: Node list ( #3715 by @WoodyLetsCode)
- Analog clock overlay enhancement (#3489 by @WoodyLetsCode)
- ESP32-POE-WROVER from Olimex ethernet support (#3625 by @m-wachter)
- APA106 support (#3580 by @itstefanjanos)
- BREAKING: Effect: updated Palette effect to support 2D (#3683 by @TripleWhy)
- "SuperSync" from WLED MM (by @MoonModules)
- Effect: DNA Spiral Effect Speed Fix (#3723 by @Derek4aty1)
- Fix for #3693
- Orange flash fix (#3196) for transitions
- Add own background image upload (#3596 by @WoodyLetsCode)
- WLED time overrides (`WLED_NTP_ENABLED`, `WLED_TIMEZONE`, `WLED_UTC_OFFSET`, `WLED_LAT` and `WLED_LON`)
- Better sorting and naming of static palettes (by @WoodyLetsCode)
- ANIMartRIX usermod and effects (#3673 by @netmindz)
- Use canvas instead of CSS gradient for liveview (#3621 by @zanhecht)
- Fix for #3672
- ColoOrderMap W channel swap (color order overrides now have W swap)
- En-/disable LED maps when receiving realtime data (#3554 by @ezcGman)
- Added PWM frequency selection to UI (Settings)
- Automatically build UI before compiling (#3598, #3666 by @WoodyLetsCode)
- Internal: Added *suspend* API to `strip` (`WS2812FX class`)
- Possible fix for #3589 & partial fix for #3605
- MPU6050 upgrade (#3654 by @willmmiles)
- UI internals (#3656 by @WoodyLetsCode)
- ColorPicker fix (#3658 by @WoodyLetsCode)
- Global JSON buffer guarding (#3648 by @willmmiles, resolves #3641, #3312, #3367, #3637, #3646, #3447)
- Effect: Fireworks 1D (fix for matrix trailing strip)
- BREAKING: Reduced number of segments (12) on ESP8266 due to less available RAM
- Increased available effect data buffer (increases more if board has PSRAM)
- Custom palette editor mobile UI enhancement (by @imeszaros)
- Per port Auto Brightness Limiter (ABL)
- Use PSRAM for JSON buffer (double size, larger ledmaps, up to 2k)
- Reduced heap fragmentation by allocating ledmap array only once and not deallocating effect buffer
- HTTP retries on failed UI load
- UI Search: scroll to top (#3587 by @WoodyLetsCode)
- Return to inline iro.js and rangetouch.js (#3597 by @WoodyLetsCode)
- Better caching (#3591 by @WoodyLetsCode)
- Do not send 404 for missing `skin.css` (#3590 by @WoodyLetsCode)
- Simplified UI rework (#3511 by @WoodyLetsCode)
- Domoticz device ID for PIR and Temperature usermods
- Bugfix for UCS8904 `hasWhite()`
- Better search in UI (#3540 by @WoodyLetsCode)
- Seeding FastLED PRNG (#3552 by @TripleWhy)
- WIZ Smart Button support (#3547 by @micw)
- New button type (button switch, fix for #3537)
- Pixel Magic Tool update (#3483 by @ajotanc)
- Effect: 2D Matrix fix for gaps
- Bugfix #3526, #3533, #3561
- Spookier Halloween Eyes (#3501)
- Compile time options for Multi Relay usermod (#3498)
- Effect: Fix for Dissolve (#3502)
- Better reverse proxy support (nested paths)
- Implement global JSON API boolean toggle (i.e. instead of "var":true or "var":false -> "var":"t").
- Sort presets by ID
- Fix for #3641, #3312, #3367, #3637, #3646, #3447, #3632, #3496, #2922, #3593, #3514, #3522, #3578 (partial), #3606 (@WoodyLetsCode)
- Improved random bg image and added random bg image options (@WoodyLetsCode, #3481)
- Audio palettes (Audioreactive usermod, credit @netmindz)
- Better UI tooltips (@ajotnac, #3464)
- Better effect filters (filter dropdown)
- UDP sync fix (for #3487)
- Power button override (solves #3431)
- Additional HTTP request throttling (ESP8266)
- Additional UI/UX improvements
- Segment class optimisations (internal)
- ESP-NOW sync
- ESP-NOW Wiz remote JSON overrides (similar to IR JSON) & bugfixes
- Gamma correction for custom palettes (#3399).
- Restore presets from browser local storage
- Optional effect blending
- Restructured UDP Sync (internal)
- Remove sync receive
- Sync clarification
- Disallow 2D effects on non-2D segments
- Return of 2 audio simulations
- Bugfix in sync #3344 (internal)
- remove excessive segments
- ignore inactive segments if not syncing bounds
- send UDP/WS on segment change
- pop_back() when removing last segment
#### Build 2403170
- WLED 0.14.2 release
#### Build 2403110
- Beta WLED 0.14.2-b2
- New AsyncWebServer (improved performance and reduced memory use)
- New builds for ESP8266 with 160MHz CPU clock
- Fixing stairway usermod and adding buildflags (#3758 by @lost-hope)
- Fixing a potential array bounds violation in ESPDMX
- Reduced RAM usage (moved strings and TZ data (by @willmmiles) to PROGMEM)
- LockedJsonResponse: Release early if possible (by @willmmiles)
#### Build 2402120
- Beta WLED 0.14.2-b1
- Possible fix for #3589 & partial fix for #3605
- Prevent JSON buffer clear after failed lock attempt
- Multiple analog button fix for #3549
- UM Audioreactive: add two compiler options (#3732 by @wled-install)
- Fix for #3693
#### Build 2401141
- Official release of WLED 0.14.1
- Fix for #3566, #3665, #3672
- Sorting of palettes in custom palette editor (#3674 by @WoodyLetsCode)
#### Build 2401060
- Version bump: 0.14.1-b3
- Global JSON buffer guarding (#3648 by @willmmiles, resolves #3641, #3312, #3367, #3637, #3646, #3447)
- Fix for #3632
- Custom palette editor mobile UI enhancement (#3617 by @imeszaros)
- changelog update
#### Build 2312290
- Fix for #3622, #3613, #3609
- Various tweaks and fixes
- changelog update
#### Build 2312230
- Version bump: 0.14.1-b2
- Fix for Pixel Magic button
- Fix for #2922 (option to force WiFi PHY mode to G on ESP8266)
- Fix for #3601, #3400 (incorrect sunrise/sunset, #3612 by @softhack007)
#### Build 2312180
- Bugfixes (#3593, #3490, #3573, #3517, #3561, #3555, #3541, #3536, #3515, #3522, #3533, #3508)
- Various other internal cleanups and optimisations
#### Build 2311160
- Version bump: 0.14.1-b1
- Bugfixes (#3526, #3502, #3496, #3484, #3487, #3445, #3466, #3296, #3382, #3312)
- New feature: Sort presets by ID
- New usermod: LDR sensor (#3490 by @JeffWDH)
- Effect: Twinklefox & Tinklecat metadata fix
- Effect: separate #HH and #MM for Scrolling Text (#3480)
- SSDR usermod enhancements (#3368)
- PWM fan usermod enhancements (#3414)
#### Build 2310010, build 2310130
- Release of WLED version 0.14.0 "Hoshi"
- Bugfixes for #3400, #3403, #3405
- minor HTML optimizations
- audioreactive: bugfix for UDP sound sync (partly initialized packets)
#### Build 2309240
- Release of WLED beta version 0.14.0-b6 "Hoshi"
- Effect bugfixes and improvements (Meteor, Meteor Smooth, Scrolling Text)
- audioreactive: bugfixes for ES8388 and ES7243 init; minor improvements for analog inputs
#### Build 2309100
- Release of WLED beta version 0.14.0-b5 "Hoshi"
- New standard esp32 build with audioreactive
- Effect blending bugfixes, and minor optimizations
#### Build 2309050
- Effect blending (#3311) (finally effect transitions!)
*WARNING*: May not work well with ESP8266, with plenty of segments or usermods (low RAM condition)!!!
- Added receive and send sync groups to JSON API (#3317) (you can change sync groups using preset)
- Internal temperature usermod (#3246)
- MQTT server and topic length overrides (#3354) (new build flags)
- Animated Staircase usermod enhancement (#3348) (on/off toggle/relay control)
- Added local time info to Info page (#3351)
- New effect: Rolling Balls (a.k.a. linear bounce) (#1039)
- Various bug fixes and enhancements.
#### Build 2308110
- Release of WLED beta version 0.14.0-b4 "Hoshi"
- Reset effect data immediately upon mode change
#### Build 2308030
- Improved random palette handling and blending
- Soap bugfix
- Fix ESP-NOW crash with AP mode Always
#### Build 2307180
- Bus-level global buffering (#3280)
- Removed per-segment LED buffer (SEGMENT.leds)
- various fixes and improvements (ESP variants platform 5.3.0, effect optimizations, /json/cfg pin allocation)
#### Build 2307130
- larger `oappend()` stack buffer (3.5k) for ESP32
- Preset cycle bugfix (#3262)
- Rotary encoder ALT fix for large LED count (#3276)
- effect updates (2D Plasmaball), `blur()` speedup
- On/Off toggle from nodes view (may show unknown device type on older versions) (#3291)
- various fixes and improvements (ABL, crashes when changing presets with different segments)
#### Build 2306270
- ESP-NOW remote support (#3237)
- Pixel Magic tool (display pixel art) (#3249)
- Websocket (peek) fallback when connection cannot be established, WS retries (#3267)
- Add WiFi network scan RPC command to Improv Serial (#3271)
- Longer (custom option available) segment name for ESP32
- various fixes and improvements
#### Build 2306210
- 0.14.0-b3 release
- respect global I2C in all usermods (no local initialization of I2C bus)
- Multi relay usermod compile-time enabled option (-D MULTI_RELAY_ENABLED=true|false)
#### Build 2306180
- Added client-side option for applying effect defaults from metadata
- Improved ESP8266 stability by reducing WebSocket response resends
- Updated ESP8266 core to 3.1.2
#### Build 2306141
- Lissajous improvements
- Scrolling Text improvements (leading 0)
#### Build 2306140
- Add settings PIN (un)locking to JSON post API
#### Build 2306130
- Bumped version to 0.14-b3 (beta 3)
- added pin dropdowns in LED preferences (not for LED pins) and usermods
- introduced (unused ATM) NeoGammaWLEDMethod class
- Reverse proxy support
- PCF8754 support for Rotary encoder (requires wiring INT pin to ESP GPIO)
- Rely on global I2C pins for usermods (breaking change)
- various fixes and enhancements
#### Build 2306020
- Support for segment sets (PR #3171)
- Reduce sound simulation modes to 2 to facilitate segment sets
- Trigger button immediately on press if all configured presets are the same (PR #3226)
- Changes for allowing Alexa to change light color to White when auto-calculating from RGB (PR #3211)
#### Build 2305280
- DDP protocol update (#3193)
- added PCF8574 I2C port expander support for Multi relay usermod
- MQTT multipacket (fragmented) message fix
- added option to retain MQTT brightness and color messages
- new ethernet board: @srg74 Ethernet Shield
- new 2D effects: Soap (#3184) & Octopus & Waving cell (credit @St3P40 https://github.com/80Stepko08)
- various fixes and enhancements
#### Build 2305090
- new ethernet board: @Wladi ABC! WLED Eth
- Battery usermod voltage calculation (#3116)
- custom palette editor (#3164)
- improvements in Dancing Shadows and Tartan effects
- UCS389x support
- switched to NeoPixelBus 2.7.5 (replaced NeoPixelBrightnessBus with NeoPixelBusLg)
- SPI bus clock selection (for LEDs) (#3173)
- DMX mode preset fix (#3134)
- iOS fix for scroll (#3182)
- Wordclock "Norddeutsch" fix (#3161)
- various fixes and enhancements
#### Build 2304090
- updated Arduino ESP8266 core to 4.1.0 (newer compiler)
- updated NeoPixelBus to 2.7.3 (with support for UCS890x chipset)
- better support for ESP32-C3, ESP32-S2 and ESP32-S3 (Arduino ESP32 core 5.2.0)
- iPad/tablet with 1024 pixels width in landscape orientation PC mode support (#3153)
- fix for Pixel Art Converter (#3155)
#### Build 2303240
- Peek scaling of large 2D matrices
- Added 0D (1 pixel) metadata for effects & enhance 0D (analog strip) UI handling
- Added ability to disable ADAlight (-D WLED_DISABLE_ADALIGHT)
- Fixed APA102 output on Ethernet enabled controllers
- Added ArtNet virtual/network output (#3121)
- Klipper usermod (#3106)
- Remove DST from CST timezone
- various fixes and enhancements
#### Build 2302180
- Removed Blynk support (servers shut down on 31st Dec 2022)
- Added `ledgap.json` to complement ledmaps for 2D matrices
- Added support for white addressable strips (#3073)
- Ability to use SHT temperature usermod with PWM fan usermod
- Added `onStateChange()` callback to usermods (#3081)
- Refactored `bus_manager` [internal]
- Dual 1D & 2D mode (add 1D strip after the matrix)
- Removed 1D -> 2D mapping for individual pixel control
- effect tweak: Fireworks 1D
- various bugfixes
#### Build 2301240
- Version bump to v0.14.0-b2 "Hoshi"
- PixelArt converter (convert any image to pixel art and display it on a matrix) (PR #3042)
- various effect updates and optimisations
- added Overlay option to some effects (allows overlapping segments)
- added gradient text on Scrolling Text
- added #DDMM, #MMDD & #HHMM date and time options for Scrolling Text effect (PR #2990)
- deprecated: Dynamic Smooth, Dissolve Rnd, Solid Glitter
- optimised & enhanced loading of default values
- new effect: Distortion Waves (2D)
- 2D support for Ripple effect
- slower minimum speed for Railway effect
- DMX effect mode & segment controls (PR #2891)
- Optimisations for conditional compiles (further reduction of code size)
- better UX with effect sliders (PR #3012)
- enhanced support for ESP32 variants: C3, S2 & S3
- usermod enhancements (PIR, Temperature, Battery (PR #2975), Analog Clock (PR #2993))
- new usermod SHT (PR #2963)
- 2D matrix set up with gaps or irregular panels (breaking change!) (PR #2892)
- palette blending/transitions
- random palette smooth changes
- hex color notations in custom palettes
- allow more virtual buses
- plethora of bugfixes
### WLED release 0.14.0-b1
#### Build 2212222
- Version bump to v0.14.0-b1 "Hoshi"
- 2D matrix support (including mapping 1D effects to 2D and 2D peek)
- [internal] completely rewritten Segment & WS2812FX handling code
- [internal] ability to add custom effects via usermods
- [internal] set of 2D drawing functions
- transitions on every segment (including ESP8266)
- enhanced old and new 2D effects (metadata: default values)
- custom palettes (up to 10; upload palette0.json, palette1.json, ...)
- custom effect sliders and options, quick filters
- global I2C and SPI GPIO allocation (for usermods)
- usermod settings page enhancements (dropdown & info)
- asynchronous preset loading (and added "pd" JSON API call for direct preset apply)
- new usermod Boblight (PR #2917)
- new usermod PWM Outputs (PR #2912)
- new usermod Audioreactive
- new usermod Word Clock Matrix (PR #2743)
- new usermod Ping Pong Clock (PR #2746)
- new usermod ADS1115 (PR #2752)
- new usermod Analog Clock (PR #2736)
- various usermod enhancements and updates
- allow disabling pull-up resistors on buttons
- SD card support (PR #2877)
- enhanced HTTP API to support custom effect sliders & options (X1, X2, X3, M1, M2, M3)
- multiple UDP sync message retries (PR #2830)
- network debug printer (PR #2870)
- automatic UI PC mode on large displays
- removed support for upgrading from pre-0.10 (EEPROM)
- support for setting GPIO level when LEDs are off (RMT idle level, ESP32 only) (PR #2478)
- Pakistan time-zone (PKT)
- ArtPoll support
- TM1829 LED support
- experimental support for ESP32 S2, S3 and C3
- general improvements and bugfixes
### WLED release 0.13.3
- Version bump to v0.13.3 "Toki"
- Disable ESP watchdog by default (fixes flickering and boot issues on a fresh install)
- Added support for LPD6803
### WLED release 0.13.2
#### Build 2208140
- Version bump to v0.13.2 "Toki"
- Added option to receive live data on the main segment only (PR #2601)
- Enable ESP watchdog by default (PR #2657)
- Fixed race condition when saving bus config
- Better potentiometer filtering (PR #2693)
- More suitable DMX libraries (PR #2652)
- Fixed outgoing serial TPM2 message length (PR #2628)
- Fixed next universe overflow and Art-Net DMX start address (PR #2607)
- Fixed relative segment brightness (PR #2665)
### Builds between releases 0.13.1 and 0.13.2
#### Build 2203191
- Fixed sunrise/set calculation (once again)
#### Build 2203190
- Fixed `/json/cfg` unable to set busses (#2589)
- Fixed Peek with odd LED counts > 255 (#2586)
#### Build 2203160
- Version bump to v0.13.2-a0 "Toki"
- Add ability to skip up to 255 LEDs
- Dependency version bumps
### WLED release 0.13.1
#### Build 2203150
- Version bump to v0.13.1 "Toki"
- Fix persistent preset bug, preventing save of new presets
### WLED release 0.13.0
#### Build 2203142
- Release of WLED v0.13.0 "Toki"
- Reduce APA102 hardware SPI frequency to 5Mhz
- Remove `persistent` parameter in `savePreset()`
### Builds between releases 0.12.0 and 0.13.0
#### Build 2203140
- Added factory reset by pressing button 0 for >10 seconds
- Added ability to set presets from DMX Effect mode
- Simplified label hiding JS in user interface
- Fixed JSON `{"live":true}` indefinite realtime mode
#### Build 2203080
- Disabled auto white mode in segments with no RGB bus
- Fixed hostname string not 0-terminated
- Fixed Popcorn mode not lighting first LED on pop
#### Build 2203060
- Dynamic hiding of unused color controls in UI (PR #2567)
- Removed native Cronixie support and added Cronixie usermod
- Fixed disabled timed preset expanding calendar
- Fixed Color Order setting shown for analog busses
- Fixed incorrect operator (#2566)
#### Build 2203011
- IR rewrite (PR #2561), supports CCT
- Added locate button to Time settings
- CSS fixes and adjustments
- Consistent Tab indentation in index JS and CSS
- Added initial contribution style guideline
#### Build 2202222
- Version bump to 0.13.0-b7 "Toki"
- Fixed HTTP API commands not applying to all selected segments in some conditions
- Blynk support is not compiled in by default on ESP32 builds
#### Build 2202210
- Fixed HTTP API commands not applying to all selected segments if called from JSON
- Improved Stream effects, no longer rely on LED state and won't fade out at low brightness
#### Build 2202200
- Added `info.leds.seglc` per-segment light capability info (PR #2552)
- Fixed `info.leds.rgbw` behavior
- Segment bounds sync (PR #2547)
- WebSockets auto reconnection and error handling
- Disable relay pin by default (PR #2531)
- Various fixes (ESP32 touch pin 33, floats, PR #2530, #2534, #2538)
- Deprecated `info.leds.cct`, `info.leds.wv` and `info.leds.rgbw`
- Deprecated `/url` endpoint
#### Build 2202030
- Switched to binary format for WebSockets peek (PR #2516)
- Playlist bugfix
- Added `extractModeName()` utility function
- Added serial out (PR #2517)
- Added configurable baud rate
#### Build 2201260
- Initial ESP32-C3 and ESP32-S2 support (PRs #2452, #2454, #2502)
- Full segment sync (PR #2427)
- Allow overriding of color order by ranges (PR #2463)
- Added white channel to Peek
#### Build 2112080
- Version bump to 0.13.0-b6 "Toki"
- Added "ESP02" (ESP8266 with 2M of flash) to PIO/release binaries
#### Build 2112070
- Added new effect "Fairy", replacing "Police All"
- Added new effect "Fairytwinkle", replacing "Two Areas"
- Static single JSON buffer (performance and stability improvement) (PR #2336)
#### Build 2112030
- Fixed ESP32 crash on Colortwinkles brightness change
- Fixed setting picker to black resetting hue and saturation
- Fixed auto white mode not saved to config
#### Build 2111300
- Added CCT and white balance correction support (PR #2285)
- Unified UI slider style
- Added LED settings config template upload
#### Build 2111220
- Fixed preset cycle not working from preset called by UI
- Reintroduced permanent min. and max. cycle bounds
#### Build 2111190
- Changed default ESP32 LED pin from 16 to 2
- Renamed "Running 2" to "Chase 2"
- Renamed "Tri Chase" to "Chase 3"
#### Build 2111170
- Version bump to 0.13.0-b5 "Toki"
- Improv Serial support (PR #2334)
- Button improvements (PR #2284)
- Added two time zones (PR #2264, 2311)
- JSON in/decrementing support for brightness and presets
- Fixed no gamma correction for JSON individual LED control
- Preset cycle bugfix
- Removed ledCount
- LED settings buffer bugfix
- Network pin conflict bugfix
- Changed default ESP32 partition layout to 4M, 1M FS
#### Build 2110110
- Version bump to 0.13.0-b4 "Toki"
- Added option for bus refresh if off (PR #2259)
- New auto segment logic
- Fixed current calculations for virtual or non-linear configs (PR #2262)
#### Build 2110060
- Added virtual network DDP busses (PR #2245)
- Allow playlist as end preset in playlist
- Improved bus start field UX
- Pin reservations improvements (PR #2214)
#### Build 2109220
- Version bump to 0.13.0-b3 "Toki"
- Added segment names (PR #2184)
- Improved Police and other effects (PR #2184)
- Reverted PR #1902 (Live color correction - will be implemented as usermod) (PR #2175)
- Added transitions for segment on/off
- Improved number of sparks/stars in Fireworks effect with low number of segments
- Fixed segment name edit pencil disappearing with request
- Fixed color transition active even if the segment is off
- Disallowed file upload with OTA lock active
- Fixed analog invert option missing (PR #2219)
#### Build 2109100
- Added an auto create segments per bus setting
- Added 15 new palettes from SR branch (PR #2134)
- Fixed segment runtime not reset on FX change via HTTP API
- Changed AsyncTCP dependency to pbolduc fork v1.2.0
#### Build 2108250
- Added Sync groups (PR #2150)
- Added JSON API over Serial support
- Live color correction (PR #1902)
#### Build 2108180
- Fixed JSON IR remote not working with codes greater than 0xFFFFFF (fixes #2135)
- Fixed transition 0 edge case
#### Build 2108170
- Added application level pong websockets reply (#2139)
- Use AsyncTCP 1.0.3 as it mitigates the flickering issue from 0.13.0-b2
- Fixed transition manually updated in preset overridden by field value
#### Build 2108050
- Fixed undesirable color transition from Orange to boot preset color on first boot
- Removed misleading Delete button on new playlist with one entry
- Updated NeoPixelBus to 2.6.7 and AsyncTCP to 1.1.1
#### Build 2107230
- Added skinning (extra custom CSS) (PR #2084)
- Added presets/config backup/restore (PR #2084)
- Added option for using length instead of Stop LED in UI (PR #2048)
- Added custom `holidays.json` holiday list (PR #2048)
#### Build 2107100
- Version bump to 0.13.0-b2 "Toki"
- Accept hex color strings in individual LED API
- Fixed transition property not applying unless power/bri/color changed next
- Moved transition field below segments (temporarily)
- Reduced unneeded websockets pushes
#### Build 2107091
- Fixed presets using wrong call mode (e.g. causing buttons to send UDP under direct change type)
- Increased hue buffer
- Renamed `NOTIFIER_CALL_MODE_` to `CALL_MODE_`
#### Build 2107090
- Busses extend total configured LEDs if required
- Fixed extra button pins defaulting to 0 on first boot
#### Build 2107080
- Made Peek use the main websocket connection instead of opening a second one
- Temperature usermod fix (from @blazoncek's dev branch)
#### Build 2107070
- More robust initial resource loading in UI
- Added `getJsonValue()` for usermod config parsing (PR #2061)
- Fixed preset saving over websocket
- Alpha ESP32 S2 support (filesystem does not work) (PR #2067)
#### Build 2107042
- Updated ArduinoJson to 6.18.1
- Improved Twinkleup effect
- Fixed preset immediately deselecting when set via HTTP API `PL=`
#### Build 2107041
- Restored support for "PL=~" mistakenly removed in 2106300
- JSON IR improvements
#### Build 2107040
- Playlist entries are now more compact
- Added the possibility to enter negative numbers for segment offset
#### Build 2107021
- Added WebSockets support to UI
#### Build 2107020
- Send websockets on every state change
- Improved Aurora effect
#### Build 2107011
- Added MQTT button feedback option (PR #2011)
#### Build 2107010
- Added JSON IR codes (PR #1941)
- Adjusted the width of WiFi and LED settings input fields
- Fixed a minor visual issue with slider trail not reaching thumb on low values
#### Build 2106302
- Fixed settings page broken by using "%" in input fields
#### Build 2106301
- Fixed a problem with disabled buttons reverting to pin 0 causing conflict
#### Build 2106300
- Version bump to 0.13.0-b0 "Toki"
- BREAKING: Removed preset cycle (use playlists)
- BREAKING: Removed `nl.fade`, `leds.pin` and `ccnf` from JSON API
- Added playlist editor UI
- Reordered segment UI and added offset field
- Raised maximum MQTT password length to 64 (closes #1373)
#### Build 2106290
- Added Offset to segments, allows shifting the LED considered first within a segment
- Added `of` property to seg object in JSON API to set offset
- Usermod settings improvements (PR #2043, PR #2045)
#### Build 2106250
- Fixed preset only disabling on second effect/color change
#### Build 2106241
- BREAKING: Added ability for usermods to force a config save if config incomplete. `readFromConfig()` needs to return a `bool` to indicate if the config is complete
- Updated usermods implementing `readFromConfig()`
- Auto-create segments based on configured busses
#### Build 2106200
- Added 2 Ethernet boards and split Ethernet configs into separate file
#### Build 2106180
- Fixed DOS on Chrome tab restore causing reboot
#### Build 2106170
- Optimized JSON buffer usage (pre-serialized color arrays)
#### Build 2106140
- Updated main logo
- Reduced flash usage by 0.8kB by using 8-bit instead of 32-bit PNGs for welcome and 404 pages
- Added a check to stop Alexa reporting an error if state set by macro differs from the expected state
#### Build 2106100
- Added support for multiple buttons with various types (PR #1977)
- Fixed infinite playlists (PR #2020)
- Added `r` to playlist object, allows for shuffle regardless of the `repeat` value
- Improved accuracy of NTP time sync
- Added possibility for WLED UDP sync to sync system time
- Improved UDP sync accuracy, if both sender and receiver are NTP synced
- Fixed a cache issue with restored tabs
- Cache CORS request
- Disable WiFi sleep by default on ESP32
#### Build 2105230
- No longer retain MQTT `/v` topic to alleviate storage loads on MQTT broker
- Fixed Sunrise calculation (atan_t approx. used outside of value range)
#### Build 2105200
- Fixed WS281x output on ESP32
- Fixed potential out-of-bounds write in MQTT
- Fixed IR pin not changeable if IR disabled
- Fixed XML API <wv> containing -1 on Manual only RGBW mode (see #888, #1783)
#### Build 2105171
- Always copy MQTT payloads to prevent non-0-terminated strings
- Updated ArduinoJson to 6.18.0
- Added experimental support for `{"on":"t"}` to toggle on/off state via JSON
#### Build 2105120
- Fixed possibility of non-0-terminated MQTT payloads
- Fixed two warnings regarding integer comparison
#### Build 2105112
- Usermod settings page no usermods message
- Lowered min speed for Drip effect
#### Build 2105111
- Fixed various Codacy code style and logic issues
#### Build 2105110
- Added Usermod settings page and configurable usermods (PR #1951)
- Added experimental `/json/cfg` endpoint for changing settings from JSON (see #1944, not part of official API)
#### Build 2105070
- Fixed not turning on after pressing "Off" on IR remote twice (#1950)
- Fixed OTA update file selection from Android app (TODO: file type verification in JS, since android can't deal with accept='.bin' attribute)
#### Build 2104220
- Version bump to 0.12.1-b1 "Hikari"
- Release and build script improvements (PR #1844)
#### Build 2104211
- Replace default TV simulator effect with the version that saves 18k of flash and appears visually identical
#### Build 2104210
- Added `tb` to JSON state, allowing setting the timebase (set tb=0 to start e.g. wipe effect from the beginning). Receive only.
- Slightly raised Solid mode refresh rate to work with LEDs (TM1814) that require refresh rates of at least 2fps
- Added sunrise and sunset calculation to the backup JSON time source
#### Build 2104151
- `NUM_STRIPS` no longer required with compile-time strip defaults
- Further optimizations in wled_math.h
#### Build 2104150
- Added ability to add multiple busses as compile time defaults using the esp32_multistrip usermod define syntax
#### Build 2104141
- Reduced memory usage by 540b by switching to a different trigonometric approximation
#### Build 2104140
- Added dynamic location-based Sunrise/Sunset macros (PR #1889)
- Improved seasonal background handling (PR #1890)
- Fixed instance discovery not working if MQTT not compiled in
- Fixed Button, IR, Relay pin not assigned by default (resolves #1891)
#### Build 2104120
- Added switch support (button macro is switch closing action, long press macro switch opening)
- Replaced Circus effect with new Running Dual effect (Circus is Tricolor Chase with Red/White/Black)
- Fixed ledmap with multiple segments (PR #1864)
#### Build 2104030
- Fixed ESP32 crash on Drip effect with reversed segment (#1854)
- Added flag `WLED_DISABLE_BROWNOUT_DET` to disable ESP32 brownout detector (off by default)
### WLED release 0.12.0
#### Build 2104020
- Allow clearing button/IR/relay pin on platforms that don't support negative numbers
- Removed AUX pin
- Hid some easter eggs, only to be found at easter
### Development versions between 0.11.1 and 0.12.0 releases
#### Build 2103310
- Version bump to 0.12.0 "Hikari"
- Fixed LED settings submission in iOS app
#### Build 2103300
- Version bump to 0.12.0-b5 "Hikari"
- Update to core espressif32@3.2
- Fixed IR pin not configurable
#### Build 2103290
- Version bump to 0.12.0-b4 "Hikari"
- Experimental use of espressif32@3.1.1
- Fixed RGBW mode disabled after LED settings saved
- Fixed infrared support not compiled in if IRPIN is not defined
#### Build 2103230
- Fixed current estimation
#### Build 2103220
- Version bump to 0.12.0-b2 "Hikari"
- Worked around an issue causing a critical decrease in framerate (wled.cpp l.240 block)
- Bump to Espalexa v2.7.0, fixing discovery
#### Build 2103210
- Version bump to 0.12.0-b1 "Hikari"
- More colors visible on Palette preview
- Fixed chevron icon not included
- Fixed color order override
- Cleanup
#### Build 2103200
- Version bump to 0.12.0-b0 "Hikari"
- Added palette preview and search (PR #1637)
- Added Reverse checkbox for PWM busses - reverses logic level for on
- Fixed various problems with the Playlist feature (PR #1724)
- Replaced "Layer" icon with "i" icon for Info button
- Chunchun effect more fitting for various segment lengths (PR #1804)
- Removed global reverse (in favor of individual bus reverse)
- Removed some unused icons from UI icon font
#### Build 2103130
- Added options for Auto Node discovery
- Optimized strings (no string both F() and raw)
#### Build 2103090
- Added Auto Node discovery (PR #1683)
- Added tooltips to quick color selectors for accessibility
#### Build 2103060
- Auto start field population in bus config
#### Build 2103050
- Fixed incorrect over-memory indication in LED settings on ESP32
#### Build 2103041
- Added destructor for BusPwm (fixes #1789)
#### Build 2103040
- Fixed relay mode inverted when upgrading from 0.11.0
- Fixed no more than 2 pins per bus configurable in UI
- Changed to non-linear IR brightness steps (PR #1742)
- Fixed various warnings (PR #1744)
- Added UDP DNRGBW Mode (PR #1704)
- Added dynamic LED mapping with ledmap.json file (PR #1738)
- Added support for QuinLED-ESP32-Ethernet board
- Added support for WESP32 ethernet board (PR #1764)
- Added Caching for main UI (PR #1704)
- Added Tetrix mode (PR #1729)
- Removed Merry Christmas mode (use "Chase 2" - called Running 2 before 0.13.0)
- Added memory check on Bus creation
#### Build 2102050
- Version bump to 0.12.0-a0 "Hikari"
- Added FPS indication in info
- Bumped max outputs from 7 to 10 busses for ESP32
#### Build 2101310
- First alpha configurable multipin
#### Build 2101130
- Added color transitions for all segments and slots and for segment brightness
- Fixed bug that prevented setting a boot preset higher than 25
#### Build 2101040
- Replaced Red & Blue effect with Aurora effect (PR #1589)
- Fixed HTTP changing segments uncommanded (#1618)
- Updated copyright year and contributor page link
#### Build 2012311
- Fixed Countdown mode
#### Build 2012310
- (Hopefully actually) fixed display of usermod values in info screen
#### Build 2012240
- Fixed display of usermod values in info screen
- 4 more effects now use FRAMETIME
- Remove unsupported environments from platformio.ini
#### Build 2012210
- Split index.htm in separate CSS + JS files (PR #1542)
- Minify UI HTML, saving >1.5kB flash
- Fixed JShint warnings
#### Build 2012180
- Boot brightness 0 will now use the brightness from preset
- Add iOS scrolling momentum (from PR #1528)
### WLED release 0.11.1
#### Build 2012180
- Release of WLED 0.11.1 "Mirai"
- Fixed AP hide not saving (fixes #1520)
- Fixed MQTT password re-transmitted to HTML
- Hide Update buttons while uploading, accept .bin
- Make sure AP password is at least 8 characters long
### Development versions after 0.11.0 release
#### Build 2012160
- Bump Espalexa to 2.5.0, fixing discovery (PR Espalexa/#152, originally PR #1497)
#### Build 2012150
- Added Blends FX (PR #1491)
- Fixed an issue that made it impossible to deactivate timed presets
#### Build 2012140
- Added Preset ID quick display option (PR #1462)
- Fixed LEDs not turning on when using gamma correct brightness and LEDPIN 2 (default)
- Fixed notifier applying main segment to selected segments on notification with FX/Col disabled
#### Build 2012130
- Fixed RGBW mode not saved between reboots (fixes #1457)
- Added brightness scaling in palette function for default (PR #1484)
#### Build 2012101
- Fixed preset cycle default duration rounded down to nearest 10sec interval (#1458)
- Enabled E1.31/DDP/Art-Net in AP mode
#### Build 2012100
- Fixed multi-segment preset cycle
- Fixed EEPROM (pre-0.11 settings) not cleared on factory reset
- Fixed an issue with intermittent crashes on FX change (PR #1465)
- Added function to know if strip is updating (PR #1466)
- Fixed using colorwheel sliding the UI (PR #1459)
- Fixed analog clock settings not saving (PR #1448)
- Added Temperature palette (PR #1430)
- Added Candy cane FX (PR #1445)
#### Build 2012020
- UDP `parsePacket()` with sync disabled (#1390)
- Added Multi RGBW DMX mode (PR #1383)
#### Build 2012010
- Fixed compilation for analog (PWM) LEDs
### WLED version 0.11.0
#### Build 2011290
- Release of WLED 0.11.0 "Mirai"
- Workaround for weird empty %f Espalexa issue
- Fixed crash on saving preset with HTTP API `PS`
- Improved performance for color changes in non-main segment
#### Build 2011270
- Added tooltips for speed and intensity sliders (PR #1378)
- Moved color order to NpbWrapper.h
- Added compile time define to override the color order for a specific range
#### Build 2011260
- Add `live` property to state, allowing toggling of realtime (not incl. in state resp.)
- PIO environment changes
#### Build 2011230
- Version bump to 0.11.0 "Mirai"
- Improved preset name sorting
- Fixed Preset cycle not working beyond preset 16
### Development versions between 0.10.2 and 0.11.0 releases
#### Build 2011220
- Fixed invalid save when modifying preset before refresh (might be related to #1361)
- Fixed brightness factor ignored on realtime timeout (fixes #1363)
- Fixed Phase and Chase effects with LED counts >256 (PR #1366)
#### Build 2011210
- Fixed Brightness slider beneath color wheel not working (fixes #1360)
- Fixed invalid UI state after saving modified preset
#### Build 2011200
- Added HEX color receiving to JSON API with `"col":["RRGGBBWW"]` format
- Moved Kelvin color receiving in JSON API from `"col":[[val]]` to `"col":[val]` format
_Notice:_ This is technically a breaking change. Since no release was made since the introduction and the Kelvin property was not previously documented in the wiki,
impact should be minimal.
- BTNPIN can now be disabled by setting to -1 (fixes #1237)
#### Build 2011180
- Platformio.ini updates and streamlining (PR #1266)
- my_config.h custom compile settings system (not yet used for much, adapted from PR #1266)
- Added Hawaii timezone (HST)
- Linebreak after 5 quick select buttons
#### Build 2011154
- Fixed RGBW saved incorrectly
- Fixed pmt caching requesting /presets.json too often
- Fixed deEEP not copying the first segment of EEPROM preset 16
#### Build 2011153
- Fixed an ESP32 end-of-file issue
- Fixed strip.isRgbw not read from cfg.json
#### Build 2011152
- Version bump to 0.11.0p "Mirai"
- Increased max. num of segments to 12 (ESP8266) / 16 (ESP32)
- Up to 250 presets stored in the `presets.json` file in filesystem
- Complete overhaul of the Presets UI tab
- Updated iro.js to v5 (fixes black color wheel)
- Added white temperature slider to color wheel
- Add JSON settings serialization/deserialization to cfg.json and wsec.json
- Added deEEP to convert the EEPROM settings and presets to files
- Playlist support - JSON only for now
- New v2 usermod methods `addToConfig()` and `readFromConfig()` (see EXAMPLE_v2 for doc)
- Added Ethernet support for ESP32 (PR #1316)
- IP addresses are now handled by the `Network` class
- New `esp32_poe` PIO environment
- Use EspAsyncWebserver Aircoookie fork v.2.0.0 (hiding wsec.json)
- Removed `WLED_DISABLE_FILESYSTEM` and `WLED_ENABLE_FS_SERVING` defines as they are now required
- Added pin manager
- UI performance improvements (no drop shadows)
- More explanatory error messages in UI
- Improved candle brightness
- Return remaining nightlight time `nl.rem` in JSON API (PR #1302)
- UI sends timestamp with every command, allowing for timed presets without using NTP
- Added gamma calculation (yet unused)
- Added LED type definitions to const.h (yet unused)
- Added nicer 404 page
- Removed `NP` and `MS=` macro HTTP API commands
- Removed macros from Time settings
#### Build 2011120
- Added the ability for the /api MQTT topic to receive JSON API payloads
#### Build 2011040
- Inverted Rain direction (fixes #1147)
#### Build 2011010
- Re-added previous C9 palette
- Renamed new C9 palette
#### Build 2010290
- Colorful effect now supports palettes
- Added C9 2 palette (#1291)
- Improved C9 palette brightness by 12%
- Disable onboard LED if LEDs are off (PR #1245)
- Added optional status LED (PR #1264)
- Realtime max. brightness now honors brightness factor (fixes #1271)
- Updated ArduinoJSON to 6.17.0
#### Build 2010020
- Fixed interaction of `T` and `NL` HTTP API commands (#1214)
- Fixed an issue where Sunrise mode nightlight does not activate if toggled on simultaneously
#### Build 2009291
- Fixed MQTT bootloop (no F() macro, #1199)
#### Build 2009290
- Added basic DDP protocol support
- Added Washing Machine effect (PR #1208)
#### Build 2009260
- Added Loxone parser (PR #1185)
- Added support for kelvin input via `K=` HTTP and `"col":[[val]]` JSON API calls
_Notice:_ `"col":[[val]]` removed in build 2011200, use `"col":[val]`
- Added supplementary UDP socket (#1205)
- TMP2.net receivable by default
- UDP sockets accept HTTP and JSON API commands
- Fixed missing timezones (#1201)
#### Build 2009202
- Fixed LPD8806 compilation
#### Build 2009201
- Added support for preset cycle toggling using CY=2
- Added ESP32 touch pin support (#1190)
- Fixed modem sleep on ESP8266 (#1184)
#### Build 2009200
- Increased available heap memory by 4kB
- Use F() macro for the majority of strings
- Restructure timezone code
- Restructured settings saved code
- Updated ArduinoJSON to 6.16.1
#### Build 2009170
- New WLED logo on Welcome screen (#1164)
- Fixed 170th pixel dark in E1.31
#### Build 2009100
- Fixed sunrise mode not reinitializing
- Fixed passwords not clearable
#### Build 2009070
- New Segments are now initialized with default speed and intensity
#### Build 2009030
- Fixed bootloop if mDNS is used on builds without OTA support
### WLED version 0.10.2
#### Build 2008310
- Added new logo
- Maximum GZIP compression (#1126)
- Enable WebSockets by default
### Development versions between 0.10.0 and 0.10.2 releases
#### Build 2008300
- Added new UI customization options to UI settings
- Added Dancing Shadows effect (#1108)
- Preset cycle is now paused if lights turned off or nightlight active
- Removed `esp01` and `esp01_ota` envs from travis build (need too much flash)
#### Build 2008290
- Added individual LED control support to JSON API
- Added internal Segment Freeze/Pause option
#### Build 2008250
- Made `platformio_override.ini` example easier to use by including the `default_envs` property
- FastLED uses `now` as timer, so effects using e.g. `beatsin88()` will sync correctly
- Extended the speed range of Pacifica effect
- Improved TPM2.net receiving (#1100)
- Fixed exception on empty MQTT payload (#1101)
#### Build 2008200
- Added segment mirroring to web UI
- Fixed segment mirroring when in reverse mode
#### Build 2008140
- Removed verbose live mode info from `<ds>` in HTTP API response
#### Build 2008100
- Fixed Auto White mode setting (fixes #1088)
#### Build 2008070
- Added segment mirroring (`mi` property) (#1017)
- Fixed DMX settings page not displayed (#1070)
- Fixed ArtNet multi universe and improve code style (#1076)
- Renamed global var `local` to `localTime` (#1078)
#### Build 2007190
- Fixed hostname containing illegal characters (#1035)
#### Build 2006251
- Added `SV=2` to HTTP API, allow selecting single segment only
#### Build 2006250
- Fix Alexa not turning off white channel (fixes #1012)
#### Build 2006220
- Added Sunrise nightlight mode
- Added Chunchun effect
- Added `LO` (live override) command to HTTP API
- Added `mode` to `nl` object of JSON state API, deprecating `fade`
- Added light color scheme support to web UI (click sun next to brightness slider)
- Added option to hide labels in web UI (click flame icon next to intensity slider)
- Added hex color input (click palette icon next to palette select) (resolves #506)
- Added support for RGB sliders (need to set in localstorage)
- Added support for custom background color or image (need to set in localstorage)
- Added option to hide bottom tab bar in PC mode (need to set in localstorage)
- Fixed transition lag with multiple segments (fixes #985)
- Changed Nightlight wording (resolves #940)
#### Build 2006060
- Added five effects by Andrew Tuline (Phased, Phased Noise, Sine, Noise Pal and Twinkleup)
- Added two new effects by Aircoookie (Sunrise and Flow)
- Added US-style sequence to traffic light effect
- Merged pull request #964 adding 9 key IR remote
#### Build 2005280
- Added v2 usermod API
- Added v2 example usermod `usermod_v2_example` in the usermods folder as prelimary documentation
- Added DS18B20 Temperature usermod with Info page support
- Disabled MQTT on ESP01 build to make room in flash
#### Build 2005230
- Fixed TPM2
#### Build 2005220
- Added TPM2.NET protocol support (need to set WLED broadcast UDP port to 65506)
- Added TPM2 protocol support via Serial
- Support up to 6553 seconds preset cycle durations (backend, NOT yet in UI)
- Merged pull request #591 fixing WS2801 color order
- Merged pull request #858 adding fully featured travis builds
- Merged pull request #862 adding DMX proxy feature
#### Build 2005100
- Update to Espalexa v2.4.6 (+1.6kB free heap memory)
- Added `m5atom` PlatformIO environment
#### Build 2005090
- Default to ESP8266 Arduino core v2.7.1 in PlatformIO
- Fixed Preset Slot 16 always indicating as empty (#891)
- Disabled Alexa emulation by default (causes bootloop for some users)
- Added BWLT11 and SHOJO_PCB defines to NpbWrapper
- Merged pull request #898 adding Solid Glitter effect
### WLED version 0.10.0
#### Build 2005030
- DMX Single RGW and Single DRGB modes now support an additional white channel
- Improved palettes derived from set colors and changed their names
### Development versions between 0.9.1 and 0.10.0 release
#### Build 2005020
- Added ACST and ACST/ACDT timezones
#### Build 2005010
- Added module info page to web UI
- Added realtime override functionality to web UI
- Added individual segment power and brightness to web UI
- Added feature to one-click select single segment only by tapping segment name
- Removed palette jumping to default if color is changed
#### Build 2004300
- Added realtime override option and `lor` JSON property
- Added `lm` (live mode) and `lip` (live IP) properties to info in JSON API
- Added reset commands to APIs
- Added `json/si`, returning state and info, but no FX or Palette lists
- Added rollover detection to millis(). Can track uptimes longer than 49 days
- Attempted to fix Wifi issues with Unifi brand APs
#### Build 2004230
- Added brightness and power for individual segments
- Added `on` and `bri` properties to Segment object in JSON API
- Added `C3` an `SB` commands to HTTP get API
- Merged pull request #865 for 5CH_Shojo_PCB environment
#### Build 2004220
- Added Candle Multi effect
- Added Palette capability to Pacifica effect
#### Build 2004190
- Added TM1814 type LED defines
#### Build 2004120
- Added Art-Net support
- Added OTA platform to platformio.ini
#### Build 2004100
- Fixed DMX output compilation
- Added DMX start LED setting
#### Build 2004061
- Fixed RBG and BGR getPixelColor (#825)
- Improved formatting
#### Build 2004060
- Consolidated global variables in wled.h
#### Build 2003300
- Major change of project structure from .ino to .cpp and func_declare.h
#### Build 2003262
- Fixed compilation for Analog LEDs
- Fixed sync settings network port fields too small
#### Build 2003261
- Fixed live preview not displaying whole light if over 255 LEDs
#### Build 2003251
- Added Pacifica effect (tentative, doesn't yet support other colors)
- Added Atlantica palette
- Fixed ESP32 build of Espalexa
#### Build 2003222
- Fixed Alexa Whites on non-RGBW lights (bump Espalexa to 2.4.5)
#### Build 2003221
- Moved Cronixie driver from FX library to drawOverlay handler
#### Build 2003211
- Added custom mapping compile define to FX_fcn.h
- Merged pull request #784 by @TravisDean: Fixed initialization bug when toggling skip first
- Added link to youtube videos by Room31 to readme
#### Build 2003141
- Fixed color of main segment returned in JSON API during transition not being target color (closes #765)
- Fixed arlsLock() being called after pixels set in E1.31 (closes #772)
- Fixed HTTP API calls not having an effect if no segment selected (now applies to main segment)
#### Build 2003121
- Created changelog.md - make tracking changes to code easier
- Merged pull request #766 by @pille: Fix E1.31 out-of sequence detection
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at dev.aircoookie@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: CONTRIBUTING.md
================================================
# Thank you for making WLED better!
WLED is a community-driven project, and every contribution matters! We appreciate your time and effort.
Our maintainers are here for two things: **helping you** improve your code, and **keeping WLED** lean, efficient, and maintainable.
We'll work with you to refine your contribution, but we'll also push back if something might create technical debt or add features without clear value. Don't take it personally - we're just protecting WLED's architecture while helping your contribution succeed!
## Getting Started
Here are a few suggestions to make it easier for you to contribute:
### PR from a branch in your own fork
Start your pull request (PR) in a branch of your own fork. Don't make a PR directly from your main branch.
This lets you update your PR if needed, while you can work on other tasks in 'main' or in other branches.
> [!TIP]
> **The easiest way to start your first PR**
> When viewing a file in `wled/WLED`, click on the "pen" icon and start making changes.
> When you choose to 'Commit changes', GitHub will automatically create a PR from your fork.
>
> <img width="295" height="134" alt="image: fork and edit" src="https://github.com/user-attachments/assets/f0dc7567-edcb-4409-a530-cd621ae9661f" />
### Target branch for pull requests
Please make all PRs against the `main` branch.
### Describing your PR
Please add a description of your proposed code changes.
A PR with no description or just a few words might not get accepted, simply because very basic information is missing.
No need to write an essay!
A good description helps us to review and understand your proposed changes. For example, you could say a few words about
* What you try to achieve (new feature, fixing a bug, refactoring, security enhancements, etc.)
* How your code works (short technical summary - focus on important aspects that might not be obvious when reading the code)
* Testing you performed, known limitations, anything you couldn't quite solve.
* Let us know if you'd like guidance from a maintainer (WLED is a big project 😉)
### Testing Your Changes
Before submitting:
- ✅ Does it compile?
- ✅ Does your feature/fix actually work?
- ✅ Did you break anything else?
- ✅ Tested on actual hardware if possible?
Mention your testing in the PR description (e.g., "Tested on ESP32 + WS2812B").
## During Review
We're all volunteers, so reviews can take some time (longer during busy times).
Don't worry - we haven't forgotten you! Feel free to ping after a week if there's no activity.
### Updating your code
While the PR is open, you can keep updating your branch - just push more commits! GitHub will automatically update your PR.
You don't need to squash commits or clean up history - we'll handle that when merging.
> [!CAUTION]
> Do not use "force-push" while your PR is open!
> It has many subtle and unexpected consequences on our GitHub repository.
> For example, we regularly lose review comments when the PR author force-pushes code changes. Our review bot (coderabbit) may become unable to properly track changes, it gets confused or stops responding to questions.
> So, pretty please, do not force-push.
> [!TIP]
> Use [cherry-picking](https://docs.github.com/en/desktop/managing-commits/cherry-picking-a-commit-in-github-desktop) to copy commits from one branch to another.
### Responding to Reviews
When we ask for changes:
- **Add new commits** - please don't amend or force-push
- **Reply in the PR** - let us know when you've addressed comments
- **Ask questions** - if something's unclear, just ask!
- **Be patient** - we're all volunteers here 😊
You can reference feedback in commit messages:
> ```text
> Fix naming per @Aircoookie's suggestion
> ```
### Dealing with Merge Conflicts
Got conflicts with `main`? No worries - here's how to fix them:
**Using GitHub Desktop** (easier for beginners):
1. Click **Fetch origin**, then **Pull origin**
2. If conflicts exist, GitHub Desktop will warn you - click **View conflicts**
3. Open the conflicted files in your editor (VS Code, etc.)
4. Remove the conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) and keep the correct code
5. Save the files
6. Back in GitHub Desktop, commit the merge (it'll suggest a message)
7. Click **Push origin**
**Using command line**:
```bash
git fetch origin
git merge origin/main
# Fix conflicts in your editor
git add .
git commit
git push
```
Either way works fine - pick what you're comfortable with! Merging is simpler than rebasing and keeps everything connected.
#### When you MUST rebase (really rare!)
Sometimes you might hit merge conflicts with `main` that are harder to solve. Here's what to try:
1. **Merge instead of rebase** (safest option):
```bash
git fetch origin
git merge origin/main
git push
```
Keeps review comments attached and CI results visible!
2. **Use cherry-picking** to copy commits between branches without rewriting history - [here's how](https://docs.github.com/en/desktop/managing-commits/cherry-picking-a-commit-in-github-desktop).
3. **If all else fails, use `--force-with-lease`** (not plain `--force`):
```bash
git rebase origin/main
git push --force-with-lease
```
Then **leave a comment** explaining why you had to force-push, and be ready to re-address some feedback.
### Additional Resources
Want to know more? Check out:
- 📚 [GitHub Desktop documentation](https://docs.github.com/en/desktop) - if you prefer GUI tools
- 🎓 [How to properly submit a PR](https://github.com/wled-dev/WLED/wiki/How-to-properly-submit-a-PR) - detailed tips and tricks
## After Approval
Once approved, a maintainer will merge your PR (possibly squashing commits).
Your contribution will be in the next WLED release - thank you! 🎉
## Coding Guidelines
### Source Code from an AI agent or bot
> [!IMPORTANT]
> It's OK if you took help from an AI for writing your source code.
>
> AI tools can be very helpful, but as the contributor, **you're responsible for the code**.
* Make sure you really understand the AI-generated code, don't just accept it because it "seems to work".
* Don't let the AI change existing code without double-checking by you as the contributor. Often, the result will not be complete. For example, previous source code comments may be lost.
* Remember that AI is still "Often-Wrong" ;-)
* If you don't feel confident using English, you can use AI for translating code comments and descriptions into English. AI bots are very good at understanding language. However, always check if the results are correct. The translation might still have wrong technical terms, or errors in some details.
#### Best Practice with AI
AI tools are powerful but "often wrong" - your judgment is essential! 😊
- ✅ **Understand the code** - As the person contributing to WLED, make sure you understand exactly what the AI-generated source code does
- ✅ **Review carefully** - AI can lose comments, introduce bugs, or make unnecessary changes
- ✅ **Be transparent** - Add a comment like `// This section was AI-generated` for larger chunks
- ✅ **Use AI for translation** - AI is great for translating comments to English (but verify technical terms!)
### Code style
Don't stress too much about style! When in doubt, just match the style in the files you're editing. 😊
Here are our main guidelines:
#### Indentation
We use tabs for indentation in Web files (.html/.css/.js) and spaces (2 per indentation level) for all other files.
You are all set if you have enabled `Editor: Detect Indentation` in VS Code.
#### Blocks
Whether the opening bracket of e.g. an `if` block is in the same line as the condition or in a separate line is up to your discretion. If there is only one statement, leaving out block brackets is acceptable.
Good:
```cpp
if (a == b) {
doStuff(a);
}
```
```cpp
if (a == b) doStuff(a);
```
Also acceptable (though the first style is usually easier to read):
```cpp
if (a == b)
{
doStuff(a);
}
```
There should always be a space between a keyword and its condition and between the condition and brace.
Within the condition, no space should be between the parenthesis and variables.
Spaces between variables and operators are up to the authors discretion.
There should be no space between function names and their argument parenthesis.
Good:
```cpp
if (a == b) {
doStuff(a);
}
```
Not good:
```cpp
if( a==b ){
doStuff ( a);
}
```
#### Comments
Comments should have a space between the delimiting characters (e.g. `//`) and the comment text.
We're gradually adopting this style - don't worry if you see older code without spaces!
Good:
```cpp
// This is a short inline comment.
/*
* This is a longer comment
* wrapping over multiple lines,
* used in WLED for file headers and function explanations
*/
```
```css
/* This is a CSS inline comment */
```
```html
<!-- This is an HTML comment -->
```
There is no hard character limit for a comment within a line,
though as a rule of thumb consider wrapping after 120 characters.
Inline comments are OK if they describe that line only and are not exceedingly wide.
================================================
FILE: LICENSE
================================================
Copyright (c) 2016-present Christian Schwinne and individual WLED contributors
Licensed under the EUPL v. 1.2 or later
EUROPEAN UNION PUBLIC LICENCE v. 1.2
EUPL © the European Union 2007, 2016
This European Union Public Licence (the ‘EUPL’) applies to the Work (as
defined below) which is provided under the terms of this Licence. Any use of
the Work, other than as authorised under this Licence is prohibited (to the
extent such use is covered by a right of the copyright holder of the Work).
The Work is provided under the terms of this Licence when the Licensor (as
defined below) has placed the following notice immediately following the
copyright notice for the Work:
Licensed under the EUPL
or has expressed by any other means his willingness to license under the EUPL.
1. Definitions
In this Licence, the following terms have the following meaning:
- ‘The Licence’: this Licence.
- ‘The Original Work’: the work or software distributed or communicated by the
Licensor under this Licence, available as Source Code and also as Executable
Code as the case may be.
- ‘Derivative Works’: the works or software that could be created by the
Licensee, based upon the Original Work or modifications thereof. This
Licence does not define the extent of modification or dependence on the
Original Work required in order to classify a work as a Derivative Work;
this extent is determined by copyright law applicable in the country
mentioned in Article 15.
- ‘The Work’: the Original Work or its Derivative Works.
- ‘The Source Code’: the human-readable form of the Work which is the most
convenient for people to study and modify.
- ‘The Executable Code’: any code which has generally been compiled and which
is meant to be interpreted by a computer as a program.
- ‘The Licensor’: the natural or legal person that distributes or communicates
the Work under the Licence.
- ‘Contributor(s)’: any natural or legal person who modifies the Work under
the Licence, or otherwise contributes to the creation of a Derivative Work.
- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
the Work under the terms of the Licence.
- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
renting, distributing, communicating, transmitting, or otherwise making
available, online or offline, copies of the Work or providing access to its
essential functionalities at the disposal of any other natural or legal
person.
2. Scope of the rights granted by the Licence
The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
sublicensable licence to do the following, for the duration of copyright
vested in the Original Work:
- use the Work in any circumstance and for all usage,
- reproduce the Work,
- modify the Work, and make Derivative Works based upon the Work,
- communicate to the public, including the right to make available or display
the Work or copies thereof to the public and perform publicly, as the case
may be, the Work,
- distribute the Work or copies thereof,
- lend and rent the Work or copies thereof,
- sublicense rights in the Work or copies thereof.
Those rights can be exercised on any media, supports and formats, whether now
known or later invented, as far as the applicable law permits so.
In the countries where moral rights apply, the Licensor waives his right to
exercise his moral right to the extent allowed by law in order to make
effective the licence of the economic rights here above listed.
The Licensor grants to the Licensee royalty-free, non-exclusive usage rights
to any patents held by the Licensor, to the extent necessary to make use of
the rights granted on the Work under this Licence.
3. Communication of the Source Code
The Licensor may provide the Work either in its Source Code form, or as
Executable Code. If the Work is provided as Executable Code, the Licensor
provides in addition a machine-readable copy of the Source Code of the Work
along with each copy of the Work that the Licensor distributes or indicates,
in a notice following the copyright notice attached to the Work, a repository
where the Source Code is easily and freely accessible for as long as the
Licensor continues to distribute or communicate the Work.
4. Limitations on copyright
Nothing in this Licence is intended to deprive the Licensee of the benefits
from any exception or limitation to the exclusive rights of the rights owners
in the Work, of the exhaustion of those rights or of other applicable
limitations thereto.
5. Obligations of the Licensee
The grant of the rights mentioned above is subject to some restrictions and
obligations imposed on the Licensee. Those obligations are the following:
Attribution right: The Licensee shall keep intact all copyright, patent or
trademarks notices and all notices that refer to the Licence and to the
disclaimer of warranties. The Licensee must include a copy of such notices and
a copy of the Licence with every copy of the Work he/she distributes or
communicates. The Licensee must cause any Derivative Work to carry prominent
notices stating that the Work has been modified and the date of modification.
Copyleft clause: If the Licensee distributes or communicates copies of the
Original Works or Derivative Works, this Distribution or Communication will be
done under the terms of this Licence or of a later version of this Licence
unless the Original Work is expressly distributed only under this version of
the Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
(becoming Licensor) cannot offer or impose any additional terms or conditions
on the Work or Derivative Work that alter or restrict the terms of the
Licence.
Compatibility clause: If the Licensee Distributes or Communicates Derivative
Works or copies thereof based upon both the Work and another work licensed
under a Compatible Licence, this Distribution or Communication can be done
under the terms of this Compatible Licence. For the sake of this clause,
‘Compatible Licence’ refers to the licences listed in the appendix attached to
this Licence. Should the Licensee's obligations under the Compatible Licence
conflict with his/her obligations under this Licence, the obligations of the
Compatible Licence shall prevail.
Provision of Source Code: When distributing or communicating copies of the
Work, the Licensee will provide a machine-readable copy of the Source Code or
indicate a repository where this Source will be easily and freely available
for as long as the Licensee continues to distribute or communicate the Work.
Legal Protection: This Licence does not grant permission to use the trade
names, trademarks, service marks, or names of the Licensor, except as required
for reasonable and customary use in describing the origin of the Work and
reproducing the content of the copyright notice.
6. Chain of Authorship
The original Licensor warrants that the copyright in the Original Work granted
hereunder is owned by him/her or licensed to him/her and that he/she has the
power and authority to grant the Licence.
Each Contributor warrants that the copyright in the modifications he/she
brings to the Work are owned by him/her or licensed to him/her and that he/she
has the power and authority to grant the Licence.
Each time You accept the Licence, the original Licensor and subsequent
Contributors grant You a licence to their contributions to the Work, under the
terms of this Licence.
7. Disclaimer of Warranty
The Work is a work in progress, which is continuously improved by numerous
Contributors. It is not a finished work and may therefore contain defects or
‘bugs’ inherent to this type of development.
For the above reason, the Work is provided under the Licence on an ‘as is’
basis and without warranties of any kind concerning the Work, including
without limitation merchantability, fitness for a particular purpose, absence
of defects or errors, accuracy, non-infringement of intellectual property
rights other than copyright as stated in Article 6 of this Licence.
This disclaimer of warranty is an essential part of the Licence and a
condition for the grant of any rights to the Work.
8. Disclaimer of Liability
Except in the cases of wilful misconduct or damages directly caused to natural
persons, the Licensor will in no event be liable for any direct or indirect,
material or moral, damages of any kind, arising out of the Licence or of the
use of the Work, including without limitation, damages for loss of goodwill,
work stoppage, computer failure or malfunction, loss of data or any commercial
damage, even if the Licensor has been advised of the possibility of such
damage. However, the Licensor will be liable under statutory product liability
laws as far such laws apply to the Work.
9. Additional agreements
While distributing the Work, You may choose to conclude an additional
agreement, defining obligations or services consistent with this Licence.
However, if accepting obligations, You may act only on your own behalf and on
your sole responsibility, not on behalf of the original Licensor or any other
Contributor, and only if You agree to indemnify, defend, and hold each
Contributor harmless for any liability incurred by, or claims asserted against
such Contributor by the fact You have accepted any warranty or additional
liability.
10. Acceptance of the Licence
The provisions of this Licence can be accepted by clicking on an icon ‘I
agree’ placed under the bottom of a window displaying the text of this Licence
or by affirming consent in any other similar way, in accordance with the rules
of applicable law. Clicking on that icon indicates your clear and irrevocable
acceptance of this Licence and all of its terms and conditions.
Similarly, you irrevocably accept this Licence and all of its terms and
conditions by exercising any rights granted to You by Article 2 of this
Licence, such as the use of the Work, the creation by You of a Derivative Work
or the Distribution or Communication by You of the Work or copies thereof.
11. Information to the public
In case of any Distribution or Communication of the Work by means of
electronic communication by You (for example, by offering to download the Work
from a remote location) the distribution channel or media (for example, a
website) must at least provide to the public the information requested by the
applicable law regarding the Licensor, the Licence and the way it may be
accessible, concluded, stored and reproduced by the Licensee.
12. Termination of the Licence
The Licence and the rights granted hereunder will terminate automatically upon
any breach by the Licensee of the terms of the Licence.
Such a termination will not terminate the licences of any person who has
received the Work from the Licensee under the Licence, provided such persons
remain in full compliance with the Licence.
13. Miscellaneous
Without prejudice of Article 9 above, the Licence represents the complete
agreement between the Parties as to the Work.
If any provision of the Licence is invalid or unenforceable under applicable
law, this will not affect the validity or enforceability of the Licence as a
whole. Such provision will be construed or reformed so as necessary to make it
valid and enforceable.
The European Commission may publish other linguistic versions or new versions
of this Licence or updated versions of the Appendix, so far this is required
and reasonable, without reducing the scope of the rights granted by the
Licence. New versions of the Licence will be published with a unique version
number.
All linguistic versions of this Licence, approved by the European Commission,
have identical value. Parties can take advantage of the linguistic version of
their choice.
14. Jurisdiction
Without prejudice to specific agreement between parties,
- any litigation resulting from the interpretation of this License, arising
between the European Union institutions, bodies, offices or agencies, as a
Licensor, and any Licensee, will be subject to the jurisdiction of the Court
of Justice of the European Union, as laid down in article 272 of the Treaty
on the Functioning of the European Union,
- any litigation arising between other parties and resulting from the
interpretation of this License, will be subject to the exclusive
jurisdiction of the competent court where the Licensor resides or conducts
its primary business.
15. Applicable Law
Without prejudice to specific agreement between parties,
- this Licence shall be governed by the law of the European Union Member State
where the Licensor has his seat, resides or has his registered office,
- this licence shall be governed by Belgian law if the Licensor has no seat,
residence or registered office inside a European Union Member State.
Appendix
‘Compatible Licences’ according to Article 5 EUPL are:
- GNU General Public License (GPL) v. 2, v. 3
- GNU Affero General Public License (AGPL) v. 3
- Open Software License (OSL) v. 2.1, v. 3.0
- Eclipse Public License (EPL) v. 1.0
- CeCILL v. 2.0, v. 2.1
- Mozilla Public Licence (MPL) v. 2
- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
works other than software
- European Union Public Licence (EUPL) v. 1.1, v. 1.2
- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
Reciprocity (LiLiQ-R+).
The European Commission may update this Appendix to later versions of the
above licences without producing a new version of the EUPL, as long as they
provide the rights granted in Article 2 of this Licence and protect the
covered Source Code from exclusive appropriation.
All other changes or additions to this Appendix require the production of a
new EUPL version.
================================================
FILE: boards/adafruit_matrixportal_esp32s3_wled.json
================================================
{
"build": {
"arduino":{
"ldscript": "esp32s3_out.ld",
"partitions": "default_8MB.csv"
},
"core": "esp32",
"extra_flags": [
"-DARDUINO_ADAFRUIT_MATRIXPORTAL_ESP32S3",
"-DARDUINO_USB_CDC_ON_BOOT=1",
"-DARDUINO_RUNNING_CORE=1",
"-DARDUINO_EVENT_RUNNING_CORE=1",
"-DBOARD_HAS_PSRAM"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [
[
"0x239A",
"0x8125"
],
[
"0x239A",
"0x0125"
],
[
"0x239A",
"0x8126"
]
],
"mcu": "esp32s3",
"variant": "adafruit_matrixportal_esp32s3"
},
"connectivity": [
"bluetooth",
"wifi"
],
"debug": {
"openocd_target": "esp32s3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "Adafruit MatrixPortal ESP32-S3 for WLED",
"upload": {
"flash_size": "8MB",
"maximum_ram_size": 327680,
"maximum_size": 8388608,
"use_1200bps_touch": true,
"wait_for_upload_port": true,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.adafruit.com/product/5778",
"vendor": "Adafruit"
}
================================================
FILE: boards/lilygo-t7-s3.json
================================================
{
"build": {
"arduino":{
"ldscript": "esp32s3_out.ld",
"memory_type": "qio_opi",
"partitions": "default_16MB.csv"
},
"core": "esp32",
"extra_flags": [
"-DARDUINO_TTGO_T7_S3",
"-DBOARD_HAS_PSRAM",
"-DARDUINO_USB_MODE=1"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [
[
"0X303A",
"0x1001"
]
],
"mcu": "esp32s3",
"variant": "esp32s3"
},
"connectivity": [
"wifi",
"bluetooth"
],
"debug": {
"openocd_target": "esp32s3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "LILYGO T3-S3",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 327680,
"maximum_size": 16777216,
"require_upload_port": true,
"speed": 921600
},
"url": "https://www.aliexpress.us/item/3256804591247074.html",
"vendor": "LILYGO"
}
================================================
FILE: boards/lolin_s3_mini.json
================================================
{
"build": {
"arduino": {
"ldscript": "esp32s3_out.ld",
"memory_type": "qio_qspi"
},
"core": "esp32",
"extra_flags": [
"-DBOARD_HAS_PSRAM",
"-DARDUINO_LOLIN_S3_MINI",
"-DARDUINO_USB_MODE=1"
],
"f_cpu": "240000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [
[
"0x303A",
"0x8167"
]
],
"mcu": "esp32s3",
"variant": "lolin_s3_mini"
},
"connectivity": [
"bluetooth",
"wifi"
],
"debug": {
"openocd_target": "esp32s3.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "WEMOS LOLIN S3 Mini",
"upload": {
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.wemos.cc/en/latest/s3/index.html",
"vendor": "WEMOS"
}
================================================
FILE: images/Readme.md
================================================
### Additional Logos
Additional awesome logos for WLED can be found here [Aircoookie/Akemi](https://github.com/Aircoookie/Akemi).
<img src="https://github.com/Aircoookie/Akemi/blob/master/akemi/001_cheerful.png">
================================================
FILE: include/README
================================================
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the usual convention is to give header files names that end with `.h'.
It is most portable to use only letters, digits, dashes, and underscores in
header file names, and at most one dot.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
================================================
FILE: lib/ESP8266PWM/src/core_esp8266_waveform_phase.cpp
================================================
/* esp8266_waveform imported from platform source code
Modified for WLED to work around a fault in the NMI handling,
which can result in the system locking up and hard WDT crashes.
Imported from https://github.com/esp8266/Arduino/blob/7e0d20e2b9034994f573a236364e0aef17fd66de/cores/esp8266/core_esp8266_waveform_phase.cpp
*/
/*
esp8266_waveform - General purpose waveform generation and control,
supporting outputs on all pins in parallel.
Copyright (c) 2018 Earle F. Philhower, III. All rights reserved.
Copyright (c) 2020 Dirk O. Kaar.
The core idea is to have a programmable waveform generator with a unique
high and low period (defined in microseconds or CPU clock cycles). TIMER1 is
set to 1-shot mode and is always loaded with the time until the next edge
of any live waveforms.
Up to one waveform generator per pin supported.
Each waveform generator is synchronized to the ESP clock cycle counter, not the
timer. This allows for removing interrupt jitter and delay as the counter
always increments once per 80MHz clock. Changes to a waveform are
contiguous and only take effect on the next waveform transition,
allowing for smooth transitions.
This replaces older tone(), analogWrite(), and the Servo classes.
Everywhere in the code where "ccy" or "ccys" is used, it means ESP.getCycleCount()
clock cycle time, or an interval measured in clock cycles, but not TIMER1
cycles (which may be 2 CPU clock cycles @ 160MHz).
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "core_esp8266_waveform.h"
#include <Arduino.h>
#include "debug.h"
#include "ets_sys.h"
#include <atomic>
// ----- @willmmiles begin patch -----
// Linker magic
extern "C" void usePWMFixedNMI(void) {};
// NMI crash workaround
// Sometimes the NMI fails to return, stalling the CPU. When this happens,
// the next NMI gets a return address /inside the NMI handler function/.
// We work around this by caching the last NMI return address, and restoring
// the epc3 and eps3 registers to the previous values if the observed epc3
// happens to be pointing to the _NMILevelVector function.
extern "C" void _NMILevelVector();
extern "C" void _UserExceptionVector_1(); // the next function after _NMILevelVector
static inline IRAM_ATTR void nmiCrashWorkaround() {
static uintptr_t epc3_backup, eps3_backup;
uintptr_t epc3, eps3;
__asm__ __volatile__("rsr %0,epc3; rsr %1,eps3":"=a"(epc3),"=a" (eps3));
if ((epc3 < (uintptr_t) &_NMILevelVector) || (epc3 >= (uintptr_t) &_UserExceptionVector_1)) {
// Address is good; save backup
epc3_backup = epc3;
eps3_backup = eps3;
} else {
// Address is inside the NMI handler -- restore from backup
__asm__ __volatile__("wsr %0,epc3; wsr %1,eps3"::"a"(epc3_backup),"a"(eps3_backup));
}
}
// ----- @willmmiles end patch -----
// No-op calls to override the PWM implementation
extern "C" void _setPWMFreq_weak(uint32_t freq) { (void) freq; }
extern "C" IRAM_ATTR bool _stopPWM_weak(int pin) { (void) pin; return false; }
extern "C" bool _setPWM_weak(int pin, uint32_t val, uint32_t range) { (void) pin; (void) val; (void) range; return false; }
// Timer is 80MHz fixed. 160MHz CPU frequency need scaling.
constexpr bool ISCPUFREQ160MHZ = clockCyclesPerMicrosecond() == 160;
// Maximum delay between IRQs, Timer1, <= 2^23 / 80MHz
constexpr int32_t MAXIRQTICKSCCYS = microsecondsToClockCycles(10000);
// Maximum servicing time for any single IRQ
constexpr uint32_t ISRTIMEOUTCCYS = microsecondsToClockCycles(18);
// The latency between in-ISR rearming of the timer and the earliest firing
constexpr int32_t IRQLATENCYCCYS = microsecondsToClockCycles(2);
// The SDK and hardware take some time to actually get to our NMI code
constexpr int32_t DELTAIRQCCYS = ISCPUFREQ160MHZ ?
microsecondsToClockCycles(2) >> 1 : microsecondsToClockCycles(2);
// for INFINITE, the NMI proceeds on the waveform without expiry deadline.
// for EXPIRES, the NMI expires the waveform automatically on the expiry ccy.
// for UPDATEEXPIRY, the NMI recomputes the exact expiry ccy and transitions to EXPIRES.
// for UPDATEPHASE, the NMI recomputes the target timings
// for INIT, the NMI initializes nextPeriodCcy, and if expiryCcy != 0 includes UPDATEEXPIRY.
enum class WaveformMode : uint8_t {INFINITE = 0, EXPIRES = 1, UPDATEEXPIRY = 2, UPDATEPHASE = 3, INIT = 4};
// Waveform generator can create tones, PWM, and servos
typedef struct {
uint32_t nextPeriodCcy; // ESP clock cycle when a period begins.
uint32_t endDutyCcy; // ESP clock cycle when going from duty to off
int32_t dutyCcys; // Set next off cycle at low->high to maintain phase
int32_t adjDutyCcys; // Temporary correction for next period
int32_t periodCcys; // Set next phase cycle at low->high to maintain phase
uint32_t expiryCcy; // For time-limited waveform, the CPU clock cycle when this waveform must stop. If WaveformMode::UPDATE, temporarily holds relative ccy count
WaveformMode mode;
bool autoPwm; // perform PWM duty to idle cycle ratio correction under high load at the expense of precise timings
} Waveform;
namespace {
static struct {
Waveform pins[17]; // State of all possible pins
uint32_t states = 0; // Is the pin high or low, updated in NMI so no access outside the NMI code
uint32_t enabled = 0; // Is it actively running, updated in NMI so no access outside the NMI code
// Enable lock-free by only allowing updates to waveform.states and waveform.enabled from IRQ service routine
int32_t toSetBits = 0; // Message to the NMI handler to start/modify exactly one waveform
int32_t toDisableBits = 0; // Message to the NMI handler to disable exactly one pin from waveform generation
// toSetBits temporaries
// cheaper than packing them in every Waveform, since we permit only one use at a time
uint32_t phaseCcy; // positive phase offset ccy count
int8_t alignPhase; // < 0 no phase alignment, otherwise starts waveform in relative phase offset to given pin
uint32_t(*timer1CB)() = nullptr;
bool timer1Running = false;
uint32_t nextEventCcy;
} waveform;
}
// Interrupt on/off control
static IRAM_ATTR void timer1Interrupt();
// Non-speed critical bits
#pragma GCC optimize ("Os")
static void initTimer() {
timer1_disable();
ETS_FRC_TIMER1_INTR_ATTACH(NULL, NULL);
ETS_FRC_TIMER1_NMI_INTR_ATTACH(timer1Interrupt);
timer1_enable(TIM_DIV1, TIM_EDGE, TIM_SINGLE);
waveform.timer1Running = true;
timer1_write(IRQLATENCYCCYS); // Cause an interrupt post-haste
}
static void IRAM_ATTR deinitTimer() {
ETS_FRC_TIMER1_NMI_INTR_ATTACH(NULL);
timer1_disable();
timer1_isr_init();
waveform.timer1Running = false;
}
extern "C" {
// Set a callback. Pass in NULL to stop it
void setTimer1Callback_weak(uint32_t (*fn)()) {
waveform.timer1CB = fn;
std::atomic_thread_fence(std::memory_order_acq_rel);
if (!waveform.timer1Running && fn) {
initTimer();
} else if (waveform.timer1Running && !fn && !waveform.enabled) {
deinitTimer();
}
}
// Start up a waveform on a pin, or change the current one. Will change to the new
// waveform smoothly on next low->high transition. For immediate change, stopWaveform()
// first, then it will immediately begin.
int startWaveformClockCycles_weak(uint8_t pin, uint32_t highCcys, uint32_t lowCcys,
uint32_t runTimeCcys, int8_t alignPhase, uint32_t phaseOffsetCcys, bool autoPwm) {
uint32_t periodCcys = highCcys + lowCcys;
if (periodCcys < MAXIRQTICKSCCYS) {
if (!highCcys) {
periodCcys = (MAXIRQTICKSCCYS / periodCcys) * periodCcys;
}
else if (!lowCcys) {
highCcys = periodCcys = (MAXIRQTICKSCCYS / periodCcys) * periodCcys;
}
}
// sanity checks, including mixed signed/unsigned arithmetic safety
if ((pin > 16) || isFlashInterfacePin(pin) || (alignPhase > 16) ||
static_cast<int32_t>(periodCcys) <= 0 ||
static_cast<int32_t>(highCcys) < 0 || static_cast<int32_t>(lowCcys) < 0) {
return false;
}
Waveform& wave = waveform.pins[pin];
wave.dutyCcys = highCcys;
wave.adjDutyCcys = 0;
wave.periodCcys = periodCcys;
wave.autoPwm = autoPwm;
waveform.alignPhase = (alignPhase < 0) ? -1 : alignPhase;
waveform.phaseCcy = phaseOffsetCcys;
std::atomic_thread_fence(std::memory_order_acquire);
const uint32_t pinBit = 1UL << pin;
if (!(waveform.enabled & pinBit)) {
// wave.nextPeriodCcy and wave.endDutyCcy are initialized by the ISR
wave.expiryCcy = runTimeCcys; // in WaveformMode::INIT, temporarily hold relative cycle count
wave.mode = WaveformMode::INIT;
if (!wave.dutyCcys) {
// If initially at zero duty cycle, force GPIO off
if (pin == 16) {
GP16O = 0;
}
else {
GPOC = pinBit;
}
}
std::atomic_thread_fence(std::memory_order_release);
waveform.toSetBits = 1UL << pin;
std::atomic_thread_fence(std::memory_order_release);
if (!waveform.timer1Running) {
initTimer();
}
else if (T1V > IRQLATENCYCCYS) {
// Must not interfere if Timer is due shortly
timer1_write(IRQLATENCYCCYS);
}
}
else {
wave.mode = WaveformMode::INFINITE; // turn off possible expiry to make update atomic from NMI
std::atomic_thread_fence(std::memory_order_release);
if (runTimeCcys) {
wave.expiryCcy = runTimeCcys; // in WaveformMode::UPDATEEXPIRY, temporarily hold relative cycle count
wave.mode = WaveformMode::UPDATEEXPIRY;
std::atomic_thread_fence(std::memory_order_release);
waveform.toSetBits = 1UL << pin;
} else if (alignPhase >= 0) {
// @willmmiles new feature
wave.mode = WaveformMode::UPDATEPHASE; // recalculate start
std::atomic_thread_fence(std::memory_order_release);
waveform.toSetBits = 1UL << pin;
}
}
std::atomic_thread_fence(std::memory_order_acq_rel);
while (waveform.toSetBits) {
esp_yield(); // Wait for waveform to update
std::atomic_thread_fence(std::memory_order_acquire);
}
return true;
}
// Stops a waveform on a pin
IRAM_ATTR int stopWaveform_weak(uint8_t pin) {
// Can't possibly need to stop anything if there is no timer active
if (!waveform.timer1Running) {
return false;
}
// If user sends in a pin >16 but <32, this will always point to a 0 bit
// If they send >=32, then the shift will result in 0 and it will also return false
std::atomic_thread_fence(std::memory_order_acquire);
const uint32_t pinBit = 1UL << pin;
if (waveform.enabled & pinBit) {
waveform.toDisableBits = 1UL << pin;
std::atomic_thread_fence(std::memory_order_release);
// Must not interfere if Timer is due shortly
if (T1V > IRQLATENCYCCYS) {
timer1_write(IRQLATENCYCCYS);
}
while (waveform.toDisableBits) {
/* no-op */ // Can't delay() since stopWaveform may be called from an IRQ
std::atomic_thread_fence(std::memory_order_acquire);
}
}
if (!waveform.enabled && !waveform.timer1CB) {
deinitTimer();
}
return true;
}
};
// Speed critical bits
#pragma GCC optimize ("O2")
// For dynamic CPU clock frequency switch in loop the scaling logic would have to be adapted.
// Using constexpr makes sure that the CPU clock frequency is compile-time fixed.
static inline IRAM_ATTR int32_t scaleCcys(const int32_t ccys, const bool isCPU2X) {
if (ISCPUFREQ160MHZ) {
return isCPU2X ? ccys : (ccys >> 1);
}
else {
return isCPU2X ? (ccys << 1) : ccys;
}
}
static IRAM_ATTR void timer1Interrupt() {
const uint32_t isrStartCcy = ESP.getCycleCount();
//int32_t clockDrift = isrStartCcy - waveform.nextEventCcy;
// ----- @willmmiles begin patch -----
nmiCrashWorkaround();
// ----- @willmmiles end patch -----
const bool isCPU2X = CPU2X & 1;
if ((waveform.toSetBits && !(waveform.enabled & waveform.toSetBits)) || waveform.toDisableBits) {
// Handle enable/disable requests from main app.
waveform.enabled = (waveform.enabled & ~waveform.toDisableBits) | waveform.toSetBits; // Set the requested waveforms on/off
// Find the first GPIO being generated by checking GCC's find-first-set (returns 1 + the bit of the first 1 in an int32_t)
waveform.toDisableBits = 0;
}
if (waveform.toSetBits) {
const int toSetPin = __builtin_ffs(waveform.toSetBits) - 1;
Waveform& wave = waveform.pins[toSetPin];
switch (wave.mode) {
case WaveformMode::INIT:
waveform.states &= ~waveform.toSetBits; // Clear the state of any just started
if (waveform.alignPhase >= 0 && waveform.enabled & (1UL << waveform.alignPhase)) {
wave.nextPeriodCcy = waveform.pins[waveform.alignPhase].nextPeriodCcy + scaleCcys(waveform.phaseCcy, isCPU2X);
}
else {
wave.nextPeriodCcy = waveform.nextEventCcy;
}
if (!wave.expiryCcy) {
wave.mode = WaveformMode::INFINITE;
break;
}
// fall through
case WaveformMode::UPDATEEXPIRY:
// in WaveformMode::UPDATEEXPIRY, expiryCcy temporarily holds relative CPU cycle count
wave.expiryCcy = wave.nextPeriodCcy + scaleCcys(wave.expiryCcy, isCPU2X);
wave.mode = WaveformMode::EXPIRES;
break;
// @willmmiles new feature
case WaveformMode::UPDATEPHASE:
// in WaveformMode::UPDATEPHASE, we recalculate the targets
if ((waveform.alignPhase >= 0) && (waveform.enabled & (1UL << waveform.alignPhase))) {
// Compute phase shift to realign with target
auto const newPeriodCcy = waveform.pins[waveform.alignPhase].nextPeriodCcy + scaleCcys(waveform.phaseCcy, isCPU2X);
auto const period = scaleCcys(wave.periodCcys, isCPU2X);
auto shift = ((static_cast<int32_t> (newPeriodCcy - wave.nextPeriodCcy) + period/2) % period) - (period/2);
wave.nextPeriodCcy += static_cast<uint32_t>(shift);
if (static_cast<int32_t>(wave.endDutyCcy - wave.nextPeriodCcy) > 0) {
wave.endDutyCcy = wave.nextPeriodCcy;
}
}
default:
break;
}
waveform.toSetBits = 0;
}
// Exit the loop if the next event, if any, is sufficiently distant.
const uint32_t isrTimeoutCcy = isrStartCcy + ISRTIMEOUTCCYS;
uint32_t busyPins = waveform.enabled;
waveform.nextEventCcy = isrStartCcy + MAXIRQTICKSCCYS;
uint32_t now = ESP.getCycleCount();
uint32_t isrNextEventCcy = now;
while (busyPins) {
if (static_cast<int32_t>(isrNextEventCcy - now) > IRQLATENCYCCYS) {
waveform.nextEventCcy = isrNextEventCcy;
break;
}
isrNextEventCcy = waveform.nextEventCcy;
uint32_t loopPins = busyPins;
while (loopPins) {
const int pin = __builtin_ffsl(loopPins) - 1;
const uint32_t pinBit = 1UL << pin;
loopPins ^= pinBit;
Waveform& wave = waveform.pins[pin];
/* @willmmiles - wtf? We don't want to accumulate drift
if (clockDrift) {
wave.endDutyCcy += clockDrift;
wave.nextPeriodCcy += clockDrift;
wave.expiryCcy += clockDrift;
}
*/
uint32_t waveNextEventCcy = (waveform.states & pinBit) ? wave.endDutyCcy : wave.nextPeriodCcy;
if (WaveformMode::EXPIRES == wave.mode &&
static_cast<int32_t>(waveNextEventCcy - wave.expiryCcy) >= 0 &&
static_cast<int32_t>(now - wave.expiryCcy) >= 0) {
// Disable any waveforms that are done
waveform.enabled ^= pinBit;
busyPins ^= pinBit;
}
else {
const int32_t overshootCcys = now - waveNextEventCcy;
if (overshootCcys >= 0) {
const int32_t periodCcys = scaleCcys(wave.periodCcys, isCPU2X);
if (waveform.states & pinBit) {
// active configuration and forward are 100% duty
if (wave.periodCcys == wave.dutyCcys) {
wave.nextPeriodCcy += periodCcys;
wave.endDutyCcy = wave.nextPeriodCcy;
}
else {
if (wave.autoPwm) {
wave.adjDutyCcys += overshootCcys;
}
waveform.states ^= pinBit;
if (16 == pin) {
GP16O = 0;
}
else {
GPOC = pinBit;
}
}
waveNextEventCcy = wave.nextPeriodCcy;
}
else {
wave.nextPeriodCcy += periodCcys;
if (!wave.dutyCcys) {
wave.endDutyCcy = wave.nextPeriodCcy;
}
else {
int32_t dutyCcys = scaleCcys(wave.dutyCcys, isCPU2X);
if (dutyCcys <= wave.adjDutyCcys) {
dutyCcys >>= 1;
wave.adjDutyCcys -= dutyCcys;
}
else if (wave.adjDutyCcys) {
dutyCcys -= wave.adjDutyCcys;
wave.adjDutyCcys = 0;
}
wave.endDutyCcy = now + dutyCcys;
if (static_cast<int32_t>(wave.endDutyCcy - wave.nextPeriodCcy) > 0) {
wave.endDutyCcy = wave.nextPeriodCcy;
}
waveform.states |= pinBit;
if (16 == pin) {
GP16O = 1;
}
else {
GPOS = pinBit;
}
}
waveNextEventCcy = wave.endDutyCcy;
}
if (WaveformMode::EXPIRES == wave.mode && static_cast<int32_t>(waveNextEventCcy - wave.expiryCcy) > 0) {
waveNextEventCcy = wave.expiryCcy;
}
}
if (static_cast<int32_t>(waveNextEventCcy - isrTimeoutCcy) >= 0) {
busyPins ^= pinBit;
if (static_cast<int32_t>(waveform.nextEventCcy - waveNextEventCcy) > 0) {
waveform.nextEventCcy = waveNextEventCcy;
}
}
else if (static_cast<int32_t>(isrNextEventCcy - waveNextEventCcy) > 0) {
isrNextEventCcy = waveNextEventCcy;
}
}
now = ESP.getCycleCount();
}
//clockDrift = 0;
}
int32_t callbackCcys = 0;
if (waveform.timer1CB) {
callbackCcys = scaleCcys(waveform.timer1CB(), isCPU2X);
}
now = ESP.getCycleCount();
int32_t nextEventCcys = waveform.nextEventCcy - now;
// Account for unknown duration of timer1CB().
if (waveform.timer1CB && nextEventCcys > callbackCcys) {
waveform.nextEventCcy = now + callbackCcys;
nextEventCcys = callbackCcys;
}
// Timer is 80MHz fixed. 160MHz CPU frequency need scaling.
int32_t deltaIrqCcys = DELTAIRQCCYS;
int32_t irqLatencyCcys = IRQLATENCYCCYS;
if (isCPU2X) {
nextEventCcys >>= 1;
deltaIrqCcys >>= 1;
irqLatencyCcys >>= 1;
}
// Firing timer too soon, the NMI occurs before ISR has returned.
if (nextEventCcys < irqLatencyCcys + deltaIrqCcys) {
waveform.nextEventCcy = now + IRQLATENCYCCYS + DELTAIRQCCYS;
nextEventCcys = irqLatencyCcys;
}
else {
nextEventCcys -= deltaIrqCcys;
}
// Register access is fast and edge IRQ was configured before.
T1L = nextEventCcys;
}
================================================
FILE: lib/NeoESP32RmtHI/include/NeoEsp32RmtHIMethod.h
================================================
/*-------------------------------------------------------------------------
NeoPixel driver for ESP32 RMTs using High-priority Interrupt
(NB. This cannot be mixed with the non-HI driver.)
Written by Will M. Miles.
I invest time and resources providing this open source code,
please support me by donating (see https://github.com/Makuna/NeoPixelBus)
-------------------------------------------------------------------------
This file is part of the Makuna/NeoPixelBus library.
NeoPixelBus is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
NeoPixelBus is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with NeoPixel. If not, see
<http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/
#pragma once
#if defined(ARDUINO_ARCH_ESP32)
// Use the NeoEspRmtSpeed types from the driver-based implementation
#include <NeoPixelBus.h>
namespace NeoEsp32RmtHiMethodDriver {
// Install the driver for a specific channel, specifying timing properties
esp_err_t Install(rmt_channel_t channel, uint32_t rmtBit0, uint32_t rmtBit1, uint32_t resetDuration);
// Remove the driver on a specific channel
esp_err_t Uninstall(rmt_channel_t channel);
// Write a buffer of data to a specific channel.
// Buffer reference is held until write completes.
esp_err_t Write(rmt_channel_t channel, const uint8_t *src, size_t src_size);
// Wait until transaction is complete.
esp_err_t WaitForTxDone(rmt_channel_t channel, TickType_t wait_time);
};
template<typename T_SPEED, typename T_CHANNEL> class NeoEsp32RmtHIMethodBase
{
public:
typedef NeoNoSettings SettingsObject;
NeoEsp32RmtHIMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize),
_pin(pin)
{
construct();
}
NeoEsp32RmtHIMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize, NeoBusChannel channel) :
_sizeData(pixelCount* elementSize + settingsSize),
_pin(pin),
_channel(channel)
{
construct();
}
~NeoEsp32RmtHIMethodBase()
{
// wait until the last send finishes before destructing everything
// arbitrary time out of 10 seconds
ESP_ERROR_CHECK_WITHOUT_ABORT(NeoEsp32RmtHiMethodDriver::WaitForTxDone(_channel.RmtChannelNumber, 10000 / portTICK_PERIOD_MS));
ESP_ERROR_CHECK(NeoEsp32RmtHiMethodDriver::Uninstall(_channel.RmtChannelNumber));
gpio_matrix_out(_pin, SIG_GPIO_OUT_IDX, false, false);
pinMode(_pin, INPUT);
free(_dataEditing);
free(_dataSending);
}
bool IsReadyToUpdate() const
{
return (ESP_OK == ESP_ERROR_CHECK_WITHOUT_ABORT_SILENT_TIMEOUT(NeoEsp32RmtHiMethodDriver::WaitForTxDone(_channel.RmtChannelNumber, 0)));
}
void Initialize()
{
rmt_config_t config = {};
config.rmt_mode = RMT_MODE_TX;
config.channel = _channel.RmtChannelNumber;
config.gpio_num = static_cast<gpio_num_t>(_pin);
config.mem_block_num = 1;
config.tx_config.loop_en = false;
config.tx_config.idle_output_en = true;
config.tx_config.idle_level = T_SPEED::IdleLevel;
config.tx_config.carrier_en = false;
config.tx_config.carrier_level = RMT_CARRIER_LEVEL_LOW;
config.clk_div = T_SPEED::RmtClockDivider;
ESP_ERROR_CHECK(rmt_config(&config)); // Uses ESP library
ESP_ERROR_CHECK(NeoEsp32RmtHiMethodDriver::Install(_channel.RmtChannelNumber, T_SPEED::RmtBit0, T_SPEED::RmtBit1, T_SPEED::RmtDurationReset));
}
void Update(bool maintainBufferConsistency)
{
// wait for not actively sending data
// this will time out at 10 seconds, an arbitrarily long period of time
// and do nothing if this happens
if (ESP_OK == ESP_ERROR_CHECK_WITHOUT_ABORT(NeoEsp32RmtHiMethodDriver::WaitForTxDone(_channel.RmtChannelNumber, 10000 / portTICK_PERIOD_MS)))
{
// now start the RMT transmit with the editing buffer before we swap
ESP_ERROR_CHECK_WITHOUT_ABORT(NeoEsp32RmtHiMethodDriver::Write(_channel.RmtChannelNumber, _dataEditing, _sizeData));
if (maintainBufferConsistency)
{
// copy editing to sending,
// this maintains the contract that "colors present before will
// be the same after", otherwise GetPixelColor will be inconsistent
memcpy(_dataSending, _dataEditing, _sizeData);
}
// swap so the user can modify without affecting the async operation
std::swap(_dataSending, _dataEditing);
}
}
bool AlwaysUpdate()
{
// this method requires update to be called only if changes to buffer
return false;
}
bool SwapBuffers()
{
std::swap(_dataSending, _dataEditing);
return true;
}
uint8_t* getData() const
{
return _dataEditing;
};
size_t getDataSize() const
{
return _sizeData;
}
void applySettings([[maybe_unused]] const SettingsObject& settings)
{
}
private:
const size_t _sizeData; // Size of '_data*' buffers
const uint8_t _pin; // output pin number
const T_CHANNEL _channel; // holds instance for multi channel support
// Holds data stream which include LED color values and other settings as needed
uint8_t* _dataEditing; // exposed for get and set
uint8_t* _dataSending; // used for async send using RMT
void construct()
{
_dataEditing = static_cast<uint8_t*>(malloc(_sizeData));
// data cleared later in Begin()
_dataSending = static_cast<uint8_t*>(malloc(_sizeData));
// no need to initialize it, it gets overwritten on every send
}
};
// normal
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannelN> NeoEsp32RmtHINSk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannelN> NeoEsp32RmtHINApa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannelN> NeoEsp32RmtHINTx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannelN> NeoEsp32RmtHINGs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannelN> NeoEsp32RmtHIN800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannelN> NeoEsp32RmtHIN400KbpsMethod;
typedef NeoEsp32RmtHINWs2805Method NeoEsp32RmtHINWs2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel0> NeoEsp32RmtHI0800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel0> NeoEsp32RmtHI0400KbpsMethod;
typedef NeoEsp32RmtHI0Ws2805Method NeoEsp32RmtHI0Ws2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel1> NeoEsp32RmtHI1800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel1> NeoEsp32RmtHI1400KbpsMethod;
typedef NeoEsp32RmtHI1Ws2805Method NeoEsp32RmtHI1Ws2814Method;
#if !defined(CONFIG_IDF_TARGET_ESP32C3)
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel2> NeoEsp32RmtHI2800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel2> NeoEsp32RmtHI2400KbpsMethod;
typedef NeoEsp32RmtHI2Ws2805Method NeoEsp32RmtHI2Ws2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel3> NeoEsp32RmtHI3800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel3> NeoEsp32RmtHI3400KbpsMethod;
typedef NeoEsp32RmtHI3Ws2805Method NeoEsp32RmtHI3Ws2814Method;
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3)
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel4> NeoEsp32RmtHI4800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel4> NeoEsp32RmtHI4400KbpsMethod;
typedef NeoEsp32RmtHI4Ws2805Method NeoEsp32RmtHI4Ws2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel5> NeoEsp32RmtHI5800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel5> NeoEsp32RmtHI5400KbpsMethod;
typedef NeoEsp32RmtHI5Ws2805Method NeoEsp32RmtHI5Ws2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel6> NeoEsp32RmtHI6800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel6> NeoEsp32RmtHI6400KbpsMethod;
typedef NeoEsp32RmtHI6Ws2805Method NeoEsp32RmtHI6Ws2814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2811Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2812xMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2816Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2805Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Sk6812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1814Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1829Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1914Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Apa106Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tx1812Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Gs1903Method;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChannel7> NeoEsp32RmtHI7800KbpsMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChannel7> NeoEsp32RmtHI7400KbpsMethod;
typedef NeoEsp32RmtHI7Ws2805Method NeoEsp32RmtHI7Ws2814Method;
#endif // !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3)
#endif // !defined(CONFIG_IDF_TARGET_ESP32C3)
// inverted
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannelN> NeoEsp32RmtHINWs2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannelN> NeoEsp32RmtHINSk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannelN> NeoEsp32RmtHINTm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannelN> NeoEsp32RmtHINApa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannelN> NeoEsp32RmtHINTx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannelN> NeoEsp32RmtHINGs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannelN> NeoEsp32RmtHIN800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannelN> NeoEsp32RmtHIN400KbpsInvertedMethod;
typedef NeoEsp32RmtHINWs2805InvertedMethod NeoEsp32RmtHINWs2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel0> NeoEsp32RmtHI0Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel0> NeoEsp32RmtHI0800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel0> NeoEsp32RmtHI0400KbpsInvertedMethod;
typedef NeoEsp32RmtHI0Ws2805InvertedMethod NeoEsp32RmtHI0Ws2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel1> NeoEsp32RmtHI1Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel1> NeoEsp32RmtHI1800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel1> NeoEsp32RmtHI1400KbpsInvertedMethod;
typedef NeoEsp32RmtHI1Ws2805InvertedMethod NeoEsp32RmtHI1Ws2814InvertedMethod;
#if !defined(CONFIG_IDF_TARGET_ESP32C3)
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel2> NeoEsp32RmtHI2Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel2> NeoEsp32RmtHI2800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel2> NeoEsp32RmtHI2400KbpsInvertedMethod;
typedef NeoEsp32RmtHI2Ws2805InvertedMethod NeoEsp32RmtHI2Ws2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel3> NeoEsp32RmtHI3Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel3> NeoEsp32RmtHI3800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel3> NeoEsp32RmtHI3400KbpsInvertedMethod;
typedef NeoEsp32RmtHI3Ws2805InvertedMethod NeoEsp32RmtHI3Ws2814InvertedMethod;
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3)
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel4> NeoEsp32RmtHI4Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel4> NeoEsp32RmtHI4800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel4> NeoEsp32RmtHI4400KbpsInvertedMethod;
typedef NeoEsp32RmtHI4Ws2805InvertedMethod NeoEsp32RmtHI4Ws2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel5> NeoEsp32RmtHI5Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel5> NeoEsp32RmtHI5800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel5> NeoEsp32RmtHI5400KbpsInvertedMethod;
typedef NeoEsp32RmtHI5Ws2805InvertedMethod NeoEsp32RmtHI5Ws2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel6> NeoEsp32RmtHI6Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel6> NeoEsp32RmtHI6800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel6> NeoEsp32RmtHI6400KbpsInvertedMethod;
typedef NeoEsp32RmtHI6Ws2805InvertedMethod NeoEsp32RmtHI6Ws2814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2811InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2812xInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2816InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Ws2805InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Sk6812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1814InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1829InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tm1914InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Apa106InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Tx1812InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32RmtChannel7> NeoEsp32RmtHI7Gs1903InvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp32RmtChannel7> NeoEsp32RmtHI7800KbpsInvertedMethod;
typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp32RmtChannel7> NeoEsp32RmtHI7400KbpsInvertedMethod;
typedef NeoEsp32RmtHI7Ws2805InvertedMethod NeoEsp32RmtHI7Ws2814InvertedMethod;
#endif // !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3)
#endif // !defined(CONFIG_IDF_TARGET_ESP32C3)
#endif
================================================
FILE: lib/NeoESP32RmtHI/library.json
================================================
{
"name": "NeoESP32RmtHI",
"build": { "libArchive": false },
"platforms": ["espressif32"],
"dependencies": [
{
"owner": "makuna",
"name": "NeoPixelBus",
"version": "^2.8.3"
}
]
}
================================================
FILE: lib/NeoESP32RmtHI/src/NeoEsp32RmtHI.S
================================================
/* RMT ISR shim
* Bridges from a high-level interrupt to the C++ code.
*
* This code is largely derived from Espressif's 'hli_vector.S' Bluetooth ISR.
*
*/
#if defined(__XTENSA__) && defined(ESP32) && !defined(CONFIG_BTDM_CTRL_HLI)
#include <freertos/xtensa_context.h>
#include "sdkconfig.h"
#include "soc/soc.h"
/* If the Bluetooth driver has hooked the high-priority interrupt, we piggyback on it and don't need this. */
#ifndef CONFIG_BTDM_CTRL_HLI
/*
Select interrupt based on system check level
- Base ESP32: could be 4 or 5, depends on platform config
- S2: 5
- S3: 5
*/
#if CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5
/* Use level 4 */
#define RFI_X 4
#define xt_highintx xt_highint4
#else /* !CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
/* Use level 5 */
#define RFI_X 5
#define xt_highintx xt_highint5
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
// Register map, based on interrupt level
#define EPC_X (EPC + RFI_X)
#define EXCSAVE_X (EXCSAVE + RFI_X)
// The sp mnemonic is used all over in ESP's assembly, though I'm not sure where it's expected to be defined?
#define sp a1
/* Interrupt stack size, for C code. */
#define RMT_INTR_STACK_SIZE 512
/* Save area for the CPU state:
* - 64 words for the general purpose registers
* - 7 words for some of the special registers:
* - WINDOWBASE, WINDOWSTART — only WINDOWSTART is truly needed
* - SAR, LBEG, LEND, LCOUNT — since the C code might use these
* - EPC1 — since the C code might cause window overflow exceptions
* This is not laid out as standard exception frame structure
* for simplicity of the save/restore code.
*/
#define REG_FILE_SIZE (64 * 4)
#define SPECREG_OFFSET REG_FILE_SIZE
#define SPECREG_SIZE (7 * 4)
#define REG_SAVE_AREA_SIZE (SPECREG_OFFSET + SPECREG_SIZE)
.data
_rmt_intr_stack:
.space RMT_INTR_STACK_SIZE
_rmt_save_ctx:
.space REG_SAVE_AREA_SIZE
.section .iram1,"ax"
.global xt_highintx
.type xt_highintx,@function
.align 4
xt_highintx:
movi a0, _rmt_save_ctx
/* save 4 lower registers */
s32i a1, a0, 4
s32i a2, a0, 8
s32i a3, a0, 12
rsr a2, EXCSAVE_X /* holds the value of a0 */
s32i a2, a0, 0
/* Save special registers */
addi a0, a0, SPECREG_OFFSET
rsr a2, WINDOWBASE
s32i a2, a0, 0
rsr a2, WINDOWSTART
s32i a2, a0, 4
rsr a2, SAR
s32i a2, a0, 8
#if XCHAL_HAVE_LOOPS
rsr a2, LBEG
s32i a2, a0, 12
rsr a2, LEND
s32i a2, a0, 16
rsr a2, LCOUNT
s32i a2, a0, 20
#endif
rsr a2, EPC1
s32i a2, a0, 24
/* disable exception mode, window overflow */
movi a0, PS_INTLEVEL(RFI_X+1) | PS_EXCM
wsr a0, PS
rsync
/* Save the remaining physical registers.
* 4 registers are already saved, which leaves 60 registers to save.
* (FIXME: consider the case when the CPU is configured with physical 32 registers)
* These 60 registers are saved in 5 iterations, 12 registers at a time.
*/
movi a1, 5
movi a3, _rmt_save_ctx + 4 * 4
/* This is repeated 5 times, each time the window is shifted by 12 registers.
* We come here with a1 = downcounter, a3 = save pointer, a2 and a0 unused.
*/
1:
s32i a4, a3, 0
s32i a5, a3, 4
s32i a6, a3, 8
s32i a7, a3, 12
s32i a8, a3, 16
s32i a9, a3, 20
s32i a10, a3, 24
s32i a11, a3, 28
s32i a12, a3, 32
s32i a13, a3, 36
s32i a14, a3, 40
s32i a15, a3, 44
/* We are about to rotate the window, so that a12-a15 will become the new a0-a3.
* Copy a0-a3 to a12-15 to still have access to these values.
* At the same time we can decrement the counter and adjust the save area pointer
*/
/* a0 is constant (_rmt_save_ctx), no need to copy */
addi a13, a1, -1 /* copy and decrement the downcounter */
/* a2 is scratch so no need to copy */
addi a15, a3, 48 /* copy and adjust the save area pointer */
beqz a13, 2f /* have saved all registers ? */
rotw 3 /* rotate the window and go back */
j 1b
/* the loop is complete */
2:
rotw 4 /* this brings us back to the original window */
/* a0 still points to _rmt_save_ctx */
/* Can clear WINDOWSTART now, all registers are saved */
rsr a2, WINDOWBASE
/* WINDOWSTART = (1 << WINDOWBASE) */
movi a3, 1
ssl a2
sll a3, a3
wsr a3, WINDOWSTART
_highint_stack_switch:
movi a0, 0
movi sp, _rmt_intr_stack + RMT_INTR_STACK_SIZE - 16
s32e a0, sp, -12 /* For GDB: set null SP */
s32e a0, sp, -16 /* For GDB: set null PC */
movi a0, _highint_stack_switch /* For GDB: cosmetics, for the frame where stack switch happened */
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
movi a6, PS_INTLEVEL(RFI_X) | PS_UM | PS_WOE
wsr a6, PS
rsync
/* Call C handler */
mov a6, sp
call4 NeoEsp32RmtMethodIsr
l32e sp, sp, -12 /* switch back to the original stack */
/* Done with C handler; re-enable exception mode, disabling window overflow */
movi a2, PS_INTLEVEL(RFI_X+1) | PS_EXCM /* TOCHECK */
wsr a2, PS
rsync
/* Restore the special registers.
* WINDOWSTART will be restored near the end.
*/
movi a0, _rmt_save_ctx + SPECREG_OFFSET
l32i a2, a0, 8
wsr a2, SAR
#if XCHAL_HAVE_LOOPS
l32i a2, a0, 12
wsr a2, LBEG
l32i a2, a0, 16
wsr a2, LEND
l32i a2, a0, 20
wsr a2, LCOUNT
#endif
l32i a2, a0, 24
wsr a2, EPC1
/* Restoring the physical registers.
* This is the reverse to the saving process above.
*/
/* Rotate back to the final window, then start loading 12 registers at a time,
* in 5 iterations.
* Again, a1 is the downcounter and a3 is the save area pointer.
* After each rotation, a1 and a3 are copied from a13 and a15.
* To simplify the loop, we put the initial values into a13 and a15.
*/
rotw -4
movi a15, _rmt_save_ctx + 64 * 4 /* point to the end of the save area */
movi a13, 5
1:
/* Copy a1 and a3 from their previous location,
* at the same time decrementing and adjusting the save area pointer.
*/
addi a1, a13, -1
addi a3, a15, -48
/* Load 12 registers */
l32i a4, a3, 0
l32i a5, a3, 4
l32i a6, a3, 8
l32i a7, a3, 12
l32i a8, a3, 16
l32i a9, a3, 20
l32i a10, a3, 24
l32i a11, a3, 28 /* ensure PS and EPC written */
l32i a12, a3, 32
l32i a13, a3, 36
l32i a14, a3, 40
l32i a15, a3, 44
/* Done with the loop? */
beqz a1, 2f
/* If no, rotate the window and repeat */
rotw -3
j 1b
2:
/* Done with the loop. Only 4 registers (a0-a3 in the original window) remain
* to be restored. Also need to restore WINDOWSTART, since all the general
* registers are now in place.
*/
movi a0, _rmt_save_ctx
l32i a2, a0, SPECREG_OFFSET + 4
wsr a2, WINDOWSTART
l32i a1, a0, 4
l32i a2, a0, 8
l32i a3, a0, 12
rsr a0, EXCSAVE_X /* holds the value of a0 before the interrupt handler */
/* Return from the interrupt, restoring PS from EPS_X */
rfi RFI_X
/* The linker has no reason to link in this file; all symbols it exports are already defined
(weakly!) in the default int handler. Define a symbol here so we can use it to have the
linker inspect this anyway. */
.global ld_include_hli_vectors_rmt
ld_include_hli_vectors_rmt:
#endif // CONFIG_BTDM_CTRL_HLI
#endif // XTensa
================================================
FILE: lib/NeoESP32RmtHI/src/NeoEsp32RmtHIMethod.cpp
================================================
/*-------------------------------------------------------------------------
NeoPixel library helper functions for Esp32.
A BIG thanks to Andreas Merkle for the investigation and implementation of
a workaround to the GCC bug that drops method attributes from template methods
Written by Michael C. Miller.
I invest time and resources providing this open source code,
please support me by donating (see https://github.com/Makuna/NeoPixelBus)
-------------------------------------------------------------------------
This file is part of the Makuna/NeoPixelBus library.
NeoPixelBus is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
NeoPixelBus is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with NeoPixel. If not, see
<http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/
#include <Arduino.h>
#if defined(ARDUINO_ARCH_ESP32)
#include <algorithm>
#include "esp_idf_version.h"
#include "NeoEsp32RmtHIMethod.h"
#include "soc/soc.h"
#include "soc/rmt_reg.h"
#ifdef __riscv
#include "riscv/interrupt.h"
#endif
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0)
#include "hal/rmt_ll.h"
#else
/* Shims for older ESP-IDF v3; we can safely assume original ESP32 */
#include "soc/rmt_struct.h"
// Selected RMT API functions borrowed from ESP-IDF v4.4.8
// components/hal/esp32/include/hal/rmt_ll.h
// Copyright 2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
__attribute__((always_inline))
static inline void rmt_ll_tx_reset_pointer(rmt_dev_t *dev, uint32_t channel)
{
dev->conf_ch[channel].conf1.mem_rd_rst = 1;
dev->conf_ch[channel].conf1.mem_rd_rst = 0;
}
__attribute__((always_inline))
static inline void rmt_ll_tx_start(rmt_dev_t *dev, uint32_t channel)
{
dev->conf_ch[channel].conf1.tx_start = 1;
}
__attribute__((always_inline))
static inline void rmt_ll_tx_stop(rmt_dev_t *dev, uint32_t channel)
{
RMTMEM.chan[channel].data32[0].val = 0;
dev->conf_ch[channel].conf1.tx_start = 0;
dev->conf_ch[channel].conf1.mem_rd_rst = 1;
dev->conf_ch[channel].conf1.mem_rd_rst = 0;
}
__attribute__((always_inline))
static inline void rmt_ll_tx_enable_pingpong(rmt_dev_t *dev, uint32_t channel, bool enable)
{
dev->apb_conf.mem_tx_wrap_en = enable;
}
__attribute__((always_inline))
static inline void rmt_ll_tx_enable_loop(rmt_dev_t *dev, uint32_t channel, bool enable)
{
dev->conf_ch[channel].conf1.tx_conti_mode = enable;
}
__attribute__((always_inline))
static inline uint32_t rmt_ll_tx_get_channel_status(rmt_dev_t *dev, uint32_t channel)
{
return dev->status_ch[channel];
}
__attribute__((always_inline))
static inline void rmt_ll_tx_set_limit(rmt_dev_t *dev, uint32_t channel, uint32_t limit)
{
dev->tx_lim_ch[channel].limit = limit;
}
__attribute__((always_inline))
static inline void rmt_ll_enable_interrupt(rmt_dev_t *dev, uint32_t mask, bool enable)
{
if (enable) {
dev->int_ena.val |= mask;
} else {
dev->int_ena.val &= ~mask;
}
}
__attribute__((always_inline))
static inline void rmt_ll_enable_tx_end_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable)
{
dev->int_ena.val &= ~(1 << (channel * 3));
dev->int_ena.val |= (enable << (channel * 3));
}
__attribute__((always_inline))
static inline void rmt_ll_enable_tx_err_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable)
{
dev->int_ena.val &= ~(1 << (channel * 3 + 2));
dev->int_ena.val |= (enable << (channel * 3 + 2));
}
__attribute__((always_inline))
static inline void rmt_ll_enable_tx_thres_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable)
{
dev->int_ena.val &= ~(1 << (channel + 24));
dev->int_ena.val |= (enable << (channel + 24));
}
__attribute__((always_inline))
static inline void rmt_ll_clear_tx_end_interrupt(rmt_dev_t *dev, uint32_t channel)
{
dev->int_clr.val = (1 << (channel * 3));
}
__attribute__((always_inline))
static inline void rmt_ll_clear_tx_err_interrupt(rmt_dev_t *dev, uint32_t channel)
{
dev->int_clr.val = (1 << (channel * 3 + 2));
}
__attribute__((always_inline))
static inline void rmt_ll_clear_tx_thres_interrupt(rmt_dev_t *dev, uint32_t channel)
{
dev->int_clr.val = (1 << (channel + 24));
}
__attribute__((always_inline))
static inline uint32_t rmt_ll_get_tx_thres_interrupt_status(rmt_dev_t *dev)
{
uint32_t status = dev->int_st.val;
return (status & 0xFF000000) >> 24;
}
#endif
// *********************************
// Select method for binding interrupt
//
// - If the Bluetooth driver has registered a high-level interrupt, piggyback on that API
// - If we're on a modern core, allocate the interrupt with the API (old cores are bugged)
// - Otherwise use the low-level hardware API to manually bind the interrupt
#if defined(CONFIG_BTDM_CTRL_HLI)
// Espressif's bluetooth driver offers a helpful sharing layer; bring in the interrupt management calls
#include "hal/interrupt_controller_hal.h"
extern "C" esp_err_t hli_intr_register(intr_handler_t handler, void* arg, uint32_t intr_reg, uint32_t intr_mask);
#else /* !CONFIG_BTDM_CTRL_HLI*/
// Declare the our high-priority ISR handler
extern "C" void ld_include_hli_vectors_rmt(); // an object with an address, but no space
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
#include "soc/periph_defs.h"
#endif
// Select level flag
#if defined(__riscv)
// RISCV chips don't block interrupts while scheduling; all we need to do is be higher than the WiFi ISR
#define INT_LEVEL_FLAG ESP_INTR_FLAG_LEVEL3
#elif defined(CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5)
#define INT_LEVEL_FLAG ESP_INTR_FLAG_LEVEL4
#else
#define INT_LEVEL_FLAG ESP_INTR_FLAG_LEVEL5
#endif
// ESP-IDF v3 cannot enable high priority interrupts through the API at all;
// and ESP-IDF v4 on XTensa cannot enable Level 5 due to incorrect interrupt descriptor tables
#if !defined(__XTENSA__) || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)) || ((ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) && CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5))
#define NEOESP32_RMT_CAN_USE_INTR_ALLOC
// XTensa cores require the assembly bridge
#ifdef __XTENSA__
#define HI_IRQ_HANDLER nullptr
#define HI_IRQ_HANDLER_ARG ld_include_hli_vectors_rmt
#else
#define HI_IRQ_HANDLER NeoEsp32RmtMethodIsr
#define HI_IRQ_HANDLER_ARG nullptr
#endif
#else
/* !CONFIG_BTDM_CTRL_HLI && !NEOESP32_RMT_CAN_USE_INTR_ALLOC */
// This is the index of the LV5 interrupt vector - see interrupt descriptor table in idf components/hal/esp32/interrupt_descriptor_table.c
#define ESP32_LV5_IRQ_INDEX 26
#endif /* NEOESP32_RMT_CAN_USE_INTR_ALLOC */
#endif /* CONFIG_BTDM_CTRL_HLI */
// RMT driver implementation
struct NeoEsp32RmtHIChannelState {
uint32_t rmtBit0, rmtBit1;
uint32_t resetDuration;
const byte* txDataStart; // data array
const byte* txDataEnd; // one past end
const byte* txDataCurrent; // current location
size_t rmtOffset;
};
// Global variables
#if defined(NEOESP32_RMT_CAN_USE_INTR_ALLOC)
static intr_handle_t isrHandle = nullptr;
#endif
static NeoEsp32RmtHIChannelState** driverState = nullptr;
constexpr size_t rmtBatchSize = RMT_MEM_ITEM_NUM / 2;
// Fill the RMT buffer memory
// This is implemented using many arguments instead of passing the structure object to ensure we do only one lookup
// All the arguments are passed in registers, so they don't need to be looked up again
static void IRAM_ATTR RmtFillBuffer(uint8_t channel, const byte** src_ptr, const byte* end, uint32_t bit0, uint32_t bit1, size_t* offset_ptr, size_t reserve) {
// We assume that (rmtToWrite % 8) == 0
size_t rmtToWrite = rmtBatchSize - reserve;
rmt_item32_t* dest =(rmt_item32_t*) &RMTMEM.chan[channel].data32[*offset_ptr + reserve]; // write directly in to RMT memory
const byte* psrc = *src_ptr;
*offset_ptr ^= rmtBatchSize;
if (psrc != end) {
while (rmtToWrite > 0) {
uint8_t data = *psrc;
for (uint8_t bit = 0; bit < 8; bit++)
{
dest->val = (data & 0x80) ? bit1 : bit0;
dest++;
data <<= 1;
}
rmtToWrite -= 8;
psrc++;
if (psrc == end) {
break;
}
}
*src_ptr = psrc;
}
if (rmtToWrite > 0) {
// Add end event
rmt_item32_t bit0_val = {{.val = bit0 }};
*dest = rmt_item32_t {{{ .duration0 = 0, .level0 = bit0_val.level1, .duration1 = 0, .level1 = bit0_val.level1 }}};
}
}
static void IRAM_ATTR RmtStartWrite(uint8_t channel, NeoEsp32RmtHIChannelState& state) {
// Reset context state
state.rmtOffset = 0;
// Fill the first part of the buffer with a reset event
// FUTURE: we could do timing analysis with the last interrupt on this channel
// Use 8 words to stay aligned with the buffer fill logic
rmt_item32_t bit0_val = {{.val = state.rmtBit0 }};
rmt_item32_t fill = {{{ .duration0 = 100, .level0 = bit0_val.level1, .duration1 = 100, .level1 = bit0_val.level1 }}};
rmt_item32_t* dest = (rmt_item32_t*) &RMTMEM.chan[channel].data32[0];
for (auto i = 0; i < 7; ++i) dest[i] = fill;
fill.duration1 = state.resetDuration > 1400 ? (state.resetDuration - 1400) : 100;
dest[7] = fill;
// Fill the remaining buffer with real data
RmtFillBuffer(channel, &state.txDataCurrent, state.txDataEnd, state.rmtBit0, state.rmtBit1, &state.rmtOffset, 8);
RmtFillBuffer(channel, &state.txDataCurrent, state.txDataEnd, state.rmtBit0, state.rmtBit1, &state.rmtOffset, 0);
// Start operation
rmt_ll_clear_tx_thres_interrupt(&RMT, channel);
rmt_ll_tx_reset_pointer(&RMT, channel);
rmt_ll_tx_start(&RMT, channel);
}
extern "C" void IRAM_ATTR NeoEsp32RmtMethodIsr(void *arg) {
// Tx threshold interrupt
uint32_t status = rmt_ll_get_tx_thres_interrupt_status(&RMT);
while (status) {
uint8_t channel = __builtin_ffs(status) - 1;
if (driverState[channel]) {
// Normal case
NeoEsp32RmtHIChannelState& state = *driverState[channel];
RmtFillBuffer(channel, &state.txDataCurrent, state.txDataEnd, state.rmtBit0, state.rmtBit1, &state.rmtOffset, 0);
} else {
// Danger - another driver got invoked?
rmt_ll_tx_stop(&RMT, channel);
}
rmt_ll_clear_tx_thres_interrupt(&RMT, channel);
status = rmt_ll_get_tx_thres_interrupt_status(&RMT);
}
};
// Wrapper around the register analysis defines
// For all currently supported chips, this is constant for all channels; but this is not true of *all* ESP32
static inline bool _RmtStatusIsTransmitting(rmt_channel_t channel, uint32_t status) {
uint32_t v;
switch(channel) {
#ifdef RMT_STATE_CH0
case 0: v = (status >> RMT_STATE_CH0_S) & RMT_STATE_CH0_V; break;
#endif
#ifdef RMT_STATE_CH1
case 1: v = (status >> RMT_STATE_CH1_S) & RMT_STATE_CH1_V; break;
#endif
#ifdef RMT_STATE_CH2
case 2: v = (status >> RMT_STATE_CH2_S) & RMT_STATE_CH2_V; break;
#endif
#ifdef RMT_STATE_CH3
case 3: v = (status >> RMT_STATE_CH3_S) & RMT_STATE_CH3_V; break;
#endif
#ifdef RMT_STATE_CH4
case 4: v = (status >> RMT_STATE_CH4_S) & RMT_STATE_CH4_V; break;
#endif
#ifdef RMT_STATE_CH5
case 5: v = (status >> RMT_STATE_CH5_S) & RMT_STATE_CH5_V; break;
#endif
#ifdef RMT_STATE_CH6
case 6: v = (status >> RMT_STATE_CH6_S) & RMT_STATE_CH6_V; break;
#endif
#ifdef RMT_STATE_CH7
case 7: v = (status >> RMT_STATE_CH7_S) & RMT_STATE_CH7_V; break;
#endif
default: v = 0;
}
return v != 0;
}
esp_err_t NeoEsp32RmtHiMethodDriver::Install(rmt_channel_t channel, uint32_t rmtBit0, uint32_t rmtBit1, uint32_t reset) {
// Validate channel number
if (channel >= RMT_CHANNEL_MAX) {
return ESP_ERR_INVALID_ARG;
}
esp_err_t err = ESP_OK;
if (!driverState) {
// First time init
driverState = reinterpret_cast<NeoEsp32RmtHIChannelState**>(heap_caps_calloc(RMT_CHANNEL_MAX, sizeof(NeoEsp32RmtHIChannelState*), MALLOC_CAP_INTERNAL));
if (!driverState) return ESP_ERR_NO_MEM;
// Ensure all interrupts are cleared before binding
RMT.int_ena.val = 0;
RMT.int_clr.val = 0xFFFFFFFF;
// Bind interrupt handler
#if defined(CONFIG_BTDM_CTRL_HLI)
// Bluetooth driver has taken the empty high-priority interrupt. Fortunately, it allows us to
// hook up another handler.
err = hli_intr_register(NeoEsp32RmtMethodIsr, nullptr, (uintptr_t) &RMT.int_st, 0xFF000000);
// 25 is the magic number of the bluetooth ISR on ESP32 - see soc/soc.h.
intr_matrix_set(cpu_hal_get_core_id(), ETS_RMT_INTR_SOURCE, 25);
intr_cntrl_ll_enable_interrupts(1<<25);
#elif defined(NEOESP32_RMT_CAN_USE_INTR_ALLOC)
// Use the platform code to allocate the interrupt
// If we need the additional assembly bridge, we pass it as the "arg" to the IDF so it gets linked in
err = esp_intr_alloc(ETS_RMT_INTR_SOURCE, INT_LEVEL_FLAG | ESP_INTR_FLAG_IRAM, HI_IRQ_HANDLER, (void*) HI_IRQ_HANDLER_ARG, &isrHandle);
//err = ESP_ERR_NOT_FINISHED;
#else
// Broken IDF API does not allow us to reserve the interrupt; do it manually
static volatile const void* __attribute__((used)) pleaseLinkAssembly = (void*) ld_include_hli_vectors_rmt;
intr_matrix_set(xPortGetCoreID(), ETS_RMT_INTR_SOURCE, ESP32_LV5_IRQ_INDEX);
gitextract_clh_9b3z/
├── .devcontainer/
│ ├── Dockerfile
│ └── devcontainer.json
├── .envrc
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── copilot-instructions.md
│ └── workflows/
│ ├── build.yml
│ ├── nightly.yml
│ ├── pr-merge.yaml
│ ├── release.yml
│ ├── stale.yml
│ ├── test.yaml
│ ├── usermods.yml
│ └── wled-ci.yml
├── .gitignore
├── .gitpod.Dockerfile
├── .gitpod.yml
├── .nvmrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── boards/
│ ├── adafruit_matrixportal_esp32s3_wled.json
│ ├── lilygo-t7-s3.json
│ └── lolin_s3_mini.json
├── images/
│ └── Readme.md
├── include/
│ └── README
├── lib/
│ ├── ESP8266PWM/
│ │ └── src/
│ │ └── core_esp8266_waveform_phase.cpp
│ ├── NeoESP32RmtHI/
│ │ ├── include/
│ │ │ └── NeoEsp32RmtHIMethod.h
│ │ ├── library.json
│ │ └── src/
│ │ ├── NeoEsp32RmtHI.S
│ │ └── NeoEsp32RmtHIMethod.cpp
│ └── README
├── package.json
├── pio-scripts/
│ ├── build_ui.py
│ ├── dynarray.py
│ ├── load_usermods.py
│ ├── obj-dump.py
│ ├── output_bins.py
│ ├── set_metadata.py
│ ├── strip-floats.py
│ ├── user_config_copy.py
│ └── validate_modules.py
├── platformio.ini
├── platformio_override.sample.ini
├── readme.md
├── requirements.in
├── requirements.txt
├── test/
│ └── README
├── tools/
│ ├── AutoCubeMap.xlsx
│ ├── WLED_ESP32-wrover_4MB.csv
│ ├── WLED_ESP32_16MB.csv
│ ├── WLED_ESP32_16MB_9MB_FS.csv
│ ├── WLED_ESP32_2MB_noOTA.csv
│ ├── WLED_ESP32_32MB.csv
│ ├── WLED_ESP32_4MB_1MB_FS.csv
│ ├── WLED_ESP32_4MB_256KB_FS.csv
│ ├── WLED_ESP32_4MB_512KB_FS.csv
│ ├── WLED_ESP32_4MB_700k_FS.csv
│ ├── WLED_ESP32_8MB.csv
│ ├── all_xml.sh
│ ├── cdata-test.js
│ ├── cdata.js
│ ├── dynarray_espressif32.ld
│ ├── fps_test.htm
│ ├── json_test.htm
│ ├── multi-update.cmd
│ ├── multi-update.sh
│ ├── partitions-16MB_spiffs-tinyuf2.csv
│ ├── partitions-4MB_spiffs-tinyuf2.csv
│ ├── partitions-8MB_spiffs-tinyuf2.csv
│ ├── stress_test.sh
│ ├── udp_test.py
│ └── wled-tools
├── usermods/
│ ├── ADS1115_v2/
│ │ ├── ADS1115_v2.cpp
│ │ ├── ChannelSettings.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── AHT10_v2/
│ │ ├── AHT10_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Analog_Clock/
│ │ ├── Analog_Clock.cpp
│ │ └── library.json
│ ├── Animated_Staircase/
│ │ ├── Animated_Staircase.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Artemis_reciever/
│ │ ├── readme.md
│ │ └── usermod.cpp
│ ├── BH1750_v2/
│ │ ├── BH1750_v2.cpp
│ │ ├── BH1750_v2.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── BME280_v2/
│ │ ├── BME280_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── BME68X_v2/
│ │ ├── BME68X_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Battery/
│ │ ├── Battery.cpp
│ │ ├── UMBattery.h
│ │ ├── battery_defaults.h
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── types/
│ │ ├── LionUMBattery.h
│ │ ├── LipoUMBattery.h
│ │ └── UnkownUMBattery.h
│ ├── Cronixie/
│ │ ├── Cronixie.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── DHT/
│ │ ├── DHT.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── EXAMPLE/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_example.cpp
│ ├── EleksTube_IPS/
│ │ ├── ChipSelect.h
│ │ ├── EleksTube_IPS.cpp
│ │ ├── Hardware.h
│ │ ├── TFTs.h
│ │ ├── User_Setup.h
│ │ ├── library.json.disabled
│ │ └── readme.md
│ ├── Enclosure_with_OLED_temp_ESP07/
│ │ ├── assets/
│ │ │ └── readme.md
│ │ ├── readme.md
│ │ ├── usermod.cpp
│ │ └── usermod_bme280.cpp
│ ├── Fix_unreachable_netservices_v2/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_Fix_unreachable_netservices.cpp
│ ├── INA226_v2/
│ │ ├── INA226_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── Internal_Temperature_v2/
│ │ ├── Internal_Temperature_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── JSON_IR_remote/
│ │ ├── 21-key_ir.json
│ │ ├── 24-key_ir.json
│ │ ├── 32-key_ir.json
│ │ ├── 40-key-black_ir.json
│ │ ├── 40-key-blue_ir.json
│ │ ├── 44-key_ir.json
│ │ ├── 6-key_ir.json
│ │ ├── 9-key_ir.json
│ │ ├── IR_Remote_Codes.xlsx
│ │ ├── ir_json_maker.py
│ │ └── readme.md
│ ├── LD2410_v2/
│ │ ├── LD2410_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── LDR_Dusk_Dawn_v2/
│ │ ├── LDR_Dusk_Dawn_v2.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── MAX17048_v2/
│ │ ├── MAX17048_v2.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── MY9291/
│ │ ├── MY9291.cpp
│ │ ├── MY92xx.h
│ │ └── library.json
│ ├── PIR_sensor_switch/
│ │ ├── PIR_Highlight_Standby
│ │ ├── PIR_sensor_switch.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── PS_Comet/
│ │ ├── PS_Comet.cpp
│ │ ├── README.md
│ │ └── library.json
│ ├── PWM_fan/
│ │ ├── PWM_fan.cpp
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── setup_deps.py
│ ├── RTC/
│ │ ├── RTC.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── RelayBlinds/
│ │ ├── index.htm
│ │ ├── presets.json
│ │ ├── readme.md
│ │ └── usermod.cpp
│ ├── SN_Photoresistor/
│ │ ├── SN_Photoresistor.cpp
│ │ ├── SN_Photoresistor.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── ST7789_display/
│ │ ├── README.md
│ │ ├── ST7789_display.cpp
│ │ └── library.json.disabled
│ ├── Si7021_MQTT_HA/
│ │ ├── Si7021_MQTT_HA.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── TTGO-T-Display/
│ │ ├── README.md
│ │ └── usermod.cpp
│ ├── Temperature/
│ │ ├── Temperature.cpp
│ │ ├── UsermodTemperature.h
│ │ ├── library.json
│ │ └── readme.md
│ ├── TetrisAI_v2/
│ │ ├── TetrisAI_v2.cpp
│ │ ├── gridbw.h
│ │ ├── gridcolor.h
│ │ ├── library.json
│ │ ├── pieces.h
│ │ ├── rating.h
│ │ ├── readme.md
│ │ ├── tetrisai.h
│ │ ├── tetrisaigame.h
│ │ └── tetrisbag.h
│ ├── VL53L0X_gestures/
│ │ ├── VL53L0X_gestures.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── Wemos_D1_mini+Wemos32_mini_shield/
│ │ ├── readme.md
│ │ ├── usermod.cpp
│ │ └── usermod_bme280.cpp
│ ├── audioreactive/
│ │ ├── audio_reactive.cpp
│ │ ├── audio_source.h
│ │ ├── library.json
│ │ ├── override_sqrt.py
│ │ └── readme.md
│ ├── battery_keypad_controller/
│ │ ├── README.md
│ │ └── wled06_usermod.ino
│ ├── boblight/
│ │ ├── boblight.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── buzzer/
│ │ ├── buzzer.cpp
│ │ └── library.json
│ ├── deep_sleep/
│ │ ├── deep_sleep.cpp
│ │ ├── library.json
│ │ └── readme.md
│ ├── mpu6050_imu/
│ │ ├── library.json
│ │ ├── mpu6050_imu.cpp
│ │ ├── readme.md
│ │ └── usermod_gyro_surge.h
│ ├── multi_relay/
│ │ ├── library.json
│ │ ├── multi_relay.cpp
│ │ └── readme.md
│ ├── photoresistor_sensor_mqtt_v1/
│ │ ├── README.md
│ │ └── usermod.cpp
│ ├── pixels_dice_tray/
│ │ ├── BLE_REQUIREMENT.md
│ │ ├── README.md
│ │ ├── WLED_ESP32_4MB_64KB_FS.csv
│ │ ├── dice_state.h
│ │ ├── generate_roll_info.py
│ │ ├── led_effects.h
│ │ ├── mqtt_client/
│ │ │ ├── mqtt_logger.py
│ │ │ ├── mqtt_plotter.py
│ │ │ └── requirements.txt
│ │ ├── pixels_dice_tray.cpp
│ │ ├── platformio_override.ini.sample
│ │ ├── roll_info.h
│ │ └── tft_menu.h
│ ├── platformio_override.usermods.ini
│ ├── pov_display/
│ │ ├── README.md
│ │ ├── bmpimage.cpp
│ │ ├── bmpimage.h
│ │ ├── library.json
│ │ ├── pov.cpp
│ │ ├── pov.h
│ │ └── pov_display.cpp
│ ├── project_cars_shiftlight/
│ │ ├── readme.md
│ │ └── wled06_usermod.ino
│ ├── pwm_outputs/
│ │ ├── library.json
│ │ ├── pwm_outputs.cpp
│ │ └── readme.md
│ ├── quinled-an-penta/
│ │ ├── library.json
│ │ ├── quinled-an-penta.cpp
│ │ └── readme.md
│ ├── readme.md
│ ├── rgb-rotary-encoder/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── rgb-rotary-encoder.cpp
│ ├── rotary_encoder_change_effect/
│ │ └── wled06_usermod.ino
│ ├── sd_card/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sd_card.cpp
│ ├── sensors_to_mqtt/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sensors_to_mqtt.cpp
│ ├── seven_segment_display/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── seven_segment_display.cpp
│ ├── seven_segment_display_reloaded/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── setup_deps.py
│ │ └── seven_segment_display_reloaded.cpp
│ ├── sht/
│ │ ├── ShtUsermod.h
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── sht.cpp
│ ├── smartnest/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── smartnest.cpp
│ ├── stairway_wipe_basic/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── stairway_wipe_basic.cpp
│ ├── udp_name_sync/
│ │ ├── library.json
│ │ └── udp_name_sync.cpp
│ ├── user_fx/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── user_fx.cpp
│ ├── usermod_rotary_brightness_color/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── usermod_rotary_brightness_color.cpp
│ ├── usermod_v2_HttpPullLightControl/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── usermod_v2_HttpPullLightControl.cpp
│ │ └── usermod_v2_HttpPullLightControl.h
│ ├── usermod_v2_RF433/
│ │ ├── library.json
│ │ ├── readme.md
│ │ ├── remote433.json
│ │ └── usermod_v2_RF433.cpp
│ ├── usermod_v2_animartrix/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_animartrix.cpp
│ ├── usermod_v2_auto_save/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_auto_save.cpp
│ ├── usermod_v2_brightness_follow_sun/
│ │ ├── README.md
│ │ ├── library.json
│ │ └── usermod_v2_brightness_follow_sun.cpp
│ ├── usermod_v2_four_line_display_ALT/
│ │ ├── 4LD_wled_fonts.h
│ │ ├── library.json
│ │ ├── platformio_override.sample.ini
│ │ ├── readme.md
│ │ ├── usermod_v2_four_line_display.h
│ │ └── usermod_v2_four_line_display_ALT.cpp
│ ├── usermod_v2_klipper_percentage/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_klipper_percentage.cpp
│ ├── usermod_v2_ping_pong_clock/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_ping_pong_clock.cpp
│ ├── usermod_v2_rotary_encoder_ui_ALT/
│ │ ├── library.json
│ │ ├── platformio_override.sample.ini
│ │ ├── readme.md
│ │ ├── setup_deps.py
│ │ └── usermod_v2_rotary_encoder_ui_ALT.cpp
│ ├── usermod_v2_word_clock/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── usermod_v2_word_clock.cpp
│ ├── wireguard/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── wireguard.cpp
│ ├── wizlights/
│ │ ├── library.json
│ │ ├── readme.md
│ │ └── wizlights.cpp
│ └── word-clock-matrix/
│ ├── Word Clock Baffle.stl
│ ├── library.json
│ ├── readme.md
│ └── word-clock-matrix.cpp
└── wled00/
├── FX.cpp
├── FX.h
├── FX_2Dfcn.cpp
├── FX_fcn.cpp
├── FXparticleSystem.cpp
├── FXparticleSystem.h
├── NodeStruct.h
├── alexa.cpp
├── bus_manager.cpp
├── bus_manager.h
├── bus_wrapper.h
├── button.cpp
├── cfg.cpp
├── colors.cpp
├── colors.h
├── const.h
├── data/
│ ├── 404.htm
│ ├── common.js
│ ├── cpal/
│ │ └── cpal.htm
│ ├── dmxmap.htm
│ ├── edit.htm
│ ├── icons-ui/
│ │ ├── HowTo_AddNewIcons.txt
│ │ ├── Read Me.txt
│ │ ├── demo-files/
│ │ │ ├── demo.css
│ │ │ └── demo.js
│ │ ├── demo.html
│ │ ├── selection.json
│ │ └── style.css
│ ├── index.css
│ ├── index.htm
│ ├── index.js
│ ├── iro.js
│ ├── liveview.htm
│ ├── liveviewws2D.htm
│ ├── msg.htm
│ ├── pixart/
│ │ ├── boxdraw.js
│ │ ├── getPixelValues.js
│ │ ├── pixart.css
│ │ ├── pixart.htm
│ │ ├── pixart.js
│ │ ├── site.webmanifest
│ │ └── statics.js
│ ├── pixelforge/
│ │ ├── omggif.js
│ │ └── pixelforge.htm
│ ├── pxmagic/
│ │ └── pxmagic.htm
│ ├── rangetouch.js
│ ├── settings.htm
│ ├── settings_2D.htm
│ ├── settings_dmx.htm
│ ├── settings_leds.htm
│ ├── settings_pin.htm
│ ├── settings_pininfo.htm
│ ├── settings_sec.htm
│ ├── settings_sync.htm
│ ├── settings_time.htm
│ ├── settings_ui.htm
│ ├── settings_um.htm
│ ├── settings_wifi.htm
│ ├── style.css
│ ├── update.htm
│ ├── usermod.htm
│ └── welcome.htm
├── dmx_input.cpp
├── dmx_input.h
├── dmx_output.cpp
├── dynarray.h
├── e131.cpp
├── fcn_declare.h
├── file.cpp
├── hue.cpp
├── image_loader.cpp
├── improv.cpp
├── ir.cpp
├── ir_codes.h
├── json.cpp
├── led.cpp
├── lx_parser.cpp
├── mqtt.cpp
├── my_config_sample.h
├── net_debug.cpp
├── net_debug.h
├── network.cpp
├── ntp.cpp
├── ota_update.cpp
├── ota_update.h
├── overlay.cpp
├── palettes.cpp
├── pin_manager.cpp
├── pin_manager.h
├── playlist.cpp
├── presets.cpp
├── remote.cpp
├── set.cpp
├── src/
│ ├── dependencies/
│ │ ├── dmx/
│ │ │ ├── ESPDMX.cpp
│ │ │ ├── ESPDMX.h
│ │ │ ├── LICENSE.md
│ │ │ ├── SparkFunDMX.cpp
│ │ │ └── SparkFunDMX.h
│ │ ├── e131/
│ │ │ ├── ESPAsyncE131.cpp
│ │ │ └── ESPAsyncE131.h
│ │ ├── espalexa/
│ │ │ ├── Espalexa.h
│ │ │ ├── EspalexaDevice.cpp
│ │ │ ├── EspalexaDevice.h
│ │ │ └── LICENSE
│ │ ├── json/
│ │ │ ├── ArduinoJson-v6.h
│ │ │ └── AsyncJson-v6.h
│ │ ├── network/
│ │ │ ├── Network.cpp
│ │ │ └── Network.h
│ │ ├── time/
│ │ │ ├── DS1307RTC.cpp
│ │ │ ├── DS1307RTC.h
│ │ │ ├── DateStrings.cpp
│ │ │ ├── LICENSE.txt
│ │ │ ├── Readme.txt
│ │ │ ├── Time.cpp
│ │ │ ├── TimeLib.h
│ │ │ ├── library.json
│ │ │ └── library.properties
│ │ ├── timezone/
│ │ │ ├── LICENSE.md
│ │ │ ├── ReadMe.md
│ │ │ ├── Timezone.cpp
│ │ │ └── Timezone.h
│ │ ├── toki/
│ │ │ └── Toki.h
│ │ └── ws2812fx/
│ │ ├── LICENSE.txt
│ │ └── readme.txt
│ └── font/
│ ├── console_font_4x6.h
│ ├── console_font_5x12.h
│ ├── console_font_5x8.h
│ ├── console_font_6x8.h
│ └── console_font_7x9.h
├── udp.cpp
├── um_manager.cpp
├── usermod.cpp
├── util.cpp
├── wled.cpp
├── wled.h
├── wled_ethernet.h
├── wled_main.cpp
├── wled_math.cpp
├── wled_metadata.cpp
├── wled_metadata.h
├── wled_serial.cpp
├── wled_server.cpp
├── ws.cpp
└── xml.cpp
Showing preview only (242K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2897 symbols across 194 files)
FILE: lib/ESP8266PWM/src/core_esp8266_waveform_phase.cpp
function IRAM_ATTR (line 69) | static inline IRAM_ATTR void nmiCrashWorkaround() {
function _setPWMFreq_weak (line 87) | void _setPWMFreq_weak(uint32_t freq) { (void) freq; }
function IRAM_ATTR (line 88) | IRAM_ATTR bool _stopPWM_weak(int pin) { (void) pin; return false; }
function _setPWM_weak (line 89) | bool _setPWM_weak(int pin, uint32_t val, uint32_t range) { (void) pin; (...
type WaveformMode (line 109) | enum class WaveformMode : uint8_t {INFINITE = 0, EXPIRES = 1, UPDATEEXPI...
function initTimer (line 154) | static void initTimer() {
function deinitTimer (line 163) | static void IRAM_ATTR deinitTimer() {
function setTimer1Callback_weak (line 173) | void setTimer1Callback_weak(uint32_t (*fn)()) {
function startWaveformClockCycles_weak (line 186) | int startWaveformClockCycles_weak(uint8_t pin, uint32_t highCcys, uint32...
function IRAM_ATTR (line 261) | IRAM_ATTR int stopWaveform_weak(uint8_t pin) {
function IRAM_ATTR (line 295) | static inline IRAM_ATTR int32_t scaleCcys(const int32_t ccys, const bool...
function IRAM_ATTR (line 304) | static IRAM_ATTR void timer1Interrupt() {
FILE: lib/NeoESP32RmtHI/include/NeoEsp32RmtHIMethod.h
function namespace (line 37) | namespace NeoEsp32RmtHiMethodDriver {
function Initialize (line 92) | void Initialize()
function Update (line 114) | void Update(bool maintainBufferConsistency)
function AlwaysUpdate (line 137) | bool AlwaysUpdate()
function SwapBuffers (line 143) | bool SwapBuffers()
function applySettings (line 159) | void applySettings([[maybe_unused]] const SettingsObject& settings)
function construct (line 173) | void construct()
type NeoEsp32RmtHIMethodBase (line 184) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 185) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 186) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 187) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 188) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 189) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 190) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 191) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 192) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 193) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 194) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 195) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 196) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHINWs2805Method (line 197) | typedef NeoEsp32RmtHINWs2805Method NeoEsp32RmtHINWs2814Method;
type NeoEsp32RmtHIMethodBase (line 199) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 200) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 201) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 202) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 203) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 204) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 205) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 206) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 207) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 208) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 209) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 210) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 211) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI0Ws2805Method (line 212) | typedef NeoEsp32RmtHI0Ws2805Method NeoEsp32RmtHI0Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 214) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 215) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 216) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 217) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 218) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 219) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 220) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 221) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 222) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 223) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 224) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 225) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 226) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI1Ws2805Method (line 227) | typedef NeoEsp32RmtHI1Ws2805Method NeoEsp32RmtHI1Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 231) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 232) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 233) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 234) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 235) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 236) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 237) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 238) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 239) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 240) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 241) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 242) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 243) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI2Ws2805Method (line 244) | typedef NeoEsp32RmtHI2Ws2805Method NeoEsp32RmtHI2Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 246) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 247) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 248) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 249) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 250) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 251) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 252) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 253) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 254) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 255) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 256) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 257) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 258) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI3Ws2805Method (line 259) | typedef NeoEsp32RmtHI3Ws2805Method NeoEsp32RmtHI3Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 263) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 264) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 265) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 266) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 267) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 268) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 269) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 270) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 271) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 272) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 273) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 274) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 275) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI4Ws2805Method (line 276) | typedef NeoEsp32RmtHI4Ws2805Method NeoEsp32RmtHI4Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 278) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 279) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 280) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 281) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 282) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 283) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 284) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 285) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 286) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 287) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 288) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 289) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 290) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI5Ws2805Method (line 291) | typedef NeoEsp32RmtHI5Ws2805Method NeoEsp32RmtHI5Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 293) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 294) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 295) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 296) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 297) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 298) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 299) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 300) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 301) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 302) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 303) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 304) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 305) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI6Ws2805Method (line 306) | typedef NeoEsp32RmtHI6Ws2805Method NeoEsp32RmtHI6Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 308) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2811, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 309) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 310) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2812x, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 311) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedWs2805, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 312) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedSk6812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 313) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1814, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 314) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1829, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 315) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTm1914, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 316) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedApa106, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 317) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedTx1812, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 318) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeedGs1903, NeoEsp32RmtChann...
type NeoEsp32RmtHIMethodBase (line 319) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed800Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHIMethodBase (line 320) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtSpeed400Kbps, NeoEsp32RmtChan...
type NeoEsp32RmtHI7Ws2805Method (line 321) | typedef NeoEsp32RmtHI7Ws2805Method NeoEsp32RmtHI7Ws2814Method;
type NeoEsp32RmtHIMethodBase (line 327) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 328) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 329) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 330) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 331) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 332) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 333) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 334) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 335) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 336) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 337) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 338) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 339) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHINWs2805InvertedMethod (line 340) | typedef NeoEsp32RmtHINWs2805InvertedMethod NeoEsp32RmtHINWs2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 342) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 343) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 344) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 345) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 346) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 347) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 348) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 349) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 350) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 351) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 352) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 353) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 354) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI0Ws2805InvertedMethod (line 355) | typedef NeoEsp32RmtHI0Ws2805InvertedMethod NeoEsp32RmtHI0Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 357) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 358) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 359) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 360) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 361) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 362) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 363) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 364) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 365) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 366) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 367) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 368) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 369) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI1Ws2805InvertedMethod (line 370) | typedef NeoEsp32RmtHI1Ws2805InvertedMethod NeoEsp32RmtHI1Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 374) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 375) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 376) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 377) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 378) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 379) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 380) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 381) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 382) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 383) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 384) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 385) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 386) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI2Ws2805InvertedMethod (line 387) | typedef NeoEsp32RmtHI2Ws2805InvertedMethod NeoEsp32RmtHI2Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 389) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 390) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 391) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 392) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 393) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 394) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 395) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 396) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 397) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 398) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 399) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 400) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 401) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI3Ws2805InvertedMethod (line 402) | typedef NeoEsp32RmtHI3Ws2805InvertedMethod NeoEsp32RmtHI3Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 406) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 407) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 408) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 409) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 410) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 411) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 412) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 413) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 414) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 415) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 416) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 417) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 418) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI4Ws2805InvertedMethod (line 419) | typedef NeoEsp32RmtHI4Ws2805InvertedMethod NeoEsp32RmtHI4Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 421) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 422) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 423) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 424) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 425) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 426) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 427) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 428) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 429) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 430) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 431) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 432) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 433) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI5Ws2805InvertedMethod (line 434) | typedef NeoEsp32RmtHI5Ws2805InvertedMethod NeoEsp32RmtHI5Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 436) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 437) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 438) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 439) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 440) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 441) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 442) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 443) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 444) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 445) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 446) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 447) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 448) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI6Ws2805InvertedMethod (line 449) | typedef NeoEsp32RmtHI6Ws2805InvertedMethod NeoEsp32RmtHI6Ws2814InvertedM...
type NeoEsp32RmtHIMethodBase (line 451) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2811, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 452) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 453) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2812x, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 454) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedWs2805, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 455) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedSk6812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 456) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1814, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 457) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1829, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 458) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTm1914, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 459) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedApa106, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 460) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedTx1812, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 461) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeedGs1903, NeoEsp32...
type NeoEsp32RmtHIMethodBase (line 462) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed800Kbps, NeoEsp3...
type NeoEsp32RmtHIMethodBase (line 463) | typedef NeoEsp32RmtHIMethodBase<NeoEsp32RmtInvertedSpeed400Kbps, NeoEsp3...
type NeoEsp32RmtHI7Ws2805InvertedMethod (line 464) | typedef NeoEsp32RmtHI7Ws2805InvertedMethod NeoEsp32RmtHI7Ws2814InvertedM...
FILE: lib/NeoESP32RmtHI/src/NeoEsp32RmtHIMethod.cpp
function rmt_ll_tx_reset_pointer (line 67) | __attribute__((always_inline))
function rmt_ll_tx_start (line 74) | __attribute__((always_inline))
function rmt_ll_tx_stop (line 80) | __attribute__((always_inline))
function rmt_ll_tx_enable_pingpong (line 89) | __attribute__((always_inline))
function rmt_ll_tx_enable_loop (line 95) | __attribute__((always_inline))
function rmt_ll_tx_get_channel_status (line 101) | __attribute__((always_inline))
function rmt_ll_tx_set_limit (line 107) | __attribute__((always_inline))
function rmt_ll_enable_interrupt (line 113) | __attribute__((always_inline))
function rmt_ll_enable_tx_end_interrupt (line 123) | __attribute__((always_inline))
function rmt_ll_enable_tx_err_interrupt (line 130) | __attribute__((always_inline))
function rmt_ll_enable_tx_thres_interrupt (line 137) | __attribute__((always_inline))
function rmt_ll_clear_tx_end_interrupt (line 144) | __attribute__((always_inline))
function rmt_ll_clear_tx_err_interrupt (line 150) | __attribute__((always_inline))
function rmt_ll_clear_tx_thres_interrupt (line 156) | __attribute__((always_inline))
function rmt_ll_get_tx_thres_interrupt_status (line 163) | __attribute__((always_inline))
type NeoEsp32RmtHIChannelState (line 228) | struct NeoEsp32RmtHIChannelState {
function RmtFillBuffer (line 249) | static void IRAM_ATTR RmtFillBuffer(uint8_t channel, const byte** src_pt...
function RmtStartWrite (line 284) | static void IRAM_ATTR RmtStartWrite(uint8_t channel, NeoEsp32RmtHIChanne...
function NeoEsp32RmtMethodIsr (line 308) | void IRAM_ATTR NeoEsp32RmtMethodIsr(void *arg) {
function _RmtStatusIsTransmitting (line 328) | static inline bool _RmtStatusIsTransmitting(rmt_channel_t channel, uint3...
function esp_err_t (line 362) | esp_err_t NeoEsp32RmtHiMethodDriver::Install(rmt_channel_t channel, uint...
function esp_err_t (line 440) | esp_err_t NeoEsp32RmtHiMethodDriver::Uninstall(rmt_channel_t channel) {
function esp_err_t (line 472) | esp_err_t NeoEsp32RmtHiMethodDriver::Write(rmt_channel_t channel, const...
function esp_err_t (line 487) | esp_err_t NeoEsp32RmtHiMethodDriver::WaitForTxDone(rmt_channel_t channel...
FILE: pio-scripts/load_usermods.py
function find_usermod (line 13) | def find_usermod(mod: str) -> Path:
function _is_external_entry (line 42) | def _is_external_entry(line: str) -> bool:
function _predict_dep_name (line 57) | def _predict_dep_name(entry: str) -> str | None:
function is_wled_module (line 96) | def is_wled_module(dep: LibBuilderBase) -> bool:
function cached_add_includes (line 143) | def cached_add_includes(dep, dep_cache: set, includes: deque):
function wrapped_ConfigureProjectLibBuilder (line 160) | def wrapped_ConfigureProjectLibBuilder(xenv):
FILE: pio-scripts/obj-dump.py
function obj_dump_after_elf (line 7) | def obj_dump_after_elf(source, target, env):
FILE: pio-scripts/output_bins.py
function _get_cpp_define_value (line 10) | def _get_cpp_define_value(env, define):
function _create_dirs (line 18) | def _create_dirs(dirs=["map", "release", "firmware"]):
function create_release (line 22) | def create_release(source):
function bin_rename_copy (line 39) | def bin_rename_copy(source, target, env):
function bin_gzip (line 58) | def bin_gzip(source, target):
FILE: pio-scripts/set_metadata.py
function get_github_repo (line 6) | def get_github_repo():
function has_def (line 87) | def has_def(cppdefs, name):
function add_wled_metadata_flags (line 97) | def add_wled_metadata_flags(env, node):
FILE: pio-scripts/validate_modules.py
function read_lines (line 10) | def read_lines(p: Path):
function _get_nm_path (line 16) | def _get_nm_path(env) -> str:
function check_elf_modules (line 26) | def check_elf_modules(elf_path: Path, env, module_lib_builders) -> set[s...
function count_usermod_objects (line 86) | def count_usermod_objects(map_file: list[str]) -> int:
function validate_map_file (line 92) | def validate_map_file(source, target, env):
FILE: tools/cdata-test.js
function deleteBuiltFiles (line 99) | async function deleteBuiltFiles() {
function checkIfBuiltFilesExist (line 109) | async function checkIfBuiltFilesExist() {
function runAndCheckIfBuiltFilesExist (line 115) | async function runAndCheckIfBuiltFilesExist() {
function checkIfFileWasNewlyCreated (line 120) | async function checkIfFileWasNewlyCreated(file) {
function testFileModification (line 125) | async function testFileModification(sourceFilePath, resultFile) {
FILE: tools/cdata.js
function generateBuildTime (line 42) | function generateBuildTime() {
function hexdump (line 68) | function hexdump(buffer, isHex = false) {
function adoptVersionAndRepo (line 94) | function adoptVersionAndRepo(html) {
function minify (line 109) | async function minify(str, type = "plain") {
function writeHtmlGzipped (line 137) | async function writeHtmlGzipped(sourceFile, resultFile, page, inlineCss ...
function specToChunk (line 162) | async function specToChunk(srcDir, s) {
function writeChunks (line 194) | async function writeChunks(srcDir, specs, resultFile) {
function isFileNewerThan (line 205) | function isFileNewerThan(filePath, time) {
function isAnyFileInFolderNewerThan (line 211) | function isAnyFileInFolderNewerThan(folderPath, time) {
function isAlreadyBuilt (line 226) | function isAlreadyBuilt(webUIPath, packageJsonPath = "package.json") {
FILE: tools/udp_test.py
class WledRealtimeClient (line 4) | class WledRealtimeClient:
method __init__ (line 5) | def __init__(self, wled_controller_ip, num_pixels, udp_port=21324, max...
method update (line 14) | def update(self):
FILE: usermods/ADS1115_v2/ADS1115_v2.cpp
class ADS1115Usermod (line 9) | class ADS1115Usermod : public Usermod {
method setup (line 11) | void setup() {
method loop (line 30) | void loop() {
method addToJsonInfo (line 45) | void addToJsonInfo(JsonObject& root)
method addToConfig (line 68) | void addToConfig(JsonObject& root)
method readFromConfig (line 86) | bool readFromConfig(JsonObject& root)
method getId (line 116) | uint16_t getId()
method round (line 217) | static float round(float value, uint8_t decimals) {
method initChannel (line 221) | bool initChannel() {
method moveToNextChannel (line 233) | void moveToNextChannel() {
method startReading (line 245) | void startReading() {
method updateResult (line 249) | void updateResult() {
FILE: usermods/ADS1115_v2/ChannelSettings.h
function namespace (line 3) | namespace ADS1115
FILE: usermods/AHT10_v2/AHT10_v2.cpp
class UsermodAHT10 (line 6) | class UsermodAHT10 : public Usermod
method truncateDecimals (line 36) | float truncateDecimals(float val)
method initializeAht (line 41) | void initializeAht()
method mqttInitialize (line 56) | void mqttInitialize()
method mqttPublishIfChanged (line 70) | void mqttPublishIfChanged(const __FlashStringHelper *topic, float &las...
method mqttCreateHassSensor (line 85) | void mqttCreateHassSensor(const String &name, const String &topic, con...
method setup (line 117) | void setup()
method loop (line 122) | void loop()
method onMqttConnect (line 174) | void onMqttConnect(bool sessionPresent)
method getId (line 180) | uint16_t getId()
method addToJsonInfo (line 185) | void addToJsonInfo(JsonObject &root) override
method addToConfig (line 225) | void addToConfig(JsonObject &root)
method readFromConfig (line 242) | bool readFromConfig(JsonObject &root) override
FILE: usermods/Analog_Clock/Analog_Clock.cpp
class AnalogClockUsermod (line 7) | class AnalogClockUsermod : public Usermod {
type Segment (line 12) | struct Segment {
method Segment (line 21) | Segment() {
method validateAndUpdate (line 25) | void validateAndUpdate() {
method update (line 37) | void update() {
method validateAndUpdate (line 59) | void validateAndUpdate() {
method adjustToSegment (line 67) | int16_t adjustToSegment(double progress, Segment const& segment) {
method setPixelColor (line 74) | void setPixelColor(uint16_t n, uint32_t c) {
method String (line 83) | String colorToHexString(uint32_t c) {
method hexStringToColor (line 89) | bool hexStringToColor(String const& s, uint32_t& c, uint32_t def) {
method secondsEffectSineFade (line 101) | void secondsEffectSineFade(int16_t secondLed, Toki::Time const& time) {
method qadd32 (line 109) | static inline uint32_t qadd32(uint32_t c1, uint32_t c2) {
method scale32 (line 118) | static inline uint32_t scale32(uint32_t c, fract8 scale) {
method dec (line 127) | static inline int16_t dec(int16_t n, int16_t i, Segment const& seg) {
method inc (line 133) | static inline int16_t inc(int16_t n, int16_t i, Segment const& seg) {
method AnalogClockUsermod (line 142) | AnalogClockUsermod() {
method setup (line 145) | void setup() override {
method loop (line 150) | void loop() override {
method handleOverlayDraw (line 156) | void handleOverlayDraw() override {
method addToConfig (line 201) | void addToConfig(JsonObject& root) override {
method readFromConfig (line 222) | bool readFromConfig(JsonObject& root) override {
method getId (line 251) | uint16_t getId() override {
FILE: usermods/Animated_Staircase/Animated_Staircase.cpp
class Animated_Staircase (line 12) | class Animated_Staircase : public Usermod {
method publishMqtt (line 95) | void publishMqtt(bool bottom, const char* state) {
method updateSegments (line 106) | void updateSegments() {
method ultrasoundRead (line 149) | bool ultrasoundRead(int8_t signalPin, int8_t echoPin, unsigned int max...
method checkSensors (line 159) | bool checkSensors() {
method autoPowerOff (line 223) | void autoPowerOff() {
method updateSwipe (line 237) | void updateSwipe() {
method writeSensorsToJson (line 262) | void writeSensorsToJson(JsonObject& staircase) {
method readSensorsFromJson (line 268) | void readSensorsFromJson(JsonObject& staircase) {
method enable (line 273) | void enable(bool enable) {
method setup (line 319) | void setup() {
method loop (line 345) | void loop() {
method getId (line 354) | uint16_t getId() { return USERMOD_ID_ANIMATED_STAIRCASE; }
method onMqttMessage (line 362) | bool onMqttMessage(char* topic, char* payload) {
method onMqttConnect (line 385) | void onMqttConnect(bool sessionPresent) {
method addToJsonState (line 396) | void addToJsonState(JsonObject& root) {
method readFromJsonState (line 409) | void readFromJsonState(JsonObject& root) {
method appendConfigData (line 426) | void appendConfigData() {
method addToConfig (line 437) | void addToConfig(JsonObject& root) {
method readFromConfig (line 462) | bool readFromConfig(JsonObject& root) {
method addToJsonInfo (line 530) | void addToJsonInfo(JsonObject& root) {
FILE: usermods/Artemis_reciever/usermod.cpp
function RGBNET_readValues (line 18) | void RGBNET_readValues() {
function RGBNET_show (line 40) | void RGBNET_show() {
function handleConfig (line 47) | void handleConfig(AsyncWebServerRequest *request)
function userSetup (line 73) | void userSetup()
function userConnected (line 80) | void userConnected()
function userLoop (line 87) | void userLoop()
FILE: usermods/BH1750_v2/BH1750_v2.cpp
function checkBoundSensor (line 11) | static bool checkBoundSensor(float newValue, float prevValue, float maxD...
FILE: usermods/BH1750_v2/BH1750_v2.h
function class (line 30) | class Usermod_BH1750 : public Usermod
FILE: usermods/BME280_v2/BME280_v2.cpp
class UsermodBME280 (line 13) | class UsermodBME280 : public Usermod
method UpdateBME280Data (line 68) | void UpdateBME280Data(int SensorType)
method _mqttInitialize (line 108) | void _mqttInitialize()
method _createMqttSensor (line 131) | void _createMqttSensor(const String &name, const String &topic, const ...
method publishMqtt (line 161) | void publishMqtt(const char *topic, const char* state) {
method initializeBmeComms (line 170) | void initializeBmeComms()
method setup (line 210) | void setup()
method loop (line 218) | void loop()
method onMqttConnect (line 290) | void onMqttConnect(bool sessionPresent)
method getTemperatureC (line 302) | inline float getTemperatureC() {
method getTemperatureF (line 310) | inline float getTemperatureF() {
method getHumidity (line 318) | inline float getHumidity() {
method getPressure (line 322) | inline float getPressure() {
method getDewPointC (line 326) | inline float getDewPointC() {
method getDewPointF (line 334) | inline float getDewPointF() {
method getHeatIndexC (line 342) | inline float getHeatIndexC() {
method getHeatIndexF (line 350) | inline float getHeatIndexF() {
method addToJsonInfo (line 359) | void addToJsonInfo(JsonObject &root)
method addToConfig (line 401) | void addToConfig(JsonObject& root)
method readFromConfig (line 418) | bool readFromConfig(JsonObject& root)
method getId (line 473) | uint16_t getId() {
FILE: usermods/BME68X_v2/BME68X_v2.cpp
class UsermodBME68X (line 43) | class UsermodBME68X : public Usermod {
type settings_t (line 90) | struct settings_t {
type decimals_t (line 107) | struct decimals_t {
type flags_t (line 123) | struct flags_t {
type timer_t (line 131) | struct timer_t {
type values_t (line 147) | struct values_t {
type cvalues_t (line 168) | struct cvalues_t {
FILE: usermods/Battery/Battery.cpp
class UsermodBattery (line 14) | class UsermodBattery : public Usermod
method dot2round (line 66) | float dot2round(float x)
method String (line 75) | String stringToLower(String str)
method turnOff (line 86) | void turnOff()
method lowPowerIndicator (line 95) | void lowPowerIndicator()
method readVoltage (line 118) | float readVoltage()
method addMqttSensor (line 130) | void addMqttSensor(const String &name, const String &type, const Strin...
method publishMqtt (line 168) | void publishMqtt(const char* topic, const char* state)
method setup (line 185) | void setup()
method connected (line 228) | void connected()
method loop (line 238) | void loop()
method addToJsonInfo (line 297) | void addToJsonInfo(JsonObject& root)
method addBatteryToJsonObject (line 338) | void addBatteryToJsonObject(JsonObject& battery, bool forJsonState)
method getUsermodConfigFromJsonObject (line 359) | void getUsermodConfigFromJsonObject(JsonObject& battery)
method addToJsonState (line 388) | void addToJsonState(JsonObject& root)
method addToConfig (line 456) | void addToConfig(JsonObject& root)
method appendConfigData (line 476) | void appendConfigData()
method readFromConfig (line 521) | bool readFromConfig(JsonObject& root)
method onMqttConnect (line 574) | void onMqttConnect(bool sessionPresent)
method getId (line 602) | uint16_t getId()
method batteryType (line 610) | batteryType getBatteryType()
method getReadingInterval (line 618) | unsigned long getReadingInterval()
method setReadingInterval (line 626) | void setReadingInterval(unsigned long newReadingInterval)
method getMinBatteryVoltage (line 634) | float getMinBatteryVoltage()
method setMinBatteryVoltage (line 643) | void setMinBatteryVoltage(float voltage)
method getMaxBatteryVoltage (line 651) | float getMaxBatteryVoltage()
method setMaxBatteryVoltage (line 660) | void setMaxBatteryVoltage(float voltage)
method getVoltage (line 670) | float getVoltage()
method getBatteryLevel (line 679) | int8_t getBatteryLevel()
method getCalibration (line 688) | float getCalibration()
method setCalibration (line 697) | void setCalibration(float offset)
method setVoltageMultiplier (line 706) | void setVoltageMultiplier(float multiplier)
method getVoltageMultiplier (line 715) | float getVoltageMultiplier()
method getAutoOffEnabled (line 724) | bool getAutoOffEnabled()
method setAutoOffEnabled (line 732) | void setAutoOffEnabled(bool enabled)
method getAutoOffThreshold (line 740) | int8_t getAutoOffThreshold()
method setAutoOffThreshold (line 748) | void setAutoOffThreshold(int8_t threshold)
method getLowPowerIndicatorEnabled (line 759) | bool getLowPowerIndicatorEnabled()
method setLowPowerIndicatorEnabled (line 767) | void setLowPowerIndicatorEnabled(bool enabled)
method getLowPowerIndicatorPreset (line 775) | int8_t getLowPowerIndicatorPreset()
method setLowPowerIndicatorPreset (line 783) | void setLowPowerIndicatorPreset(int8_t presetId)
method getLowPowerIndicatorThreshold (line 793) | int8_t getLowPowerIndicatorThreshold()
method setLowPowerIndicatorThreshold (line 801) | void setLowPowerIndicatorThreshold(int8_t threshold)
method getLowPowerIndicatorDuration (line 811) | int8_t getLowPowerIndicatorDuration()
method setLowPowerIndicatorDuration (line 819) | void setLowPowerIndicatorDuration(int8_t duration)
method getLowPowerIndicatorDone (line 827) | bool getLowPowerIndicatorDone()
method setHomeAssistantDiscovery (line 835) | void setHomeAssistantDiscovery(bool enable)
method getHomeAssistantDiscovery (line 843) | bool getHomeAssistantDiscovery()
FILE: usermods/Battery/UMBattery.h
function class (line 10) | class UMBattery
function virtual (line 34) | virtual void update(batteryConfig cfg)
function virtual (line 66) | virtual float getMinVoltage()
function virtual (line 75) | virtual void setMinVoltage(float voltage)
function virtual (line 83) | virtual float getMaxVoltage()
function virtual (line 92) | virtual void setMaxVoltage(float voltage)
function getVoltage (line 97) | float getVoltage()
function setVoltage (line 105) | void setVoltage(float voltage)
function getLevel (line 113) | float getLevel()
function setLevel (line 118) | void setLevel(float level)
function virtual (line 127) | virtual float getCalibration()
function virtual (line 136) | virtual void setCalibration(float offset)
function virtual (line 145) | virtual float getVoltageMultiplier()
function virtual (line 154) | virtual void setVoltageMultiplier(float multiplier)
FILE: usermods/Battery/battery_defaults.h
type batteryType (line 121) | typedef enum
type batteryConfig (line 129) | typedef struct bconfig_t
FILE: usermods/Battery/types/LionUMBattery.h
function class (line 11) | class LionUMBattery : public UMBattery
FILE: usermods/Battery/types/LipoUMBattery.h
function class (line 11) | class LipoUMBattery : public UMBattery
FILE: usermods/Battery/types/UnkownUMBattery.h
function class (line 11) | class UnkownUMBattery : public UMBattery
FILE: usermods/Cronixie/Cronixie.cpp
class UsermodCronixie (line 3) | class UsermodCronixie : public Usermod {
method initCronixie (line 14) | void initCronixie()
method setup (line 23) | void setup() {
method loop (line 27) | void loop() {
method byte (line 34) | byte getSameCodeLength(char code, int index, char const cronixieDispla...
method setCronixie (line 50) | void setCronixie()
method _overlayCronixie (line 172) | void _overlayCronixie()
method handleOverlayDraw (line 237) | void handleOverlayDraw()
method addToJsonState (line 263) | void addToJsonState(JsonObject& root)
method readFromJsonState (line 268) | void readFromJsonState(JsonObject& root)
method addToConfig (line 276) | void addToConfig(JsonObject& root)
method readFromConfig (line 282) | bool readFromConfig(JsonObject& root)
method getId (line 296) | uint16_t getId()
FILE: usermods/DHT/DHT.cpp
class UsermodDHT (line 60) | class UsermodDHT : public Usermod {
method setup (line 82) | void setup() {
method loop (line 94) | void loop() {
method addToJsonInfo (line 174) | void addToJsonInfo(JsonObject& root) {
method getId (line 240) | uint16_t getId()
FILE: usermods/EXAMPLE/usermod_v2_example.cpp
class MyExampleUsermod (line 22) | class MyExampleUsermod : public Usermod {
method enable (line 58) | inline void enable(bool enable) { enabled = enable; }
method isEnabled (line 63) | inline bool isEnabled() { return enabled; }
method setup (line 88) | void setup() override {
method connected (line 99) | void connected() override {
method loop (line 114) | void loop() override {
method addToJsonInfo (line 132) | void addToJsonInfo(JsonObject& root) override
method addToJsonState (line 157) | void addToJsonState(JsonObject& root) override
method readFromJsonState (line 172) | void readFromJsonState(JsonObject& root) override
method addToConfig (line 221) | void addToConfig(JsonObject& root) override
method readFromConfig (line 254) | bool readFromConfig(JsonObject& root) override
method appendConfigData (line 286) | void appendConfigData() override
method handleOverlayDraw (line 301) | void handleOverlayDraw() override
method handleButton (line 312) | bool handleButton(uint8_t b) override {
method onMqttMessage (line 335) | bool onMqttMessage(char* topic, char* payload) override {
method onMqttConnect (line 356) | void onMqttConnect(bool sessionPresent) override {
method onStateChange (line 367) | void onStateChange(uint8_t mode) override {
method getId (line 376) | uint16_t getId() override
FILE: usermods/EleksTube_IPS/ChipSelect.h
function class (line 10) | class ChipSelect {
function getDigitMap (line 48) | uint8_t getDigitMap() { return digits_map; }
function setSecondsOnes (line 55) | void setSecondsOnes() { setDigit(SECONDS_ONES); }
function setSecondsTens (line 56) | void setSecondsTens() { setDigit(SECONDS_TENS); }
function setMinutesOnes (line 57) | void setMinutesOnes() { setDigit(MINUTES_ONES); }
function setMinutesTens (line 58) | void setMinutesTens() { setDigit(MINUTES_TENS); }
function setHoursOnes (line 59) | void setHoursOnes() { setDigit(HOURS_ONES); }
function setHoursTens (line 60) | void setHoursTens() { setDigit(HOURS_TENS); }
function isSecondsOnes (line 61) | bool isSecondsOnes() { return ((digits_map & ...
function isSecondsTens (line 62) | bool isSecondsTens() { return ((digits_map & ...
function isMinutesOnes (line 63) | bool isMinutesOnes() { return ((digits_map & ...
function isMinutesTens (line 64) | bool isMinutesTens() { return ((digits_map & ...
function isHoursOnes (line 65) | bool isHoursOnes() { return ((digits_map & ...
function isHoursTens (line 66) | bool isHoursTens() { return ((digits_map & ...
FILE: usermods/EleksTube_IPS/EleksTube_IPS.cpp
class ElekstubeIPSUsermod (line 6) | class ElekstubeIPSUsermod : public Usermod {
method updateClockDisplay (line 16) | void updateClockDisplay(TFTs::show_t show=TFTs::yes) {
method setup (line 52) | void setup() {
method loop (line 61) | void loop() {
method addToConfig (line 88) | void addToConfig(JsonObject &root) {
method readFromConfig (line 101) | bool readFromConfig(JsonObject &root) {
method addToJsonState (line 125) | void addToJsonState(JsonObject& root)
method readFromJsonState (line 136) | void readFromJsonState(JsonObject& root)
method getId (line 148) | uint16_t getId()
FILE: usermods/EleksTube_IPS/TFTs.h
function class (line 11) | class TFTs : public TFT_eSPI {
FILE: usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp
function userSetup (line 32) | void userSetup() {
function userConnected (line 44) | void userConnected() {}
function userLoop (line 63) | void userLoop() {
FILE: usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp
function userSetup (line 53) | void userSetup() {
function userConnected (line 82) | void userConnected() {}
function userLoop (line 101) | void userLoop() {
function UpdateBME280Data (line 214) | void UpdateBME280Data() {
FILE: usermods/Fix_unreachable_netservices_v2/usermod_Fix_unreachable_netservices.cpp
class FixUnreachableNetServices (line 26) | class FixUnreachableNetServices : public Usermod
method setup (line 46) | void setup()
method connected (line 55) | void connected()
method loop (line 70) | void loop()
method addToJsonInfo (line 90) | void addToJsonInfo(JsonObject &root)
method addToJsonState (line 114) | void addToJsonState(JsonObject &root)
method readFromJsonState (line 123) | void readFromJsonState(JsonObject &root)
method addToConfig (line 135) | void addToConfig(JsonObject &root)
method readFromConfig (line 144) | bool readFromConfig(JsonObject &root)
method getId (line 158) | uint16_t getId()
FILE: usermods/INA226_v2/INA226_v2.cpp
type InaSettingLookup (line 14) | struct InaSettingLookup
function INA226_AVERAGES (line 33) | INA226_AVERAGES getAverageEnum(uint16_t &samples)
function INA226_CONV_TIME (line 49) | INA226_CONV_TIME getConversionTimeEnum(uint16_t &timeUs)
class UsermodINA226 (line 65) | class UsermodINA226 : public Usermod
method truncateDecimals (line 106) | float truncateDecimals(float val)
method initializeINA226 (line 111) | void initializeINA226()
method fetchAndPushValues (line 146) | void fetchAndPushValues()
method handleTriggeredMode (line 174) | void handleTriggeredMode(unsigned long currentTime)
method handleContinuousMode (line 202) | void handleContinuousMode(unsigned long currentTime)
method mqttInitialize (line 212) | void mqttInitialize()
method mqttPublishIfChanged (line 234) | void mqttPublishIfChanged(const __FlashStringHelper *topic, float &las...
method mqttPublishIfChanged (line 246) | void mqttPublishIfChanged(const __FlashStringHelper *topic, bool &last...
method mqttCreateHassSensor (line 258) | void mqttCreateHassSensor(const String &name, const String &topic, con...
method mqttCreateHassBinarySensor (line 288) | void mqttCreateHassBinarySensor(const String &name, const String &topic)
method UsermodINA226 (line 315) | UsermodINA226()
method setup (line 328) | void setup()
method loop (line 333) | void loop()
method onMqttConnect (line 351) | void onMqttConnect(bool sessionPresent)
method getId (line 357) | uint16_t getId()
method addToJsonInfo (line 362) | void addToJsonInfo(JsonObject &root) override
method addToConfig (line 440) | void addToConfig(JsonObject &root)
method readFromConfig (line 460) | bool readFromConfig(JsonObject &root) override
FILE: usermods/Internal_Temperature_v2/Internal_Temperature_v2.cpp
class InternalTemperatureUsermod (line 3) | class InternalTemperatureUsermod : public Usermod
method setup (line 29) | void setup()
method loop (line 33) | void loop()
method addToJsonInfo (line 114) | void addToJsonInfo(JsonObject &root)
method addToConfig (line 138) | void addToConfig(JsonObject &root)
method appendConfigData (line 148) | void appendConfigData()
method readFromConfig (line 158) | bool readFromConfig(JsonObject &root)
method getId (line 170) | uint16_t getId()
FILE: usermods/JSON_IR_remote/ir_json_maker.py
function shift_color (line 50) | def shift_color(col, shift=30, sat=1.0, val=1.0):
function parse_sheet (line 59) | def parse_sheet(ws):
FILE: usermods/LD2410_v2/LD2410_v2.cpp
class LD2410Usermod (line 8) | class LD2410Usermod : public Usermod {
method _mqttInitialize (line 44) | void _mqttInitialize()
method _createMqttSensor (line 55) | void _createMqttSensor(const String &name, const String &topic, const ...
method isEnabled (line 89) | inline bool isEnabled() { return enabled; }
method setup (line 91) | void setup() {
method loop (line 103) | void loop() {
method addToJsonInfo (line 136) | void addToJsonInfo(JsonObject& root)
method addToConfig (line 158) | void addToConfig(JsonObject& root)
method readFromConfig (line 168) | bool readFromConfig(JsonObject& root)
method onMqttConnect (line 195) | void onMqttConnect(bool sessionPresent) {
method getId (line 207) | uint16_t getId()
FILE: usermods/LDR_Dusk_Dawn_v2/LDR_Dusk_Dawn_v2.cpp
class LDR_Dusk_Dawn_v2 (line 8) | class LDR_Dusk_Dawn_v2 : public Usermod {
method setup (line 29) | void setup() {
method loop (line 38) | void loop() {
method addToConfig (line 89) | void addToConfig(JsonObject& root) {
method readFromConfig (line 99) | bool readFromConfig(JsonObject& root) {
method addToJsonInfo (line 118) | void addToJsonInfo(JsonObject& root) {
method getId (line 147) | uint16_t getId() {
FILE: usermods/MAX17048_v2/MAX17048_v2.cpp
class Usermod_MAX17048 (line 26) | class Usermod_MAX17048 : public Usermod {
method _mqttInitialize (line 60) | void _mqttInitialize()
method _createMqttSensor (line 74) | void _createMqttSensor(const String &name, const String &topic, const ...
method publishMqtt (line 104) | void publishMqtt(const char *topic, const char* state) {
method enable (line 117) | inline void enable(bool enable) { enabled = enable; }
method isEnabled (line 119) | inline bool isEnabled() { return enabled; }
method setup (line 121) | void setup() {
method loop (line 128) | void loop() {
method onMqttConnect (line 157) | void onMqttConnect(bool sessionPresent)
method getBatteryVoltageV (line 166) | inline float getBatteryVoltageV() {
method getBatteryPercent (line 170) | inline float getBatteryPercent() {
method addToJsonInfo (line 174) | void addToJsonInfo(JsonObject& root)
method addToJsonState (line 204) | void addToJsonState(JsonObject& root)
method readFromJsonState (line 214) | void readFromJsonState(JsonObject& root)
method addToConfig (line 226) | void addToConfig(JsonObject& root)
method readFromConfig (line 237) | bool readFromConfig(JsonObject& root)
method getId (line 266) | uint16_t getId()
FILE: usermods/MY9291/MY9291.cpp
class MY9291Usermod (line 14) | class MY9291Usermod : public Usermod {
method setup (line 20) | void setup() {
method connected (line 24) | void connected() {
method loop (line 27) | void loop() {
method getId (line 40) | uint16_t getId() {
FILE: usermods/MY9291/MY92xx.h
type my92xx_model_t (line 39) | typedef enum my92xx_model_t {
type my92xx_cmd_one_shot_t (line 44) | typedef enum my92xx_cmd_one_shot_t {
type my92xx_cmd_reaction_t (line 49) | typedef enum my92xx_cmd_reaction_t {
type my92xx_cmd_bit_width_t (line 54) | typedef enum my92xx_cmd_bit_width_t {
type my92xx_cmd_frequency_t (line 61) | typedef enum my92xx_cmd_frequency_t {
type my92xx_cmd_scatter_t (line 68) | typedef enum my92xx_cmd_scatter_t {
type my92xx_cmd_t (line 73) | typedef struct {
function class (line 91) | class my92xx {
function _di_pulse (line 136) | void my92xx::_di_pulse(unsigned int times) {
function _dcki_pulse (line 143) | void my92xx::_dcki_pulse(unsigned int times) {
function _write (line 150) | void my92xx::_write(unsigned int data, unsigned char bit_length) {
function _set_cmd (line 167) | void my92xx::_set_cmd(my92xx_cmd_t command) {
function _send (line 201) | void my92xx::_send() {
function getChannels (line 255) | unsigned char my92xx::getChannels() {
function setChannel (line 259) | void my92xx::setChannel(unsigned char channel, unsigned int value) {
function getChannel (line 265) | unsigned int my92xx::getChannel(unsigned char channel) {
function getState (line 272) | bool my92xx::getState() {
function setState (line 276) | void my92xx::setState(bool state) {
function update (line 280) | void my92xx::update() {
FILE: usermods/PIR_sensor_switch/PIR_sensor_switch.cpp
class PIRsensorSwitch (line 33) | class PIRsensorSwitch : public Usermod
method PIRsensorSwitch (line 37) | PIRsensorSwitch() {}
method EnablePIRsensor (line 42) | inline void EnablePIRsensor(bool en) { enabled = en; }
method PIRsensorEnabled (line 45) | inline bool PIRsensorEnabled() { return enabled; }
method getId (line 189) | uint16_t getId() override { return USERMOD_ID_PIRSWITCH; }
FILE: usermods/PS_Comet/PS_Comet.cpp
function mode_pscomet (line 14) | void mode_pscomet() {
class PSCometUsermod (line 113) | class PSCometUsermod : public Usermod {
method setup (line 115) | void setup() override {
method loop (line 119) | void loop() override {}
FILE: usermods/PWM_fan/PWM_fan.cpp
function rpm_fan (line 29) | static void IRAM_ATTR rpm_fan() {
class PWMFanUsermod (line 34) | class PWMFanUsermod : public Usermod {
method initTacho (line 81) | void initTacho(void) {
method deinitTacho (line 92) | void deinitTacho(void) {
method updateTacho (line 99) | void updateTacho(void) {
method initPWMfan (line 117) | void initPWMfan(void) {
method deinitPWMfan (line 140) | void deinitPWMfan(void) {
method updateFanSpeed (line 150) | void updateFanSpeed(uint8_t pwmValue){
method getActualTemperature (line 160) | float getActualTemperature(void) {
method setFanPWMbasedOnTemperature (line 168) | void setFanPWMbasedOnTemperature(void) {
method calculatePwmStep (line 178) | uint8_t calculatePwmStep(float diffTemp){
method setup (line 195) | void setup() override {
method connected (line 210) | void connected() override {}
method loop (line 215) | void loop() override {
method addToJsonInfo (line 230) | void addToJsonInfo(JsonObject& root) override {
method readFromJsonState (line 279) | void readFromJsonState(JsonObject& root) override {
method addToConfig (line 312) | void addToConfig(JsonObject& root) override {
method readFromConfig (line 335) | bool readFromConfig(JsonObject& root) override {
method getId (line 387) | uint16_t getId() override {
FILE: usermods/RTC/RTC.cpp
class RTCUsermod (line 6) | class RTCUsermod : public Usermod {
method setup (line 12) | void setup() {
method loop (line 24) | void loop() {
method getId (line 45) | uint16_t getId()
FILE: usermods/RelayBlinds/usermod.cpp
function userSetup (line 6) | void userSetup()
function userConnected (line 12) | void userConnected()
function handleRelay (line 26) | void handleRelay()
function userLoop (line 80) | void userLoop()
FILE: usermods/SN_Photoresistor/SN_Photoresistor.cpp
function checkBoundSensor (line 9) | static bool checkBoundSensor(float newValue, float prevValue, float maxD...
FILE: usermods/SN_Photoresistor/SN_Photoresistor.h
function class (line 34) | class Usermod_SN_Photoresistor : public Usermod
FILE: usermods/ST7789_display/ST7789_display.cpp
class St7789DisplayUsermod (line 49) | class St7789DisplayUsermod : public Usermod {
method center (line 73) | void center(String &line, uint8_t width) {
method showTime (line 84) | void showTime() {
method setup (line 136) | void setup() override
method connected (line 166) | void connected() override {
method loop (line 180) | void loop() override {
method addToJsonInfo (line 320) | void addToJsonInfo(JsonObject& root) override
method addToJsonState (line 334) | void addToJsonState(JsonObject& root) override
method readFromJsonState (line 344) | void readFromJsonState(JsonObject& root) override
method addToConfig (line 365) | void addToConfig(JsonObject& root) override
method appendConfigData (line 377) | void appendConfigData() override {
method readFromConfig (line 392) | bool readFromConfig(JsonObject& root) override
method getId (line 404) | uint16_t getId() override
FILE: usermods/Si7021_MQTT_HA/Si7021_MQTT_HA.cpp
class Si7021_MQTT_HA (line 14) | class Si7021_MQTT_HA : public Usermod
method _initializeSensor (line 40) | void _initializeSensor()
method _initializeMqtt (line 46) | void _initializeMqtt()
method _publishHAMqttSensor (line 71) | void _publishHAMqttSensor(
method _updateSensorData (line 106) | void _updateSensorData()
method _publishSensorData (line 133) | void _publishSensorData()
method addToConfig (line 147) | void addToConfig(JsonObject& root)
method readFromConfig (line 156) | bool readFromConfig(JsonObject& root)
method onMqttConnect (line 168) | void onMqttConnect(bool sessionPresent) {
method setup (line 173) | void setup()
method connected (line 183) | void connected()
method loop (line 188) | void loop()
method getId (line 219) | uint16_t getId()
FILE: usermods/TTGO-T-Display/usermod.cpp
function userSetup (line 49) | void userSetup() {
function userConnected (line 72) | void userConnected() {}
function userLoop (line 92) | void userLoop() {
FILE: usermods/Temperature/Temperature.cpp
function mode_temperature (line 372) | static void mode_temperature() {
FILE: usermods/Temperature/UsermodTemperature.h
function class (line 19) | class UsermodTemperature : public Usermod {
FILE: usermods/TetrisAI_v2/TetrisAI_v2.cpp
type TetrisAI_data (line 10) | struct TetrisAI_data
function drawGrid (line 30) | void drawGrid(TetrisAIGame* tetris, TetrisAI_data* tetrisai_data)
function mode_2DTetrisAI (line 115) | void mode_2DTetrisAI()
class TetrisAIUsermod (line 257) | class TetrisAIUsermod : public Usermod
method setup (line 264) | void setup()
method addToConfig (line 269) | void addToConfig(JsonObject& root) override
method readFromConfig (line 275) | bool readFromConfig(JsonObject& root) override
method loop (line 283) | void loop()
method getId (line 288) | uint16_t getId()
FILE: usermods/TetrisAI_v2/gridbw.h
function class (line 21) | class GridBW
function placePiece (line 47) | void placePiece(Piece* piece, uint8_t x, uint8_t y)
function erasePiece (line 55) | void erasePiece(Piece* piece, uint8_t x, uint8_t y)
function noCollision (line 63) | bool noCollision(Piece* piece, uint8_t x, uint8_t y)
function findLandingPosition (line 81) | void findLandingPosition(Piece* piece)
function hasClearingRows (line 94) | bool hasClearingRows()
function cleanupFullLines (line 106) | void cleanupFullLines()
function isLineFull (line 143) | bool isLineFull(uint8_t y)
function isLineReadyForRemoval (line 148) | bool isLineReadyForRemoval(uint8_t y)
function reset (line 153) | void reset()
FILE: usermods/TetrisAI_v2/gridcolor.h
function class (line 23) | class GridColor
function placePiece (line 51) | void placePiece(Piece* piece, uint8_t x, uint8_t y)
function erasePiece (line 65) | void erasePiece(Piece* piece, uint8_t x, uint8_t y)
function cleanupFullLines (line 79) | void cleanupFullLines()
function sync (line 115) | void sync()
function reset (line 131) | void reset()
FILE: usermods/TetrisAI_v2/pieces.h
type PieceRotation (line 25) | struct PieceRotation
type PieceData (line 32) | struct PieceData
function class (line 110) | class Piece
function reset (line 129) | void reset()
function getGridRow (line 137) | uint32_t getGridRow(uint8_t x, uint8_t y, uint8_t width)
function getRow (line 154) | uint8_t getRow(uint8_t y)
function getPixel (line 163) | bool getPixel(uint8_t x, uint8_t y)
function PieceRotation (line 177) | PieceRotation getRotation()
FILE: usermods/TetrisAI_v2/rating.h
function class (line 25) | class Rating
function reset (line 46) | void reset()
FILE: usermods/TetrisAI_v2/tetrisai.h
function class (line 21) | class TetrisAI
function findBestMove (line 127) | void findBestMove(GridBW grid, std::vector<Piece> *pieces)
function findBestMove (line 132) | void findBestMove(GridBW grid, std::vector<Piece>::iterator start, std::...
function findBestMove (line 138) | void findBestMove(GridBW grid, std::vector<Piece>::iterator start, std::...
FILE: usermods/TetrisAI_v2/tetrisaigame.h
function class (line 26) | class TetrisAIGame
function findBestMove (line 83) | void findBestMove()
function animateFall (line 88) | bool animateFall(bool skip)
function isGameOver (line 93) | bool isGameOver()
function poll (line 99) | void poll()
function reset (line 145) | void reset()
FILE: usermods/TetrisAI_v2/tetrisbag.h
function class (line 21) | class TetrisBag
function init (line 42) | void init()
function shuffleBag (line 59) | void shuffleBag()
function Piece (line 75) | Piece getNextPiece()
function queuePiece (line 86) | void queuePiece()
function reset (line 95) | void reset()
FILE: usermods/VL53L0X_gestures/VL53L0X_gestures.cpp
class UsermodVL53L0XGestures (line 37) | class UsermodVL53L0XGestures : public Usermod {
method setup (line 50) | void setup() {
method loop (line 63) | void loop() {
method getId (line 123) | uint16_t getId()
FILE: usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp
function Dallas (line 7) | int16_t Dallas(int x, byte start)
function userSetup (line 63) | void userSetup() {
function userConnected (line 77) | void userConnected() {}
function userLoop (line 96) | void userLoop() {
FILE: usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp
function userSetup (line 49) | void userSetup() {
function userConnected (line 78) | void userConnected() {}
function userLoop (line 97) | void userLoop() {
function UpdateBME280Data (line 212) | void UpdateBME280Data() {
FILE: usermods/audioreactive/audio_reactive.cpp
function fftAddAvg (line 207) | static float fftAddAvg(int from, int to) {
function FFTcode (line 218) | void FFTcode(void * parameter)
function CRGB (line 2003) | CRGB AudioReactive::getCRGBForBand(int x, int pal) {
FILE: usermods/audioreactive/audio_source.h
function class (line 113) | class AudioSource {
function class (line 167) | class I2SSource : public AudioSource {
function virtual (line 305) | virtual void deinitialize() {
function virtual (line 319) | virtual void getSamples(float *buffer, uint16_t num_samples) {
function class (line 386) | class ES7243 : public I2SSource {
function initialize (line 417) | void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_...
function deinitialize (line 429) | void deinitialize() {
function class (line 438) | class ES8388Source : public I2SSource {
function initialize (line 533) | void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_...
function deinitialize (line 545) | void deinitialize() {
function class (line 565) | class I2SAdcSource : public I2SSource {
function AudioSourceType (line 589) | AudioSourceType getType(void) {return(Type_I2SAdc);}
function I2S_datatype (line 650) | I2S_datatype postProcessSample(I2S_datatype sample_in) {
function getSamples (line 692) | void getSamples(float *buffer, uint16_t num_samples) {
function deinitialize (line 721) | void deinitialize() {
function class (line 757) | class SPH0654 : public I2SSource {
FILE: usermods/boblight/boblight.cpp
class BobLightUsermod (line 13) | class BobLightUsermod : public Usermod {
type _LIGHT (line 14) | struct _LIGHT {
method fillBobLights (line 58) | void fillBobLights(int bottom, int left, int top, int right, float pct...
method BobSync (line 182) | void BobSync() { yield(); }
method BobClear (line 183) | void BobClear() { for (size_t i=0; i<numLights; i++) setRealtimePixel(...
method setup (line 188) | void setup() override {
method connected (line 203) | void connected() override {
method loop (line 210) | void loop() override {
method enable (line 218) | void enable(bool en) { enabled = en; }
method onMqttMessage (line 226) | bool onMqttMessage(char* topic, char* payload) override {
method onMqttConnect (line 243) | void onMqttConnect(bool sessionPresent) override {
method addToJsonInfo (line 253) | void addToJsonInfo(JsonObject& root) override
method addToJsonState (line 274) | void addToJsonState(JsonObject& root) override
method readFromJsonState (line 282) | void readFromJsonState(JsonObject& root) override {
method appendConfigData (line 305) | void appendConfigData() override {
method addToConfig (line 316) | void addToConfig(JsonObject& root) override {
method readFromConfig (line 327) | bool readFromConfig(JsonObject& root) override {
method handleOverlayDraw (line 356) | void handleOverlayDraw() override {
method getId (line 360) | uint16_t getId() override { return USERMOD_ID_BOBLIGHT; }
FILE: usermods/buzzer/buzzer.cpp
class BuzzerUsermod (line 21) | class BuzzerUsermod : public Usermod {
method setup (line 31) | void setup() {
method connected (line 46) | void connected() {
method loop (line 58) | void loop() {
method getId (line 76) | uint16_t getId()
FILE: usermods/deep_sleep/deep_sleep.cpp
class DeepSleepUsermod (line 32) | class DeepSleepUsermod : public Usermod {
method pin_is_valid (line 52) | bool pin_is_valid(uint8_t wakePin) {
method calculateTimeDifference (line 73) | int calculateTimeDifference(int hour1, int minute1, int hour2, int min...
method findNextTimerInterval (line 82) | int findNextTimerInterval() {
method enable (line 122) | inline void enable(bool enable) { enabled = enable; }
method isEnabled (line 123) | inline bool isEnabled() { return enabled; }
method setup (line 126) | void setup() {
method loop (line 137) | void loop() {
method addToConfig (line 247) | void addToConfig(JsonObject& root) override
method readFromConfig (line 264) | bool readFromConfig(JsonObject& root) override
method appendConfigData (line 295) | void appendConfigData() override
method getId (line 336) | uint16_t getId() {
FILE: usermods/mpu6050_imu/mpu6050_imu.cpp
function dmpDataReady (line 68) | void IRAM_ATTR dmpDataReady() {
class MPU6050Driver (line 74) | class MPU6050Driver : public Usermod {
type config_t (line 81) | struct config_t {
method initDone (line 124) | inline bool initDone() { return um_data.u_size != 0; }
method setup (line 130) | void setup() {
method connected (line 236) | void connected() {
method loop (line 244) | void loop() {
method addToJsonInfo (line 295) | void addToJsonInfo(JsonObject& root)
method addToConfig (line 348) | void addToConfig(JsonObject& root)
method readFromConfig (line 378) | bool readFromConfig(JsonObject& root)
method getUMData (line 420) | bool getUMData(um_data_t **data)
method getId (line 430) | uint16_t getId()
FILE: usermods/mpu6050_imu/usermod_gyro_surge.h
function A0_temp (line 13) | constexpr size_t A0_temp {A0}; }
function A1_temp (line 19) | constexpr size_t A1_temp {A1}; }
function B0_temp (line 25) | constexpr size_t B0_temp {B0}; }
function B1_temp (line 31) | constexpr size_t B1_temp {B1}; }
function D0_temp (line 37) | constexpr size_t D0_temp {D0}; }
function D1_temp (line 43) | constexpr size_t D1_temp {D1}; }
function D2_temp (line 49) | constexpr size_t D2_temp {D2}; }
function D3_temp (line 55) | constexpr size_t D3_temp {D3}; }
function D3 (line 57) | static constexpr size_t D3 {D3_temp};
function addToConfig (line 123) | void addToConfig(JsonObject& root)
function readFromConfig (line 148) | bool readFromConfig(JsonObject& root)
function loop (line 163) | void loop() {
FILE: usermods/multi_relay/multi_relay.cpp
type relay_t (line 64) | struct relay_t {
class MultiRelay (line 77) | class MultiRelay : public Usermod {
method enable (line 136) | inline void enable(bool enable) { enabled = enable; }
method isEnabled (line 141) | inline bool isEnabled() { return enabled; }
method getId (line 147) | inline uint16_t getId() override { return USERMOD_ID_MULTI_RELAY; }
method toggleRelay (line 157) | inline void toggleRelay(uint8_t relay) {
method connected (line 171) | inline void connected() override { InitHtmlAPIHandle(); }
function byte (line 340) | byte MultiRelay::IOexpanderWrite(byte address, byte _data ) {
function byte (line 347) | byte MultiRelay::IOexpanderRead(int address) {
FILE: usermods/photoresistor_sensor_mqtt_v1/usermod.cpp
function userSetup (line 27) | void userSetup()
function userConnected (line 33) | void userConnected()
function publishMqtt (line 38) | void publishMqtt(float state)
function userLoop (line 50) | void userLoop()
FILE: usermods/pixels_dice_tray/dice_state.h
type DiceUpdate (line 23) | struct DiceUpdate {
type DiceSettings (line 35) | struct DiceSettings {
function pixels (line 53) | static pixels::RollEvent GetLastRoll() {
FILE: usermods/pixels_dice_tray/generate_roll_info.py
class Size (line 46) | class Size:
method __init__ (line 47) | def __init__(self, w, h):
function short_range (line 62) | def short_range() -> int:
function main (line 123) | def main():
FILE: usermods/pixels_dice_tray/led_effects.h
function pixels (line 28) | static pixels::RollEvent GetLastRollForSegment() {
function simple_roll (line 68) | static void simple_roll() {
function pulse_roll (line 93) | static void pulse_roll() {
function check_roll (line 109) | static void check_roll() {
FILE: usermods/pixels_dice_tray/mqtt_client/mqtt_logger.py
function on_connect (line 16) | def on_connect(client, userdata, connect_flags, reason_code, properties):
function on_message (line 22) | def on_message(client, userdata, msg):
function main (line 44) | def main():
FILE: usermods/pixels_dice_tray/mqtt_client/mqtt_plotter.py
function main (line 13) | def main():
FILE: usermods/pixels_dice_tray/pixels_dice_tray.cpp
class PixelsDiceTrayUsermod (line 40) | class PixelsDiceTrayUsermod : public Usermod {
method center (line 55) | static void center(String& line, uint8_t width) {
method SetSPIPinsFromMacros (line 66) | static void SetSPIPinsFromMacros() {
method UpdateDieNames (line 77) | void UpdateDieNames(
method menu_ctrl (line 96) | menu_ctrl(&dice_settings)
method setup (line 107) | void setup() override {
method connected (line 155) | void connected() override {
method loop (line 171) | void loop() override {
method addToJsonInfo (line 314) | void addToJsonInfo(JsonObject& root) override {
method addToJsonState (line 328) | void addToJsonState(JsonObject& root) override {
method readFromJsonState (line 337) | void readFromJsonState(JsonObject& root) override {
method addToConfig (line 360) | void addToConfig(JsonObject& root) override {
method appendConfigData (line 375) | void appendConfigData() override {
method readFromConfig (line 419) | bool readFromConfig(JsonObject& root) override {
method handleButton (line 462) | bool handleButton(uint8_t b) override {
method getId (line 528) | uint16_t getId() { return USERMOD_ID_PIXELS_DICE_TRAY; }
FILE: usermods/pixels_dice_tray/roll_info.h
function PrintRoll0 (line 11) | static void PrintRoll0() {
function PrintRoll1 (line 25) | static void PrintRoll1() {
function PrintRoll2 (line 34) | static void PrintRoll2() {
function PrintRoll3 (line 38) | static void PrintRoll3() {
function PrintRoll4 (line 44) | static void PrintRoll4() {
function PrintRoll5 (line 51) | static void PrintRoll5() {
function PrintRollInfo (line 78) | static void PrintRollInfo(uint8_t key) {
FILE: usermods/pixels_dice_tray/tft_menu.h
function PrintLnInBox (line 36) | static void PrintLnInBox(const char* txt, uint32_t color) {
function SetDefaultColors (line 51) | void SetDefaultColors(uint8_t mode) {
function class (line 77) | class RollCountWidget {
function AddRoll (line 109) | void AddRoll(unsigned val) {
function Draw (line 118) | void Draw() {
type class (line 137) | enum class
function class (line 140) | class MenuBase {
function Update (line 286) | void Update(const DiceUpdate& dice_update) override {}
function Draw (line 288) | void Draw(const DiceUpdate& dice_update, bool force_redraw) override {
function HandleButton (line 323) | void HandleButton(ButtonType type, uint8_t b) override {
function class (line 366) | class InfoMenu : public MenuBase {
function Init (line 417) | void Init(unsigned rotation) {
function EnableBacklight (line 431) | static void EnableBacklight(bool enable) {
function HandleButton (line 444) | void HandleButton(ButtonType type, uint8_t b) {
FILE: usermods/pov_display/bmpimage.cpp
function read16 (line 6) | uint16_t read16(File &f) {
function read32 (line 12) | uint32_t read32(File &f) {
function byte (line 123) | byte* BMPimage::line(uint16_t n){
FILE: usermods/pov_display/bmpimage.h
function class (line 24) | class BMPimage {
FILE: usermods/pov_display/pov.h
function class (line 6) | class POV {
FILE: usermods/pov_display/pov_display.cpp
function mode_pov_image (line 8) | void mode_pov_image(void) {
class PovDisplayUsermod (line 41) | class PovDisplayUsermod : public Usermod {
method PovDisplayUsermod (line 49) | PovDisplayUsermod(const char *name, bool enabled)
method setup (line 52) | void setup() override {
method loop (line 58) | void loop() override {
method getId (line 69) | uint16_t getId() override {
FILE: usermods/pwm_outputs/pwm_outputs.cpp
class PwmOutput (line 12) | class PwmOutput {
method open (line 15) | void open(int8_t pin, uint32_t freq) {
method close (line 47) | void close() {
method setDuty (line 59) | void setDuty(const float duty) {
method setDuty (line 68) | void setDuty(const uint16_t duty) {
method isEnabled (line 72) | bool isEnabled() const {
method addToJsonState (line 76) | void addToJsonState(JsonObject& pwmState) const {
method readFromJsonState (line 80) | void readFromJsonState(JsonObject& pwmState) {
method addToJsonInfo (line 90) | void addToJsonInfo(JsonObject& user) const {
method addToConfig (line 100) | void addToConfig(JsonObject& pwmConfig) const {
method readFromConfig (line 105) | bool readFromConfig(JsonObject& pwmConfig) {
class PwmOutputsUsermod (line 130) | class PwmOutputsUsermod : public Usermod {
method setup (line 136) | void setup() {
method loop (line 140) | void loop() {
method addToJsonState (line 143) | void addToJsonState(JsonObject& root) {
method readFromJsonState (line 156) | void readFromJsonState(JsonObject& root) {
method addToJsonInfo (line 172) | void addToJsonInfo(JsonObject& root) {
method addToConfig (line 183) | void addToConfig(JsonObject& root) {
method readFromConfig (line 194) | bool readFromConfig(JsonObject& root) {
method getId (line 210) | uint16_t getId() {
FILE: usermods/quinled-an-penta/quinled-an-penta.cpp
class QuinLEDAnPentaUsermod (line 6) | class QuinLEDAnPentaUsermod : public Usermod
method isAnPentaLedPin (line 72) | bool isAnPentaLedPin(int8_t pin)
method getCurrentUsedLedPins (line 82) | void getCurrentUsedLedPins()
method getCurrentLedcValues (line 103) | void getCurrentLedcValues()
method initOledDisplay (line 127) | void initOledDisplay()
method cleanupOledDisplay (line 159) | void cleanupOledDisplay()
method isOledReady (line 177) | bool isOledReady()
method initSht30TempHumiditySensor (line 182) | void initSht30TempHumiditySensor()
method cleanupSht30TempHumiditySensor (line 207) | void cleanupSht30TempHumiditySensor()
method cleanup (line 222) | void cleanup()
method oledCheckForNetworkChanges (line 235) | bool oledCheckForNetworkChanges()
method byte (line 263) | byte oledGetNextPage()
method oledShowPage (line 268) | void oledShowPage(byte page, bool updateLastTimePageChange = false)
method updateOledDisplay (line 281) | void updateOledDisplay()
method isShtReady (line 436) | bool isShtReady()
method getPercentageForBrightness (line 455) | static int8_t getPercentageForBrightness(byte brightness)
method setup (line 465) | void setup()
method loop (line 496) | void loop()
method addToConfig (line 576) | void addToConfig(JsonObject &root)
method readFromConfig (line 597) | bool readFromConfig(JsonObject &root)
method addToJsonInfo (line 648) | void addToJsonInfo(JsonObject& root)
method getId (line 686) | uint16_t getId()
FILE: usermods/rgb-rotary-encoder/rgb-rotary-encoder.cpp
class RgbRotaryEncoderUsermod (line 5) | class RgbRotaryEncoderUsermod : public Usermod
method initRotaryEncoder (line 38) | void initRotaryEncoder()
method initLedBus (line 55) | void initLedBus()
method updateLeds (line 73) | void updateLeds()
method cleanup (line 109) | void cleanup()
method getPositionForBrightness (line 127) | int getPositionForBrightness()
method fract (line 132) | float fract(float x) { return x - int(x); }
method mix (line 134) | float mix(float a, float b, float t) { return a + (b - a) * t; }
method hsv2rgb (line 136) | void hsv2rgb(float h, float s, float v) {
method cbRotate (line 157) | static void cbRotate(ESPRotary& r) {
method setup (line 174) | void setup()
method loop (line 199) | void loop()
method addToConfig (line 231) | void addToConfig(JsonObject &root)
method readFromConfig (line 250) | bool readFromConfig(JsonObject &root)
method getId (line 326) | uint16_t getId()
FILE: usermods/sd_card/sd_card.cpp
class UsermodSdCard (line 23) | class UsermodSdCard : public Usermod {
method init_SD_SPI (line 34) | void init_SD_SPI()
method deinit_SD_SPI (line 69) | void deinit_SD_SPI()
method reinit_SD_SPI (line 85) | void reinit_SD_SPI()
method init_SD_MMC (line 93) | void init_SD_MMC() {
method setup (line 113) | void setup() {
method loop (line 126) | void loop(){
method getId (line 130) | uint16_t getId()
method addToConfig (line 135) | void addToConfig(JsonObject& root)
method readFromConfig (line 147) | bool readFromConfig(JsonObject &root)
function file_onSD (line 195) | bool file_onSD(const char *filepath)
function listDir (line 214) | void listDir( const char * dirname, uint8_t levels){
FILE: usermods/sensors_to_mqtt/sensors_to_mqtt.cpp
class UserMod_SensorsToMQTT (line 16) | class UserMod_SensorsToMQTT : public Usermod
method _initialize (line 35) | void _initialize()
method _mqttInitialize (line 50) | void _mqttInitialize()
method _createMqttSensor (line 69) | void _createMqttSensor(const String &name, const String &topic, const ...
method _updateSensorData (line 99) | void _updateSensorData()
method setup (line 221) | void setup()
method connected (line 229) | void connected()
method loop (line 234) | void loop()
FILE: usermods/seven_segment_display/seven_segment_display.cpp
class SevenSegmentDisplay (line 7) | class SevenSegmentDisplay : public Usermod
method _overlaySevenSegmentProcess (line 65) | unsigned long _overlaySevenSegmentProcess()
method _overlaySevenSegmentDraw (line 146) | void _overlaySevenSegmentDraw()
method _overlaySevenSegmentLEDOutput (line 182) | void _overlaySevenSegmentLEDOutput(char mask, int indexLED)
method _overlaySevenSegmentGetCharMask (line 197) | char _overlaySevenSegmentGetCharMask(char var)
method _overlaySevenSegmentSwapBits (line 251) | char _overlaySevenSegmentSwapBits(char x, char p1, char p2, char n)
method _publishMQTTint_P (line 272) | void _publishMQTTint_P(const char *subTopic, int value)
method _publishMQTTstr_P (line 283) | void _publishMQTTstr_P(const char *subTopic, String Value)
method _updateMQTT (line 291) | void _updateMQTT()
method _cmpIntSetting_P (line 304) | bool _cmpIntSetting_P(char *topic, char *payload, const char *setting,...
method _handleSetting (line 315) | bool _handleSetting(char *topic, char *payload)
method setSevenSegmentMessage (line 345) | void setSevenSegmentMessage(String message)
method setup (line 372) | void setup()
method loop (line 380) | void loop()
method handleOverlayDraw (line 392) | void handleOverlayDraw()
method onMqttConnect (line 397) | void onMqttConnect(bool sessionPresent)
method onMqttMessage (line 416) | bool onMqttMessage(char *topic, char *payload)
method addToConfig (line 439) | void addToConfig(JsonObject &root)
method readFromConfig (line 456) | bool readFromConfig(JsonObject &root)
method getId (line 485) | uint16_t getId()
FILE: usermods/seven_segment_display_reloaded/seven_segment_display_reloaded.cpp
class UsermodSSDR (line 13) | class UsermodSSDR : public Usermod {
method _overlaySevenSegmentDraw (line 110) | void _overlaySevenSegmentDraw() {
method _setColons (line 164) | void _setColons() {
method _showElements (line 174) | void _showElements(String *map, int timevar, bool isColon, bool remove...
method _setLeds (line 247) | void _setLeds(int lednr, int lastSeenLedNr, bool range, int countSegme...
method _setMaskToLeds (line 263) | void _setMaskToLeds() {
method _setAllFalse (line 271) | void _setAllFalse() {
method _checkForNumber (line 277) | int _checkForNumber(int count, int index, String *map) {
method _publishMQTTint_P (line 282) | void _publishMQTTint_P(const char *subTopic, int value)
method _publishMQTTstr_P (line 293) | void _publishMQTTstr_P(const char *subTopic, String Value)
method _cmpIntSetting_P (line 301) | bool _cmpIntSetting_P(char *topic, char *payload, const char *setting,...
method _handleSetting (line 312) | bool _handleSetting(char *topic, char *payload) {
method _updateMQTT (line 336) | void _updateMQTT()
method _addJSONObject (line 357) | void _addJSONObject(JsonObject& root) {
method setup (line 387) | void setup() {
method loop (line 408) | void loop() {
method handleOverlayDraw (line 441) | void handleOverlayDraw() {
method addToJsonInfo (line 452) | void addToJsonInfo(JsonObject& root) {
method addToJsonState (line 474) | void addToJsonState(JsonObject& root) {
method readFromJsonState (line 486) | void readFromJsonState(JsonObject& root) {
method onMqttConnect (line 499) | void onMqttConnect(bool sessionPresent) {
method onMqttMessage (line 517) | bool onMqttMessage(char *topic, char *payload) {
method addToConfig (line 540) | void addToConfig(JsonObject &root) {
method readFromConfig (line 544) | bool readFromConfig(JsonObject &root) {
method getId (line 579) | uint16_t getId() {
FILE: usermods/sht/ShtUsermod.h
function class (line 15) | class ShtUsermod : public Usermod
FILE: usermods/smartnest/smartnest.cpp
class Smartnest (line 7) | class Smartnest : public Usermod
method sendToBroker (line 14) | void sendToBroker(const char *const topic, const char *const message)
method turnOff (line 25) | void turnOff()
method turnOn (line 33) | void turnOn()
method setBrightness (line 41) | void setBrightness(int value)
method setColor (line 48) | void setColor(int r, int g, int b)
method splitColor (line 57) | int splitColor(const char *const color, int * const rgb)
method onMqttMessage (line 91) | bool onMqttMessage(char *topic, char *message)
method onMqttConnect (line 146) | void onMqttConnect(bool sessionPresent)
method getId (line 169) | uint16_t getId()
method setup (line 177) | void setup() {
method loop (line 187) | void loop() {
FILE: usermods/stairway_wipe_basic/stairway_wipe_basic.cpp
class StairwayWipeUsermod (line 14) | class StairwayWipeUsermod : public Usermod {
method setup (line 26) | void setup() {
method loop (line 28) | void loop() {
method readFromJsonState (line 81) | void readFromJsonState(JsonObject& root)
method getId (line 87) | uint16_t getId()
method startWipe (line 93) | void startWipe()
method turnOff (line 109) | void turnOff()
FILE: usermods/udp_name_sync/udp_name_sync.cpp
class UdpNameSync (line 3) | class UdpNameSync : public Usermod {
method enable (line 17) | inline void enable(bool value) { enabled = value; }
method isEnabled (line 22) | inline bool isEnabled() const { return enabled; }
method setup (line 24) | void setup() override {
method loop (line 29) | void loop() override {
method onUdpPacket (line 66) | bool onUdpPacket(uint8_t * payload, size_t len) override {
FILE: usermods/user_fx/user_fx.cpp
function mode_static (line 11) | static void mode_static(void) {
function mode_diffusionfire (line 26) | static void mode_diffusionfire(void) {
function mode_spinning_wheel (line 118) | static void mode_spinning_wheel(void) {
type LavaParticle (line 359) | struct LavaParticle {
function mode_2D_lavalamp (line 371) | static void mode_2D_lavalamp(void) {
function drawMagma (line 645) | static void drawMagma(const uint16_t width, const uint16_t height, float...
function drawLavaBombs (line 667) | static void drawLavaBombs(const uint16_t width, const uint16_t height, f...
function mode_2D_magma (line 727) | static void mode_2D_magma(void) {
type Ant (line 836) | struct Ant {
function getFoodColor (line 851) | static uint32_t getFoodColor(uint32_t antColor, uint32_t backgroundColor) {
function handleBoundary (line 858) | static void handleBoundary(Ant& ant, float& position, bool gatherFood, b...
function getAntColor (line 875) | static uint32_t getAntColor(int antIndex, int numAnts, bool usePalette) {
function renderAntPixel (line 883) | static void renderAntPixel(int pixelIndex, int pixelOffset, int antSize,...
function mode_ants (line 893) | static void mode_ants(void) {
function build_morsecode_pattern (line 1036) | static void build_morsecode_pattern(const char *morse_code, uint8_t *pat...
function mode_morsecode (line 1083) | static void mode_morsecode(void) {
class UserFxUsermod (line 1267) | class UserFxUsermod : public Usermod {
method setup (line 1270) | void setup() override {
method loop (line 1307) | void loop() override {}
method getId (line 1308) | uint16_t getId() override { return USERMOD_ID_USER_FX; }
FILE: usermods/usermod_rotary_brightness_color/usermod_rotary_brightness_color.cpp
class RotaryEncoderBrightnessColor (line 5) | class RotaryEncoderBrightnessColor : public Usermod
method setup (line 35) | void setup()
method loop (line 55) | void loop()
method addToConfig (line 147) | void addToConfig(JsonObject& root)
method readFromConfig (line 169) | bool readFromConfig(JsonObject& root)
FILE: usermods/usermod_v2_HttpPullLightControl/usermod_v2_HttpPullLightControl.cpp
function String (line 49) | String HttpPullLightControl::generateUniqueId() {
FILE: usermods/usermod_v2_HttpPullLightControl/usermod_v2_HttpPullLightControl.h
function class (line 33) | class HttpPullLightControl : public Usermod {
FILE: usermods/usermod_v2_RF433/usermod_v2_RF433.cpp
class RF433Usermod (line 7) | class RF433Usermod : public Usermod
method setup (line 25) | void setup()
method connected (line 39) | void connected()
method loop (line 43) | void loop()
method addToJsonInfo (line 69) | void addToJsonInfo(JsonObject &root)
method addToConfig (line 81) | void addToConfig(JsonObject &root)
method readFromConfig (line 91) | bool readFromConfig(JsonObject &root)
method getId (line 116) | uint16_t getId()
method remoteJson433 (line 122) | bool remoteJson433(int button)
FILE: usermods/usermod_v2_animartrix/usermod_v2_animartrix.cpp
class ANIMartRIXMod (line 62) | class ANIMartRIXMod:public ANIMartRIX {
method initEffect (line 64) | void initEffect() {
method setPixelColor (line 77) | void setPixelColor(int x, int y, rgb pixel) {
method setPixelColor (line 80) | void setPixelColor(int index, rgb pixel) {
function mode_Module_Experiment10 (line 88) | void mode_Module_Experiment10() {
function mode_Module_Experiment9 (line 92) | void mode_Module_Experiment9() {
function mode_Module_Experiment8 (line 96) | void mode_Module_Experiment8() {
function mode_Module_Experiment7 (line 100) | void mode_Module_Experiment7() {
function mode_Module_Experiment6 (line 104) | void mode_Module_Experiment6() {
function mode_Module_Experiment5 (line 108) | void mode_Module_Experiment5() {
function mode_Module_Experiment4 (line 112) | void mode_Module_Experiment4() {
function mode_Zoom2 (line 116) | void mode_Zoom2() {
function mode_Module_Experiment3 (line 120) | void mode_Module_Experiment3() {
function mode_Module_Experiment2 (line 124) | void mode_Module_Experiment2() {
function mode_Module_Experiment1 (line 128) | void mode_Module_Experiment1() {
function mode_Parametric_Water (line 132) | void mode_Parametric_Water() {
function mode_Water (line 136) | void mode_Water() {
function mode_Complex_Kaleido_6 (line 140) | void mode_Complex_Kaleido_6() {
function mode_Complex_Kaleido_5 (line 144) | void mode_Complex_Kaleido_5() {
function mode_Complex_Kaleido_4 (line 148) | void mode_Complex_Kaleido_4() {
function mode_Complex_Kaleido_3 (line 152) | void mode_Complex_Kaleido_3() {
function mode_Complex_Kaleido_2 (line 156) | void mode_Complex_Kaleido_2() {
function mode_Complex_Kaleido (line 160) | void mode_Complex_Kaleido() {
function mode_SM10 (line 164) | void mode_SM10() {
function mode_SM9 (line 168) | void mode_SM9() {
function mode_SM8 (line 172) | void mode_SM8() {
function mode_SM6 (line 181) | void mode_SM6() {
function mode_SM5 (line 185) | void mode_SM5() {
function mode_SM4 (line 189) | void mode_SM4() {
function mode_SM3 (line 193) | void mode_SM3() {
function mode_SM2 (line 197) | void mode_SM2() {
function mode_SM1 (line 201) | void mode_SM1() {
function mode_Big_Caleido (line 205) | void mode_Big_Caleido() {
function mode_RGB_Blobs5 (line 209) | void mode_RGB_Blobs5() {
function mode_RGB_Blobs4 (line 213) | void mode_RGB_Blobs4() {
function mode_RGB_Blobs3 (line 217) | void mode_RGB_Blobs3() {
function mode_RGB_Blobs2 (line 221) | void mode_RGB_Blobs2() {
function mode_RGB_Blobs (line 225) | void mode_RGB_Blobs() {
function mode_Polar_Waves (line 229) | void mode_Polar_Waves() {
function mode_Slow_Fade (line 233) | void mode_Slow_Fade() {
function mode_Zoom (line 237) | void mode_Zoom() {
function mode_Hot_Blob (line 241) | void mode_Hot_Blob() {
function mode_Spiralus2 (line 245) | void mode_Spiralus2() {
function mode_Spiralus (line 249) | void mode_Spiralus() {
function mode_Yves (line 253) | void mode_Yves() {
function mode_Scaledemo1 (line 257) | void mode_Scaledemo1() {
function mode_Lava1 (line 261) | void mode_Lava1() {
function mode_Caleido3 (line 265) | void mode_Caleido3() {
function mode_Caleido2 (line 269) | void mode_Caleido2() {
function mode_Caleido1 (line 273) | void mode_Caleido1() {
function mode_Distance_Experiment (line 277) | void mode_Distance_Experiment() {
function mode_Center_Field (line 281) | void mode_Center_Field() {
function mode_Waves (line 285) | void mode_Waves() {
function mode_Chasing_Spirals (line 289) | void mode_Chasing_Spirals() {
function mode_Rotating_Blob (line 293) | void mode_Rotating_Blob() {
class AnimartrixUsermod (line 299) | class AnimartrixUsermod : public Usermod {
method AnimartrixUsermod (line 308) | AnimartrixUsermod(const char *name, bool enabled) {
method setup (line 314) | void setup() {
method loop (line 372) | void loop() {
method addToJsonInfo (line 382) | void addToJsonInfo(JsonObject& root)
method getId (line 394) | uint16_t getId()
FILE: usermods/usermod_v2_auto_save/usermod_v2_auto_save.cpp
class AutoSaveUsermod (line 29) | class AutoSaveUsermod : public Usermod {
method saveSettings (line 79) | void inline saveSettings() {
method displayOverlay (line 90) | void inline displayOverlay() {
method enable (line 99) | void enable(bool enable) {
method setup (line 107) | void setup() {
method connected (line 124) | void connected() {}
method loop (line 129) | void loop() {
method addToJsonInfo (line 168) | void addToJsonInfo(JsonObject& root) {
method readFromJsonState (line 198) | void readFromJsonState(JsonObject& root) {
method addToConfig (line 227) | void addToConfig(JsonObject& root) {
method readFromConfig (line 248) | bool readFromConfig(JsonObject& root) {
method getId (line 275) | uint16_t getId() {
FILE: usermods/usermod_v2_brightness_follow_sun/usermod_v2_brightness_follow_sun.cpp
class UsermodBrightnessFollowSun (line 5) | class UsermodBrightnessFollowSun : public Usermod
method mapFloat (line 28) | float mapFloat(float inputValue, float inMin, float inMax, float outMi...
method getId (line 37) | uint16_t getId() override
method update (line 42) | void update()
method loop (line 68) | void loop() override
method addToConfig (line 80) | void addToConfig(JsonObject& root)
method readFromConfig (line 91) | bool readFromConfig(JsonObject& root)
FILE: usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display.h
type DisplayType (line 51) | typedef enum {
function class (line 64) | class FourLineDisplayUsermod : public Usermod {
FILE: usermods/usermod_v2_klipper_percentage/usermod_v2_klipper_percentage.cpp
class klipper_percentage (line 3) | class klipper_percentage : public Usermod
method httpGet (line 17) | void httpGet(WiFiClient &client, char *errorMessage)
method setup (line 61) | void setup()
method connected (line 65) | void connected()
method loop (line 69) | void loop()
method addToConfig (line 105) | void addToConfig(JsonObject &root)
method readFromConfig (line 113) | bool readFromConfig(JsonObject &root)
method addToJsonInfo (line 132) | void addToJsonInfo(JsonObject &root)
method addToJsonState (line 151) | void addToJsonState(JsonObject &root)
method readFromJsonState (line 160) | void readFromJsonState(JsonObject &root)
method handleOverlayDraw (line 177) | void handleOverlayDraw()
method getId (line 214) | uint16_t getId()
FILE: usermods/usermod_v2_ping_pong_clock/usermod_v2_ping_pong_clock.cpp
class PingPongClockUsermod (line 3) | class PingPongClockUsermod : public Usermod
method setup (line 43) | void setup()
method loop (line 46) | void loop()
method addToJsonInfo (line 55) | void addToJsonInfo(JsonObject& root)
method addToConfig (line 65) | void addToConfig(JsonObject &root)
method readFromConfig (line 74) | bool readFromConfig(JsonObject &root)
method drawNumber (line 88) | void drawNumber(int base, int number)
method handleOverlayDraw (line 97) | void handleOverlayDraw()
method getId (line 112) | uint16_t getId()
FILE: usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.cpp
function re_qstringCmp (line 89) | static int re_qstringCmp(const void *ap, const void *bp) {
function i2cReadingISR (line 145) | static void IRAM_ATTR i2cReadingISR() {
class RotaryEncoderUIUsermod (line 153) | class RotaryEncoderUIUsermod : public Usermod {
method RotaryEncoderUIUsermod (line 254) | RotaryEncoderUIUsermod()
method getId (line 290) | uint16_t getId() override { return USERMOD_ID_ROTARY_ENC_UI; }
method enable (line 294) | inline void enable(bool enable) { if (!(pinA<0 || pinB<0 || pinC<0)) e...
method isEnabled (line 299) | inline bool isEnabled() { return enabled; }
function byte (line 383) | byte RotaryEncoderUIUsermod::readPin(uint8_t pin) {
function byte (line 419) | byte *RotaryEncoderUIUsermod::re_initIndexArray(int numModes) {
FILE: usermods/usermod_v2_word_clock/usermod_v2_word_clock.cpp
class WordClockUsermod (line 15) | class WordClockUsermod : public Usermod
method updateLedMask (line 136) | void updateLedMask(const int wordMask[], int arraySize)
method setHours (line 151) | void setHours(int hours, bool fullClock)
method setMinutes (line 183) | void setMinutes(int index)
method setSingleMinuteDots (line 195) | void setSingleMinuteDots(int minutes)
method updateDisplay (line 213) | void updateDisplay(uint8_t hours, uint8_t minutes)
method setup (line 315) | void setup()
method connected (line 323) | void connected()
method loop (line 337) | void loop() {
method addToJsonState (line 375) | void addToJsonState(JsonObject& root)
method readFromJsonState (line 383) | void readFromJsonState(JsonObject& root)
method addToConfig (line 422) | void addToConfig(JsonObject& root)
method appendConfigData (line 432) | void appendConfigData()
method readFromConfig (line 453) | bool readFromConfig(JsonObject& root)
method handleOverlayDraw (line 476) | void handleOverlayDraw()
method getId (line 498) | uint16_t getId()
FILE: usermods/wireguard/wireguard.cpp
class WireguardUsermod (line 5) | class WireguardUsermod : public Usermod {
method setup (line 7) | void setup() { configTzTime(posix_tz, ntpServerName); }
method connected (line 9) | void connected() {
method loop (line 15) | void loop() {
method addToJsonInfo (line 34) | void addToJsonInfo(JsonObject& root) {
method appendConfigData (line 54) | void appendConfigData() {
method addToConfig (line 64) | void addToConfig(JsonObject& root) {
method readFromConfig (line 75) | bool readFromConfig(JsonObject& root) {
method getId (line 112) | uint16_t getId() { return USERMOD_ID_WIREGUARD; }
FILE: usermods/wizlights/wizlights.cpp
class WizLightsUsermod (line 12) | class WizLightsUsermod : public Usermod {
method wizSendColor (line 40) | void wizSendColor(IPAddress ip, uint32_t color) {
method setup (line 77) | void setup() {
method loop (line 83) | void loop() {
method addToConfig (line 107) | void addToConfig(JsonObject& root)
method readFromConfig (line 125) | bool readFromConfig(JsonObject& root)
method String (line 153) | String getJsonLabel(uint8_t i) {return "WiZ Light IP #" + String(i+1);}
method getId (line 155) | uint16_t getId(){return USERMOD_ID_WIZLIGHTS;}
FILE: usermods/word-clock-matrix/word-clock-matrix.cpp
class WordClockMatrix (line 10) | class WordClockMatrix : public Usermod
method setup (line 19) | void setup()
method connected (line 46) | void connected()
method selectWordSegments (line 51) | void selectWordSegments(bool state)
method hourChime (line 65) | void hourChime()
method displayTime (line 78) | void displayTime(byte hour, byte minute)
method timeOfDay (line 262) | void timeOfDay()
method loop (line 294) | void loop()
method addToConfig (line 323) | void addToConfig(JsonObject& root)
method getId (line 330) | uint16_t getId()
FILE: wled00/FX.cpp
function sin_gap (line 85) | static uint8_t sin_gap(uint16_t in) {
function triwave16 (line 90) | static uint16_t triwave16(uint16_t in) {
function tristate_square8 (line 102) | static int8_t tristate_square8(uint8_t x, uint8_t pulsewidth, uint8_t at...
function um_data_t (line 121) | static um_data_t* getAudioData() {
function mode_static (line 136) | void mode_static(void) {
function mode_copy_segment (line 144) | void mode_copy_segment(void) {
function blink (line 196) | void blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palett...
function mode_blink (line 225) | void mode_blink(void) {
function mode_blink_rainbow (line 234) | void mode_blink_rainbow(void) {
function mode_strobe (line 243) | void mode_strobe(void) {
function mode_strobe_rainbow (line 252) | void mode_strobe_rainbow(void) {
function color_wipe (line 263) | void color_wipe(bool rev, bool useRandomColors) {
function mode_color_wipe (line 317) | void mode_color_wipe(void) {
function mode_color_sweep (line 326) | void mode_color_sweep(void) {
function mode_color_wipe_random (line 336) | void mode_color_wipe_random(void) {
function mode_color_sweep_random (line 345) | void mode_color_sweep_random(void) {
function mode_random_color (line 355) | void mode_random_color(void) {
function mode_dynamic (line 387) | void mode_dynamic(void) {
function mode_dynamic_smooth (line 421) | void mode_dynamic_smooth(void) {
function mode_breath (line 433) | void mode_breath(void) {
function mode_fade (line 454) | void mode_fade(void) {
function scan (line 468) | void scan(bool dual) {
function mode_scan (line 497) | void mode_scan(void) {
function mode_dual_scan (line 506) | void mode_dual_scan(void) {
function mode_rainbow (line 515) | void mode_rainbow(void) {
function mode_rainbow_cycle (line 531) | void mode_rainbow_cycle(void) {
function running (line 547) | static void running(uint32_t color1, uint32_t color2, bool theatre = fal...
function mode_theater_chase (line 576) | void mode_theater_chase(void) {
function mode_theater_chase_rainbow (line 586) | void mode_theater_chase_rainbow(void) {
function running_base (line 595) | static void running_base(bool saw, bool dual=false) {
function mode_running_dual (line 628) | void mode_running_dual(void) {
function mode_running_lights (line 637) | void mode_running_lights(void) {
function mode_saw (line 646) | void mode_saw(void) {
function mode_twinkle (line 656) | void mode_twinkle(void) {
function dissolve (line 689) | void dissolve(uint32_t color) {
function mode_dissolve (line 745) | void mode_dissolve(void) {
function mode_dissolve_random (line 754) | void mode_dissolve_random(void) {
function mode_sparkle (line 763) | void mode_sparkle(void) {
function mode_flash_sparkle (line 783) | void mode_flash_sparkle(void) {
function mode_hyper_sparkle (line 803) | void mode_hyper_sparkle(void) {
function mode_multi_strobe (line 825) | void mode_multi_strobe(void) {
function mode_android (line 853) | void mode_android(void) {
function chase (line 894) | static void chase(uint32_t color1, uint32_t color2, uint32_t color3, boo...
function mode_chase_color (line 962) | void mode_chase_color(void) {
function mode_chase_random (line 971) | void mode_chase_random(void) {
function mode_chase_rainbow (line 980) | void mode_chase_rainbow(void) {
function mode_chase_rainbow_white (line 994) | void mode_chase_rainbow_white(void) {
function mode_colorful (line 1008) | void mode_colorful(void) {
function mode_traffic_light (line 1051) | void mode_traffic_light(void) {
function mode_chase_flash (line 1082) | void mode_chase_flash(void) {
function mode_chase_flash_random (line 1120) | void mode_chase_flash_random(void) {
function mode_running_color (line 1163) | void mode_running_color(void) {
function mode_running_random (line 1172) | void mode_running_random(void) {
function mode_larson_scanner (line 1208) | void mode_larson_scanner(void) {
function mode_dual_larson_scanner (line 1255) | void mode_dual_larson_scanner(void){
function mode_comet (line 1264) | void mode_comet(void) {
function mode_fireworks (line 1289) | void mode_fireworks() {
function mode_rain (line 1329) | void mode_rain() {
function mode_fire_flicker (line 1365) | void mode_fire_flicker(void) {
function gradient_base (line 1393) | void gradient_base(bool loading) {
function mode_gradient (line 1419) | void mode_gradient(void) {
function mode_loading (line 1428) | void mode_loading(void) {
function mode_two_dots (line 1436) | void mode_two_dots() {
type Flasher (line 1460) | struct Flasher {
function mode_fairy (line 1469) | void mode_fairy() {
function mode_fairytwinkle (line 1546) | void mode_fairytwinkle() {
function tricolor_chase (line 1594) | void tricolor_chase(uint32_t color1, uint32_t color2) {
function mode_tricolor_chase (line 1615) | void mode_tricolor_chase(void) {
function mode_icu (line 1624) | void mode_icu(void) {
function mode_tricolor_wipe (line 1696) | void mode_tricolor_wipe(void) {
function mode_tricolor_fade (line 1736) | void mode_tricolor_fade(void) {
function mode_multi_comet (line 1777) | void mode_multi_comet(void) {
function mode_random_chase (line 1814) | void mode_random_chase(void) {
type Oscillator (line 1845) | struct Oscillator {
function mode_oscillate (line 1855) | void mode_oscillate(void) {
function mode_lightning (line 1905) | void mode_lightning(void) {
function mode_colorwaves_pride_base (line 1947) | void mode_colorwaves_pride_base(bool isPride2015) {
function mode_pride_2015 (line 1998) | void mode_pride_2015(void) {
function mode_colorwaves (line 2006) | void mode_colorwaves() {
function mode_juggle (line 2013) | void mode_juggle(void) {
function mode_palette (line 2030) | void mode_palette() {
function mode_fire_2012 (line 2156) | void mode_fire_2012() {
function mode_bpm (line 2215) | void mode_bpm() {
function mode_fillnoise8 (line 2225) | void mode_fillnoise8() {
function mode_noise16_1 (line 2236) | void mode_noise16_1() {
function mode_noise16_2 (line 2255) | void mode_noise16_2() {
function mode_noise16_3 (line 2271) | void mode_noise16_3() {
function mode_noise16_4 (line 2291) | void mode_noise16_4() {
function mode_colortwinkle (line 2302) | void mode_colortwinkle() {
function mode_lake (line 2359) | void mode_lake() {
function mode_meteor (line 2378) | void mode_meteor() {
function mode_railway (line 2446) | void mode_railway() {
type Ripple (line 2481) | struct Ripple {
function ripple_base (line 2492) | static void ripple_base(uint8_t blurAmount = 0) {
function mode_ripple (line 2545) | void mode_ripple(void) {
function mode_ripple_rainbow (line 2557) | void mode_ripple_rainbow(void) {
function CRGB (line 2580) | static CRGB twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat)
function twinklefox_base (line 2642) | static void twinklefox_base(bool cat)
function mode_twinklefox (line 2700) | void mode_twinklefox()
function mode_twinklecat (line 2707) | void mode_twinklecat()
function mode_halloween_eyes (line 2714) | void mode_halloween_eyes()
function mode_static_pattern (line 2870) | void mode_static_pattern()
function mode_tri_static_pattern (line 2889) | void mode_tri_static_pattern()
function spots_base (line 2913) | static void spots_base(uint16_t threshold)
function mode_spots (line 2940) | void mode_spots()
function mode_spots_fade (line 2948) | void mode_spots_fade()
type Ball (line 2958) | struct Ball {
function mode_bouncing_balls (line 2967) | void mode_bouncing_balls(void) {
type RollingBall (line 3045) | struct RollingBall {
function mode_rolling_balls (line 3052) | static void mode_rolling_balls(void) {
type PacManChars (line 3152) | struct PacManChars {
function mode_pacman (line 3161) | static void mode_pacman(void) {
function sinelon_base (line 3336) | static void sinelon_base(bool dual, bool rainbow=false) {
function mode_sinelon (line 3369) | void mode_sinelon(void) {
function mode_sinelon_dual (line 3375) | void mode_sinelon_dual(void) {
function mode_sinelon_rainbow (line 3381) | void mode_sinelon_rainbow(void) {
function glitter_base (line 3387) | void glitter_base(uint8_t intensity, uint32_t col = ULTRAWHITE) {
function mode_glitter (line 3392) | void mode_glitter()
function mode_solid_glitter (line 3414) | void mode_solid_glitter()
type Spark (line 3423) | struct Spark {
function mode_popcorn (line 3435) | void mode_popcorn(void) {
function candle (line 3498) | void candle(bool multi)
function mode_candle (line 3576) | void mode_candle()
function mode_candle_multi (line 3583) | void mode_candle_multi()
type particle (line 3601) | struct particle {
function mode_starburst (line 3610) | void mode_starburst(void) {
function mode_exploding_fireworks (line 3728) | void mode_exploding_fireworks(void)
function mode_drip (line 3864) | void mode_drip(void)
type Tetris (line 3949) | struct Tetris {
function mode_tetrix (line 3958) | void mode_tetrix(void) {
function mode_plasma (line 4037) | void mode_plasma(void) {
function mode_percent (line 4059) | void mode_percent(void) {
function mode_heartbeat (line 4110) | void mode_heartbeat(void) {
function CRGB (line 4162) | static CRGB pacifica_one_layer(uint16_t i, const CRGBPalette16& p, uint1...
function mode_pacifica (line 4177) | void mode_pacifica()
function mode_sunrise (line 4256) | void mode_sunrise() {
function phased_base (line 4305) | static void phased_base(uint8_t moder) { // We're makin...
function mode_phased (line 4329) | void mode_phased(void) {
function mode_phased_noise (line 4335) | void mode_phased_noise(void) {
function mode_twinkleup (line 4341) | void mode_twinkleup(void) { // A very short twinkle rout...
function mode_noisepal (line 4358) | void mode_noisepal(void) { // Slow no...
function mode_sinewave (line 4394) | void mode_sinewave(void) { // Adjustable sinewave. By Andrew...
function mode_flow (line 4414) | void mode_flow(void)
function mode_chunchun (line 4450) | void mode_chunchun(void)
type Spotlight (line 4484) | struct Spotlight {
function mode_dancing_shadows (line 4500) | void mode_dancing_shadows(void)
function mode_washing_machine (line 4620) | void mode_washing_machine(void) {
function mode_image (line 4637) | void mode_image(void) {
function mode_blends (line 4654) | void mode_blends(void) {
type TvSim (line 4681) | struct TvSim {
function mode_tv_simulator (line 4701) | void mode_tv_simulator(void) {
class AuroraWave (line 4822) | class AuroraWave {
method init (line 4838) | void init(uint32_t segment_length, CRGBW color) {
method updateCachedValues (line 4850) | void updateCachedValues() {
method CRGBW (line 4864) | CRGBW getColorForLED(int ledIndex) {
method update (line 4887) | void update(uint32_t segment_length, uint32_t speed) {
method stillAlive (line 4910) | bool stillAlive() { return alive; }
function mode_aurora (line 4913) | void mode_aurora(void) {
function mode_ColorClouds (line 4957) | void mode_ColorClouds()
function mode_perlinmove (line 5031) | void mode_perlinmove(void) {
function mode_wavesins (line 5047) | void mode_wavesins(void) {
function mode_FlowStripe (line 5063) | void mode_FlowStripe(void) {
function mode_shimmer (line 5084) | void mode_shimmer() {
function mode_2DBlackHole (line 5156) | void mode_2DBlackHole(void) { // By: Stepko https://editor.so...
function mode_2DColoredBursts (line 5188) | void mode_2DColoredBursts() { // By: ldirko https://edito...
function mode_2Ddna (line 5238) | void mode_2Ddna(void) { // dna originally by by ldirko at https:...
function mode_2DDNASpiral (line 5256) | void mode_2DDNASpiral() { // By: ldirko https://editor.so...
function mode_2DDrift (line 5302) | void mode_2DDrift() { // By: Stepko https://editor.soulma...
function mode_2Dfirenoise (line 5330) | void mode_2Dfirenoise(void) { // firenoise2d. By Andrew Tu...
function mode_2DFrizzles (line 5362) | void mode_2DFrizzles(void) { // By: Stepko https://edito...
type Cell (line 5382) | struct Cell {
function mode_2Dgameoflife (line 5386) | void mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by ht...
function mode_2DHiphotic (line 5541) | void mode_2DHiphotic() { // By: ldirko https://...
type Julia (line 5565) | struct Julia {
function mode_2DJulia (line 5571) | void mode_2DJulia(void) { // An animated Julia...
function mode_2DLissajous (line 5676) | void mode_2DLissajous(void) { // By: Andrew Tuline
function mode_2Dmatrix (line 5703) | void mode_2Dmatrix(void) { // Matrix2D. By Jeremy Willi...
function mode_2Dmetaballs (line 5772) | void mode_2Dmetaballs(void) { // Metaballs by Stefan Petrick. Cannot h...
function mode_2Dnoise (line 5829) | void mode_2Dnoise(void) { // By Andrew Tuline
function mode_2DPlasmaball (line 5850) | void mode_2DPlasmaball(void) { // By: Stepko https://e...
function mode_2DPolarLights (line 5886) | void mode_2DPolarLights(void) { // By: Kostyantyn Matviyevskyy h...
function mode_2DPulser (line 5918) | void mode_2DPulser(void) { // By: ldirko https:/...
function mode_2DSindots (line 5938) | void mode_2DSindots(void) { // By: ldirko ...
function mode_2Dsquaredswirl (line 5966) | void mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. https...
function mode_2DSunradiation (line 5996) | void mode_2DSunradiation(void) { // By: ldirko https:/...
function mode_2Dtartan (line 6045) | void mode_2Dtartan(void) { // By: Elliott Kember https://edito...
function mode_2Dspaceships (line 6082) | void mode_2Dspaceships(void) { //// Space ships by stepko (c)05.02.21...
function mode_2Dcrazybees (line 6123) | void mode_2Dcrazybees(void) {
function mode_2Dghostrider (line 6195) | void mode_2Dghostrider(void) {
function mode_2Dfloatingblobs (line 6282) | void mode_2Dfloatingblobs(void) {
function mode_2Dscrollingtext (line 6378) | void mode_2Dscrollingtext(void) {
function mode_2Ddriftrose (line 6527) | void mode_2Ddriftrose(void) {
function mode_2Dplasmarotozoom (line 6553) | void mode_2Dplasmarotozoom() {
function mode_ripplepeak (line 6604) | void mode_ripplepeak(void) { // * Ripple peak. By Andrew ...
function mode_2DSwirl (line 6678) | void mode_2DSwirl(void) {
function mode_2DWaverly (line 6715) | void mode_2DWaverly(void) {
type Gravity (line 6748) | struct Gravity {
function mode_gravcenter_base (line 6759) | void mode_gravcenter_base(unsigned mode) {
function mode_gravcenter (line 6842) | void mode_gravcenter(void) { // Gravcenter. By Andrew Tul...
function mode_gravcentric (line 6850) | void mode_gravcentric(void) { // Gravcentric. By Andrew Tu...
function mode_gravimeter (line 6859) | void mode_gravimeter(void) { // Gravmeter. By Andrew Tuline.
function mode_gravfreq (line 6868) | void mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
function mode_juggles (line 6877) | void mode_juggles(void) { // Juggles. By Andrew Tuline.
function mode_matripix (line 6895) | void mode_matripix(void) { // Matripix. By Andrew Tuline.
function mode_midnoise (line 6929) | void mode_midnoise(void) { // Midnoise. By Andrew Tuline.
function mode_noisefire (line 6960) | void mode_noisefire(void) { // Noisefire. By Andrew Tuline.
function mode_noisemeter (line 6985) | void mode_noisemeter(void) { // Noisemeter. By Andrew Tul...
function mode_pixelwave (line 7014) | void mode_pixelwave(void) { // Pixelwave. By Andrew Tuline.
type Plasphase (line 7042) | struct Plasphase {
function mode_plasmoid (line 7047) | void mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
function mode_puddles_base (line 7078) | void mode_puddles_base(bool peakdetect) {
function mode_puddlepeak (line 7112) | void mode_puddlepeak(void) { // Puddlepeak. By Andrew Tul...
function mode_puddles (line 7117) | void mode_puddles(void) { // Puddles. By Andrew Tuline.
function mode_pixels (line 7126) | void mode_pixels(void) { // Pixels. By Andrew Tuline.
function mode_blurz (line 7152) | void mode_blurz(void) { // Blurz. By Andrew Tuline.
function mode_DJLight (line 7183) | void mode_DJLight(void) { // Written by ??? Adapted by...
function mode_freqmap (line 7212) | void mode_freqmap(void) { // Map FFT_MajorPeak to SEGL...
function mode_freqmatrix (line 7243) | void mode_freqmatrix(void) { // Freqmatrix. By Andreas Pl...
function mode_freqpixels (line 7297) | void mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
function mode_freqwave (line 7337) | void mode_freqwave(void) { // Freqwave. By Andreas Ples...
function mode_noisemove (line 7386) | void mode_noisemove(void) { // Noisemove. By: Andrew ...
function mode_rocktaves (line 7407) | void mode_rocktaves(void) { // Rocktaves. Same note from...
function mode_waterfall (line 7441) | void mode_waterfall(void) { // Waterfall. By: Andrew T...
function mode_2DGEQ (line 7495) | void mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
function mode_2DFunkyPlank (line 7554) | void mode_2DFunkyPlank(void) { // Written by ??? Adapted by...
function mode_2DAkemi (line 7640) | void mode_2DAkemi(void) {
function mode_2Ddistortionwaves (line 7707) | void mode_2Ddistortionwaves() {
function soapPixels (line 7787) | static void soapPixels(bool isRow, uint8_t *noise3d, CRGB *pixels) {
function mode_2Dsoap (line 7839) | void mode_2Dsoap() {
function mode_2Doctopus (line 7890) | void mode_2Doctopus() {
function mode_2Dwavingcell (line 7947) | void mode_2Dwavingcell() {
function mode_particlevortex (line 7977) | void mode_particlevortex(void) {
function mode_particlefireworks (line 8091) | void mode_particlefireworks(void) {
function mode_particlevolcano (line 8234) | void mode_particlevolcano(void) {
function mode_particlefire (line 8305) | void mode_particlefire(void) {
function mode_particlepit (line 8409) | void mode_particlepit(void) {
function mode_particlewaterfall (line 8477) | void mode_particlewaterfall(void) {
function mode_particlebox (line 8548) | void mode_particlebox(void) {
function mode_particleperlin (line 8634) | void mode_particleperlin(void) {
function mode_particleimpact (line 8695) | void mode_particleimpact(void) {
function mode_particleattractor (line 8803) | void mode_particleattractor(void) {
function mode_particlespray (line 8894) | void mode_particlespray(void) {
function mode_particleGEQ (line 8967) | void mode_particleGEQ(void) {
function mode_particlecenterGEQ (line 9041) | void mode_particlecenterGEQ(void) {
function mode_particleghostrider (line 9109) | void mode_particleghostrider(void) {
function mode_particleblobs (line 9189) | void mode_particleblobs(void) {
function mode_particlegalaxy (line 9262) | void mode_particlegalaxy(void) {
function mode_particleDrip (line 9368) | void mode_particleDrip(void) {
function mode_particlePinball (line 9472) | void mode_particlePinball(void) {
function mode_particleDancingShadows (line 9590) | void mode_particleDancingShadows(void) {
function mode_particleFireworks1D (line 9704) | void mode_particleFireworks1D(void) {
function mode_particleSparkler (line 9823) | void mode_particleSparkler(void) {
function mode_particleHourglass (line 9893) | void mode_particleHourglass(void) {
function mode_particle1Dspray (line 10016) | void mode_particle1Dspray(void) {
function mode_particleBalance (line 10066) | void mode_particleBalance(void) {
function mode_particleChase (line 10146) | void mode_particleChase(void) {
function mode_particleStarburst (line 10241) | void mode_particleStarburst(void) {
function mode_particle1DGEQ (line 10299) | void mode_particle1DGEQ(void) {
function mode_particleFire1D (line 10371) | void mode_particleFire1D(void) {
function mode_particle1DsonicStream (line 10434) | void mode_particle1DsonicStream(void) {
function mode_particle1DsonicBoom (line 10536) | void mode_particle1DsonicBoom(void) {
function mode_particleSpringy (line 10624) | void mode_particleSpringy(void) {
FILE: wled00/FX.h
type mapping1D2D_t (line 415) | typedef enum mapping1D2D {
function class (line 426) | class Segment {
function setPixelColorRaw (line 544) | inline void setPixelColorRaw(unsigned i, uint32_t c) const { pixels...
function getPixelColorRaw (line 545) | inline uint32_t getPixelColorRaw(unsigned i) const { return...
function setPixelColorXYRaw (line 547) | inline void setPixelColorXYRaw(unsigned x, unsigned y, uint32_t c) c...
function getPixelColorXYRaw (line 548) | inline uint32_t getPixelColorXYRaw(unsigned x, unsigned y) const ...
function updateTransitionProgress (line 555) | void updateTransitionProgress() const; // sets transition progress (0-6...
function Segment (line 561) | inline Segment *getOldSegment() const { return isInTransition() ? _t...
function modeBlend (line 563) | inline static void modeBlend(bool blend) { Segment::_modeBlend = blend; }
function isPreviousMode (line 565) | inline static bool isPreviousMode() { return Segment::_modeBlend; }
function getOption (line 642) | inline bool getOption(uint8_t n) const { return ((options >> n) & ...
function deactivate (line 654) | inline void deactivate() { setGeometry(0,0); }
function Segment (line 655) | inline Segment &clearName() { p_free(name); name = null...
function Segment (line 656) | inline Segment &setName(const String &name) { return setName(name.c_str...
function vLength (line 658) | inline static unsigned vLength() { return Segment:...
function vWidth (line 659) | inline static unsigned vWidth() { return Segment:...
function vHeight (line 660) | inline static unsigned vHeight() { return Segment:...
function getCurrentColor (line 661) | inline static uint32_t getCurrentColor(unsigned i) { return Segment:...
function CRGBPalette16 (line 662) | inline static const CRGBPalette16 &getCurrentPalette() { return Segment:...
function refreshLightCapabilities (line 675) | void refreshLightCapabilities() const;
function setPixelColor (line 700) | inline void setPixelColor(int n, CRGB c) const ...
function setRawPixelColor (line 701) | void setRawPixelColor(int i, uint32_t col) const ...
function clear (line 711) | void clear() const { fill(BLACK); } // clear segment
function blendPixelColor (line 717) | inline void blendPixelColor(int n, CRGB c, uint8_t blend) const ...
function fadePixelColor (line 722) | inline void fadePixelColor(uint16_t n, uint8_t fade) const ...
function virtualWidth (line 726) | unsigned virtualWidth() const; // segment width in virtual pixels...
function setPixelColorXY (line 745) | inline void setPixelColorXY(unsigned x, unsigned y, uint32_t c) const ...
function setPixelColorXY (line 747) | inline void setPixelColorXY(int x, int y, CRGB c) const ...
function setPixelColorXY (line 748) | inline void setPixelColorXY(unsigned x, unsigned y, CRGB c) const ...
function blendPixelColorXY (line 757) | inline void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, ui...
function blendPixelColorXY (line 758) | inline void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t bl...
function fadePixelColorXY (line 763) | inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) const...
function fill_solid (line 780) | inline void fill_solid(CRGB c) const { fill(RGBW32(c.r,c.g,c.b,0)); }
function setPixelColorXY (line 783) | inline void setPixelColorXY(int x, int y, uint32_t c) const ...
function setPixelColorXY (line 784) | inline void setPixelColorXY(unsigned x, unsigned y, uint32_t c) const ...
function setPixelColorXY (line 786) | inline void setPixelColorXY(int x, int y, CRGB c) const ...
function setPixelColorXY (line 787) | inline void setPixelColorXY(unsigned x, unsigned y, CRGB c) const ...
function isPixelXYClipped (line 793) | inline bool isPixelXYClipped(int x, int y) const ...
function getPixelColorXY (line 794) | inline uint32_t getPixelColorXY(int x, int y) const ...
function blendPixelColorXY (line 795) | inline void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t c, uint8_...
function blendPixelColorXY (line 796) | inline void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t bl...
function fadePixelColorXY (line 800) | inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) const...
function wu_pixel (line 816) | inline void wu_pixel(uint32_t x, uint32_t y, CRGB c) {}
function class (line 824) | class WS2812FX {
function setPixelColor (line 909) | inline void setPixelColor(unsigned n, uint32_t c) const { if (n < getL...
function resetTimebase (line 910) | inline void resetTimebase() { timebase = 0...
function setPixelColor (line 913) | inline void setPixelColor(unsigned n, CRGB c) const { setPixelColo...
function fill (line 914) | inline void fill(uint32_t c) const { for (size_t ...
function trigger (line 915) | inline void trigger() { _triggered =...
function setShowCallback (line 916) | inline void setShowCallback(show_callback cb) { _callback = ...
function setTransition (line 917) | inline void setTransition(uint16_t t) { _transitionD...
function suspend (line 920) | inline void suspend() { _suspend = t...
function resume (line 921) | inline void resume() { _suspend = f...
function checkSegmentAlignment (line 926) | bool checkSegmentAlignment() const;
function getActiveSegmentsNum (line 939) | uint8_t getActiveSegmentsNum() const;
function getMaxSegments (line 946) | inline static constexpr unsigned getMaxSegments() { return MAX_NUM_SEGME...
function getLengthPhysical (line 953) | uint16_t getLengthPhysical() const;
function getMappedPixelIndex (line 961) | inline uint16_t getMappedPixelIndex(uint16_t index) const { //...
function getPixelColor (line 967) | inline uint32_t getPixelColor(unsigned n) const { return (getMappedPixel...
function getPixelColorNoMap (line 968) | inline uint32_t getPixelColorNoMap(unsigned n) const { return (n < getLe...
function Segment (line 975) | inline Segment& getFirstSelectedSeg() { return _segments[getFirstSelecte...
function Segment (line 976) | inline Segment& getMainSegment() { return _segments[getMainSegmentI...
function Segment (line 977) | inline Segment* getSegments() { return &(_segments[0]); }
FILE: wled00/FX_fcn.cpp
function Segment (line 95) | Segment& Segment::operator= (const Segment &orig) {
function Segment (line 129) | Segment& Segment::operator= (Segment &&orig) noexcept {
function CRGBPalette16 (line 227) | CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_...
function Segment (line 502) | Segment &Segment::setColor(uint8_t slot, uint32_t c) {
function Segment (line 515) | Segment &Segment::setCCT(uint16_t k) {
function Segment (line 530) | Segment &Segment::setOpacity(uint8_t o) {
function Segment (line 540) | Segment &Segment::setOption(uint8_t n, bool val) {
function Segment (line 551) | Segment &Segment::setMode(uint8_t fx, bool loadDefaults) {
function Segment (line 587) | Segment &Segment::setPalette(uint8_t pal) {
function Segment (line 598) | Segment &Segment::setName(const char *newName) {
function getPinwheelLength (line 631) | static int getPinwheelLength(int vW, int vH) {
function setPinwheelParameters (line 635) | static void setPinwheelParameters(int i, int vW, int vH, int& startx, in...
function _top (line 1340) | static uint8_t _top (uint8_t a, uint8_t b) { return a; }
function _bottom (line 1341) | static uint8_t _bottom (uint8_t a, uint8_t b) { return b; }
function _add (line 1342) | static uint8_t _add (uint8_t a, uint8_t b) { unsigned t = a + b; r...
function _subtract (line 1343) | static uint8_t _subtract (uint8_t a, uint8_t b) { return b > a ? (b - a...
function _difference (line 1344) | static uint8_t _difference(uint8_t a, uint8_t b) { return b > a ? (b - a...
function _average (line 1345) | static uint8_t _average (uint8_t a, uint8_t b) { return (a + b) >> 1; }
function _multiply (line 1347) | static uint8_t _multiply (uint8_t a, uint8_t b) { return ((a * b) + 255...
function _multiply (line 1349) | static uint8_t _multiply (uint8_t a, uint8_t b) { return (a * b) / 255; }
function _divide (line 1351) | static uint8_t _divide (uint8_t a, uint8_t b) { return a > b ? (b * 2...
function _lighten (line 1352) | static uint8_t _lighten (uint8_t a, uint8_t b) { return a > b ? a : b; }
function _darken (line 1353) | static uint8_t _darken (uint8_t a, uint8_t b) { return a < b ? a : b; }
function _screen (line 1354) | static uint8_t _screen (uint8_t a, uint8_t b) { return 255 - _multipl...
function _overlay (line 1355) | static uint8_t _overlay (uint8_t a, uint8_t b) { return b < 128 ? 2 * ...
function _hardlight (line 1356) | static uint8_t _hardlight (uint8_t a, uint8_t b) { return a < 128 ? 2 * ...
function _softlight (line 1358) | static uint8_t _softlight (uint8_t a, uint8_t b) { return (((b * b * (25...
function _softlight (line 1360) | static uint8_t _softlight (uint8_t a, uint8_t b) { return (b * b * (255 ...
function _dodge (line 1362) | static uint8_t _dodge (uint8_t a, uint8_t b) { return _divide(~a,b); }
function _burn (line 1363) | static uint8_t _burn (uint8_t a, uint8_t b) { return ~_divide(a,~b); }
function Segment (line 1821) | Segment& WS2812FX::getSegment(unsigned id) {
FILE: wled00/FXparticleSystem.cpp
function calculateNumberOfParticles2D (line 1057) | uint32_t calculateNumberOfParticles2D(uint32_t const pixels, const bool ...
function calculateNumberOfSources2D (line 1071) | uint32_t calculateNumberOfSources2D(uint32_t pixels, uint32_t requesteds...
function allocateParticleSystemMemory2D (line 1080) | bool allocateParticleSystemMemory2D(uint32_t numparticles, uint32_t nums...
function initParticleSystem2D (line 1097) | bool initParticleSystem2D(ParticleSystem2D *&PartSys, uint32_t requested...
function calculateNumberOfParticles1D (line 1810) | uint32_t calculateNumberOfParticles1D(const uint32_t fraction, const boo...
function calculateNumberOfSources1D (line 1824) | uint32_t calculateNumberOfSources1D(const uint32_t requestedsources) {
function allocateParticleSystemMemory1D (line 1832) | bool allocateParticleSystemMemory1D(const uint32_t numparticles, const u...
function initParticleSystem1D (line 1850) | bool initParticleSystem1D(ParticleSystem1D *&PartSys, const uint32_t req...
function calcForce_dv (line 1885) | static int32_t calcForce_dv(const int8_t force, uint8_t &counter) {
function checkBoundsAndWrap (line 1906) | static bool checkBoundsAndWrap(int32_t &position, const int32_t max, con...
function fast_color_scaleAdd (line 1921) | static uint32_t fast_color_scaleAdd(const uint32_t c1, const uint32_t c2...
FILE: wled00/FXparticleSystem.h
function limitSpeed (line 34) | static inline int32_t limitSpeed(const int32_t speed) {
type PSsettings2D (line 64) | typedef union {
type PSparticle (line 79) | typedef struct { // 10 bytes
type PSparticleFlags (line 90) | typedef union {
type PSadvancedParticle (line 105) | typedef struct { // 2 bytes
type PSsizeControl (line 111) | typedef struct { // 8 bytes
type PSsource (line 129) | typedef struct {
function class (line 141) | class ParticleSystem2D {
function calculateEllipseBrightness (line 238) | inline uint8_t calculateEllipseBrightness(int32_t dx, int32_t dy, int32_...
type PSsettings1D (line 280) | typedef union {
type PSparticle1D (line 296) | typedef struct {
type PSparticleFlags1D (line 304) | typedef union {
type PSadvancedParticle1D (line 319) | typedef struct {
type PSsource1D (line 326) | typedef struct {
function class (line 338) | class ParticleSystem1D
FILE: wled00/alexa.cpp
function alexaInit (line 15) | void alexaInit()
function handleAlexa (line 38) | void handleAlexa()
function onAlexaChange (line 44) | void onAlexaChange(EspalexaDevice* dev)
function alexaInit (line 140) | void alexaInit(){}
function handleAlexa (line 141) | void handleAlexa(){}
FILE: wled00/bus_manager.cpp
function getBitFromArray (line 23) | static inline bool getBitFromArray(const uint8_t* byteArray, size_t posi...
function setBitInArray (line 30) | static inline void setBitInArray(uint8_t* byteArray, size_t position, bo...
function getBitArrayBytes (line 40) | static inline size_t getBitArrayBytes(size_t num_bits) { // number of by...
function setBitArray (line 44) | static inline void setBitArray(uint8_t* byteArray, size_t numBits, bool ...
function String (line 1209) | static String LEDTypesToJson(const std::vector<LEDType>& types) {
function String (line 1222) | String BusManager::getLEDTypesJSONString() {
function ColorOrderMap (line 1438) | ColorOrderMap& BusManager::getColorOrderMap() { return _colorOrderMap; }
FILE: wled00/bus_manager.h
type BusConfig (line 70) | struct BusConfig
type ColorOrderMapEntry (line 73) | typedef struct {
function reserve (line 79) | struct ColorOrderMap {
function reset (line 85) | void reset() {
function ColorOrderMapEntry (line 90) | const ColorOrderMapEntry* get(uint8_t n) const {
type LEDType (line 102) | typedef struct {
function class (line 110) | class Bus {
function virtual (line 125) | virtual ~Bus() {}
function virtual (line 127) | virtual void begin() {}
function virtual (line 130) | virtual void setStatusPixel(uint32_t c) {}
function virtual (line 132) | virtual void setBrightness(uint8_t b) { _bri = b; }
function virtual (line 133) | virtual void setColorOrder(uint8_t co) {}
function virtual (line 134) | virtual uint32_t getPixelColor(unsigned pix) const { return 0; }
function isDigital (line 150) | inline bool isDigital() const { return isD...
function isOnOff (line 152) | inline bool isOnOff() const { return isO...
function isVirtual (line 154) | inline bool isVirtual() const { return isV...
function mustRefresh (line 157) | inline bool mustRefresh() const { return mus...
function setStart (line 159) | inline void setStart(uint16_t start) { _start = s...
function setAutoWhiteMode (line 160) | inline void setAutoWhiteMode(uint8_t m) { if (m < 5)...
function containsPixel (line 168) | inline bool containsPixel(uint16_t pix) const { return pix...
function std (line 170) | static inline std::vector<LEDType> getLEDTypes() { return {{T...
function getNumberOfPins (line 171) | static constexpr size_t getNumberOfPins(uint8_t type) { return isV...
function getNumberOfChannels (line 172) | static constexpr size_t getNumberOfChannels(uint8_t type) { return has...
function hasRGB (line 173) | static constexpr bool hasRGB(uint8_t type) {
function hasWhite (line 176) | static constexpr bool hasWhite(uint8_t type) {
function hasCCT (line 183) | static constexpr bool hasCCT(uint8_t type) {
function isTypeValid (line 189) | static constexpr bool isTypeValid(uint8_t type) { return (type > 15 &&...
function isDigital (line 190) | static constexpr bool isDigital(uint8_t type) { return (type >= TYPE...
function is2Pin (line 191) | static constexpr bool is2Pin(uint8_t type) { return (type >= TYPE...
function isOnOff (line 192) | static constexpr bool isOnOff(uint8_t type) { return (type == TYPE...
function isPWM (line 193) | static constexpr bool isPWM(uint8_t type) { return (type >= TYPE...
function isVirtual (line 194) | static constexpr bool isVirtual(uint8_t type) { return (type >= TYPE...
function isHub75 (line 195) | static constexpr bool isHub75(uint8_t type) { return (type >= TYPE...
function is16bit (line 196) | static constexpr bool is16bit(uint8_t type) { return type == TYPE_...
function mustRefresh (line 197) | static constexpr bool mustRefresh(uint8_t type) { return type == TYPE_...
function numPWMPins (line 198) | static constexpr int numPWMPins(uint8_t type) { return (type - 40); }
function getCCT (line 200) | static inline int16_t getCCT() { return _cct; }
function setGlobalAWMode (line 201) | static inline void setGlobalAWMode(uint8_t m) { if (m < 5) _gAWM = m...
function getGlobalAWMode (line 202) | static inline uint8_t getGlobalAWMode() { return _gAWM; }
function setCCT (line 203) | static inline void setCCT(int16_t cct) { _cct = cct; }
function getCCTBlend (line 204) | static inline int8_t getCCTBlend() { return (_cctBlend * ...
function setCCTBlend (line 205) | static inline void setCCTBlend(int8_t b) { // input is -100 to +100
function class (line 246) | class BusDigital : public Bus {
function class (line 303) | class BusPwm : public Bus {
function class (line 331) | class BusOnOff : public Bus {
function class (line 351) | class BusNetwork : public Bus {
function class (line 384) | class BusPlaceholder : public Bus {
function class (line 417) | class BusHub75Matrix : public Bus {
function adjustBounds (line 501) | bool adjustBounds(uint16_t& total) {
FILE: wled00/bus_wrapper.h
type X8Ws2812xMethod (line 214) | typedef X8Ws2812xMethod X1Ws2812xMethod;
type X8Sk6812Method (line 215) | typedef X8Sk6812Method X1Sk6812Method;
type X8400KbpsMethod (line 216) | typedef X8400KbpsMethod X1400KbpsMethod;
type X8800KbpsMethod (line 217) | typedef X8800KbpsMethod X1800KbpsMethod;
type X8Tm1814Method (line 218) | typedef X8Tm1814Method X1Tm1814Method;
type X8Tm1829Method (line 219) | typedef X8Tm1829Method X1Tm1829Method;
type X8Apa106Method (line 220) | typedef X8Apa106Method X1Apa106Method;
type X8Ws2805Method (line 221) | typedef X8Ws2805Method X1Ws2805Method;
type X8Tm1914Method (line 222) | typedef X8Tm1914Method X1Tm1914Method;
type NeoEsp32I2s0Ws2812xMethod (line 225) | typedef NeoEsp32I2s0Ws2812xMethod X1Ws2812xMethod;
type NeoEsp32I2s0Sk6812Method (line 226) | typedef NeoEsp32I2s0Sk6812Method X1Sk6812Method;
type NeoEsp32I2s0400KbpsMethod (line 227) | typedef NeoEsp32I2s0400KbpsMethod X1400KbpsMethod;
type NeoEsp32I2s0800KbpsMethod (line 228) | typedef NeoEsp32I2s0800KbpsMethod X1800KbpsMethod;
type NeoEsp32I2s0Tm1814Method (line 229) | typedef NeoEsp32I2s0Tm1814Method X1Tm1814Method;
type NeoEsp32I2s0Tm1829Method (line 230) | typedef NeoEsp32I2s0Tm1829Method X1Tm1829Method;
type NeoEsp32I2s0Apa106Method (line 231) | typedef NeoEsp32I2s0Apa106Method X1Apa106Method;
type NeoEsp32I2s0Ws2805Method (line 232) | typedef NeoEsp32I2s0Ws2805Method X1Ws2805Method;
type NeoEsp32I2s0Tm1914Method (line 233) | typedef NeoEsp32I2s0Tm1914Method X1Tm1914Method;
type NeoEsp32I2s1Ws2812xMethod (line 236) | typedef NeoEsp32I2s1Ws2812xMethod X1Ws2812xMethod;
type NeoEsp32I2s1Sk6812Method (line 237) | typedef NeoEsp32I2s1Sk6812Method X1Sk6812Method;
type NeoEsp32I2s1400KbpsMethod (line 238) | typedef NeoEsp32I2s1400KbpsMethod X1400KbpsMethod;
type NeoEsp32I2s1800KbpsMethod (line 239) | typedef NeoEsp32I2s1800KbpsMethod X1800KbpsMethod;
type NeoEsp32I2s1Tm1814Method (line 240) | typedef NeoEsp32I2s1Tm1814Method X1Tm1814Method;
type NeoEsp32I2s1Tm1829Method (line 241) | typedef NeoEsp32I2s1Tm1829Method X1Tm1829Method;
type NeoEsp32I2s1Apa106Method (line 242) | typedef NeoEsp32I2s1Apa106Method X1Apa106Method;
type NeoEsp32I2s1Ws2805Method (line 243) | typedef NeoEsp32I2s1Ws2805Method X1Ws2805Method;
type NeoEsp32I2s1Tm1914Method (line 244) | typedef NeoEsp32I2s1Tm1914Method X1Tm1914Method;
function class (line 340) | class PolyBus {
function getPixelColor (line 899) | [[gnu::hot]] static uint32_t getPixelColor(void* busPtr, uint8_t busType...
function cleanup (line 1014) | static void cleanup(void* busPtr, uint8_t busType) {
function getDataSize (line 1111) | static unsigned getDataSize(void* busPtr, uint8_t busType) {
function memUsage (line 1212) | static unsigned memUsage(unsigned count, unsigned busType) {
function resetChannelTracking (line 1283) | static void resetChannelTracking() {
function getI (line 1293) | static uint8_t getI(uint8_t busType, const uint8_t* pins, uint8_t driver...
FILE: wled00/button.cpp
function shortPressAction (line 18) | void shortPressAction(uint8_t b)
function longPressAction (line 39) | void longPressAction(uint8_t b)
function doublePressAction (line 72) | void doublePressAction(uint8_t b)
function isButtonPressed (line 93) | bool isButtonPressed(uint8_t b)
function handleSwitch (line 124) | void handleSwitch(uint8_t b)
function handleAnalog (line 170) | void handleAnalog(uint8_t b)
function handleButton (line 258) | void handleButton()
function handleIO (line 364) | void handleIO()
function handleOnOff (line 373) | void handleOnOff(bool forceOff)
function touchButtonISR (line 399) | void IRAM_ATTR touchButtonISR()
FILE: wled00/cfg.cpp
function sumPinsRequired (line 25) | static constexpr unsigned sumPinsRequired(const unsigned* current, size_...
function validatePinsAndTypes (line 29) | static constexpr bool validatePinsAndTypes(const unsigned* types, unsign...
function getStringFromJson (line 41) | static inline void getStringFromJson(char* dest, const char* src, size_t...
function deserializeConfig (line 45) | bool deserializeConfig(JsonObject doc, bool fromFS) {
function backupConfig (line 773) | bool backupConfig() {
function restoreConfig (line 777) | bool restoreConfig() {
function verifyConfig (line 781) | bool verifyConfig() {
function configBackupExists (line 785) | bool configBackupExists() {
function resetConfig (line 791) | void resetConfig() {
function deserializeConfigFromFS (line 801) | bool deserializeConfigFromFS() {
function serializeConfigToFS (line 819) | void serializeConfigToFS() {
function serializeConfig (line 839) | void serializeConfig(JsonObject root) {
function deserializeConfigSec (line 1271) | bool deserializeConfigSec() {
function serializeConfigSec (line 1325) | void serializeConfigSec() {
FILE: wled00/colors.cpp
function color_blend (line 11) | uint32_t WLED_O2_ATTR IRAM_ATTR color_blend(uint32_t color1, uint32_t co...
function color_fade (line 65) | uint32_t IRAM_ATTR color_fade(uint32_t c1, uint8_t amount, bool video) {
function adjust_color (line 91) | uint32_t adjust_color(uint32_t rgb, uint32_t hueShift, uint32_t lighten,...
function ColorFromPaletteWLED (line 104) | uint32_t ColorFromPaletteWLED(const CRGBPalette16& pal, unsigned index, ...
function setRandomColor (line 133) | void setRandomColor(byte* rgb)
function CRGBPalette16 (line 143) | CRGBPalette16 generateHarmonicRandomPalette(const CRGBPalette16 &basepal...
function CRGBPalette16 (line 240) | CRGBPalette16 generateRandomPalette() // generate fully random palette
function loadCustomPalettes (line 248) | void loadCustomPalettes() {
function hsv2rgb (line 298) | void hsv2rgb(const CHSV32& hsv, uint32_t& rgb) // convert HSV (16bit hue...
function rgb2hsv (line 329) | void rgb2hsv(const uint32_t rgb, CHSV32& hsv) // convert RGB to HSV (16b...
function colorHStoRGB (line 350) | void colorHStoRGB(uint16_t hue, byte sat, byte* rgb) { //hue, sat to rgb
function colorKtoRGB (line 359) | void colorKtoRGB(uint16_t kelvin, byte* rgb) //white spectrum to rgb, calc
function colorCTtoRGB (line 383) | void colorCTtoRGB(uint16_t mired, byte* rgb) //white spectrum to rgb, bins
function colorXYtoRGB (line 406) | void colorXYtoRGB(float x, float y, byte* rgb) //coordinates to rgb (htt...
function colorRGBtoXY (line 462) | void colorRGBtoXY(const byte* rgb, float* xy) //rgb to coordinates (http...
function colorFromDecOrHexString (line 473) | void colorFromDecOrHexString(byte* rgb, const char* in)
function colorFromHexString (line 494) | bool colorFromHexString(byte* rgb, const char* in) {
function minf (line 514) | static inline float minf(float v, float w)
function maxf (line 520) | static inline float maxf(float v, float w)
function colorBalanceFromKelvin (line 528) | uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb)
function approximateKelvinFromRGB (line 550) | uint16_t approximateKelvinFromRGB(uint32_t rgb) {
FILE: wled00/colors.h
type CRGBW (line 16) | struct CRGBW {
type CHSV32 (line 71) | struct CHSV32 { // 32bit HSV color with 16bit hue for more accurate conv...
function class (line 96) | class NeoGammaWLEDMethod {
function color_blend16 (line 118) | inline uint32_t color_blend16(uint32_t c1, uint32_t c2, uint16_t b) { re...
function getPaletteCount (line 127) | inline size_t getPaletteCount() { return FIXED_PALETTE_COUNT + customPal...
function colorFromRgbw (line 128) | inline uint32_t colorFromRgbw(byte* rgbw) { return uint32_t((byte(rgbw[3...
function CHSV (line 132) | inline CHSV rgb2hsv(const CRGB c) { CHSV32 hsv; rgb2hsv((uint32_t((byte(...
function fast_color_scale (line 145) | static inline uint32_t fast_color_scale(const uint32_t c, const uint8_t ...
FILE: wled00/data/common.js
function H (line 4) | function H(pg="") { window.open("https://kno.wled.ge/"+pg); }
function GH (line 5) | function GH() { window.open("https://github.com/wled-dev/WLED"); }
function gId (line 6) | function gId(c) { return d.getElementById(c); } // getElementById
function cE (line 7) | function cE(e) { return d.createElement(e); } // createElement
function gEBCN (line 8) | function gEBCN(c) { return d.getElementsByClassName(c); } // getElemen...
function gN (line 9) | function gN(s) { return d.getElementsByName(s)[0]; } // getElements...
function isE (line 10) | function isE(o) { return Object.keys(o).length === 0; } // isEmpty
function isO (line 11) | function isO(i) { return (i && typeof i === 'object' && !Array.isArr...
function isN (line 12) | function isN(n) { return !isNaN(parseFloat(n)) && isFinite(n); } // ...
function isF (line 14) | function isF(n) { return n === +n && n !== (n|0); } // isFloat
function isI (line 15) | function isI(n) { return n === +n && n === (n|0); } // isInteger
function toggle (line 16) | function toggle(el) { gId(el).classList.toggle("hide"); let n = gId('No'...
function tooltip (line 17) | function tooltip(cont=null) {
function loadResources (line 55) | function loadResources(files, init) {
function loadJS (line 87) | function loadJS(FILE_URL, async = true, preGetV = undefined, postGetV = ...
function getLoc (line 106) | function getLoc() {
function getURL (line 128) | function getURL(path) { return (loc ? locproto + "//" + locip : "") + pa...
function B (line 129) | function B() { window.open(getURL("/settings"),"_self"); }
function showToast (line 131) | function showToast(text, error = false) {
function uploadFile (line 140) | async function uploadFile(fileObj, name, callback) {
function connectWs (line 162) | function connectWs(onOpen) {
function sendDDP (line 185) | function sendDDP(ws, start, len, colors) {
FILE: wled00/data/icons-ui/demo-files/demo.js
function updateTest (line 17) | function updateTest() {
function updateSize (line 23) | function updateSize() {
FILE: wled00/data/index.js
function handleVisibilityChange (line 65) | function handleVisibilityChange() {if (!d.hidden && new Date () - lastUp...
function sCol (line 66) | function sCol(na, col) {d.documentElement.style.setProperty(na, col);}
function gId (line 67) | function gId(c) {return d.getElementById(c);}
function gEBCN (line 68) | function gEBCN(c) {return d.getElementsByClassName(c);}
function isEmpty (line 69) | function isEmpty(o) {for (const i in o) return false; return true;}
function isObj (line 70) | function isObj(i) {return (i && typeof i === 'object' && !Array.isArray(...
function isNumeric (line 71) | function isNumeric(n) {return !isNaN(parseFloat(n)) && isFinite(n);}
function isRgbBlack (line 74) | function isRgbBlack(a) {return (parseInt(a.r) == 0 && parseInt(a.g) == 0...
function rgbStr (line 77) | function rgbStr(a) {return "rgb(" + a.r + "," + a.g + "," + a.b + ")";}
function rgbBri (line 80) | function rgbBri(a) {return 0.2126*parseInt(a.r) + 0.7152*parseInt(a.g) +...
function setCSL (line 83) | function setCSL(cs)
function applyCfg (line 97) | function applyCfg()
function tglHex (line 114) | function tglHex()
function tglTheme (line 120) | function tglTheme()
function tglLabels (line 126) | function tglLabels()
function tglRgb (line 132) | function tglRgb()
function cTheme (line 139) | function cTheme(light) {
function loadBg (line 187) | function loadBg() {
function loadSkinCSS (line 211) | function loadSkinCSS(cId) {
function getURL (line 224) | function getURL(path) {
function onLoad (line 227) | function onLoad()
function updateTablinks (line 315) | function updateTablinks(tabI)
function openTab (line 322) | function openTab(tabI, force = false)
function handleLocationHash (line 337) | function handleLocationHash() {
function showToast (line 347) | function showToast(text, error = false)
function showErrorToast (line 359) | function showErrorToast()
function clearErrorToast (line 365) | function clearErrorToast(n=5000)
function getRuntimeStr (line 377) | function getRuntimeStr(rt)
function inforow (line 392) | function inforow(key, val, unit = "")
function getLowestUnusedP (line 397) | function getLowestUnusedP()
function checkUsed (line 405) | function checkUsed(i)
function pName (line 414) | function pName(i)
function isPlaylist (line 421) | function isPlaylist(i)
function papiVal (line 428) | function papiVal(i)
function qlName (line 437) | function qlName(i)
function cpBck (line 443) | function cpBck()
function presetError (line 453) | function presetError(empty)
function restore (line 481) | function restore(txt) {
function loadPresets (line 494) | async function loadPresets() {
function loadPalettes (line 510) | async function loadPalettes(retry=0) {
function loadFX (line 530) | async function loadFX(retry=0) {
function loadFXData (line 550) | async function loadFXData(retry=0) {
function populateQL (line 573) | function populateQL()
function populatePresets (line 587) | function populatePresets(fromls)
function parseInfo (line 628) | function parseInfo(i) {
function populateInfo (line 681) | function populateInfo(i)
function populateSegments (line 730) | function populateSegments(s)
function populateEffects (line 909) | function populateEffects()
function populatePalettes (line 956) | function populatePalettes()
function redrawPalPrev (line 990) | function redrawPalPrev()
function genPalPrevCss (line 1000) | function genPalPrevCss(id)
function generateListItemHtml (line 1045) | function generateListItemHtml(listName, id, name, clickAction, extraHtml...
function btype (line 1059) | function btype(b)
function bname (line 1081) | function bname(o)
function populateNodes (line 1087) | function populateNodes(i,n)
function loadNodes (line 1112) | function loadNodes()
function updateTrail (line 1131) | function updateTrail(e)
function toggleBubble (line 1147) | function toggleBubble(e)
function updateLen (line 1154) | function updateLen(s)
function updatePA (line 1228) | function updatePA()
function updateUI (line 1250) | function updateUI()
function updateSelectedPalette (line 1292) | function updateSelectedPalette(s)
function updateSelectedFx (line 1322) | function updateSelectedFx()
function displayRover (line 1370) | function displayRover(i,s)
function cmpP (line 1378) | function cmpP(a, b)
function makeWS (line 1390) | function makeWS() {
function readState (line 1427) | function readState(s,command=false)
function setEffectParameters (line 1563) | function setEffectParameters(idx)
function requestJson (line 1686) | async function requestJson(command=null, retry=0) {
function togglePower (line 1751) | function togglePower()
function toggleNl (line 1765) | function toggleNl()
function toggleSync (line 1778) | function toggleSync()
function toggleLiveview (line 1788) | function toggleLiveview()
function toggleInfo (line 1809) | function toggleInfo()
function toggleNodes (line 1819) | function toggleNodes()
function makeSeg (line 1829) | function makeSeg()
function resetUtil (line 1873) | function resetUtil(off=false)
function makePlSel (line 1890) | function makePlSel(p, el)
function refreshPlE (line 1904) | function refreshPlE(p)
function addPl (line 1925) | function addPl(p,i)
function delPl (line 1934) | function delPl(p,i)
function plePs (line 1944) | function plePs(p,i,field)
function pleDur (line 1949) | function pleDur(p,i,field)
function pleTr (line 1955) | function pleTr(p,i,field)
function plR (line 1968) | function plR(p)
function plM (line 1983) | function plM(p)
function makeP (line 1994) | function makeP(i,pl)
function makePUtil (line 2082) | function makePUtil()
function makePlEntry (line 2099) | function makePlEntry(p,i)
function makePlUtil (line 2127) | function makePlUtil()
function resetPUtil (line 2145) | function resetPUtil()
function tglCs (line 2155) | function tglCs(i)
function tglSegn (line 2162) | function tglSegn(s)
function selSegAll (line 2174) | function selSegAll(o)
function selSegEx (line 2181) | function selSegEx(s)
function selSeg (line 2189) | function selSeg(s)
function selGrp (line 2196) | function selGrp(g)
function rptSeg (line 2209) | function rptSeg(s)
function setSeg (line 2234) | function setSeg(s)
function delSeg (line 2269) | function delSeg(s)
function setRev (line 2280) | function setRev(s)
function setRevY (line 2287) | function setRevY(s)
function setMi (line 2294) | function setMi(s)
function setMiY (line 2301) | function setMiY(s)
function setM12 (line 2308) | function setM12(s)
function setSi (line 2315) | function setSi(s)
function setBm (line 2322) | function setBm(s)
function setTp (line 2329) | function setTp(s)
function setGrp (line 2336) | function setGrp(s, g)
function setSegPwr (line 2344) | function setSegPwr(s)
function setSegBri (line 2351) | function setSegBri(s)
function tglFreeze (line 2357) | function tglFreeze(s=null)
function setFX (line 2368) | function setFX(ind = null)
function setPalette (line 2385) | function setPalette(paletteId = null)
function setBri (line 2402) | function setBri()
function setSpeed (line 2408) | function setSpeed()
function setIntensity (line 2414) | function setIntensity()
function setCustom (line 2420) | function setCustom(i=1)
function setOption (line 2431) | function setOption(i=1, v=false)
function setLor (line 2441) | function setLor(i)
function setPreset (line 2447) | function setPreset(i)
function saveP (line 2463) | function saveP(i,pl)
function testPl (line 2525) | function testPl(i,bt) {
function stopPl (line 2540) | function stopPl() {
function delP (line 2544) | function delP(i) {
function selectSlot (line 2559) | function selectSlot(b)
function pC (line 2575) | function pC(col)
function updatePSliders (line 2589) | function updatePSliders() {
function hexEnter (line 2623) | function hexEnter()
function segEnter (line 2628) | function segEnter(s) {
function fromHex (line 2632) | function fromHex()
function setPicker (line 2645) | function setPicker(rgb) {
function fromH (line 2654) | function fromH()
function fromS (line 2659) | function fromS()
function fromV (line 2664) | function fromV()
function fromK (line 2669) | function fromK()
function fromRgb (line 2674) | function fromRgb()
function fromW (line 2687) | function fromW()
function setColor (line 2697) | function setColor(sr)
function setBalance (line 2715) | function setBalance(b)
function rmtTgl (line 2721) | function rmtTgl(ip,i) {
function openGH (line 2752) | function openGH() { window.open("https://github.com/wled/WLED/wiki"); }
function cnfReset (line 2755) | function cnfReset()
function rSegs (line 2767) | function rSegs()
function loadPalettesData (line 2788) | function loadPalettesData() {
function getPalettesData (line 2815) | function getPalettesData(page, callback, retry=0) {
function search (line 2845) | function search(field, listId = null) {
function clean (line 2909) | function clean(clearButton) {
function initFilters (line 2916) | function initFilters() {
function filterFocus (line 2920) | function filterFocus(e) {
function filterFx (line 2945) | function filterFx() {
function preventBlur (line 2958) | function preventBlur(e) {
function formatArr (line 2964) | function formatArr(pl) {
function expand (line 2991) | function expand(i)
function unfocusSliders (line 3033) | function unfocusSliders()
function unify (line 3045) | function unify(e) { return e.changedTouches ? e.changedTouches[0] : e; }
function hasIroClass (line 3047) | function hasIroClass(classList)
function lock (line 3054) | function lock(e)
function move (line 3068) | function move(e)
function size (line 3090) | function size()
function togglePcMode (line 3102) | function togglePcMode(fromB = false)
function mergeDeep (line 3119) | function mergeDeep(target, ...sources)
function tooltip (line 3137) | function tooltip(cont=null)
function simplifyUI (line 3177) | function simplifyUI() {
function checkVersionUpgrade (line 3271) | function checkVersionUpgrade(info) {
function showVersionUpgradePrompt (line 3327) | function showVersionUpgradePrompt(info, oldVersion, newVersion) {
function reportUpgradeEvent (line 3394) | function reportUpgradeEvent(info, oldVersion, alwaysReport) {
function updateVersionInfo (line 3454) | function updateVersionInfo(version, neverAsk, alwaysReport) {
FILE: wled00/data/iro.js
function M (line 7) | function M(t,n){for(var i in n)t[i]=n[i];return t}
function y (line 7) | function y(t){var n=t.parentNode;n&&n.removeChild(t)}
function h (line 7) | function h(t,n,i){var r,e,u,o,l=arguments;if(n=M({},n),3<arguments.lengt...
function c (line 7) | function c(t,n,i,r){var e={type:t,props:n,key:i,ref:r,n:null,i:null,e:0,...
function O (line 7) | function O(t){return t.children}
function I (line 7) | function I(t,n){this.props=t,this.context=n}
function w (line 7) | function w(t,n){if(null==n)return t.i?w(t.i,t.i.n.indexOf(t)+1):null;for...
function a (line 7) | function a(t){var n,i;if(null!=(t=t.i)&&null!=t.c){for(t.o=t.c.base=null...
function e (line 7) | function e(t){(!t.f&&(t.f=!0)&&1===s.push(t)||i!==m.debounceRendering)&&...
function u (line 7) | function u(){var t,n,i,r,e,u,o,l;for(s.sort(function(t,n){return n.d.e-t...
function S (line 7) | function S(n,i,t,r,e,u,o,l,s){var c,a,f,h,v,d,g,b=t&&t.n||j,p=b.length;i...
function A (line 7) | function A(t,n,i){if(null==i&&(i=[]),null==t||"boolean"==typeof t)n&&i.p...
function f (line 7) | function f(t,n,i){"-"===n[0]?t.setProperty(n,i):t[n]="number"==typeof i&...
function R (line 7) | function R(t,n,i,r,e){var u,o,l,s,c;if("key"===(n=e?"className"===n?"cla...
function v (line 7) | function v(t){return this.t[t.type](m.event?m.event(t):t)}
function k (line 7) | function k(t,n,i,r,e,u,o,l,s,c){var a,f,h,v,d,g,b,p,y,w,k=n.type;if(void...
function d (line 7) | function d(t,n){for(var i;i=t.pop();)try{i.componentDidMount()}catch(t){...
function E (line 7) | function E(t,n,i){try{"function"==typeof t?t(n):t.current=n}catch(t){m.o...
function N (line 7) | function N(t,n,i){var r,e,u;if(m.unmount&&m.unmount(t),(r=t.ref)&&E(r,nu...
function z (line 7) | function z(t,n,i){return this.constructor(t,i)}
function g (line 7) | function g(t,n){for(var i=0;i<n.length;i++){var r=n[i];r.enumerable=r.en...
function b (line 7) | function b(){return(b=Object.assign||function(t){for(var n=arguments,i=1...
function J (line 7) | function J(t,n,i){return Math.min(Math.max(t,n),i)}
function K (line 7) | function K(t,n){var i=-1<t.indexOf("%"),r=parseFloat(t);return i?n/100*r:r}
function Q (line 7) | function Q(t){return parseInt(t,16)}
function U (line 7) | function U(t){return t.toString(16).padStart(2,"0")}
function l (line 7) | function l(t,n){this.$={h:0,s:0,v:0,a:1},t&&this.set(t),this.onChange=n,...
function X (line 7) | function X(t){var n,i=t.width,r=t.sliderSize,e=t.borderWidth,u=t.handleR...
function Y (line 7) | function Y(t,n){var i=X(t),r=i.width,e=i.height,u=i.handleRange,o=i.hand...
function et (line 7) | function et(t){return t.width/2-t.padding-t.handleRadius-t.borderWidth}
function ut (line 7) | function ut(t){var n=t.width/2;return{width:t.width,radius:n-t.borderWid...
function ot (line 7) | function ot(t,n,i){var r=t.wheelAngle,e=t.wheelDirection;return i&&"cloc...
function lt (line 7) | function lt(t,n,i){var r=ut(t),e=r.cx,u=r.cy,o=et(t);n=e-n,i=u-i;var l=o...
function st (line 7) | function st(t){var n=t.width,i=t.boxHeight;return{width:n,height:null!=i...
function ct (line 7) | function ct(t,n,i){var r=st(t),e=r.width,u=r.height,o=r.radius,l=(n-o)/(...
function at (line 7) | function at(t,n,i,r){for(var e=0;e<r.length;e++){var u=r[e].x-n,o=r[e].y...
function ft (line 7) | function ft(t){return{boxSizing:"border-box",border:t.borderWidth+"px so...
function ht (line 7) | function ht(t,n,i){return t+"-gradient("+n+", "+i.map(function(t){var n=...
function vt (line 7) | function vt(t){return"string"==typeof t?t:t+"px"}
function t (line 7) | function t(t){n.call(this,t),this.uid=(Math.random()+1).toString(36).sub...
function bt (line 7) | function bt(t){var n=t.r,i=t.url,r=n,e=n;return h("svg",{className:"IroH...
function pt (line 7) | function pt(e){var t=e.activeIndex,u=void 0!==t&&t<e.colors.length?e.col...
function yt (line 7) | function yt(e){var t=st(e),r=t.width,u=t.height,o=t.radius,l=e.colors,s=...
function wt (line 7) | function wt(e){var r=ut(e).width,u=e.colors,o=(e.borderWidth,e.parent),l...
function t (line 7) | function t(t){var n=this;i.call(this,t),this.colors=[],this.inputActive=...
function It (line 7) | function It(n,t){var i,r=document.createElement("div");function e(){var ...
FILE: wled00/data/pixart/boxdraw.js
function drawBoxes (line 1) | function drawBoxes(inputPixelArray, widthPixels, heightPixels) {
FILE: wled00/data/pixart/getPixelValues.js
function getPixelRGBValues (line 1) | function getPixelRGBValues(base64Image) {
FILE: wled00/data/pixart/pixart.js
function gen (line 16) | function gen(){
function postPixels (line 121) | async function postPixels() {
function zoneClicked (line 174) | function zoneClicked(e) {
function dragEnter (line 182) | function dragEnter(e) {
function dragOver (line 188) | function dragOver(e) {
function dropped (line 193) | function dropped(e) {
function filePicked (line 203) | function filePicked(e) {
function updatePreview (line 210) | function updatePreview(file) {
function isValidBase64Gif (line 222) | function isValidBase64Gif(string) {
function switchScale (line 249) | function switchScale() {
function generateSegmentOptions (line 270) | function generateSegmentOptions(array) {
function getSegments (line 290) | async function getSegments() {
function generateSegmentArray (line 334) | function generateSegmentArray(noOfSegments) {
FILE: wled00/data/pixelforge/omggif.js
function GifWriter (line 29) | function GifWriter(buf, width, height, gopts) {
function GifWriterOutputLZWCodeStream (line 225) | function GifWriterOutputLZWCodeStream(buf, p, min_code_size, index_strea...
function GifReader (line 366) | function GifReader(buf) {
function GifReaderLZWOutputIndexStream (line 662) | function GifReaderLZWOutputIndexStream(code_stream, p, output, output_le...
FILE: wled00/data/rangetouch.js
function e (line 7) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
function t (line 7) | function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
function n (line 7) | function n(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){va...
function r (line 7) | function r(e){for(var r=1;r<arguments.length;r++){var i=null!=arguments[...
function u (line 7) | function u(e,t){return function(){return Array.from(document.querySelect...
function v (line 7) | function v(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\...
function t (line 7) | function t(e,n){(function(e,t){if(!(e instanceof t))throw new TypeError(...
FILE: wled00/dmx_input.cpp
function rdmPersonalityChangedCb (line 12) | void rdmPersonalityChangedCb(dmx_port_t dmxPort, const rdm_header_t *hea...
function rdmAddressChangedCb (line 30) | void rdmAddressChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
function dmx_config_t (line 48) | static dmx_config_t createConfig()
function dmxReceiverTask (line 90) | void dmxReceiverTask(void *context)
FILE: wled00/dmx_output.cpp
function handleDMXOutput (line 15) | void handleDMXOutput()
function initDMXOutput (line 71) | void initDMXOutput() {
function initDMXOutput (line 79) | void initDMXOutput(){}
function handleDMXOutput (line 80) | void handleDMXOutput() {}
FILE: wled00/e131.cpp
function handleDDPPacket (line 20) | static void handleDDPPacket(e131_packet_t* p) {
function handleE131Packet (line 72) | void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
function handleDMXData (line 137) | void handleDMXData(uint16_t uni, uint16_t dmxChannels, uint8_t* e131_dat...
function handleArtnetPollReply (line 346) | static void handleArtnetPollReply(IPAddress ipAddress) {
function prepareArtnetPollReply (line 412) | static void prepareArtnetPollReply(ArtPollReply *reply) {
function sendArtnetPollReply (line 531) | static void sendArtnetPollReply(ArtPollReply *reply, IPAddress ipAddress...
FILE: wled00/fcn_declare.h
function DefaultType (line 52) | DefaultType defaultValue) {
function writeObjectToFileUsingId (line 115) | inline bool writeObjectToFileUsingId(const String &file, uint16_t id, co...
function writeObjectToFile (line 116) | inline bool writeObjectToFile(const String &file, const char* key, const...
type ImprovRPCType (line 147) | enum ImprovRPCType {
function applyTemporaryPreset (line 244) | inline bool applyTemporaryPreset() {return applyPreset(255);}
function saveTemporaryPreset (line 246) | inline void saveTemporaryPreset() {savePreset(255);}
type um_types_t (line 283) | typedef enum UM_Data_Types {
type um_data_t (line 299) | typedef struct UM_Exchange_Data {
function class (line 316) | class Usermod {
function namespace (line 357) | namespace UsermodManager {
function hw_random (line 448) | inline uint32_t hw_random() { return HW_RND_REGISTER; }
function hw_random16 (line 451) | inline uint16_t hw_random16() { return HW_RND_REGISTER; }
function hw_random16 (line 452) | inline uint16_t hw_random16(uint32_t upperlimit) { return (hw_random16()...
function hw_random16 (line 453) | inline int16_t hw_random16(int32_t lowerlimit, int32_t upperlimit) { int...
function hw_random8 (line 454) | inline uint8_t hw_random8() { return HW_RND_REGISTER; }
function hw_random8 (line 455) | inline uint8_t hw_random8(uint32_t upperlimit) { return (hw_random8() * ...
function hw_random8 (line 456) | inline uint8_t hw_random8(uint32_t lowerlimit, uint32_t upperlimit) { ui...
function d_free (line 465) | inline void d_free(void *ptr) { heap_caps_free(ptr); }
function d_free (line 467) | inline void d_free(void *ptr) { free(ptr); }
function p_free (line 474) | inline void p_free(void *ptr) { heap_caps_free(ptr); }
function getFreeHeapSize (line 483) | inline size_t getFreeHeapSize() { return heap_caps_get_free_size(MALLOC_...
function getContiguousFreeHeap (line 484) | inline size_t getContiguousFreeHeap() { return heap_caps_get_largest_fre...
function getFreeHeapSize (line 486) | inline size_t getFreeHeapSize() { return ESP.getFreeHeap(); }
function getContiguousFreeHeap (line 487) | inline size_t getContiguousFreeHeap() { return ESP.getMaxFreeBlockSize(); }
function class (line 503) | class JSONBufferGuard {
function holding_lock (line 510) | inline JSONBufferGuard(JSONBufferGuard&& r) : holding_lock(r.holding_loc...
function release (line 514) | inline void release() { if (holding_lock) releaseJSONBufferLock(); holdi...
FILE: wled00/file.cpp
function closeFile (line 36) | void closeFile() {
function bufferedFind (line 48) | static bool bufferedFind(const char *target, bool fromStart = true) {
function bufferedFindSpace (line 84) | static bool bufferedFindSpace(size_t targetLen, bool fromStart = true) {
function bufferedFindObjectEnd (line 133) | static bool bufferedFindObjectEnd() {
function writeSpace (line 165) | static void writeSpace(size_t l)
function appendObjectToFile (line 179) | static bool appendObjectToFile(const char* key, const JsonDocument* cont...
function writeObjectToFileUsingId (line 258) | bool writeObjectToFileUsingId(const char* file, uint16_t id, const JsonD...
function writeObjectToFile (line 265) | bool writeObjectToFile(const char* file, const char* key, const JsonDocu...
function readObjectFromFileUsingId (line 330) | bool readObjectFromFileUsingId(const char* file, uint16_t id, JsonDocume...
function readObjectFromFile (line 338) | bool readObjectFromFile(const char* file, const char* key, JsonDocument*...
function updateFSInfo (line 365) | void updateFSInfo() {
function handleFileRead (line 424) | bool handleFileRead(AsyncWebServerRequest* request, String path){
function copyFile (line 447) | bool copyFile(const char* src_path, const char* dst_path) {
function compareFiles (line 485) | bool compareFiles(const char* path1, const char* path2) {
function backupFile (line 523) | bool backupFile(const char* filename) {
function restoreFile (line 540) | bool restoreFile(const char* filename) {
function checkBackupExists (line 563) | bool checkBackupExists(const char* filename) {
function validateJsonFile (line 569) | bool validateJsonFile(const char* filename) {
function dumpFilesToSerial (line 585) | void dumpFilesToSerial() {
FILE: wled00/hue.cpp
function handleHue (line 9) | void handleHue()
function reconnectHue (line 34) | void reconnectHue()
function onHueError (line 48) | void onHueError(void* arg, AsyncClient* client, int8_t error)
function onHueConnect (line 54) | void onHueConnect(void* arg, AsyncClient* client)
function sendHuePoll (line 60) | void sendHuePoll()
function onHueData (line 84) | void onHueData(void* arg, AsyncClient* client, void *data, size_t len)
function handleHue (line 206) | void handleHue(){}
function reconnectHue (line 207) | void reconnectHue(){}
FILE: wled00/image_loader.cpp
function fileSeekCallback (line 18) | bool fileSeekCallback(unsigned long position) {
function filePositionCallback (line 22) | unsigned long filePositionCallback(void) {
function fileReadCallback (line 26) | int fileReadCallback(void) {
function fileReadBlockCallback (line 30) | int fileReadBlockCallback(void * buffer, int numberOfBytes) {
function fileSizeCallback (line 34) | int fileSizeCallback(void) {
function openGif (line 38) | bool openGif(const char *filename) { // side-effect: updates "file"
function screenClearCallback (line 51) | void screenClearCallback(void) {
function updateScreenCallback (line 56) | void updateScreenCallback(void) {
function drawPixelCallbackNoScale (line 69) | void drawPixelCallbackNoScale(int16_t x, int16_t y, uint8_t red, uint8_t...
function drawPixelCallback1D (line 73) | void drawPixelCallback1D(int16_t x, int16_t y, uint8_t red, uint8_t gree...
function drawPixelCallback2D (line 84) | void drawPixelCallback2D(int16_t x, int16_t y, uint8_t red, uint8_t gree...
function byte (line 111) | byte renderImageToSegment(Segment &seg) {
function endImagePlayback (line 225) | void endImagePlayback(Segment *seg) {
FILE: wled00/improv.cpp
type ImprovPacketType (line 22) | enum ImprovPacketType {
type ImprovPacketByte (line 29) | enum ImprovPacketByte {
function handleImprovPacket (line 41) | void handleImprovPacket() {
function sendImprovStateResponse (line 131) | void sendImprovStateResponse(uint8_t state, bool error) {
function sendImprovRPCResult (line 148) | void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings, const ch...
function sendImprovIPRPCResult (line 180) | void sendImprovIPRPCResult(ImprovRPCType type) {
function sendImprovInfoResponse (line 196) | void sendImprovInfoResponse() {
function startImprovWifiScan (line 219) | void startImprovWifiScan() {
function handleImprovWifiScan (line 225) | void handleImprovWifiScan() {
function startImprovWifiScan (line 251) | void startImprovWifiScan() {}
function handleImprovWifiScan (line 252) | void handleImprovWifiScan() {}
function parseWiFiCommand (line 255) | static void parseWiFiCommand(char* rpcData) {
FILE: wled00/ir.cpp
function incBrightness (line 38) | static void incBrightness()
function decBrightness (line 53) | static void decBrightness()
function presetFallback (line 67) | static void presetFallback(uint8_t presetID, uint8_t effectID, uint8_t p...
function byte (line 72) | static byte relativeChange(byte property, int8_t amount, byte lowerBound...
function changeEffect (line 81) | static void changeEffect(uint8_t fx)
function changePalette (line 97) | static void changePalette(uint8_t pal)
function changeEffectSpeed (line 113) | static void changeEffectSpeed(int8_t amount)
function changeEffectIntensity (line 157) | static void changeEffectIntensity(int8_t amount)
function changeColor (line 199) | static void changeColor(uint32_t c, int16_t cct=-1)
function changeWhite (line 240) | static void changeWhite(int8_t amount, int16_t cct=-1)
function decodeIR24 (line 250) | static void decodeIR24(uint32_t code)
function decodeIR24OLD (line 282) | static void decodeIR24OLD(uint32_t code)
function decodeIR24CT (line 314) | static void decodeIR24CT(uint32_t code)
function decodeIR40 (line 346) | static void decodeIR40(uint32_t code)
function decodeIR44 (line 399) | static void decodeIR44(uint32_t code)
function decodeIR21 (line 451) | static void decodeIR21(uint32_t code)
function decodeIR6 (line 480) | static void decodeIR6(uint32_t code)
function decodeIR9 (line 513) | static void decodeIR9(uint32_t code)
function decodeIRJson (line 554) | static void decodeIRJson(uint32_t code)
function applyRepeatActions (line 633) | static void applyRepeatActions()
function decodeIR (line 661) | static void decodeIR(uint32_t code)
function initIR (line 699) | void initIR()
function deInitIR (line 707) | void deInitIR()
function handleIR (line 716) | void handleIR()
FILE: wled00/json.cpp
function differs (line 40) | uint8_t differs(const Segment& b, const SegmentCopy& a) {
function deserializeSegment (line 71) | static bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0)
function deserializeState (line 370) | bool deserializeState(JsonObject root, byte callMode, byte presetId)
function serializeSegment (line 566) | static void serializeSegment(JsonObject& root, const Segment& seg, byte ...
function serializeState (line 637) | void serializeState(JsonObject root, bool forPreset, bool includeBri, bo...
function serializeInfo (line 696) | void serializeInfo(JsonObject root)
function setPaletteColors (line 901) | static void setPaletteColors(JsonArray json, CRGBPalette16 palette)
function setPaletteColors (line 913) | static void setPaletteColors(JsonArray json, byte* tcp)
function serializePalettes (line 941) | void serializePalettes(JsonObject root, int page)
function serializeNetworks (line 1005) | void serializeNetworks(JsonObject root)
function serializeNodes (line 1034) | void serializeNodes(JsonObject root)
function serializePins (line 1052) | void serializePins(JsonObject root)
function serializeModeData (line 1167) | void serializeModeData(JsonArray fxdata)
function serializeModeNames (line 1183) | void serializeModeNames(JsonArray arr)
class LockedJsonResponse (line 1198) | class LockedJsonResponse: public AsyncJsonResponse {
method LockedJsonResponse (line 1205) | inline LockedJsonResponse(JsonDocument* doc, bool isArray) : AsyncJson...
method _fillBuffer (line 1207) | virtual size_t _fillBuffer(uint8_t *buf, size_t maxLen) {
function serveJson (line 1221) | void serveJson(AsyncWebServerRequest* request)
function serveLiveLeds (line 1310) | bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
FILE: wled00/led.cpp
function setValuesFromSegment (line 8) | void setValuesFromSegment(uint8_t s) {
function applyValuesToSelectedSegs (line 26) | void applyValuesToSelectedSegs() {
function toggleOnOff (line 42) | void toggleOnOff()
function byte (line 58) | byte scaledBri(byte in)
function applyBri (line 67) | void applyBri() {
function applyFinalBri (line 77) | void applyFinalBri() {
function stateUpdated (line 87) | void stateUpdated(byte callMode) {
function updateInterfaces (line 142) | void updateInterfaces(uint8_t callMode) {
function handleTransitions (line 163) | void handleTransitions() {
function colorUpdated (line 188) | void colorUpdated(byte callMode) {
function handleNightlight (line 194) | void handleNightlight() {
function get_millisecond_timer (line 274) | uint32_t get_millisecond_timer() {
FILE: wled00/lx_parser.cpp
function parseLx (line 8) | bool parseLx(int lxValue, byte* rgbw)
function parseLxJson (line 49) | void parseLxJson(int lxValue, byte segId, bool secondary)
FILE: wled00/mqtt.cpp
function parseMQTTBriPayload (line 19) | static void parseMQTTBriPayload(char* payload)
function onMqttConnect (line 32) | static void onMqttConnect(bool sessionPresent)
function onMqttMessage (line 66) | static void onMqttMessage(char* topic, char* payload, AsyncMqttClientMes...
class bufferPrint (line 140) | class bufferPrint : public Print {
method bufferPrint (line 145) | bufferPrint(char* buf, size_t size) : _buf(buf), _size(size), _offset(...
method write (line 147) | size_t write(const uint8_t *buffer, size_t size) {
method write (line 154) | size_t write(uint8_t c) {
method size (line 159) | size_t size() const { return _offset; }
method capacity (line 160) | size_t capacity() const { return _size; }
function publishMqtt (line 165) | void publishMqtt()
function initMqtt (line 197) | bool initMqtt()
FILE: wled00/net_debug.h
function class (line 7) | class NetworkDebugPrinter : public Print {
FILE: wled00/network.cpp
function initEthernet (line 160) | bool initEthernet()
function getSignalQuality (line 265) | int getSignalQuality(int rssi)
function fillMAC2Str (line 285) | void fillMAC2Str(char *str, const uint8_t *mac) {
function fillStr2MAC (line 292) | void fillStr2MAC(uint8_t *mac, const char *str) {
function findWiFi (line 302) | int findWiFi(bool doScan) {
function isWiFiConfigured (line 338) | bool isWiFiConfigured() {
function WiFiEvent (line 364) | void WiFiEvent(WiFiEvent_t event)
FILE: wled00/ntp.cpp
function updateTimezone (line 156) | void updateTimezone() {
function handleTime (line 170) | void handleTime() {
function handleNetworkTime (line 188) | void handleNetworkTime()
function sendNTPPacket (line 207) | static void sendNTPPacket()
function isValidNtpResponse (line 237) | static bool isValidNtpResponse(const byte* ntpPacket) {
function checkNTPResponse (line 253) | static bool checkNTPResponse()
function updateLocalTime (line 303) | void updateLocalTime()
function getTimeString (line 310) | void getTimeString(char* out)
function setCountdown (line 327) | void setCountdown()
function checkCountdown (line 335) | bool checkCountdown()
function byte (line 351) | byte weekdayMondayFirst()
function isTodayInDateRange (line 358) | bool isTodayInDateRange(byte monthStart, byte dayStart, byte monthEnd, b...
function checkTimers (line 384) | void checkTimers()
function getSunriseUTC (line 440) | static int getSunriseUTC(int year, int month, int day, float lat, float ...
function calculateSunriseAndSunset (line 493) | void calculateSunriseAndSunset() {
function setTimeFromAPI (line 547) | void setTimeFromAPI(uint32_t timein) {
FILE: wled00/ota_update.cpp
function validateOTA (line 48) | static bool validateOTA(const uint8_t* binaryData, size_t dataSize, char...
type UpdateContext (line 70) | struct UpdateContext {
function endOTA (line 85) | static void endOTA(AsyncWebServerRequest *request) {
function beginOTA (line 115) | static bool beginOTA(AsyncWebServerRequest *request, UpdateContext* cont...
function initOTA (line 159) | bool initOTA(AsyncWebServerRequest *request) {
function setOTAReplied (line 171) | void setOTAReplied(AsyncWebServerRequest *request) {
function getOTAResult (line 178) | std::pair<bool, String> getOTAResult(AsyncWebServerRequest* request) {
function handleOTAData (line 200) | void handleOTAData(AsyncWebServerRequest *request, size_t index, uint8_t...
function markOTAvalid (line 278) | void markOTAvalid() {
class BootloaderImageSizer (line 295) | class BootloaderImageSizer {
method feed (line 298) | bool feed(const uint8_t* data, size_t len) {
method hasError (line 375) | bool hasError() const { return error; }
method isSizeKnown (line 376) | bool isSizeKnown() const { return !error && imageSize != 0 && segments...
method totalSize (line 377) | size_t totalSize() const {
function calculateBootloaderSHA256 (line 403) | static void calculateBootloaderSHA256() {
function String (line 445) | String getBootloaderSHA256Hex() {
function invalidateBootloaderSHA256Cache (line 470) | static void invalidateBootloaderSHA256Cache() {
function verifyBootloaderImage (line 482) | static bool verifyBootloaderImage(const uint8_t* &buffer, size_t &len, S...
type BootloaderUpdateContext (line 558) | struct BootloaderUpdateContext {
function endBootloaderOTA (line 572) | static void endBootloaderOTA(AsyncWebServerRequest *request) {
function initBootloaderOTA (line 596) | bool initBootloaderOTA(AsyncWebServerRequest *request) {
function setBootloaderOTAReplied (line 642) | void setBootloaderOTAReplied(AsyncWebServerRequest *request) {
function getBootloaderOTAResult (line 650) | std::pair<bool, String> getBootloaderOTAResult(AsyncWebServerRequest *re...
function handleBootloaderOTAData (line 678) | void handleBootloaderOTAData(AsyncWebServerRequest *request, size_t inde...
FILE: wled00/overlay.cpp
function _overlayAnalogClock (line 10) | static void _overlayAnalogClock()
function _overlayAnalogCountdown (line 53) | static void _overlayAnalogCountdown()
function handleOverlayDraw (line 93) | void handleOverlayDraw() {
FILE: wled00/pin_manager.cpp
function PinOwner (line 277) | PinOwner PinManager::getPinOwner(byte gpio)
function byte (line 284) | byte PinManager::allocateLedc(byte channels)
FILE: wled00/pin_manager.h
type managed_pin_type (line 20) | typedef struct PinManagerPinType {
function PinOwner (line 34) | enum struct PinOwner : uint8_t {
FILE: wled00/playlist.cpp
type PlaylistEntry (line 7) | struct PlaylistEntry {
function shufflePlaylist (line 28) | void shufflePlaylist() {
function unloadPlaylist (line 45) | void unloadPlaylist() {
function loadPlaylist (line 56) | int16_t loadPlaylist(JsonObject playlistObj, byte presetId) {
function handlePlaylist (line 146) | void handlePlaylist() {
function serializePlaylist (line 180) | void serializePlaylist(JsonObject sObj) {
FILE: wled00/presets.cpp
function presetNeedsSaving (line 25) | bool presetNeedsSaving() {
function doSaveState (line 29) | static void doSaveState() {
function getPresetName (line 87) | bool getPresetName(byte index, String& name)
function initPresetsFile (line 102) | void initPresetsFile()
function applyPresetFromPlaylist (line 119) | bool applyPresetFromPlaylist(byte index)
function applyPreset (line 127) | bool applyPreset(byte index, byte callMode)
function applyPresetWithFallback (line 137) | void applyPresetWithFallback(uint8_t index, uint8_t callMode, uint8_t ef...
function handlePresets (line 145) | void handlePresets()
function savePreset (line 218) | void savePreset(byte index, const char* pname, JsonObject sObj)
function deletePreset (line 280) | void deletePreset(byte index) {
FILE: wled00/remote.cpp
type WizMoteMessageStructure (line 30) | struct WizMoteMessageStructure {
function nightModeActive (line 54) | inline bool nightModeActive() {
function activateNightMode (line 58) | static void activateNightMode() {
function resetNightMode (line 65) | static bool resetNightMode() {
function brightnessUp (line 74) | static void brightnessUp() {
function brightnessDown (line 87) | static void brightnessDown() {
function setOn (line 99) | static void setOn() {
function setOff (line 107) | static void setOff() {
function presetWithFallback (line 115) | static void presetWithFallback(uint8_t presetID, uint8_t effectID, uint8...
function remoteJson (line 121) | static bool remoteJson(int button)
function handleWiZdata (line 188) | void handleWiZdata(uint8_t *incomingData, size_t len) {
function handleRemote (line 213) | void handleRemote() {
function handleRemote (line 240) | void handleRemote() {}
FILE: wled00/set.cpp
function handleSettingsSet (line 8) | void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
function handleSet (line 874) | bool handleSet(AsyncWebServerRequest *request, const String& req, bool a...
FILE: wled00/src/dependencies/dmx/ESPDMX.h
function class (line 21) | class DMXESPSerial {
FILE: wled00/src/dependencies/dmx/SparkFunDMX.cpp
function onTimer (line 65) | void IRAM_ATTR onTimer() {
FILE: wled00/src/dependencies/dmx/SparkFunDMX.h
function class (line 26) | class SparkFunDMX {
FILE: wled00/src/dependencies/e131/ESPAsyncE131.h
type ip4_addr_t (line 45) | typedef struct ip_addr ip4_addr_t;
type e131_packet_t (line 93) | typedef union {
type ArtPollReply (line 159) | typedef union {
function class (line 204) | class ESPAsyncE131 {
function class (line 232) | class E131Priority {
function set (line 245) | void set(uint8_t prio) {
function get (line 251) | uint8_t get() {
FILE: wled00/src/dependencies/espalexa/Espalexa.h
function class (line 65) | class Espalexa {
function renameDevice (line 448) | void renameDevice(uint8_t id, const String& deviceName)
function handleAlexaApiCall (line 457) | bool handleAlexaApiCall(AsyncWebServerRequest* request)
FILE: wled00/src/dependencies/espalexa/EspalexaDevice.cpp
function EspalexaColorMode (line 52) | EspalexaColorMode EspalexaDevice::getColorMode()
function EspalexaDeviceType (line 57) | EspalexaDeviceType EspalexaDevice::getType()
function String (line 62) | String EspalexaDevice::getName()
function EspalexaDeviceProperty (line 67) | EspalexaDeviceProperty EspalexaDevice::getLastChangedProperty()
FILE: wled00/src/dependencies/espalexa/EspalexaDevice.h
type std (line 9) | typedef std::function<void(uint8_t b)> BrightnessCallbackFunction;
type std (line 10) | typedef std::function<void(EspalexaDevice* d)> DeviceCallbackFunction;
type std (line 11) | typedef std::function<void(uint8_t br, uint32_t col)> ColorCallbackFunct...
type class (line 13) | enum class
type class (line 14) | enum class
type class (line 15) | enum class
function class (line 17) | class EspalexaDevice {
FILE: wled00/src/dependencies/json/ArduinoJson-v6.h
function namespace (line 256) | namespace ARDUINOJSON_NAMESPACE {
function VariantData (line 299) | inline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) {
function typename (line 303) | typename TVisitor::result_type arrayAccept(const CollectionData *arr,
function arrayEquals (line 310) | inline bool ar
Condensed preview — 490 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,119K chars).
[
{
"path": ".devcontainer/Dockerfile",
"chars": 914,
"preview": "# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.dev"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 2730,
"preview": "{\n\t\"name\": \"Python 3\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\",\n\t\t\"context\": \"..\",\n\t\t\"args\": { \n\t\t\t// Update 'VARIANT' "
},
{
"path": ".envrc",
"chars": 27,
"preview": "layout python-venv python3\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 131,
"preview": "github: [DedeHai,lost-hope,willmmiles,netmindz,softhack007]\ncustom: ['https://paypal.me/Aircoookie','https://paypal.me/b"
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yml",
"chars": 3020,
"preview": "name: Bug Report\ndescription: File a bug report\nlabels: [\"bug\"]\nbody:\n - type: markdown\n attributes:\n value: |\n"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 510,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: WLED Discord community\n url: https://discord.gg/KuqP7NE\n abou"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 659,
"preview": "---\nname: Feature request\nabout: Suggest an improvement idea for WLED!\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n"
},
{
"path": ".github/copilot-instructions.md",
"chars": 8650,
"preview": "# WLED - ESP32/ESP8266 LED Controller Firmware\n\nWLED is a fast and feature-rich implementation of an ESP32 and ESP8266 w"
},
{
"path": ".github/workflows/build.yml",
"chars": 2418,
"preview": "name: WLED Build\n\n# Only included into other workflows\non:\n workflow_call:\n \njobs:\n\n get_default_envs:\n name: Gath"
},
{
"path": ".github/workflows/nightly.yml",
"chars": 1596,
"preview": "\nname: Deploy Nightly\non:\n # This can be used to automatically publish nightlies at UTC nighttime\n schedule:\n - cro"
},
{
"path": ".github/workflows/pr-merge.yaml",
"chars": 1561,
"preview": " name: Notify Discord on PR Merge\n on:\n workflow_dispatch:\n pull_request_target:\n types: [closed]"
},
{
"path": ".github/workflows/release.yml",
"chars": 948,
"preview": "name: WLED Release CI\n\non:\n push:\n tags:\n - '*'\n\njobs:\n \n wled_build:\n uses: ./.github/workflows/build.yml"
},
{
"path": ".github/workflows/stale.yml",
"chars": 1076,
"preview": "name: 'Close stale issues and PRs'\non:\n schedule:\n - cron: '0 12 * * *'\n workflow_dispatch:\n\njobs:\n stale:\n run"
},
{
"path": ".github/workflows/test.yaml",
"chars": 305,
"preview": "on:\n workflow_dispatch:\n\njobs:\n dispatch:\n runs-on: ubuntu-latest\n steps:\n - name: Repository Dispatch\n "
},
{
"path": ".github/workflows/usermods.yml",
"chars": 2574,
"preview": "name: Usermod CI\n\non:\n pull_request:\n paths:\n - usermods/**\n \njobs:\n\n get_usermod_envs:\n # Only run for "
},
{
"path": ".github/workflows/wled-ci.yml",
"chars": 130,
"preview": "name: WLED CI\n\non:\n push:\n branches:\n - '*'\n pull_request:\n\njobs:\n wled_build:\n uses: ./.github/workflows/"
},
{
"path": ".gitignore",
"chars": 395,
"preview": ".cache\n.clang-format\n.direnv\n.DS_Store\n.idea\n.pio\n.pioenvs\n.piolibdeps\n.vscode\ncompile_commands.json\n__pycache__/\n\n/.dum"
},
{
"path": ".gitpod.Dockerfile",
"chars": 40,
"preview": "FROM gitpod/workspace-full\n\nUSER gitpod\n"
},
{
"path": ".gitpod.yml",
"chars": 221,
"preview": "tasks:\n - command: pip3 install -U platformio && platformio run\n\nimage:\n file: .gitpod.Dockerfile\n\nvscode:\n extension"
},
{
"path": ".nvmrc",
"chars": 6,
"preview": "20.18\n"
},
{
"path": "CHANGELOG.md",
"chars": 58820,
"preview": "## WLED changelog\n\n#### Build 2410270\n- WLED 0.15.0-b7 release\n- Re-license the WLED project from MIT to EUPL (#4194"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3356,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 9146,
"preview": "# Thank you for making WLED better!\n\nWLED is a community-driven project, and every contribution matters! We appreciate y"
},
{
"path": "LICENSE",
"chars": 13866,
"preview": "Copyright (c) 2016-present Christian Schwinne and individual WLED contributors\nLicensed under the EUPL v. 1.2 or later\n\n"
},
{
"path": "boards/adafruit_matrixportal_esp32s3_wled.json",
"chars": 1187,
"preview": "{\n \"build\": {\n \"arduino\":{\n \"ldscript\": \"esp32s3_out.ld\",\n \"partitions\": \"default_8MB.csv\"\n },\n \"cor"
},
{
"path": "boards/lilygo-t7-s3.json",
"chars": 1085,
"preview": "{\n \"build\": {\n \"arduino\":{\n \"ldscript\": \"esp32s3_out.ld\",\n \"memory_type\": \"qio_opi\",\n "
},
{
"path": "boards/lolin_s3_mini.json",
"chars": 1020,
"preview": "{\r\n \"build\": {\r\n \"arduino\": {\r\n \"ldscript\": \"esp32s3_out.ld\",\r\n \"memory_type\": \"qio_qspi\"\r\n }"
},
{
"path": "images/Readme.md",
"chars": 215,
"preview": "### Additional Logos\n\nAdditional awesome logos for WLED can be found here [Aircoookie/Akemi](https://github.com/Aircoook"
},
{
"path": "include/README",
"chars": 1386,
"preview": "\nThis directory is intended for project header files.\n\nA header file is a file containing C declarations and macro defin"
},
{
"path": "lib/ESP8266PWM/src/core_esp8266_waveform_phase.cpp",
"chars": 19566,
"preview": "/* esp8266_waveform imported from platform source code\n Modified for WLED to work around a fault in the NMI handling,\n"
},
{
"path": "lib/NeoESP32RmtHI/include/NeoEsp32RmtHIMethod.h",
"chars": 35210,
"preview": "/*-------------------------------------------------------------------------\r\nNeoPixel driver for ESP32 RMTs using High-p"
},
{
"path": "lib/NeoESP32RmtHI/library.json",
"chars": 223,
"preview": "{\n \"name\": \"NeoESP32RmtHI\",\n \"build\": { \"libArchive\": false },\n \"platforms\": [\"espressif32\"],\n \"dependencies\": [\n "
},
{
"path": "lib/NeoESP32RmtHI/src/NeoEsp32RmtHI.S",
"chars": 7982,
"preview": "/* RMT ISR shim\n * Bridges from a high-level interrupt to the C++ code.\n *\n * This code is largely derived from Espressi"
},
{
"path": "lib/NeoESP32RmtHI/src/NeoEsp32RmtHIMethod.cpp",
"chars": 18222,
"preview": "/*-------------------------------------------------------------------------\nNeoPixel library helper functions for Esp32."
},
{
"path": "lib/README",
"chars": 1037,
"preview": "\nThis directory is intended for project specific (private) libraries.\nPlatformIO will compile them to static libraries a"
},
{
"path": "package.json",
"chars": 816,
"preview": "{\n \"name\": \"wled\",\n \"version\": \"16.0.0-alpha\",\n \"description\": \"Tools for WLED project\",\n \"main\": \"tools/cdata.js\",\n"
},
{
"path": "pio-scripts/build_ui.py",
"chars": 841,
"preview": "Import(\"env\")\nimport shutil\n\nnode_ex = shutil.which(\"node\")\n# Check if Node.js is installed and present in PATH if it fa"
},
{
"path": "pio-scripts/dynarray.py",
"chars": 791,
"preview": "# Add a section to the linker script to store our dynamic arrays\n# This is implemented as a pio post-script to ensure th"
},
{
"path": "pio-scripts/load_usermods.py",
"chars": 8190,
"preview": "Import('env')\nfrom collections import deque\nfrom pathlib import Path # For OS-agnostic path manipulation\nimport re\nfro"
},
{
"path": "pio-scripts/obj-dump.py",
"chars": 1167,
"preview": "# Little convenience script to get an object dump\n# You may add \"-S\" to the objdump commandline (i.e. replace \"-D -C \""
},
{
"path": "pio-scripts/output_bins.py",
"chars": 2375,
"preview": "Import('env')\nimport os\nimport shutil\nimport gzip\nimport json\n\nOUTPUT_DIR = \"build_output{}\".format(os.path.sep)\n#OUTPUT"
},
{
"path": "pio-scripts/set_metadata.py",
"chars": 3991,
"preview": "Import('env')\nimport subprocess\nimport json\nimport re\n\ndef get_github_repo():\n \"\"\"Extract GitHub repository name from"
},
{
"path": "pio-scripts/strip-floats.py",
"chars": 262,
"preview": "Import('env')\n\n#\n# Dump build environment (for debug)\n#print env.Dump()\n#\n\nflags = \" \".join(env['LINKFLAGS'])\nflags = fl"
},
{
"path": "pio-scripts/user_config_copy.py",
"chars": 256,
"preview": "Import('env')\nimport os\nimport shutil\n\n# copy WLED00/my_config_sample.h to WLED00/my_config.h\nif os.path.isfile(\"wled00/"
},
{
"path": "pio-scripts/validate_modules.py",
"chars": 5441,
"preview": "import os\nimport re\nimport subprocess\nfrom pathlib import Path # For OS-agnostic path manipulation\nfrom click import s"
},
{
"path": "platformio.ini",
"chars": 31535,
"preview": "; PlatformIO Project Configuration File\n; Please visit documentation: https://docs.platformio.org/page/projectconf.html\n"
},
{
"path": "platformio_override.sample.ini",
"chars": 26211,
"preview": "# Example PlatformIO Project Configuration Override\n# ------------------------------------------------------------------"
},
{
"path": "readme.md",
"chars": 4835,
"preview": "<p align=\"center\">\n <img src=\"/images/wled_logo_akemi.png\">\n <a href=\"https://github.com/wled-dev/WLED/releases\"><img "
},
{
"path": "requirements.in",
"chars": 19,
"preview": "platformio>=6.1.17\n"
},
{
"path": "requirements.txt",
"chars": 1058,
"preview": "#\n# This file is autogenerated by pip-compile with Python 3.11\n# by the following command:\n#\n# pip-compile requiremen"
},
{
"path": "test/README",
"chars": 490,
"preview": "\nThis directory is intended for PIO Unit Testing and project tests.\n\nUnit Testing is a software testing method by which "
},
{
"path": "tools/WLED_ESP32-wrover_4MB.csv",
"chars": 261,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_16MB.csv",
"chars": 261,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_16MB_9MB_FS.csv",
"chars": 364,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_2MB_noOTA.csv",
"chars": 212,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 20K,\notadata, data, ota, 0xe000, "
},
{
"path": "tools/WLED_ESP32_32MB.csv",
"chars": 293,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_4MB_1MB_FS.csv",
"chars": 260,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_4MB_256KB_FS.csv",
"chars": 290,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_4MB_512KB_FS.csv",
"chars": 290,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_4MB_700k_FS.csv",
"chars": 261,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/WLED_ESP32_8MB.csv",
"chars": 292,
"preview": "# Name, Type, SubType, Offset, Size, Flags\nnvs, data, nvs, 0x9000, 0x5000,\notadata, data, ota, 0xe000,"
},
{
"path": "tools/all_xml.sh",
"chars": 347,
"preview": "#!/bin/bash\n# Pull all settings pages for comparison\nHOST=$1\nTGT_PATH=$2\nCURL_ARGS=\"--compressed\"\n\n# Replicate one targe"
},
{
"path": "tools/cdata-test.js",
"chars": 7564,
"preview": "'use strict';\n\nconst assert = require('node:assert');\nconst { describe, it, before, after } = require('node:test');\ncons"
},
{
"path": "tools/cdata.js",
"chars": 13579,
"preview": "/**\n * Writes compressed C arrays of data files (web interface)\n * How to use it?\n *\n * 1) Install Node 20+ and npm\n * 2"
},
{
"path": "tools/dynarray_espressif32.ld",
"chars": 227,
"preview": "/* ESP32 linker script fragment to add dynamic array section to binary */\nSECTIONS\n{\n .dynarray :\n {\n . = ALIGN(0x1"
},
{
"path": "tools/fps_test.htm",
"chars": 9236,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <title>WLED frame rate test tool</title>\n <style>\n body {\n "
},
{
"path": "tools/json_test.htm",
"chars": 2449,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>JSON client</title>\n <style>\n :root {\n --bCol:#333;--cCol:#222"
},
{
"path": "tools/multi-update.cmd",
"chars": 330,
"preview": "@echo off\nSETLOCAL\nSET FWPATH=c:\\path\\to\\your\\WLED\\build_output\\firmware\nGOTO ESPS\n\n:UPDATEONE\nIF NOT EXIST %FWPATH%\\%2 "
},
{
"path": "tools/multi-update.sh",
"chars": 359,
"preview": "#!/bin/bash\nFWPATH=/path/to/your/WLED/build_output/firmware\n\nupdate_one() {\nif [ -f $FWPATH/$2 ]; then\n\tping -c 1 $1 >/d"
},
{
"path": "tools/partitions-16MB_spiffs-tinyuf2.csv",
"chars": 403,
"preview": "# ESP-IDF Partition Table\n# Name, Type, SubType, Offset, Size, Flags\n# bootloader.bin,, 0x1000, 32K\n# partit"
},
{
"path": "tools/partitions-4MB_spiffs-tinyuf2.csv",
"chars": 397,
"preview": "# ESP-IDF Partition Table\n# Name, Type, SubType, Offset, Size, Flags\n# bootloader.bin,, 0x1000, 32K\n# partit"
},
{
"path": "tools/partitions-8MB_spiffs-tinyuf2.csv",
"chars": 403,
"preview": "# ESP-IDF Partition Table\n# Name, Type, SubType, Offset, Size, Flags\n# bootloader.bin,, 0x1000, 32K\n# partit"
},
{
"path": "tools/stress_test.sh",
"chars": 1431,
"preview": "#!/bin/bash\n# Some web server stress tests\n#\n# Perform a large number of parallel requests, stress testing the web serve"
},
{
"path": "tools/udp_test.py",
"chars": 1904,
"preview": "import numpy as np\r\nimport socket\r\n\r\nclass WledRealtimeClient:\r\n def __init__(self, wled_controller_ip, num_pixels, u"
},
{
"path": "tools/wled-tools",
"chars": 9489,
"preview": "#!/bin/bash\n\n# WLED Tools\n# A utility for managing WLED devices in a local network\n# https://github.com/wled/WLED\n\n# Col"
},
{
"path": "usermods/ADS1115_v2/ADS1115_v2.cpp",
"chars": 6450,
"preview": "#include \"wled.h\"\n#include <Adafruit_ADS1X15.h>\n#include <math.h>\n\n#include \"ChannelSettings.h\"\n\nusing namespace ADS1115"
},
{
"path": "usermods/ADS1115_v2/ChannelSettings.h",
"chars": 243,
"preview": "#include \"wled.h\"\n\nnamespace ADS1115\n{\n struct ChannelSettings {\n const String settingName;\n bool isEnabled;\n "
},
{
"path": "usermods/ADS1115_v2/library.json",
"chars": 240,
"preview": "{\n \"name\": \"ADS1115_v2\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"Adafruit BusIO\": \"https://github."
},
{
"path": "usermods/ADS1115_v2/readme.md",
"chars": 322,
"preview": "# ADS1115 16-Bit ADC with four inputs\n\nThis usermod will read from an ADS1115 ADC. The voltages are displayed in the Inf"
},
{
"path": "usermods/AHT10_v2/AHT10_v2.cpp",
"chars": 9671,
"preview": "#include \"wled.h\"\n#include <AHT10.h>\n\n#define AHT10_SUCCESS 1\n\nclass UsermodAHT10 : public Usermod\n{\nprivate:\n static c"
},
{
"path": "usermods/AHT10_v2/README.md",
"chars": 1043,
"preview": "# Usermod AHT10\nThis Usermod is designed to read a `AHT10`, `AHT15` or `AHT20` sensor and output the following:\n- Temper"
},
{
"path": "usermods/AHT10_v2/library.json",
"chars": 122,
"preview": "{\n \"name\": \"AHT10_v2\",\n \"build\": { \"libArchive\": false }, \n \"dependencies\": {\n \"enjoyneering/AHT10\":\"~1.1.0\"\n }\n"
},
{
"path": "usermods/Analog_Clock/Analog_Clock.cpp",
"chars": 9076,
"preview": "#include \"wled.h\"\n\n/*\n * Usermod for analog clock\n */\n\nclass AnalogClockUsermod : public Usermod {\nprivate:\n static c"
},
{
"path": "usermods/Analog_Clock/library.json",
"chars": 64,
"preview": "{\n \"name\": \"Analog_Clock\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Animated_Staircase/Animated_Staircase.cpp",
"chars": 22012,
"preview": "/*\n * Usermod for detecting people entering/leaving a staircase and switching the\n * staircase on/off.\n *\n * Edit the An"
},
{
"path": "usermods/Animated_Staircase/README.md",
"chars": 5551,
"preview": "# Usermod Animated Staircase\n\nThis usermod makes your staircase look cool by illuminating it with an animation. It uses\n"
},
{
"path": "usermods/Animated_Staircase/library.json",
"chars": 70,
"preview": "{\n \"name\": \"Animated_Staircase\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Artemis_reciever/readme.md",
"chars": 603,
"preview": "Usermod to allow WLED to receive via UDP port from RGB.NET (and therefore add as a device to be controlled within artemi"
},
{
"path": "usermods/Artemis_reciever/usermod.cpp",
"chars": 1937,
"preview": "/*\n * RGB.NET (artemis) receiver\n * \n * This works via the UDP, http is not supported apart from repor"
},
{
"path": "usermods/BH1750_v2/BH1750_v2.cpp",
"chars": 5924,
"preview": "// force the compiler to show a warning to confirm that this file is included\n#warning **** Included USERMOD_BH1750 ****"
},
{
"path": "usermods/BH1750_v2/BH1750_v2.h",
"chars": 2954,
"preview": "\r\n#pragma once\r\n#include \"wled.h\"\r\n#include <BH1750.h>\r\n\r\n#ifdef WLED_DISABLE_MQTT\r\n#error \"This user mod requires MQTT "
},
{
"path": "usermods/BH1750_v2/library.json",
"chars": 115,
"preview": "{\n \"name\": \"BH1750_v2\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"claws/BH1750\":\"^1.2.0\"\n }\n}\n"
},
{
"path": "usermods/BH1750_v2/readme.md",
"chars": 1614,
"preview": "# BH1750 usermod\n\nThis usermod will read from an ambient light sensor like the BH1750.\nThe luminance is displayed in bot"
},
{
"path": "usermods/BME280_v2/BME280_v2.cpp",
"chars": 18354,
"preview": "// force the compiler to show a warning to confirm that this file is included\n#warning **** Included USERMOD_BME280 vers"
},
{
"path": "usermods/BME280_v2/README.md",
"chars": 3291,
"preview": "# Usermod BME280\nThis Usermod is designed to read a `BME280` or `BMP280` sensor and output the following:\n- Temperature\n"
},
{
"path": "usermods/BME280_v2/library.json",
"chars": 120,
"preview": "{\n \"name\": \"BME280_v2\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"finitespace/BME280\":\"~3.0.0\"\n }\n}"
},
{
"path": "usermods/BME68X_v2/BME68X_v2.cpp",
"chars": 57579,
"preview": "/**\n * @file usermod_BMW68X.cpp\n * @author Gabriel A. Sieben (GeoGab)\n * @brief Usermod for WLED to implement the BME68"
},
{
"path": "usermods/BME68X_v2/README.md",
"chars": 7369,
"preview": "# Usermod BME68X\n\nThis usermod was developed for a BME680/BME68X sensor. The BME68X is not compatible with the BME280/BM"
},
{
"path": "usermods/BME68X_v2/library.json",
"chars": 139,
"preview": "{\n \"name\": \"BME68X\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"boschsensortec/BSEC Software Library\""
},
{
"path": "usermods/Battery/Battery.cpp",
"chars": 30004,
"preview": "#include \"wled.h\"\n#include \"battery_defaults.h\"\n#include \"UMBattery.h\"\n#include \"types/UnkownUMBattery.h\"\n#include \"type"
},
{
"path": "usermods/Battery/UMBattery.h",
"chars": 4169,
"preview": "#ifndef UMBBattery_h\n#define UMBBattery_h\n\n#include \"battery_defaults.h\"\n\n/**\n * Battery base class\n * all other batte"
},
{
"path": "usermods/Battery/battery_defaults.h",
"chars": 3559,
"preview": "#ifndef UMBDefaults_h\n#define UMBDefaults_h\n\n#include \"wled.h\"\n\n// pin defaults\n// for the esp32 it is best to use the A"
},
{
"path": "usermods/Battery/library.json",
"chars": 59,
"preview": "{\n \"name\": \"Battery\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Battery/readme.md",
"chars": 8066,
"preview": "<p align=\"center\">\n <img width=\"700\" src=\"assets/battery_usermod_logo.png\">\n</p>\n\n# Welcome to the battery usermod! 🔋\n\n"
},
{
"path": "usermods/Battery/types/LionUMBattery.h",
"chars": 880,
"preview": "#ifndef UMBLion_h\n#define UMBLion_h\n\n#include \"../battery_defaults.h\"\n#include \"../UMBattery.h\"\n\n/**\n * LiOn Battery\n *"
},
{
"path": "usermods/Battery/types/LipoUMBattery.h",
"chars": 1508,
"preview": "#ifndef UMBLipo_h\n#define UMBLipo_h\n\n#include \"../battery_defaults.h\"\n#include \"../UMBattery.h\"\n\n/**\n * LiPo Battery\n *"
},
{
"path": "usermods/Battery/types/UnkownUMBattery.h",
"chars": 1077,
"preview": "#ifndef UMBUnkown_h\n#define UMBUnkown_h\n\n#include \"../battery_defaults.h\"\n#include \"../UMBattery.h\"\n\n/**\n * Unkown / De"
},
{
"path": "usermods/Cronixie/Cronixie.cpp",
"chars": 10728,
"preview": "#include \"wled.h\"\n\nclass UsermodCronixie : public Usermod {\n private:\n unsigned long lastTime = 0;\n char cronixie"
},
{
"path": "usermods/Cronixie/library.json",
"chars": 60,
"preview": "{\n \"name\": \"Cronixie\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Cronixie/readme.md",
"chars": 307,
"preview": "# Cronixie clock usermod\n\nThis usermod supports driving the Cronixie M and L clock kits by Diamex.\n\n## Installation \n\nCo"
},
{
"path": "usermods/DHT/DHT.cpp",
"chars": 6838,
"preview": "#include \"wled.h\"\n#ifdef WLED_DISABLE_MQTT\n#error \"This user mod requires MQTT to be enabled.\"\n#endif\n\n\n#include <dht_no"
},
{
"path": "usermods/DHT/library.json",
"chars": 150,
"preview": "{\n \"name\": \"DHT\",\n \"build\": { \"libArchive\": false},\n \"dependencies\": {\n \"DHT_nonblocking\":\"https://github.com/alwy"
},
{
"path": "usermods/DHT/readme.md",
"chars": 2407,
"preview": "# DHT Temperature/Humidity sensor usermod\n\nThis usermod will read from an attached DHT22 or DHT11 humidity and temperatu"
},
{
"path": "usermods/EXAMPLE/library.json",
"chars": 82,
"preview": "{\n \"name\": \"EXAMPLE\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {}\n}\n"
},
{
"path": "usermods/EXAMPLE/readme.md",
"chars": 314,
"preview": "# Usermods API v2 example usermod\n\nIn this usermod file you can find the documentation on how to take advantage of the n"
},
{
"path": "usermods/EXAMPLE/usermod_v2_example.cpp",
"chars": 17155,
"preview": "#include \"wled.h\"\n\n/*\n * Usermods allow you to add own functionality to WLED more easily\n * See: https://github.com/wled"
},
{
"path": "usermods/EleksTube_IPS/ChipSelect.h",
"chars": 2966,
"preview": "#ifndef CHIP_SELECT_H\n#define CHIP_SELECT_H\n\n#include \"Hardware.h\"\n\n/*\n * `digit`s are as defined in Hardware.h, 0 == se"
},
{
"path": "usermods/EleksTube_IPS/EleksTube_IPS.cpp",
"chars": 5507,
"preview": "#include \"TFTs.h\"\n#include \"wled.h\"\n\n//Large parts of the code are from https://github.com/SmittyHalibut/EleksTubeHAX\n\nc"
},
{
"path": "usermods/EleksTube_IPS/Hardware.h",
"chars": 1499,
"preview": "/*\n * Define the hardware for the EleksTube IPS clock. Mostly pin definitions\n */\n#ifndef ELEKSTUBEHAX_HARDWARE_H\n#defi"
},
{
"path": "usermods/EleksTube_IPS/TFTs.h",
"chars": 11727,
"preview": "#ifndef TFTS_H\n#define TFTS_H\n\n#include \"wled.h\"\n#include <FS.h>\n\n#include <TFT_eSPI.h>\n#include \"Hardware.h\"\n#include \""
},
{
"path": "usermods/EleksTube_IPS/User_Setup.h",
"chars": 1892,
"preview": "/*\n * This is intended to over-ride `User_Setup.h` that comes with the TFT_eSPI library.\n * I hate having to modify the "
},
{
"path": "usermods/EleksTube_IPS/library.json.disabled",
"chars": 166,
"preview": "{\n \"name:\": \"EleksTube_IPS\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"TFT_eSPI\" : \"2.5.33\"\n } \n}\n#"
},
{
"path": "usermods/EleksTube_IPS/readme.md",
"chars": 2240,
"preview": "# EleksTube IPS Clock usermod\n\nThis usermod allows WLED to run on the EleksTube IPS clock.\nIt enables running all WLED e"
},
{
"path": "usermods/Enclosure_with_OLED_temp_ESP07/assets/readme.md",
"chars": 98,
"preview": "# Enclosure and PCB\n\n## IP67 rated enclosure\n\n\n## PCB\n\n"
},
{
"path": "usermods/Enclosure_with_OLED_temp_ESP07/readme.md",
"chars": 1807,
"preview": "# Almost universal controller board for outdoor applications\nThis usermod is using ideas from @mrVanboy and @400killer\n\n"
},
{
"path": "usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp",
"chars": 5545,
"preview": "#include \"wled.h\"\n#include <Arduino.h>\n#include <U8x8lib.h> // from https://github.com/olikraus/u8g2/\n#include <DallasTe"
},
{
"path": "usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp",
"chars": 7186,
"preview": "#include \"wled.h\"\n#include <Arduino.h>\n#include <U8x8lib.h> // from https://github.com/olikraus/u8g2/\n#include <Wire.h>\n"
},
{
"path": "usermods/Fix_unreachable_netservices_v2/library.json",
"chars": 81,
"preview": "{\n \"name\": \"Fix_unreachable_netservices_v2\",\n \"platforms\": [\"espressif8266\"]\n}\n"
},
{
"path": "usermods/Fix_unreachable_netservices_v2/readme.md",
"chars": 1340,
"preview": "# Fix unreachable net services V2\n\n**Attention: This usermod compiles only for ESP8266**\n\nThis usermod-v2 modification p"
},
{
"path": "usermods/Fix_unreachable_netservices_v2/usermod_Fix_unreachable_netservices.cpp",
"chars": 5538,
"preview": "#include \"wled.h\"\n\n#if defined(ESP8266)\n#include <ping.h>\n\n/*\n * This usermod performs a ping request to the local IP ad"
},
{
"path": "usermods/INA226_v2/INA226_v2.cpp",
"chars": 18562,
"preview": "#include \"wled.h\"\n#include <INA226_WE.h>\n\n#define INA226_ADDRESS 0x40 // Default I2C address for INA226\n\n#define DEFAULT"
},
{
"path": "usermods/INA226_v2/README.md",
"chars": 4674,
"preview": "# Usermod INA226\n\nThis Usermod is designed to read values from an INA226 sensor and output the following:\n- Current\n- Vo"
},
{
"path": "usermods/INA226_v2/library.json",
"chars": 122,
"preview": "{\n \"name\": \"INA226_v2\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"wollewald/INA226_WE\":\"~1.2.9\"\n }\n"
},
{
"path": "usermods/Internal_Temperature_v2/Internal_Temperature_v2.cpp",
"chars": 7233,
"preview": "#include \"wled.h\"\n\nclass InternalTemperatureUsermod : public Usermod\n{\n\nprivate:\n static constexpr unsigned long minLoo"
},
{
"path": "usermods/Internal_Temperature_v2/library.json",
"chars": 75,
"preview": "{\n \"name\": \"Internal_Temperature_v2\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Internal_Temperature_v2/readme.md",
"chars": 1337,
"preview": "# Internal Temperature Usermod\n\n\n\n![Screenshot of WLED usermo"
},
{
"path": "usermods/JSON_IR_remote/21-key_ir.json",
"chars": 2165,
"preview": "{\n \"desc\": \"21-key\",\n \"0xFFA25D\": {\n \"label\": \"On\",\n \"pos\": \"1x1\",\n \"cmd\": \"T=1\"\n },\n \"0xFF629D\": {\n \"la"
},
{
"path": "usermods/JSON_IR_remote/24-key_ir.json",
"chars": 2583,
"preview": "{\n \"desc\": \"24-key\",\n \"0xF700FF\": {\n \"label\": \"+\",\n \"pos\": \"1x1\",\n \"cmnt\": \"Speed +\",\n \"cmd\": \"SX=~16\"\n }"
},
{
"path": "usermods/JSON_IR_remote/32-key_ir.json",
"chars": 3381,
"preview": "{\n \"desc\": \"32-key\",\n \"0xFF08F7\": {\n \"label\": \"On\",\n \"pos\": \"1x1\",\n \"cmd\": \"T=1\"\n },\n \"0xFFC03F\": {\n \"la"
},
{
"path": "usermods/JSON_IR_remote/40-key-black_ir.json",
"chars": 4410,
"preview": "{\n \"desc\": \"40-key-black\",\n \"0xFF3AC5\": {\n \"label\": \"Bright +\",\n \"pos\": \"1x1\",\n \"cmd\": \"A=~16\"\n },\n \"0xFFBA"
},
{
"path": "usermods/JSON_IR_remote/40-key-blue_ir.json",
"chars": 3961,
"preview": "{\n \"desc\": \"40-key-blue\",\n \"0xFF3AC5\": {\n \"label\": \"Bright +\",\n \"pos\": \"1x1\",\n \"cmd\": \"A=~16\"\n },\n \"0xFFBA4"
},
{
"path": "usermods/JSON_IR_remote/44-key_ir.json",
"chars": 4456,
"preview": "{\n \"desc\": \"44-key\",\n \"0xFF3AC5\": {\n \"label\": \"Bright +\",\n \"pos\": \"1x1\",\n \"cmd\": \"A=~16\"\n },\n \"0xFFBA45\": {"
},
{
"path": "usermods/JSON_IR_remote/6-key_ir.json",
"chars": 654,
"preview": "{\n \"desc\": \"6-key\",\n \"0xFF0FF0\": {\n \"label\": \"Power\",\n \"pos\": \"1x1\",\n \"cmd\": \"T=2\"\n },\n \"0xFF8F70\": {\n \""
},
{
"path": "usermods/JSON_IR_remote/9-key_ir.json",
"chars": 761,
"preview": "{\n \"desc\": \"9-key\",\n \"0xFF629D\": {\n \"label\": \"Power\",\n \"cmd\": \"T=2\"\n },\n \"0xFF22DD\": {\n \"label\": \"A\",\n \""
},
{
"path": "usermods/JSON_IR_remote/ir_json_maker.py",
"chars": 6898,
"preview": "import colorsys\nimport json\nimport openpyxl\n\nnamed_colors = {'AliceBlue': '0xF0F8FF', 'AntiqueWhite': '0xFAEBD7', 'Aqua'"
},
{
"path": "usermods/JSON_IR_remote/readme.md",
"chars": 1845,
"preview": "# JSON IR remote\n\n## Purpose \n\nThe JSON IR remote enables users to customize IR remote behavior without writing custom c"
},
{
"path": "usermods/LD2410_v2/LD2410_v2.cpp",
"chars": 7898,
"preview": "#include \"wled.h\"\n#include <ld2410.h>\n\n#ifdef WLED_DISABLE_MQTT\n#error \"This user mod requires MQTT to be enabled.\"\n#end"
},
{
"path": "usermods/LD2410_v2/library.json",
"chars": 120,
"preview": "{\n \"name\": \"LD2410_v2\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"ncmreynolds/ld2410\":\"^0.1.3\"\n }\n}"
},
{
"path": "usermods/LD2410_v2/readme.md",
"chars": 904,
"preview": "# BH1750 usermod\n\n> This usermod requires a second UART and was only tested on the ESP32\n\n\nThis usermod will read from a"
},
{
"path": "usermods/LDR_Dusk_Dawn_v2/LDR_Dusk_Dawn_v2.cpp",
"chars": 5929,
"preview": "#include \"wled.h\"\n\n#ifndef ARDUINO_ARCH_ESP32\n // 8266 does not support analogRead on user selectable pins \n #error on"
},
{
"path": "usermods/LDR_Dusk_Dawn_v2/README.md",
"chars": 1320,
"preview": "# LDR_Dusk_Dawn_v2\nThis usermod will obtain readings from a Light Dependent Resistor (LDR) and will turn on/off specific"
},
{
"path": "usermods/LDR_Dusk_Dawn_v2/library.json",
"chars": 68,
"preview": "{\n \"name\": \"LDR_Dusk_Dawn_v2\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/MAX17048_v2/MAX17048_v2.cpp",
"chars": 9810,
"preview": "// force the compiler to show a warning to confirm that this file is included\n#warning **** Included USERMOD_MAX17048 V2"
},
{
"path": "usermods/MAX17048_v2/library.json",
"chars": 166,
"preview": "{\n \"name\": \"MAX17048_v2\",\n \"build\": { \"libArchive\": false},\n \"dependencies\": {\n \"Adafruit_MAX1704X\":\"https://githu"
},
{
"path": "usermods/MAX17048_v2/readme.md",
"chars": 2095,
"preview": "# Adafruit MAX17048 Usermod (LiPo & LiIon Battery Monitor & Fuel Gauge)\nThis usermod reads information from an Adafruit "
},
{
"path": "usermods/MY9291/MY9291.cpp",
"chars": 1125,
"preview": "#include \"wled.h\"\n#include \"MY92xx.h\"\n\n#define MY92XX_MODEL MY92XX_MODEL_MY9291\n#define MY92XX_CHIPS 1\n#de"
},
{
"path": "usermods/MY9291/MY92xx.h",
"chars": 7979,
"preview": "/*\n\nMY92XX LED Driver for Arduino\nBased on the C driver by MaiKe Labs\n\nCopyright (c) 2016 - 2026 MaiKe Labs\nCopyright (C"
},
{
"path": "usermods/MY9291/library.json",
"chars": 92,
"preview": "{\n \"name\": \"MY9291\",\n \"build\": { \"libArchive\": false },\n \"platforms\": [\"espressif8266\"]\n}"
},
{
"path": "usermods/PIR_sensor_switch/PIR_Highlight_Standby",
"chars": 14128,
"preview": "#pragma once\n\n#include \"wled.h\"\n\n/*\n * --------------------\n * Rawframe edit:\n * - TESTED ON WLED VS.0.10.1 - WHERE ONLY"
},
{
"path": "usermods/PIR_sensor_switch/PIR_sensor_switch.cpp",
"chars": 19495,
"preview": "#include \"wled.h\"\r\n\r\n#ifndef PIR_SENSOR_PIN\r\n // compatible with QuinLED-Dig-Uno\r\n #ifdef ARDUINO_ARCH_ESP32\r\n #def"
},
{
"path": "usermods/PIR_sensor_switch/library.json",
"chars": 69,
"preview": "{\n \"name\": \"PIR_sensor_switch\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/PIR_sensor_switch/readme.md",
"chars": 4626,
"preview": "# PIR sensor switch\n\nThis usermod-v2 modification allows the connection of a PIR sensor to switch on the LED strip when "
},
{
"path": "usermods/PS_Comet/PS_Comet.cpp",
"chars": 4381,
"preview": "#include \"wled.h\"\n#include \"FXparticleSystem.h\"\n\nunsigned long nextCometCreationTime = 0;\n\n#define FX_FALLBACK_STATIC { "
},
{
"path": "usermods/PS_Comet/README.md",
"chars": 932,
"preview": "## Description\n\nA 2D falling comet effect similar to \"Matrix\" but with a fire particle simulation to enhance the comet t"
},
{
"path": "usermods/PS_Comet/library.json",
"chars": 60,
"preview": "{\n \"name\": \"PS Comet\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/PWM_fan/PWM_fan.cpp",
"chars": 15650,
"preview": "#include \"wled.h\"\n\n#if defined(USERMOD_DALLASTEMPERATURE) \n#include \"UsermodTemperature.h\"\n#elif defined(USERMOD_SHT)\n#i"
},
{
"path": "usermods/PWM_fan/library.json",
"chars": 101,
"preview": "{\n \"name\": \"PWM_fan\",\n \"build\": {\n \"libArchive\": false,\n \"extraScript\": \"setup_deps.py\"\n }\n}"
},
{
"path": "usermods/PWM_fan/readme.md",
"chars": 1977,
"preview": "# PWM fan\n\nv2 Usermod to to control PWM fan with RPM feedback and temperature control\n\nThis usermod requires the Dallas "
},
{
"path": "usermods/PWM_fan/setup_deps.py",
"chars": 489,
"preview": "from platformio.package.meta import PackageSpec\nImport('env')\n\n\nlibs = [PackageSpec(lib).name for lib in env.GetProjectO"
},
{
"path": "usermods/RTC/RTC.cpp",
"chars": 1537,
"preview": "#include \"src/dependencies/time/DS1307RTC.h\"\n#include \"wled.h\"\n\n//Connect DS1307 to standard I2C pins (ESP32: GPIO 21 (S"
},
{
"path": "usermods/RTC/library.json",
"chars": 55,
"preview": "{\n \"name\": \"RTC\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/RTC/readme.md",
"chars": 270,
"preview": "# DS1307/DS3231 Real time clock\n\nGets the time from I2C RTC module on boot. This allows clock operation if WiFi is not a"
},
{
"path": "usermods/RelayBlinds/index.htm",
"chars": 2776,
"preview": "<!DOCTYPE html>\n<html>\n<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1\">\n <me"
},
{
"path": "usermods/RelayBlinds/presets.json",
"chars": 62,
"preview": "{\"0\":{},\"2\":{\"n\":\"▲\",\"win\":\"U0=2\"},\"1\":{\"n\":\"▼\",\"win\":\"U0=1\"}}"
},
{
"path": "usermods/RelayBlinds/readme.md",
"chars": 564,
"preview": "# RelayBlinds usermod\n\nThis simple usermod toggles two relay pins momentarily (defaults to 500ms) when `userVar0` is set"
},
{
"path": "usermods/RelayBlinds/usermod.cpp",
"chars": 1668,
"preview": "#include \"wled.h\"\n\n//Use userVar0 and userVar1 (API calls &U0=,&U1=, uint16_t)\n\n//gets called once at boot. Do all initi"
},
{
"path": "usermods/SN_Photoresistor/SN_Photoresistor.cpp",
"chars": 4471,
"preview": "#include \"wled.h\"\n#include \"SN_Photoresistor.h\"\n\n//Pin defaults for QuinLed Dig-Uno (A0)\n#ifndef PHOTORESISTOR_PIN\n#defi"
},
{
"path": "usermods/SN_Photoresistor/SN_Photoresistor.h",
"chars": 2784,
"preview": "#pragma once\r\n#include \"wled.h\"\r\n\r\n// the frequency to check photoresistor, 10 seconds\r\n#ifndef USERMOD_SN_PHOTORESISTOR"
},
{
"path": "usermods/SN_Photoresistor/library.json",
"chars": 68,
"preview": "{\n \"name\": \"SN_Photoresistor\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/SN_Photoresistor/readme.md",
"chars": 1539,
"preview": "# SN_Photoresistor usermod\n\nThis usermod will read from an attached photoresistor sensor like the KY-018.\nThe luminance "
},
{
"path": "usermods/ST7789_display/README.md",
"chars": 1897,
"preview": "# Using the ST7789 TFT IPS 240x240 pixel color display with ESP32 boards\n\nThis usermod enables display of the following:"
},
{
"path": "usermods/ST7789_display/ST7789_display.cpp",
"chars": 14915,
"preview": "// Credits to @mrVanboy, @gwaland and my dearest friend @westward\n// Also for @spiff72 for usermod TTGO-T-Display\n// 210"
},
{
"path": "usermods/ST7789_display/library.json.disabled",
"chars": 67,
"preview": "{\n \"name:\": \"ST7789_display\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/Si7021_MQTT_HA/Si7021_MQTT_HA.cpp",
"chars": 8214,
"preview": "// this is remixed from usermod_v2_SensorsToMqtt.h (sensors_to_mqtt usermod)\n// and usermod_multi_relay.h (multi_relay u"
},
{
"path": "usermods/Si7021_MQTT_HA/library.json",
"chars": 230,
"preview": "{\n \"name\": \"Si7021_MQTT_HA\",\n \"build\": { \"libArchive\": false },\n \"dependencies\": {\n \"finitespace/BME280\":\"3.0.0\",\n"
},
{
"path": "usermods/Si7021_MQTT_HA/readme.md",
"chars": 1404,
"preview": "# Si7021 to MQTT (with Home Assistant Auto Discovery) usermod\n\nThis usermod implements support for [Si7021 I²C temperatu"
},
{
"path": "usermods/TTGO-T-Display/README.md",
"chars": 5033,
"preview": "# TTGO T-Display ESP32 with 240x135 TFT via SPI with TFT_eSPI\nThis usermod enables use of the TTGO 240x135 T-Display ESP"
},
{
"path": "usermods/TTGO-T-Display/usermod.cpp",
"chars": 6003,
"preview": "\n/*\n * This file allows you to add own functionality to WLED more easily\n * See: https://github.com/wled-dev/WLED/wiki/A"
},
{
"path": "usermods/Temperature/Temperature.cpp",
"chars": 14753,
"preview": "#include \"UsermodTemperature.h\"\n\nstatic void mode_temperature();\n\n//Dallas sensor quick (& dirty) reading. Credit to - A"
},
{
"path": "usermods/Temperature/UsermodTemperature.h",
"chars": 3887,
"preview": "#pragma once\n#include \"wled.h\"\n#include \"OneWire.h\"\n\n//Pin defaults for QuinLed Dig-Uno if not overriden\n#ifndef TEMPERA"
},
{
"path": "usermods/Temperature/library.json",
"chars": 126,
"preview": "{\n \"name\": \"Temperature\",\n \"build\": { \"libArchive\": false},\n \"dependencies\": {\n \"paulstoffregen/OneWire\":\"~2.3.8\"\n"
},
{
"path": "usermods/Temperature/readme.md",
"chars": 1886,
"preview": "# Temperature usermod\n\nBased on the excellent `QuinLED_Dig_Uno_Temp_MQTT` usermod by srg74 and 400killer! \nReads an att"
},
{
"path": "usermods/TetrisAI_v2/TetrisAI_v2.cpp",
"chars": 8850,
"preview": "#include \"wled.h\"\n#include \"FX.h\"\n#include \"fcn_declare.h\"\n\n#include \"tetrisaigame.h\"\n// By: muebau\n\nbool noFlashOnClear"
},
{
"path": "usermods/TetrisAI_v2/gridbw.h",
"chars": 4549,
"preview": "/******************************************************************************\n * @file : gridbw.h\n * @brie"
},
{
"path": "usermods/TetrisAI_v2/gridcolor.h",
"chars": 3526,
"preview": "/******************************************************************************\n * @file : gridcolor.h\n * @b"
},
{
"path": "usermods/TetrisAI_v2/library.json",
"chars": 63,
"preview": "{\n \"name\": \"TetrisAI_v2\",\n \"build\": { \"libArchive\": false }\n}"
},
{
"path": "usermods/TetrisAI_v2/pieces.h",
"chars": 3809,
"preview": "/******************************************************************************\n * @file : pieces.h\n * @brie"
},
{
"path": "usermods/TetrisAI_v2/rating.h",
"chars": 1354,
"preview": "/******************************************************************************\n * @file : rating.h\n * @brie"
},
{
"path": "usermods/TetrisAI_v2/readme.md",
"chars": 2202,
"preview": "# Tetris AI effect usermod\n\nThis usermod adds a self-playing Tetris game as an 'effect'. The mod requires version 0.14 o"
},
{
"path": "usermods/TetrisAI_v2/tetrisai.h",
"chars": 6464,
"preview": "/******************************************************************************\n * @file : ai.h\n * @brief "
}
]
// ... and 290 more files (download for full content)
About this extraction
This page contains the full source code of the wled/WLED GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 490 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 2897 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.