diff options
Diffstat (limited to 'libraries/ws2812.c')
-rw-r--r-- | libraries/ws2812.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/libraries/ws2812.c b/libraries/ws2812.c index 41d4fb5..aa64031 100644 --- a/libraries/ws2812.c +++ b/libraries/ws2812.c @@ -8,7 +8,7 @@ Please mind these restrictions: - Only usable with libopencm3 - Newer versions of libopencm3 may be not compatibel (libopencm3 api is not stable yet) -- Just usable with a clock frequency of 80 MHz +- Just usable with a clock frequency of 72 MHz - You have to setup the clock and gpio yourself */ @@ -21,19 +21,18 @@ Please mind these restrictions: #define NUMBER_NOPS_SHORT 6 // 0.35 µs = 25.2 cycles @ 72 MHz = 6.3 nops --> 16.7 ns timing error -void ws2812_init(ws2812_init_typedef *control_struct, uint32_t port, uint16_t pin, uint32_t array_length, uint32_t matrix_width) +void ws2812_init(WS2812_ARRAY *control_struct, uint32_t port, uint16_t pin, uint8_t *buffer_ptr, uint32_t array_length) { control_struct->gpio_port = port; control_struct->gpio_pin = pin; + control_struct->array_buffer = buffer_ptr; control_struct->array_length = array_length; - control_struct->matrix_width = matrix_width; - control_struct->led_array = malloc(sizeof(uint8_t[array_length][3])); ws2812_clear_buffer(control_struct); ws2812_send_reset(control_struct); } -void ws2812_send_reset(ws2812_init_typedef *control_struct) +void ws2812_send_reset(WS2812_ARRAY *control_struct) { gpio_clear(control_struct->gpio_port, control_struct->gpio_pin); for (int i = 0; i < NUMBER_NOPS_RESET; i++) { @@ -42,7 +41,7 @@ void ws2812_send_reset(ws2812_init_typedef *control_struct) } -void ws2812_send_zero(ws2812_init_typedef *control_struct) +void ws2812_send_zero(WS2812_ARRAY *control_struct) { gpio_set(control_struct->gpio_port, control_struct->gpio_pin); for (int i = 0; i < NUMBER_NOPS_SHORT; i++) { @@ -55,7 +54,7 @@ void ws2812_send_zero(ws2812_init_typedef *control_struct) } -void ws2812_send_one(ws2812_init_typedef *control_struct) +void ws2812_send_one(WS2812_ARRAY *control_struct) { gpio_set(control_struct->gpio_port, control_struct->gpio_pin); for (int i = 0; i < NUMBER_NOPS_LONG; i++) { @@ -68,7 +67,7 @@ void ws2812_send_one(ws2812_init_typedef *control_struct) } -void ws2812_send_byte(ws2812_init_typedef *control_struct, uint8_t data) +void ws2812_send_byte(WS2812_ARRAY *control_struct, uint8_t data) { for (int i=7; i>=0; i--){ if ( (data >> i) & 0x01 ){ @@ -81,7 +80,7 @@ void ws2812_send_byte(ws2812_init_typedef *control_struct, uint8_t data) } -void ws2812_send_led(ws2812_init_typedef *control_struct, uint8_t red, uint8_t green, uint8_t blue) +void ws2812_send_led(WS2812_ARRAY *control_struct, uint8_t red, uint8_t green, uint8_t blue) { ws2812_send_byte(control_struct, green); ws2812_send_byte(control_struct, red); @@ -89,35 +88,29 @@ void ws2812_send_led(ws2812_init_typedef *control_struct, uint8_t red, uint8_t g } -void ws2812_write_leds(ws2812_init_typedef *control_struct) +void ws2812_write_leds(WS2812_ARRAY *control_struct) { for(uint32_t i=0; i<(control_struct->array_length); i++){ ws2812_send_led( control_struct, - control_struct->led_array[i][0], // red - control_struct->led_array[i][1], // green - control_struct->led_array[i][2] // blue + control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 0], // red + control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 1], // green + control_struct->array_buffer[i * WS2812_NUMBER_OF_COLORS + 2] // blue ); } ws2812_send_reset(control_struct); } -void ws2812_set_array_led(ws2812_init_typedef *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue) +void ws2812_set_array_led(WS2812_ARRAY *control_struct, uint32_t index, uint8_t red, uint8_t green, uint8_t blue) { - control_struct->led_array[index][0] = red; - control_struct->led_array[index][1] = green; - control_struct->led_array[index][2] = blue; + control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 0] = red; + control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 1] = green; + control_struct->array_buffer[index * WS2812_NUMBER_OF_COLORS + 2] = blue; } -void ws2812_set_matrix_led(ws2812_init_typedef *control_struct, uint32_t x, uint32_t y, uint8_t red, uint8_t green, uint8_t blue) -{ - ws2812_set_array_led(control_struct, (x + y * (control_struct->matrix_width)), red, green, blue); -} - - -void ws2812_clear_buffer(ws2812_init_typedef *control_struct) +void ws2812_clear_buffer(WS2812_ARRAY *control_struct) { for (uint32_t i=0; i<control_struct->array_length; i++){ ws2812_set_array_led(control_struct, i, 0, 0, 0); |