displayAndSend.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "displayAndSend.h"
  2. #include "ssd1306.h"
  3. #include "ssd1306_driver.h"
  4. #include "esp_log.h"
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. #include "freertos/queue.h"
  10. #ifdef ENABLE_SSD1306
  11. #define QUEUE_SIZE 3
  12. QueueHandle_t dataQueue = NULL;
  13. void displayAndSendTask(void *pvParameters) {
  14. DisplayData data;
  15. char txt[50];
  16. ESP_LOGI("DISPLAY", "displayAndSendTask starting");
  17. i2c_master_init();
  18. oled_ssd1306_init();
  19. vTaskDelay(100 / portTICK_PERIOD_MS);
  20. SSD1306_SetPosition(4,18);
  21. SSD1306_DrawVertLine(29,0,128);
  22. SSD1306_Puts("Home Energy Meter", &Font_7x10,SSD1306_COLOR_WHITE);
  23. SSD1306_SetPosition(4,31);
  24. SSD1306_Puts("v1.0", &Font_7x10,SSD1306_COLOR_WHITE);
  25. SSD1306_UpdateScreen();
  26. vTaskDelay(3000 / portTICK_PERIOD_MS);
  27. SSD1306_Clear();
  28. SSD1306_SetPosition(0,0);
  29. SSD1306_Puts("Temp A:", &Font_7x10,SSD1306_COLOR_WHITE);
  30. SSD1306_SetPosition(0,11);
  31. SSD1306_Puts("Temp B:", &Font_7x10,SSD1306_COLOR_WHITE);
  32. SSD1306_SetPosition(0,22);
  33. SSD1306_Puts("ADC Vpp:", &Font_7x10,SSD1306_COLOR_WHITE);
  34. SSD1306_SetPosition(0,33);
  35. SSD1306_Puts("Pulses:", &Font_7x10,SSD1306_COLOR_WHITE);
  36. SSD1306_UpdateScreen();
  37. while( 1 ) {
  38. if( xQueueReceive(dataQueue,&data,portMAX_DELAY) == pdTRUE ) {
  39. switch( data.type ) {
  40. case VPP: sprintf(txt,"%d",data.iData);
  41. SSD1306_SetPosition(127-(strlen(txt)*8),22);
  42. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  43. SSD1306_UpdateScreen();
  44. break;
  45. case TempA:
  46. sprintf(txt,"%.2f",data.dData);
  47. SSD1306_SetPosition(127-(strlen(txt)*8),0);
  48. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  49. SSD1306_UpdateScreen();
  50. break;
  51. case TempB:
  52. sprintf(txt,"%.2f",data.dData);
  53. SSD1306_SetPosition(127-(strlen(txt)*8),11);
  54. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  55. SSD1306_UpdateScreen();
  56. break;
  57. case Pulses:
  58. break;
  59. }
  60. }
  61. }
  62. vTaskDelete(NULL);
  63. }
  64. void addDataToQueue(int data_type, double dData_in, int iData_in) {
  65. DisplayData d;
  66. d.type = data_type;
  67. d.dData = dData_in;
  68. d.iData = iData_in;
  69. if( dataQueue != NULL ) {
  70. if( xQueueSend(dataQueue, &d, 0) != pdPASS ) {
  71. ESP_LOGE("SERIAL","Queue full");
  72. }
  73. }
  74. else {
  75. ESP_LOGE("SERIAL","Queue not ready for send");
  76. }
  77. }
  78. void initDisplayAndSend() {
  79. dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) );
  80. if(dataQueue == NULL) {
  81. ESP_LOGE("SERIAL","Error creating the queue");
  82. }
  83. xTaskCreate(displayAndSendTask, "MQTT-Task", 1024*10, NULL, 2, NULL);
  84. }
  85. #endif