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();