1 #pragma once
2 #include <common/glib.h>
3 #include <common/sys/types.h>
4 #include <common/spinlock.h>
5 
6 /*
7 textui中的几个对象的关系:
8 
9 
10                                           textui_vline_normal_t
11                                           +--------------------------------+
12                                           |                                |        textui_char_normal_t
13  textui_window_t                          | chars: textui_char_normal_t *  |        +--------------------------+
14 +----------------------------+            |                                |        |                          |
15 |                            |     +------>                                +-------->  c: char                 |
16 |  list:List                 |     |      | index:  int16_t                |        +--------------------------+
17 |  vlines_num:int16_t        |     |      |                                |
18 |  vlines_used:int16_t       |     |      +--------------------------------+
19 |                            |     |
20 |  vlines                    +-----+                                                textui_char_chromatic_t
21 |                            |     |       textui_vline_chromatic_t                 +--------------------------+
22 |  top_vline:int16_t         |     |      +-------------------------------------+   |                          |
23 |  vline_operating:int16_t   |     |      |                                     |   |   c: uint16_t            |
24 |  chars_per_line:int16_t    |     |      |  chars: textui_char_chromatic_t *   |   |                          |
25 |  flags:uint8_t             |     |      |                                     |   |   FRcolor:24             |
26 |  lock:spinlock_t           |     +------>                                     +--->                          |
27 |                            |            |  index:  int16_t                    |   |   BKcolor:24             |
28 |                            |            |                                     |   |                          |
29 +----------------------------+            +-------------------------------------+   +--------------------------+
30  */
31 
32 // 文本窗口标志位
33 // 文本窗口是否为彩色
34 #define TEXTUI_WF_CHROMATIC (1 << 0)
35 
36 // 窗口是否启用彩色字符
37 #define textui_is_chromatic(flag) ((flag)&TEXTUI_WF_CHROMATIC)
38 
39 // 每个字符的宽度和高度(像素)
40 #define TEXTUI_CHAR_WIDTH 8
41 #define TEXTUI_CHAR_HEIGHT 16
42 
43 /**
44  * @brief 黑白字符对象
45  *
46  */
47 struct textui_char_normal_t
48 {
49     char c;
50 };
51 
52 /**
53  * @brief 彩色字符对象
54  *
55  */
56 struct textui_char_chromatic_t
57 {
58     unsigned c : 16;
59 
60     // 前景色
61     unsigned FRcolor : 24; // rgb
62 
63     // 背景色
64     unsigned BKcolor : 24; // rgb
65 };
66 
67 // 注意!!! 请保持vline结构体的大小、成员变量命名相等!
68 /**
69  * @brief 单色显示的虚拟行结构体
70  *
71  */
72 struct textui_vline_normal_t
73 {
74     struct textui_char_normal_t *chars; // 字符对象数组
75     int16_t index;                      // 当前操作的位置
76 };
77 
78 /**
79  * @brief 彩色显示的虚拟行结构体
80  *
81  */
82 struct textui_vline_chromatic_t
83 {
84     struct textui_char_chromatic_t *chars;
85     int16_t index; // 当前操作的位置
86 };
87 
88 /**
89  * @brief textu ui 框架的文本窗口结构体
90  *
91  */
92 struct textui_window_t
93 {
94     struct List list;
95 
96     uint32_t id;         // 窗口id
97     int16_t vlines_num;  // 虚拟行总数
98     int16_t vlines_used; // 当前已经使用了的虚拟行总数
99 
100     // 指向虚拟行的数组的指针(二选一)
101     union
102     {
103         struct textui_vline_normal_t *normal;
104         struct textui_vline_chromatic_t *chromatic;
105     } vlines;
106 
107     int16_t top_vline;       // 位于最顶上的那一个虚拟行的行号
108     int16_t vline_operating; // 正在操作的vline
109     int16_t chars_per_line;  // 每行最大容纳的字符数
110     uint8_t flags;           // 窗口flag
111     spinlock_t lock;         // 窗口操作锁
112 };
113 
114 struct textui_private_info_t
115 {
116     int16_t actual_line;                    // 真实行的数量
117     struct textui_window_t *current_window; // 当前的主窗口
118     struct textui_window_t *default_window; // 默认print到的窗口
119 };
120 
121 /**
122  * @brief 重新渲染整个虚拟行
123  *
124  * @param window 窗口结构体
125  * @param vline_id 虚拟行号
126  * @return int 错误码
127  */
128 int textui_refresh_vline(struct textui_window_t *window, uint16_t vline_id);
129 
130 int textui_refresh_vlines(struct textui_window_t *window, uint16_t start, uint16_t count);
131 
132 /**
133  * @brief 刷新某个虚拟行的连续n个字符对象
134  *
135  * @param window 窗口结构体
136  * @param vline_id 虚拟行号
137  * @param start 起始字符号
138  * @param count 要刷新的字符数量
139  * @return int 错误码
140  */
141 int textui_refresh_characters(struct textui_window_t *window, uint16_t vline_id, uint16_t start, uint16_t count);
142 
143 /**
144  * @brief 在指定窗口上输出一个字符
145  *
146  * @param window 窗口
147  * @param character 字符
148  * @param FRcolor 前景色(RGB)
149  * @param BKcolor 背景色(RGB)
150  * @return int
151  */
152 int textui_putchar_window(struct textui_window_t *window, uint16_t character, uint32_t FRcolor, uint32_t BKcolor);
153 
154 /**
155  * @brief 在默认窗口上输出一个字符
156  *
157  * @param character 字符
158  * @param FRcolor 前景色(RGB)
159  * @param BKcolor 背景色(RGB)
160  * @return int
161  */
162 int textui_putchar(uint16_t character, uint32_t FRcolor, uint32_t BKcolor);
163 
164 /**
165  * @brief 获取textui的帧缓冲区能容纳的内容的行数
166  *
167  * @return uint16_t
168  */
169 uint16_t __textui_get_actual_lines();
170 
171 /**
172  * @brief 获取当前渲染的窗口的id
173  *
174  * @return uint16_t
175  */
176 uint32_t __textui_get_current_window_id();
177 
178 /**
179  * @brief 初始化text ui框架
180  *
181  * @return int
182  */
183 int textui_init();