The two SPI panels are done: a Heltec T114 and a T096 draw under Renode, on
the controller the boards actually use (the Arduino core's SPI1, not the
radio's). Verified on a T114 booting its published image - "Please wait..."
at boot, then the repeater's own status screen.
The RAK4631 is the one left, and it is a different problem rather than a
smaller one. Its SSD1306 is on I2C, and NRF52840_TWIM in
tools/renode/peripherals/ has no notion of a slave at all: it answers every
address with a NACK, deliberately, because until now no board under Renode had
anything on that bus and firmware probing an empty bus has to get an answer
rather than hang.
What is needed
- A slave registry on the TWIM. Address in, bytes in and out, NACK for
an address nobody claims - which has to stay the default, because that
behaviour is what stops a firmware probing for a sensor from spinning.
- An SSD1306 model behind it: 128x64, one bit a pixel, page-addressed.
The frame it sends is the same shape the two colour panels send, and the
Go side already reads it (peripheral.PanelListener, bpp: 1).
Already in place
peripheral.ListenPanelTCP - the loopback frame channel Renode can dial.
MeshBenchPanel.cs - the frame header and sender, and the "nothing drawn is
not black" rule, which an SSD1306 model can follow rather than reinvent.
engine.ScreenModelled - the one rule that decides whether the window says
a panel is drawn or says the gap is ours. It already excludes exactly this
case, so the window is honest about it today.
Not this
Do not settle for drawing something plausible. A panel showing a picture the
firmware did not draw is worse than an empty frame that says why it is empty.
The two SPI panels are done: a Heltec T114 and a T096 draw under Renode, on
the controller the boards actually use (the Arduino core's SPI1, not the
radio's). Verified on a T114 booting its published image - "Please wait..."
at boot, then the repeater's own status screen.
The RAK4631 is the one left, and it is a different problem rather than a
smaller one. Its SSD1306 is on I2C, and
NRF52840_TWIMintools/renode/peripherals/has no notion of a slave at all: it answers everyaddress with a NACK, deliberately, because until now no board under Renode had
anything on that bus and firmware probing an empty bus has to get an answer
rather than hang.
What is needed
an address nobody claims - which has to stay the default, because that
behaviour is what stops a firmware probing for a sensor from spinning.
The frame it sends is the same shape the two colour panels send, and the
Go side already reads it (
peripheral.PanelListener,bpp: 1).Already in place
peripheral.ListenPanelTCP- the loopback frame channel Renode can dial.MeshBenchPanel.cs- the frame header and sender, and the "nothing drawn isnot black" rule, which an SSD1306 model can follow rather than reinvent.
engine.ScreenModelled- the one rule that decides whether the window saysa panel is drawn or says the gap is ours. It already excludes exactly this
case, so the window is honest about it today.
Not this
Do not settle for drawing something plausible. A panel showing a picture the
firmware did not draw is worse than an empty frame that says why it is empty.