From 3b69399be226a170db20991dc95e3c950612b711 Mon Sep 17 00:00:00 2001 From: Brendan Porter Date: Wed, 15 Aug 2018 18:23:06 -0500 Subject: [PATCH 1/5] Added GPIO Slowdown --- matrix.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/matrix.go b/matrix.go index 8b9ddf1..9ecc432 100644 --- a/matrix.go +++ b/matrix.go @@ -95,6 +95,9 @@ type HardwareConfig struct { ShowRefreshRate bool InverseColors bool + // Control speed of GPIO updates. Valid range is 0..3 + GPIOSlowdown int + // Name of GPIO mapping used HardwareMapping string } @@ -114,6 +117,7 @@ func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions { o.brightness = C.int(c.Brightness) o.scan_mode = C.int(c.ScanMode) o.hardware_mapping = C.CString(c.HardwareMapping) + o.gpio_slowdown = C.int(c.GPIOSlowdown) if c.ShowRefreshRate == true { C.set_show_refresh_rate(o, C.int(1)) From 1338f761458c00775275c9fd889d2f950c827270 Mon Sep 17 00:00:00 2001 From: Brendan Porter Date: Wed, 15 Aug 2018 18:23:45 -0500 Subject: [PATCH 2/5] Added GPIO Slowdown default --- matrix.go | 1 + 1 file changed, 1 insertion(+) diff --git a/matrix.go b/matrix.go index 9ecc432..ab0045a 100644 --- a/matrix.go +++ b/matrix.go @@ -56,6 +56,7 @@ var DefaultConfig = HardwareConfig{ PWMLSBNanoseconds: 130, Brightness: 100, ScanMode: Progressive, + GPIOSlowdown: 1, } // HardwareConfig rgb-led-matrix configuration From 1563b8531e40f6675f5be06edbe3821f04e1b7de Mon Sep 17 00:00:00 2001 From: Brendan Porter Date: Wed, 15 Aug 2018 18:42:16 -0500 Subject: [PATCH 3/5] fixing gpio slowdown --- matrix.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/matrix.go b/matrix.go index ab0045a..439a34e 100644 --- a/matrix.go +++ b/matrix.go @@ -118,7 +118,10 @@ func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions { o.brightness = C.int(c.Brightness) o.scan_mode = C.int(c.ScanMode) o.hardware_mapping = C.CString(c.HardwareMapping) - o.gpio_slowdown = C.int(c.GPIOSlowdown) + + if c.GPIOSlowdown >= 0 && c.GPIOSlowdown < 3 { + C.gpio_slowdown(gpio_slowdown) + } if c.ShowRefreshRate == true { C.set_show_refresh_rate(o, C.int(1)) From e46ef1c378a30f21530558c10c317642d3425948 Mon Sep 17 00:00:00 2001 From: Brendan Porter Date: Wed, 15 Aug 2018 18:44:43 -0500 Subject: [PATCH 4/5] fixing gpio slowdown --- matrix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix.go b/matrix.go index 439a34e..1a0f089 100644 --- a/matrix.go +++ b/matrix.go @@ -120,7 +120,7 @@ func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions { o.hardware_mapping = C.CString(c.HardwareMapping) if c.GPIOSlowdown >= 0 && c.GPIOSlowdown < 3 { - C.gpio_slowdown(gpio_slowdown) + C.gpio_slowdown(c.GPIOSlowdown) } if c.ShowRefreshRate == true { From 59ef5ae4add6eaa8b32e4679e91446bbf338622c Mon Sep 17 00:00:00 2001 From: Brendan Porter Date: Fri, 17 Aug 2018 11:35:22 -0500 Subject: [PATCH 5/5] trying to fix gpio slowdown --- matrix.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/matrix.go b/matrix.go index 1a0f089..1d14044 100644 --- a/matrix.go +++ b/matrix.go @@ -56,7 +56,11 @@ var DefaultConfig = HardwareConfig{ PWMLSBNanoseconds: 130, Brightness: 100, ScanMode: Progressive, - GPIOSlowdown: 1, +} + +type RuntimeOptions struct { + // Control speed of GPIO updates. Valid range is 0..3 + GPIOSlowdown int } // HardwareConfig rgb-led-matrix configuration @@ -96,9 +100,6 @@ type HardwareConfig struct { ShowRefreshRate bool InverseColors bool - // Control speed of GPIO updates. Valid range is 0..3 - GPIOSlowdown int - // Name of GPIO mapping used HardwareMapping string } @@ -107,6 +108,17 @@ func (c *HardwareConfig) geometry() (width, height int) { return c.Cols * c.ChainLength, c.Rows * c.Parallel } +func (r *RuntimeOptions) toC() *C.struct_RuntimeOptions { + o := &C.struct_RuntimeOptions{} + o.gpio_slowdown = C.int(r.GPIOSlowdown) + + if c.GPIOSlowdown > 0 || c.GPIOSlowdown > 4 { + o.gpio_slowdown = 1 + } + + return o +} + func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions { o := &C.struct_RGBLedMatrixOptions{} o.rows = C.int(c.Rows) @@ -119,10 +131,6 @@ func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions { o.scan_mode = C.int(c.ScanMode) o.hardware_mapping = C.CString(c.HardwareMapping) - if c.GPIOSlowdown >= 0 && c.GPIOSlowdown < 3 { - C.gpio_slowdown(c.GPIOSlowdown) - } - if c.ShowRefreshRate == true { C.set_show_refresh_rate(o, C.int(1)) } else { @@ -197,6 +205,39 @@ func NewRGBLedMatrix(config *HardwareConfig) (c Matrix, err error) { return c, nil } +// NewRGBLedMatrix returns a new matrix using the given size and config +func NewRGBLedMatrixWithOptions(config *HardwareConfig, run *RuntimeOptions) (c Matrix, err error) { + defer func() { + if r := recover(); r != nil { + var ok bool + err, ok = r.(error) + if !ok { + err = fmt.Errorf("error creating matrix: %v", r) + } + } + }() + + if isMatrixEmulator() { + return buildMatrixEmulator(config), nil + } + + w, h := config.geometry() + m := C.from_matrix(C.CreateMatrixFromOptions(config.toC(), run.toC())) + b := C.led_matrix_create_offscreen_canvas(m) + c = &RGBLedMatrix{ + Config: config, + width: w, height: h, + matrix: m, + buffer: b, + leds: make([]C.uint32_t, w*h), + } + if m == nil { + return nil, fmt.Errorf("unable to allocate memory") + } + + return c, nil +} + func isMatrixEmulator() bool { if os.Getenv(MatrixEmulatorENV) == "1" { return true