User reported their back button didn't work on crosspoint but did work
on stock. I had them run a few tests with logging and it turns out their
back button reports 3832 which is above the 3800 threshold we detect for
back button presses. This fixes the issue while still being within an
acceptable range to not have any regressions on other buttons. This fix
was verified by the user, and has been tested on an non problematic x3,
and an x4.
## Summary
Adds dedicated X3 grayscale LUTs and improves fast differential refresh
for better antialiased text rendering on the Xteink X3 display.
## Changes
- Dedicated grayscale LUTs (lut_x3_*_gray): Single-phase waveforms with
tuned VDL drive for dark gray (2 units) and light gray (3 units), with
active GND hold on non-gray transitions to prevent crosstalk
- Tight scan timing: TP2/TP3 reduced from 6 to 1 to minimize idle
gate-on time (17 to 7 units per row), reducing parasitic charge leakage
that causes white lines through letter strokes
- BB reinforcement: Added mild VDH pulse (VS=0x10) to lut_x3_bb_full so
black pixels get actively reinforced during fast differential refreshes,
clearing gray residue/ghosting
- displayGrayBuffer() updated to use the dedicated gray LUT bank instead
of full refresh LUTs
Companion to crosspoint-reader/crosspoint-reader#1607
## AI Disclosure
Yes, AI was used to assist with the development of these changes.
Migrating to Arduino ESP32 Core 3.x (ESP-IDF 5.x). The esp_adc_cal_* API
was removed in ESP-IDF 5.x - replaced with analogReadMilliVolts() which
handles ADC calibration internally.
---------
Co-authored-by: Dave Allie <dave@daveallie.com>
See crosspoint-reader/crosspoint-reader#561 for details.
This PR contains necessary changes to be able to implement a fix for the
sunlight fading issue present on the XTEINK X4.
Basically, I'm making sure for all necessary functions to have a
parameter turnOffScreen and to pass it through to displayBuffer() .
displayBuffer() then won't do a HALF_REFRESH if if turnOffScreen is true
and also pass it down to refreshDisplay().
The SDCardManager.h header uses std::string in function signatures but
doesn't include the <string> header, causing build failures.
Co-authored-by: ratedcounsel <hello@ratedcounsel.com>
- Migrate over to SdFat for exFAT support
- Add new utilities:
- `openFileForWrite`
- `openFileForRead`
- `removeDir`
- Sets up a singleton and macro to access it (`SdMan`)
Adds a basic implementation of `displayWindow` which displays a subset
of the current frame buffer to the screen. It is significantly less
performant than a full screen reload, so it shouldn't be used unless the
underlying content is hard to get/rerender.
I've also spotted a little bit of ghosting, but it's not fully clear as
to why that is. My only thought it the LUT and grayscale mode isn't
fully disengaged or the RED RAM buffer isn't correctly setup (but afaict
it should be populated correctly).
Going to merge this to continue testing this feature out in the wild,
but consider it experimental.
* Cleanup EInkDisplay
* Add EINK_DISPLAY_SINGLE_BUFFER_MODE build flag and allow for single buffer rendering
* Add SSD1677 E-Ink Display Driver Guide
Copied verbatium from https://github.com/CidVonHighwind/microreader/blob/main/doc/SSD1677_GUIDE.md
* Add a few details in the readme and update the SSD1677_GUIDE