From cae0146d890095378b84c438c7f53b6bfeae1589 Mon Sep 17 00:00:00 2001 From: Ohad Lutzky Date: Sat, 8 May 2021 20:39:39 +0100 Subject: [PATCH] ssd1306: Add SetDisplayStartLine --- ssd1306/ssd1306.go | 11 +++++++++++ ssd1306/ssd1306_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/ssd1306/ssd1306.go b/ssd1306/ssd1306.go index 937d55c..9a8d29d 100644 --- a/ssd1306/ssd1306.go +++ b/ssd1306/ssd1306.go @@ -279,6 +279,17 @@ func (d *Dev) SetContrast(level byte) error { return d.sendCommand([]byte{0x81, level}) } +// SetDisplayStartLine causes the display to start from startLine, effectively +// scrolling the screen to that position. +// +// startLine must be between 0 and 63. +func (d *Dev) SetDisplayStartLine(startLine byte) error { + if startLine > 63 { + return fmt.Errorf("ssd1306: invalid startLine %d", startLine) + } + return d.sendCommand([]byte{_SETSTARTLINE | startLine}) +} + // Halt turns off the display. // // Sending any other command afterward reenables the display. diff --git a/ssd1306/ssd1306_test.go b/ssd1306/ssd1306_test.go index 3cf7b59..98ce906 100644 --- a/ssd1306/ssd1306_test.go +++ b/ssd1306/ssd1306_test.go @@ -377,6 +377,37 @@ func TestI2C_SetContrast(t *testing.T) { } } +func TestI2C_SetDisplayStartLine(t *testing.T) { + bus := i2ctest.Playback{ + Ops: []i2ctest.IO{ + {Addr: 0x3c, W: initCmdI2C()}, + {Addr: 0x3c, W: []byte{0x0, 0x40}}, + {Addr: 0x3c, W: []byte{0x0, 0x45}}, + {Addr: 0x3c, W: []byte{0x0, 0x60}}, + {Addr: 0x3c, W: []byte{0x0, 0x7F}}, + }, + } + dev, err := NewI2C(&bus, &DefaultOpts) + if err != nil { + t.Fatal(err) + } + if err := dev.SetDisplayStartLine(0); err != nil { + t.Fatal(err) + } + if err := dev.SetDisplayStartLine(5); err != nil { + t.Fatal(err) + } + if err := dev.SetDisplayStartLine(32); err != nil { + t.Fatal(err) + } + if err := dev.SetDisplayStartLine(63); err != nil { + t.Fatal(err) + } + if err := bus.Close(); err != nil { + t.Fatal(err) + } +} + func TestI2C_Invert_Halt_resume(t *testing.T) { bus := i2ctest.Playback{ Ops: []i2ctest.IO{