Merge pull request #4 from brendanporter/gpio_slowdown
trying to fix gpio slowdown
This commit is contained in:
57
matrix.go
57
matrix.go
@@ -56,7 +56,11 @@ var DefaultConfig = HardwareConfig{
|
|||||||
PWMLSBNanoseconds: 130,
|
PWMLSBNanoseconds: 130,
|
||||||
Brightness: 100,
|
Brightness: 100,
|
||||||
ScanMode: Progressive,
|
ScanMode: Progressive,
|
||||||
GPIOSlowdown: 1,
|
}
|
||||||
|
|
||||||
|
type RuntimeOptions struct {
|
||||||
|
// Control speed of GPIO updates. Valid range is 0..3
|
||||||
|
GPIOSlowdown int
|
||||||
}
|
}
|
||||||
|
|
||||||
// HardwareConfig rgb-led-matrix configuration
|
// HardwareConfig rgb-led-matrix configuration
|
||||||
@@ -96,9 +100,6 @@ type HardwareConfig struct {
|
|||||||
ShowRefreshRate bool
|
ShowRefreshRate bool
|
||||||
InverseColors bool
|
InverseColors bool
|
||||||
|
|
||||||
// Control speed of GPIO updates. Valid range is 0..3
|
|
||||||
GPIOSlowdown int
|
|
||||||
|
|
||||||
// Name of GPIO mapping used
|
// Name of GPIO mapping used
|
||||||
HardwareMapping string
|
HardwareMapping string
|
||||||
}
|
}
|
||||||
@@ -107,6 +108,17 @@ func (c *HardwareConfig) geometry() (width, height int) {
|
|||||||
return c.Cols * c.ChainLength, c.Rows * c.Parallel
|
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 {
|
func (c *HardwareConfig) toC() *C.struct_RGBLedMatrixOptions {
|
||||||
o := &C.struct_RGBLedMatrixOptions{}
|
o := &C.struct_RGBLedMatrixOptions{}
|
||||||
o.rows = C.int(c.Rows)
|
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.scan_mode = C.int(c.ScanMode)
|
||||||
o.hardware_mapping = C.CString(c.HardwareMapping)
|
o.hardware_mapping = C.CString(c.HardwareMapping)
|
||||||
|
|
||||||
if c.GPIOSlowdown >= 0 && c.GPIOSlowdown < 3 {
|
|
||||||
C.gpio_slowdown(c.GPIOSlowdown)
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.ShowRefreshRate == true {
|
if c.ShowRefreshRate == true {
|
||||||
C.set_show_refresh_rate(o, C.int(1))
|
C.set_show_refresh_rate(o, C.int(1))
|
||||||
} else {
|
} else {
|
||||||
@@ -197,6 +205,39 @@ func NewRGBLedMatrix(config *HardwareConfig) (c Matrix, err error) {
|
|||||||
return c, nil
|
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 {
|
func isMatrixEmulator() bool {
|
||||||
if os.Getenv(MatrixEmulatorENV) == "1" {
|
if os.Getenv(MatrixEmulatorENV) == "1" {
|
||||||
return true
|
return true
|
||||||
|
|||||||
Reference in New Issue
Block a user