ESP32 Native version of Blinky, featureful controller code for WS2811/WS2812/NeoPixels
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

81 líneas
1.9KB

  1. static const char *TAG = "display";
  2. #include <esp_log.h>
  3. #include "display.hpp"
  4. Display::Display(size_t w, size_t h) :
  5. width(w), height(h), pitch(w), buffer(NULL),
  6. bus(NULL), iface_drv(NULL), driver{.deinit = NULL}
  7. {
  8. esp_err_t ret;
  9. spi_config_t bus_cfg = {
  10. .miso_io_num = GPIO_NUM_4,
  11. .mosi_io_num = GPIO_NUM_35,
  12. .sclk_io_num = GPIO_NUM_36,
  13. .max_transfer_sz = (int)(height * width * sizeof(*buffer) + 8),
  14. };
  15. bus = spi_bus_create(SPI2_HOST, &bus_cfg);
  16. if (NULL == bus) {
  17. ESP_LOGE(TAG, "Failed to acquire bus");
  18. return;
  19. }
  20. scr_interface_spi_config_t spi_dev_cfg = {
  21. .spi_bus = bus,
  22. .pin_num_cs = 34,
  23. .pin_num_dc = 37,
  24. .clk_freq = 40 * 1000 * 1000,
  25. .swap_data = 1,
  26. };
  27. ret = scr_interface_create(SCREEN_IFACE_SPI, &spi_dev_cfg, &iface_drv);
  28. if (ESP_OK != ret) {
  29. ESP_LOGE(TAG, "Failed to create interface");
  30. return;
  31. }
  32. ret = scr_find_driver(SCREEN_CONTROLLER_ST7789, &driver);
  33. if (ESP_OK != ret) {
  34. ESP_LOGE(TAG, "Failed to find driver");
  35. return;
  36. }
  37. scr_controller_config_t lcd_cfg = {
  38. .interface_drv = iface_drv,
  39. .pin_num_rst = 38,
  40. .pin_num_bckl = 33,
  41. .rst_active_level = 0,
  42. .bckl_active_level = 1,
  43. .width = (uint16_t)width,
  44. .height = (uint16_t)height,
  45. .offset_hor = 52,
  46. .offset_ver = 40,
  47. .rotate = SCR_DIR_LRTB,
  48. };
  49. ret = driver.init(&lcd_cfg);
  50. if (ESP_OK != ret) {
  51. ESP_LOGE(TAG, "Failed to initialize driver");
  52. return;
  53. }
  54. buffer = new uint16_t[height * pitch]();
  55. refresh();
  56. }
  57. Display::~Display() {
  58. if (buffer) delete[] buffer;
  59. if (driver.deinit) driver.deinit();
  60. if (iface_drv) scr_interface_delete(iface_drv);
  61. if (bus) spi_bus_delete(&bus);
  62. }
  63. void Display::refresh() {
  64. driver.draw_bitmap(0, 0, width, height, buffer);
  65. }