commit fd15458b4be915acf16da242cc67f906e839dd7c Author: Máximo Cuadros Date: Sat Oct 22 03:22:19 2016 +0200 poc diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0d67c2b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/rpi-rgb-led-matrix"] + path = vendor/rpi-rgb-led-matrix + url = https://github.com/hzeller/rpi-rgb-led-matrix.git diff --git a/matrix.go b/matrix.go new file mode 100644 index 0000000..17fd2a5 --- /dev/null +++ b/matrix.go @@ -0,0 +1,112 @@ +package main + +/* +#cgo CFLAGS: -std=c99 -Ivendor/rpi-rgb-led-matrix/include -DSHOW_REFRESH_RATE +#cgo LDFLAGS: -lrgbmatrix -Lvendor/rpi-rgb-led-matrix/lib -lstdc++ -lm +#include +#include +#include +#include + +struct RGBLedMatrix *matrix; +struct LedCanvas *offscreen_canvas; + +void setCanvas(struct LedCanvas *offscreen_canvas, const uint32_t pixels[]) { + int i, x, y; + uint32_t color; + for (y = 0; y < 32; ++y) { + for (x = 0; x < 64; ++x) { + i = x + (y * 64); + + color = pixels[i]; + led_canvas_set_pixel(offscreen_canvas, x, y, + (color >> 16) & 255, (color >> 8) & 255, color & 255); + } + } +} + +int example(struct RGBLedMatrixOptions *options) { + struct LedCanvas *offscreen_canvas; + int width, height; + int x, y, i; + + matrix = led_matrix_create_from_options(options, NULL, NULL); + if (matrix == NULL) + return 1; + + offscreen_canvas = led_matrix_create_offscreen_canvas(matrix); + + led_canvas_get_size(offscreen_canvas, &width, &height); + + fprintf(stderr, "Size: %dx%d. Hardware gpio mapping: %s\n", + width, height, options->hardware_mapping); + + for (i = 0; i < 1000; ++i) { + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + led_canvas_set_pixel(offscreen_canvas, x, y, i & 0xff, x, y); + } + } + + offscreen_canvas = led_matrix_swap_on_vsync(matrix, offscreen_canvas); + } + + led_matrix_delete(matrix); + + return 0; +} +*/ +import "C" +import ( + "fmt" + "image/color" + "time" + "unsafe" +) + +func main() { + o := &C.struct_RGBLedMatrixOptions{} + o.rows = 32 + o.chain_length = 2 + + s := time.Now() + C.example(o) + fmt.Println(time.Since(s)) + + s = time.Now() + example(o) + fmt.Println(time.Since(s)) + +} + +func example(o *C.struct_RGBLedMatrixOptions) { + matrix := C.led_matrix_create_from_options(o, nil, nil) + if matrix == nil { + panic("jodido") + } + + //offscreen := C.led_matrix_create_offscreen_canvas(matrix) + for i := 1; i < 1000; i++ { + p := make([]C.uint32_t, 2048) + for y := 0; y < 32; y++ { + for x := 0; x < 64; x++ { + pos := x + (y * 64) + + c := color.RGBA{uint8(i & 0xff), uint8(x), uint8(y), 0} + p[pos] = C.uint32_t(colorToUint32(c)) + } + } + + C.setCanvas(matrix, (*C.uint32_t)(unsafe.Pointer(&p[0]))) + //offscreen = C.led_matrix_swap_on_vsync(matrix, offscreen) + } + + C.led_matrix_delete(matrix) +} + +func colorToUint32(c color.Color) uint32 { + // A color's RGBA method returns values in the range [0, 65535] + red, green, blue, _ := c.RGBA() + // r<<16 | g<<8 | b + return (red>>8)<<16 | (green>>8)<<8 | blue>>8 +} diff --git a/vendor/rpi-rgb-led-matrix b/vendor/rpi-rgb-led-matrix new file mode 160000 index 0000000..24ecf1d --- /dev/null +++ b/vendor/rpi-rgb-led-matrix @@ -0,0 +1 @@ +Subproject commit 24ecf1d8393d55880b013e068a7d3575c13ab8ac