greenhouse
ui.cpp
Go to the documentation of this file.
1 #include "ui/ui.h"
2 #include "Queue.h"
3 #include "mbed.h"
4 #include "stm32746g_discovery_lcd.h"
5 #include "stm32f7xx_hal.h"
6 #include <cstdint>
7 #include <cstdio>
8 #include <cstring>
9 #include <queue>
10 #include <string>
11 #include <vector>
12 
13 using namespace UI;
14 
15 static const int MAX_LOG_LINES = 6;
16 static const int LOG_Y_POS = 13;
17 int log_idx = 0;
18 uint64_t prev_idle_time = 0;
19 
21  BSP_LCD_SetFont(&Font12);
22 }
23 
24 void Display::clear_line(int line_no) {
25  BSP_LCD_DisplayStringAt(0, LINE(line_no), (uint8_t *)" ", LEFT_MODE);
26  BSP_LCD_DisplayStringAt(0, LINE(line_no), (uint8_t *)" ", CENTER_MODE);
27  BSP_LCD_DisplayStringAt(0, LINE(line_no), (uint8_t *)" ", RIGHT_MODE);
28 
29  // this doesn't appear to work properly?
30  BSP_LCD_ClearStringLine(LINE(line_no));
31 }
32 
33 void Display::init() {
34  BSP_LCD_Init();
35  BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
36  BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
37 
38  BSP_LCD_SetFont(&Font16);
39  BSP_LCD_Clear(LCD_COLOR_BLACK);
40  BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
41  BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
42 
43  BSP_LCD_DisplayStringAt(2, 2, (uint8_t *)"greenhouse (server)", LEFT_MODE);
44  BSP_LCD_DrawHLine(0, 20, 480);
45 
47 
48  BSP_LCD_DrawHLine(0, LINE(LOG_Y_POS - 1) - 1, 480);
49  BSP_LCD_DisplayStringAt(10, LINE(LOG_Y_POS) - 12, (uint8_t *)"console", LEFT_MODE);
50  BSP_LCD_DrawHLine(0, LINE(LOG_Y_POS), 480);
51 }
52 
53 void Display::log(uint8_t *text) {
54  if (log_idx > MAX_LOG_LINES) {
55  // Clear display
56  for (int i = 1; i < 10; i++) {
57  clear_line(LINE(i + LOG_Y_POS));
58  }
59 
60  log_idx = 0;
61  }
62 
63  ++log_idx;
64 
65  BSP_LCD_DisplayStringAt(10, LINE(log_idx + LOG_Y_POS), text, LEFT_MODE);
66 }
67 
68 string microsecond_to_sec_str(uint64_t us) {
69  uint64_t converted;
70 
71  if (us > 1) {
72  converted = us / 1000 / 1000;
73  } else {
74  converted = 0;
75  }
76 
77  return std::to_string(converted);
78 }
79 
80 string make_stat_str(string label, string suffix, uint64_t us) {
81  string stat = string(label);
82  stat.append(microsecond_to_sec_str(us));
83  stat.append(suffix);
84 
85  return stat;
86 }
87 
88 void Display::update_stats(mbed_stats_cpu_t *stats, int sample_time_ms) {
89  clear_line(3);
90  clear_line(4);
91 
92  string uptime = make_stat_str("Uptime: ", "s", stats->uptime);
93  string idle_time = make_stat_str("Idle: ", "s", stats->idle_time);
94  string sleep = make_stat_str("Sleep: ", "s", stats->sleep_time);
95  string deep_sleep = make_stat_str("Deep sleep: ", "s", stats->deep_sleep_time);
96 
97  BSP_LCD_DisplayStringAt(25, LINE(3), (uint8_t *)uptime.c_str(), LEFT_MODE);
98  BSP_LCD_DisplayStringAt(120, LINE(3), (uint8_t *)idle_time.c_str(), LEFT_MODE);
99  BSP_LCD_DisplayStringAt(205, LINE(3), (uint8_t *)sleep.c_str(), LEFT_MODE);
100  BSP_LCD_DisplayStringAt(300, LINE(3), (uint8_t *)deep_sleep.c_str(), LEFT_MODE);
101 
102  uint64_t diff_usec = (stats->idle_time - prev_idle_time);
103  uint8_t idle = (diff_usec * 100) / (sample_time_ms*1000);
104  uint8_t usage = 100 - ((diff_usec * 100) / (sample_time_ms*1000));
105  prev_idle_time = stats->idle_time;
106 
107  string usage_str = string("Usage: ");
108  usage_str.append(std::to_string(usage));
109  usage_str.append("%");
110 
111  BSP_LCD_DisplayStringAt(25, LINE(4), (uint8_t *)usage_str.c_str(), LEFT_MODE);
112 }
void log(uint8_t *text)
Definition: ui.cpp:53
void clear_line(int line_no)
Definition: ui.cpp:24
void init()
Definition: ui.cpp:33
void update_stats(mbed_stats_cpu_t *stats, int sample_time_ms)
Definition: ui.cpp:88
Definition: ui.h:7
string make_stat_str(string label, string suffix, uint64_t us)
Definition: ui.cpp:80
static const int MAX_LOG_LINES
Definition: ui.cpp:15
static const int LOG_Y_POS
Definition: ui.cpp:16
string microsecond_to_sec_str(uint64_t us)
Definition: ui.cpp:68
void set_default_font()
Definition: ui.cpp:20
uint64_t prev_idle_time
Definition: ui.cpp:18
int log_idx
Definition: ui.cpp:17