1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| #include "led_matrix_driver.h"
static ws2812_config_t led_matrix_ws2812_config; static ws2812_color_t led_matrix_pixels[LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT];
bool led_matrix_driver_init(const ws2812_config_t *ws2812_config) { if (ws2812_config == NULL) { return false; } led_matrix_ws2812_config = *ws2812_config; if (!ws2812_driver_init(ws2812_config)) { return false; } led_matrix_driver_clear(); return true; }
bool led_matrix_driver_set_pixel(uint8_t x, uint8_t y, const ws2812_color_t *color) { if (x >= LED_MATRIX_WIDTH || y >= LED_MATRIX_HEIGHT || color == NULL) { return false; } uint16_t index = y * LED_MATRIX_WIDTH + x; led_matrix_pixels[index] = *color; return true; }
bool led_matrix_driver_clear(void) { ws2812_color_t black_color = {0, 0, 0}; for (uint16_t i = 0; i < LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT; i++) { led_matrix_pixels[i] = black_color; } return true; }
bool led_matrix_driver_show(void) { return ws2812_driver_set_pixels_color(led_matrix_pixels, LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT) && ws2812_driver_show(); }
bool led_matrix_driver_draw_vertical_line(uint8_t x, uint8_t y_start, uint8_t y_end, const ws2812_color_t *color) { if (x >= LED_MATRIX_WIDTH || y_start >= LED_MATRIX_HEIGHT || y_end >= LED_MATRIX_HEIGHT || color == NULL || y_start > y_end) { return false; } for (uint8_t y = y_start; y <= y_end; y++) { led_matrix_driver_set_pixel(x, y, color); } return true; }
bool led_matrix_driver_draw_horizontal_line(uint8_t y, uint8_t x_start, uint8_t x_end, const ws2812_color_t *color) { if (y >= LED_MATRIX_HEIGHT || x_start >= LED_MATRIX_WIDTH || x_end >= LED_MATRIX_WIDTH || color == NULL || x_start > x_end) { return false; } for (uint8_t x = x_start; x <= x_end; x++) { led_matrix_driver_set_pixel(x, y, color); } return true; }
bool led_matrix_driver_draw_rectangle(uint8_t x_start, uint8_t y_start, uint8_t width, uint8_t height, const ws2812_color_t *color) { if (x_start >= LED_MATRIX_WIDTH || y_start >= LED_MATRIX_HEIGHT || width <= 0 || height <= 0 || color == NULL || (x_start + width) > LED_MATRIX_WIDTH || (y_start + height) > LED_MATRIX_HEIGHT) { return false; } led_matrix_driver_draw_horizontal_line(y_start, x_start, x_start + width - 1, color); led_matrix_driver_draw_horizontal_line(y_start + height - 1, x_start, x_start + width - 1, color); led_matrix_driver_draw_vertical_line(x_start, y_start, y_start + height - 1, color); led_matrix_driver_draw_vertical_line(x_start + width - 1, y_start, y_start + height - 1, color); return true; }
bool led_matrix_driver_draw_filled_rectangle(uint8_t x_start, uint8_t y_start, uint8_t width, uint8_t height, const ws2812_color_t *color) { if (x_start >= LED_MATRIX_WIDTH || y_start >= LED_MATRIX_HEIGHT || width <= 0 || height <= 0 || color == NULL || (x_start + width) > LED_MATRIX_WIDTH || (y_start + height) > LED_MATRIX_HEIGHT) { return false; } for (uint8_t y = y_start; y < y_start + height; y++) { led_matrix_driver_draw_horizontal_line(y, x_start, x_start + width - 1, color); } return true; }
static const uint8_t font_5x7[] = { 0x00, 0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x7C, 0x02, 0x7C, 0x80, 0x7C, 0x00, 0x00, 0x7C, 0x02, 0x3C, 0x02, 0x7C, 0x00, 0x00, 0x84, 0x84, 0x84, 0xFC, 0x04, 0x00, 0x00, 0xFC, 0x80, 0x7C, 0x02, 0x7C, 0x00, 0x00, 0x7C, 0x80, 0xFC, 0x82, 0x7C, 0x00, 0x00, 0xFC, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x7C, 0x82, 0x7C, 0x82, 0x7C, 0x00, 0x00, 0x7C, 0x82, 0x7E, 0x02, 0x7C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, };
bool led_matrix_driver_draw_char(uint8_t x, uint8_t y, char ch, const ws2812_color_t *color) { if (x >= LED_MATRIX_WIDTH || y >= LED_MATRIX_HEIGHT || color == NULL) { return false; } if (ch < '0' || ch > ':') { return false; } uint8_t char_index = ch - '0'; if (char_index >= sizeof(font_5x7) / 7) return false;
for (uint8_t row = 0; row < 7; row++) { uint8_t font_row_data = font_5x7[char_index * 7 + row]; for (uint8_t col = 0; col < 5; col++) { if ((font_row_data >> (4 - col)) & 0x01) { led_matrix_driver_set_pixel(x + col, y + row, color); } } } return true; }
bool led_matrix_driver_draw_string(uint8_t x, uint8_t y, const char *str, const ws2812_color_t *color) { if (str == NULL || color == NULL) { return false; } uint8_t current_x = x; for (uint8_t i = 0; str[i] != '\0'; i++) { if (!led_matrix_driver_draw_char(current_x, y, str[i], color)) { return false; } current_x += 6; if (current_x >= LED_MATRIX_WIDTH) { return true; } } return true; }
|