Bind Companion replies to request transports, make dual-CDC USB sessions nonblocking and reconnect-safe, and harden nRF52 watchdog/OTA storage paths. Fix T096 button debounce, display wake, sleep races, and the compact message layout; add exact WisBlock OTA profiles plus expanded native/static/HIL documentation.
107 lines
4.6 KiB
Python
107 lines
4.6 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from pathlib import Path
|
|
import unittest
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
DRIVER = ROOT / "src" / "helpers" / "ui" / "ST7735Display.cpp"
|
|
|
|
|
|
class ST7735DisplayWakeProfileTest(unittest.TestCase):
|
|
def test_power_off_releases_bus_without_uninitializing_spi(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
turn_off_start = source.index("void ST7735Display::turnOff()")
|
|
turn_off_end = source.index("\n}\n", turn_off_start)
|
|
turn_off = source[turn_off_start:turn_off_end]
|
|
|
|
self.assertNotIn("_spi->end();", turn_off)
|
|
self.assertIn("pinMode(PIN_TFT_SDA, INPUT);", turn_off)
|
|
self.assertIn("pinMode(PIN_TFT_SCL, INPUT);", turn_off)
|
|
|
|
def test_begin_restores_bus_pins_before_spi_begin(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
begin_start = source.index("bool ST7735Display::begin()")
|
|
begin_end = source.index("\n}\n", begin_start)
|
|
begin = source[begin_start:begin_end]
|
|
|
|
sda_restore = begin.index("pinMode(PIN_TFT_SDA, OUTPUT);")
|
|
scl_restore = begin.index("pinMode(PIN_TFT_SCL, OUTPUT);")
|
|
spi_begin = begin.index("_spi->begin(")
|
|
self.assertLess(sda_restore, spi_begin)
|
|
self.assertLess(scl_restore, spi_begin)
|
|
|
|
backlight_inactive = begin.index(
|
|
"digitalWrite(PIN_TFT_LEDA_CTL, !PIN_TFT_LEDA_CTL_ACTIVE);"
|
|
)
|
|
backlight_output = begin.index("pinMode(PIN_TFT_LEDA_CTL, OUTPUT);")
|
|
self.assertLess(backlight_inactive, backlight_output)
|
|
|
|
def test_nrf52_wake_restores_spi_high_drive(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
begin_start = source.index("bool ST7735Display::begin()")
|
|
begin_end = source.index("\n}\n", begin_start)
|
|
begin = source[begin_start:begin_end]
|
|
|
|
self.assertIn("nrf_gpio_cfg(PIN_TFT_SCL,", begin)
|
|
self.assertIn("NRF_GPIO_PIN_INPUT_CONNECT", begin)
|
|
self.assertIn("nrf_gpio_cfg(PIN_TFT_SDA,", begin)
|
|
self.assertIn("NRF_GPIO_PIN_INPUT_DISCONNECT", begin)
|
|
self.assertEqual(begin.count("NRF_GPIO_PIN_H0H1"), 2)
|
|
|
|
def test_wake_reenters_full_display_begin_path(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
turn_on_start = source.index("void ST7735Display::turnOn()")
|
|
turn_on_end = source.index("\n}\n", turn_on_start)
|
|
turn_on = source[turn_on_start:turn_on_end]
|
|
|
|
self.assertIn("begin();", turn_on)
|
|
|
|
def test_reset_release_waits_before_first_init_command(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
reset_start = source.index("void ST7735Display::_resetAndInit()")
|
|
reset_end = source.index("\n}\n", reset_start)
|
|
reset = source[reset_start:reset_end]
|
|
|
|
reset_release = reset.index("digitalWrite(PIN_TFT_RST, HIGH);", 100)
|
|
recovery_wait = reset.index("delay(120);", reset_release)
|
|
display_init = reset.index("displayInit(Rcmd1);", reset_release)
|
|
self.assertLess(reset_release, recovery_wait)
|
|
self.assertLess(recovery_wait, display_init)
|
|
|
|
def test_begin_settles_normal_mode_before_marking_display_on(self):
|
|
source = DRIVER.read_text(encoding="utf-8")
|
|
begin_start = source.index("bool ST7735Display::begin()")
|
|
begin_end = source.index("\n}\n", begin_start)
|
|
begin = source[begin_start:begin_end]
|
|
|
|
display_init = begin.index("_resetAndInit();")
|
|
normal_on = begin.index("sendCommand(ST77XX_NORON);", display_init)
|
|
normal_delay = begin.index("delay(10);", normal_on)
|
|
display_on = begin.index("sendCommand(ST77XX_DISPON);", normal_delay)
|
|
display_delay = begin.index("delay(100);", display_on)
|
|
prime_frame = begin.index("endFrame();", display_delay)
|
|
backlight = begin.index(
|
|
"digitalWrite(PIN_TFT_LEDA_CTL, PIN_TFT_LEDA_CTL_ACTIVE);",
|
|
prime_frame,
|
|
)
|
|
marked_on = begin.index("_isOn = true;", backlight)
|
|
|
|
self.assertLess(display_init, normal_on)
|
|
self.assertLess(normal_on, normal_delay)
|
|
self.assertLess(normal_delay, display_on)
|
|
self.assertLess(display_on, display_delay)
|
|
self.assertLess(display_delay, prime_frame)
|
|
self.assertLess(prime_frame, backlight)
|
|
self.assertLess(backlight, marked_on)
|
|
self.assertNotIn("fillScreen(ST77XX_BLACK)", begin[display_delay:prime_frame])
|
|
|
|
reset_start = source.index("void ST7735Display::_resetAndInit()")
|
|
reset_end = source.index("\n}\n", reset_start)
|
|
reset = source[reset_start:reset_end]
|
|
self.assertNotIn("endFrame();", reset)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|