Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ When using Bambu Cloud, BambuHelper connects through Bambu Lab's cloud MQTT serv
| ![QD ES3N28P 2.8 inch](img/es3n28p-2.8.png) | **QD ES3N28P 2.8"** (ILI9341V) | `240x320` **ILI9341V** IPS panel over 4-wire SPI with ESP32-S3-N16R8 (`16MB` flash / `8MB` PSRAM) and **FT6336** capacitive touch on I2C. Use the `es3n28p` firmware build. Reuses the same `240x320` layout as the Waveshare 2"/2.8" boards and supports **up to 2 printers** (up to 4 with the experimental opt-in). The board carries an onboard WS2812 and ES8311 audio that the firmware does not drive, and the buzzer is disabled by default because its default pin is an I2S clock line. Sold as the QD electronic 2.8" IPS ESP32-S3 module (board codes ES3C28P / ES3N28P); see issue [#125](https://github.com/Keralots/BambuHelper/issues/125). | [@gwbuss](https://github.com/gwbuss) |
| ![Waveshare 3.5 inch](img/ws_lcd_350.png) | **Waveshare ESP32-S3-Touch-LCD-3.5** | `320x480` **ST7796** IPS panel over plain 4-wire SPI (native LovyanGFX, not the Guition board's AXS15231B QSPI), ESP32-S3R8 (`16MB` flash / `8MB` PSRAM), and **FT6336** capacitive touch on I2C. The LCD reset line is driven through an on-board **TCA9554** I2C IO expander rather than a GPIO. Use the `ws_lcd_350` firmware build. Reuses the same `320x480` layout as the JC3248W535 and supports **up to 2 printers** (up to 4 with the experimental opt-in). The board has no buzzer hardware. Pinout from the [Waveshare wiki](https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-3.5). Product page: [waveshare.com/product/esp32-s3-touch-lcd-3.5.htm](https://www.waveshare.com/product/esp32-s3-touch-lcd-3.5.htm) | _community_ |
| ![Panlee SC05_X](img/sc05_x.jpg) | **Panlee SC05_X / ZX2D80CE02S 2.8"** | `240x320` **ST7789** IPS panel driven over an **8-bit 8080 parallel** bus, ESP32-S3 with `8MB` flash / QSPI PSRAM, and **FT5X06** capacitive touch on I2C. Use the `sc05_x` firmware build. This is not the 3.5" WT32-SC01 Plus; selecting the `wt32_sc01_plus` firmware on this board leaves the screen black because the LCD driver, resolution, backlight, reset, touch, and data pins are different. The onboard USB-C connector carries native ESP32-S3 USB data for serial and Improv; the separate 7-pin debug header exposes UART0, EN, and BOOT for the vendor's external ZXACC-ESPDB flashing adapter. Pinout and photo from the official Wireless-Tag / PanelLan datasheet and PanelLan Arduino library. | [@nunnypern](https://github.com/nunnypern) |
| _(no photo yet)_ | **LCDwiki ES3C35P 3.5"** | `320x480` **ST77922 QSPI** panel with capacitive touch built into the display IC (I2C `0x55`), ESP32-S3 with `16MB` flash / `8MB` octal PSRAM. Use the `es3c35p` firmware build. Reuses the same `320x480` layout as the JC3248W535 and supports **up to 2 printers** (up to 4 with the experimental opt-in). Has a battery indicator (GPIO8, 1:2 divider) and a **WS2812 status LED** on GPIO40. The board has no buzzer; the audio amp (ES8311) is not supported yet. The ST77922 needs register writes on one QSPI line and pixels on four, so it uses its own small LovyanGFX panel class. Tested on a single unit. | _community_ |
| ![Panlee WT32-SC01 Plus](img/SC01Plus3.5.png) | **Panlee WT32-SC01 Plus 3.5"** | `320x480` **ST7796** IPS panel driven over an **8-bit 8080 parallel** bus (the project's first `Bus_Parallel8` board, not SPI or QSPI), ESP32-S3-N16R8 (`16MB` flash / `8MB` PSRAM), and **FT6336** capacitive touch on I2C. Use the `wt32_sc01_plus` firmware build. Reuses the same `320x480` layout as the JC3248W535 and supports **up to 2 printers** (up to 4 with the experimental opt-in). The board has an I2S audio amp, but the buzzer is disabled by default because its default pin is the touch I2C clock line. Sold as the *WT32-SC01 Plus*. | [@cliomjh](https://github.com/cliomjh) |
| ![Waveshare 2.8C round](img/ws_lcd_28c.jpg) | **Waveshare ESP32-S3-Touch-LCD-2.8C** | `480x480` **round** **ST7701** IPS panel on the ESP32-S3's LCD_CAM RGB bus (16-bit parallel, with a 3-wire SPI command interface), ESP32-S3R8 (`16MB` flash / `8MB` PSRAM), and **GT911** capacitive touch. Use the `ws_lcd_28c` firmware build. Gets its own `480x480` round layout - the 240x240 round dashboard at exactly 2x, with a larger font tier - and supports **up to 2 printers** (up to 4 with the experimental opt-in). LCD reset, LCD CS, touch reset and the buzzer all hang off an on-board **TCA9554** I2C IO expander; the buzzer is therefore on/off only, so melodies play as rhythm without pitch. Battery voltage is read on GPIO4. IMU, RTC and microSD are not wired up in firmware. Hardware-confirmed by the requester in issue [#171](https://github.com/Keralots/BambuHelper/issues/171). The RGB pixel clock runs at a conservative 12 MHz and is an `.ini` knob. Product page: [waveshare.com/esp32-s3-touch-lcd-2.8c.htm](https://www.waveshare.com/esp32-s3-touch-lcd-2.8c.htm) | _community_ |
| ![CYD TZT variant](img/CYD_tzt.png) | **CYD / TZT L1435-2.4** (ST7789) | Looks almost identical to the standard CYD, but uses a `240x320` **ST7789V** panel (instead of ILI9341) and the backlight is on GPIO27. Use the `tzt_2432` firmware build - the regular `cyd` build will give you a black screen on this hardware. Due to RAM limits, this board supports **1 printer only**. Often sold on Aliexpress as *"TZT ESP32 LVGL 2.4 inch LCD TFT 240*320 With Touch"*. | _community_ |
Expand Down Expand Up @@ -484,6 +485,7 @@ The device reboots automatically once the update is written; the web page reload
| ESP32-S3 Super Mini | `BambuHelper-esp32s3-v3.9.2-Full.bin` |
| ESP32-S3 Super Mini + 1.28" GC9A01 round | `BambuHelper-esp32s3_round-v3.9.2-Full.bin` |
| Guition JC3248W535 | `BambuHelper-jc3248w535-v3.9.2-Full.bin` |
| LCDwiki ES3C35P 3.5" | `BambuHelper-es3c35p-v3.9.2-Full.bin` |
| Waveshare ESP32-S3-Zero | `BambuHelper-esp32s3_zero-v3.9.2-Full.bin` |
| Waveshare ESP32-S3-Zero + 2.0" 240x320 panel | `BambuHelper-esp32s3_zero_320-v3.9.2-Full.bin` |
| CYD / ESP32-2432S028 | `BambuHelper-cyd-v3.9.2-Full.bin` |
Expand Down
60 changes: 60 additions & 0 deletions boards/lcdwiki_es3c35p.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
; =============================================================================
; LCDwiki ES3C35P (3.5" ESP32-S3, ST77922 320x480 QSPI + built-in cap touch)
; https://www.lcdwiki.com/3.5inch_ESP32-S3_Display
; Sold under several names, e.g. Hosyond "ESP32-S3 Touchscreen Module 3.5"" and
; the AliExpress "cheap black display" listings.
;
; Core: ESP32-S3 N16R8 (16 MB flash, PSRAM) - standalone env, like ws_lcd_350.
;
; Display: ST77922 over quad-SPI with NO DC pin. Register writes go out on one
; data line and pixel data on four, which neither LovyanGFX's SPI bus nor
; Arduino_GFX's Arduino_ESP32QSPI can produce, so src/lgfx_panel_st77922_qspi.hpp
; drives the SPI device itself. Pins (CS=10 SCLK=12 D0=11 D1=13 D2=14 D3=9) are
; fixed in that class. No reset pin (tied to the chip's own reset).
; Like jc3248w535 it draws into a full-frame PSRAM sprite pushed once per tick
; (PANEL_REQUIRES_AXS_FRAME_SPRITE); the panel itself stays at rotation 0.
;
; Touch: built into the ST77922 itself (I2C 0x55, 16-bit register addresses),
; NOT FT6x36-compatible -> src/button_touch_st77922.cpp. RST (GPIO48) idles low
; and must be pulsed before the touch half answers.
;
; Battery: GPIO 8 through a 1:2 divider (ADC 2.007 V x 2 = 4.01 V against a
; multimeter reading of 3.99-4.00 V).
;
; Hardware-tested pin map and driver come from the Launcher port of this board
; (bmorcelli/Launcher PR 475). Audio (ES8311 + amp) is not driven here.
; =============================================================================
[env:es3c35p]
platform = espressif32@6.12.0
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
board_build.partitions = partitions_16mb.csv
board_build.arduino.memory_type = qio_opi
board_upload.flash_size = 16MB
board_upload.maximum_size = 16777216
board_build.f_flash = 80000000L
board_build.flash_mode = qio
lib_deps = ${common.lib_deps}
build_flags =
-D BOARD_VARIANT=\"es3c35p\"
-D BOARD_NAME=\"LCDwiki_ES3C35P\"
-D BOARD_PANEL=\"ST77922_320x480_QSPI\"
-D BOARD_IS_ES3C35P=1
-D ENABLE_OTA_AUTO=1
-D BOARD_HAS_PSRAM=1
-D ARDUINO_USB_CDC_ON_BOOT=1
; --- Layout profile (same 320x480 as jc3248w535 / ws_lcd_350) ---
-D DISPLAY_320x480=1
-D BACKLIGHT_PIN=41
; --- Battery sense: GPIO 8, 1:2 divider ---
-D BOARD_HAS_BATTERY=1
-D BOARD_HAS_BAT_ADC=1
-D BAT_ADC_PIN=8
-D BAT_VOLT_DIVIDER=2.0f
; --- Touch (ST77922 integrated controller, I2C @0x55) ---
-D USE_ST77922_TOUCH=1
-D ST77922_TOUCH_SDA=38
-D ST77922_TOUCH_SCL=39
-D ST77922_TOUCH_INT=47
-D ST77922_TOUCH_RST=48
16 changes: 16 additions & 0 deletions docs/flasher.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,22 @@ const BOARDS = {
],
credit: { name: '@theNailz', u: 'https://github.com/theNailz' },
},
es3c35p: {
chipFamily: 'ESP32-S3',
label: 'LCDwiki ES3C35P 3.5" (320x480, ST77922 QSPI) - community (not owned by maintainer)',
name: 'LCDwiki ES3C35P 3.5"',
badge: 'community',
display: '3.5" ST77922, 320x480, QSPI',
touch: 'capacitive (in display IC)',
printers: 'up to 2 (opt-in 4)',
desc: 'All-in-one 3.5" ESP32-S3 board with 16MB flash, 8MB octal ' +
'PSRAM, a battery sense input and a WS2812 status LED on GPIO 40. ' +
'Reuses the JC3248W535 full-frame layout. There is no buzzer ' +
'hardware and no ES8311 audio driver yet.',
links: [
{ t: 'LCDwiki', u: 'http://www.lcdwiki.com/' },
],
},
cyd: {
chipFamily: 'ESP32',
label: 'CYD / ESP32-2432S028 (ILI9341, 240x320)',
Expand Down
25 changes: 21 additions & 4 deletions include/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,22 @@
#define DISPLAY_IS_ROUND 0
#endif

#if defined(BOARD_IS_JC3248W535)
// ES3C35P's ST77922 QSPI panel follows the same contract (fixed native 320x480
// portrait, whole-frame push via pushRawPixels(), rotation on the sprite), so it
// shares this path. The macro keeps its historical AXS name.
#if defined(BOARD_IS_JC3248W535) || defined(BOARD_IS_ES3C35P)
#define PANEL_REQUIRES_AXS_FRAME_SPRITE 1
#else
#define PANEL_REQUIRES_AXS_FRAME_SPRITE 0
#endif

// Panel class behind the frame sprite (display_ui.h FramePanel typedef).
#if defined(BOARD_IS_ES3C35P)
#define PANEL_FRAME_IS_ST77922 1
#else
#define PANEL_FRAME_IS_ST77922 0
#endif

// Display reset/control routed through an I2C IO expander instead of GPIOs:
// SenseCAP (PCA9535), ws_lcd_350 and ws_lcd_28c (TCA9554). This cap only signals "bring up
// Wire.h for the expander"; the per-chip register bring-up stays board-specific
Expand All @@ -215,7 +225,7 @@
// Touch panels where a wake tap reads as a long press (resistive XPT2046 - both the
// library driver and the LovyanGFX shared-bus one on cyd_2432s024 - and AXS15231B).
// main.cpp suppresses hold-to-dim on the sleep screens for these.
#if defined(USE_XPT2046) || defined(USE_AXS_TOUCH) || defined(BOARD_IS_CYD_2432S024)
#if defined(USE_XPT2046) || defined(USE_AXS_TOUCH) || defined(USE_ST77922_TOUCH) || defined(BOARD_IS_CYD_2432S024)
#define TOUCH_WAKE_LONGPRESS 1
#else
#define TOUCH_WAKE_LONGPRESS 0
Expand Down Expand Up @@ -256,7 +266,7 @@
#define BOARD_HAS_ONBOARD_RGB_PWM 0
#endif

#if defined(BOARD_IS_S3_ZERO) || defined(BOARD_IS_ES3N28P)
#if defined(BOARD_IS_S3_ZERO) || defined(BOARD_IS_ES3N28P) || defined(BOARD_IS_ES3C35P)
#define BOARD_HAS_ONBOARD_RGB_PIXEL 1
#else
#define BOARD_HAS_ONBOARD_RGB_PIXEL 0
Expand Down Expand Up @@ -359,6 +369,7 @@
defined(BOARD_IS_WS280) || defined(BOARD_IS_WS350) || \
defined(BOARD_IS_JC3248W535) || defined(BOARD_IS_SC01PLUS) || \
defined(BOARD_IS_ES3N28P) || defined(BOARD_IS_SC05X) || \
defined(BOARD_IS_ES3C35P) || \
defined(BOARD_IS_SENSECAP) || defined(BOARD_IS_AMOLED216) || \
defined(BOARD_IS_WS28C)
#define HAS_FULL_HMS_TABLE 1
Expand Down Expand Up @@ -465,7 +476,7 @@
// Edge glow (border light effect on print complete / failed)
// =============================================================================
#define GLOW_THICKNESS_PX 8 // border band thickness (rectangular)
#if defined(BOARD_IS_JC3248W535)
#if defined(BOARD_IS_JC3248W535) || defined(BOARD_IS_ES3C35P)
#define GLOW_ANIM_MS 80 // every tick flushes the full QSPI frame - keep modest
#elif DISPLAY_IS_ROUND
#define GLOW_ANIM_MS 40 // round ring = a few fillArc wedges, 25 fps fine
Expand Down Expand Up @@ -544,6 +555,10 @@
// as a GPIO regardless of the enabled flag, which would hijack SCLK and freeze
// the panel after boot. Disable (0) so the SPI clock is left alone.
#define BUZZER_DEFAULT_PIN 0
#elif defined(BOARD_IS_ES3C35P)
// LCDwiki ES3C35P: no buzzer; audio is an ES8311 codec + amp, which has no GPIO
// backend here. The generic S3 default (GPIO 5) is this board's SD CLK. Disable (0).
#define BUZZER_DEFAULT_PIN 0
#elif defined(BOARD_IS_WS28C)
// Waveshare 2.8C: the buzzer is expander bit 7, not a GPIO, so there is no pin
// to configure. 0 keeps the GPIO backend out of it - and the generic S3
Expand Down Expand Up @@ -616,6 +631,8 @@
#if BOARD_HAS_ONBOARD_RGB_PIXEL
#if defined(BOARD_IS_ES3N28P)
#define ONBOARD_RGB_DATA_PIN 42
#elif defined(BOARD_IS_ES3C35P)
#define ONBOARD_RGB_DATA_PIN 40 // LCDwiki ES3C35P WS2812
#else
#define ONBOARD_RGB_DATA_PIN 21 // Waveshare ESP32-S3-Zero
#endif
Expand Down
6 changes: 6 additions & 0 deletions src/button.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ void sanitizeButtonPin() {
if (buttonPin == AXS_TOUCH_SCL) { clash("AXS touch SCL"); return; }
if (buttonPin == AXS_TOUCH_INT) { clash("AXS touch INT"); return; }
#endif
#if defined(USE_ST77922_TOUCH)
if (buttonPin == ST77922_TOUCH_SDA) { clash("ST77922 touch SDA"); return; }
if (buttonPin == ST77922_TOUCH_SCL) { clash("ST77922 touch SCL"); return; }
if (buttonPin == ST77922_TOUCH_INT) { clash("ST77922 touch INT"); return; }
if (buttonPin == ST77922_TOUCH_RST) { clash("ST77922 touch RST"); return; }
#endif
#if defined(USE_FT6336)
if (buttonPin == FT6336_SDA) { clash("FT6336 touch SDA"); return; }
if (buttonPin == FT6336_SCL) { clash("FT6336 touch SCL"); return; }
Expand Down
2 changes: 1 addition & 1 deletion src/button_touch_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// At most one EXPLICIT driver may be selected. Zero is valid (no-touch boards -
// esp32s3, esp32c3, the round/DIY envs). More than one is a build error.
#if (defined(USE_XPT2046) + defined(USE_CST816) + defined(USE_CST328) \
+ defined(USE_FT5X06) + defined(USE_FT6336) + defined(USE_AXS_TOUCH) \
+ defined(USE_FT5X06) + defined(USE_FT6336) + defined(USE_AXS_TOUCH) + defined(USE_ST77922_TOUCH) \
+ defined(USE_GT911)) > 1
#error "button_touch: more than one explicit touch driver (USE_*) selected"
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/button_touch_none.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include "button_touch_backend.h"

#if (defined(USE_XPT2046) + defined(USE_CST816) + defined(USE_CST328) \
+ defined(USE_FT5X06) + defined(USE_FT6336) + defined(USE_AXS_TOUCH) \
+ defined(USE_FT5X06) + defined(USE_FT6336) + defined(USE_AXS_TOUCH) + defined(USE_ST77922_TOUCH) \
+ defined(USE_GT911)) == 0

#if defined(TOUCH_CS)
Expand Down
85 changes: 85 additions & 0 deletions src/button_touch_st77922.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// ST77922 integrated touch backend (lcdwiki_es3c35p). See button_touch_backend.h.
// The touch block sits inside the display controller (I2C 0x55) and is NOT
// FT6x36-compatible: register addresses are 16 bits wide (MSB first) and reads
// use a repeated start. BambuHelper only needs "finger down", so this is a level
// backend: touchPoll() reports whether the controller currently has a valid
// touch record. Register layout (from the vendor's esp_lcd_touch_st77922):
// 0x0010 info byte: bit 3 = "a coordinate report is available"
// 0x0009 max simultaneous touches
// 0x0014 8-byte record per touch, bit 7 of byte 0 = valid
// The whole maxTouches*8 report block MUST be read in one transfer, otherwise the
// controller never refreshes its buffer and keeps reporting a stale touch.
#include "button_touch_backend.h"

#if defined(USE_ST77922_TOUCH)

#include <Wire.h>

#define ST77922_TOUCH_ADDR 0x55
#define ST77922_REG_MAX_TOUCH 0x0009
#define ST77922_REG_INFO 0x0010
#define ST77922_REG_REPORT 0x0014
#define ST77922_INFO_HAS_COORD 0x08
#define ST77922_REPORT_VALID 0x80
#define ST77922_MAX_TOUCHES 10

static bool busReady = false;
static bool seen = false;

static bool stReadReg(uint16_t reg, uint8_t* buf, size_t len) {
Wire.beginTransmission(ST77922_TOUCH_ADDR);
Wire.write((uint8_t)(reg >> 8));
Wire.write((uint8_t)(reg & 0xFF));
if (Wire.endTransmission(false) != 0) return false; // repeated start, no STOP
if (Wire.requestFrom((uint8_t)ST77922_TOUCH_ADDR, len) < len) return false;
for (size_t i = 0; i < len; i++) buf[i] = (uint8_t)Wire.read();
return true;
}

void touchInit() {
// The touch half of the IC holds in reset until RST (GPIO48) is pulsed; the
// display half does not need it.
pinMode(ST77922_TOUCH_RST, OUTPUT);
digitalWrite(ST77922_TOUCH_RST, LOW);
delay(10);
digitalWrite(ST77922_TOUCH_RST, HIGH);
delay(50);
Wire.begin(ST77922_TOUCH_SDA, ST77922_TOUCH_SCL);
Wire.setClock(400000);
busReady = true;
pinMode(ST77922_TOUCH_INT, INPUT_PULLUP);
uint8_t info = 0;
if (stReadReg(ST77922_REG_INFO, &info, 1)) {
Serial.printf("ST77922 touch initialized (I2C SDA=%d SCL=%d INT=%d RST=%d, addr 0x%02X)\n",
ST77922_TOUCH_SDA, ST77922_TOUCH_SCL, ST77922_TOUCH_INT,
ST77922_TOUCH_RST, ST77922_TOUCH_ADDR);
seen = true;
} else {
Serial.printf("ST77922 touch did not answer at init (addr 0x%02X); will keep retrying at runtime\n",
ST77922_TOUCH_ADDR);
}
}

TouchPoll touchPoll() {
if (!busReady) return {TouchEvent::Unavailable, false};
uint8_t info = 0;
if (!stReadReg(ST77922_REG_INFO, &info, 1)) return {TouchEvent::Unavailable, false};
if (!seen) {
Serial.println("ST77922 touch became responsive at runtime");
seen = true;
}
if (!(info & ST77922_INFO_HAS_COORD)) return {TouchEvent::None, false};

uint8_t maxTouches = 0;
if (!stReadReg(ST77922_REG_MAX_TOUCH, &maxTouches, 1)) return {TouchEvent::Unavailable, false};
if (maxTouches == 0 || maxTouches > ST77922_MAX_TOUCHES) maxTouches = ST77922_MAX_TOUCHES;
uint8_t r[ST77922_MAX_TOUCHES * 8];
if (!stReadReg(ST77922_REG_REPORT, r, (size_t)maxTouches * 8))
return {TouchEvent::Unavailable, false};
for (uint8_t i = 0; i < maxTouches; i++) {
if (r[i * 8] & ST77922_REPORT_VALID) return {TouchEvent::None, true};
}
return {TouchEvent::None, false};
}

#endif // USE_ST77922_TOUCH
8 changes: 4 additions & 4 deletions src/clock_pong.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@
#define ARK_BALL_SIZE (SCREEN_W >= 480 ? ARK_BALL_SIZE_BASE * 2 : ARK_BALL_SIZE_BASE)
#define ARK_PADDLE_H_BASE 4
#define ARK_PADDLE_H (SCREEN_W >= 480 ? ARK_PADDLE_H_BASE * 2 : ARK_PADDLE_H_BASE)
// JC3248W535 (320x480, PSRAM sprite + ~20ms QSPI flush) needs faster
// physics: the play field is twice as tall as the 240px reference and the
// effective loop rate sits well below 50 Hz, so the base 3.0 px/tick ball
// Frame-sprite boards (320x480, PSRAM sprite + full QSPI flush per tick) need
// faster physics: the play field is twice as tall as the 240px reference and
// the effective loop rate sits well below 50 Hz, so the base 3.0 px/tick ball
// crawls across the screen. Paddle keeps its >ball-speed margin so it can
// still track the ball.
#if defined(BOARD_IS_JC3248W535)
#if PANEL_REQUIRES_AXS_FRAME_SPRITE
#define ARK_BALL_SPEED 6.0f
#define ARK_PADDLE_SPEED 8
#else
Expand Down
Loading
Loading