1 | // SPDX-License-Identifier: GPL-3.0-or-later |
2 | |
3 | #pragma once |
4 | |
5 | #include <ansi_colors.h> |
6 | #include <mos/io/io.h> |
7 | #include <mos/lib/structures/list.h> |
8 | #include <mos/lib/structures/ring_buffer.h> |
9 | #include <mos/lib/sync/spinlock.h> |
10 | #include <mos/tasks/wait.h> |
11 | #include <mos/types.h> |
12 | |
13 | typedef enum |
14 | { |
15 | CONSOLE_CAP_COLOR = 1 << 0, |
16 | CONSOLE_CAP_CLEAR = 1 << 1, |
17 | CONSOLE_CAP_GET_SIZE = 1 << 2, |
18 | CONSOLE_CAP_CURSOR_HIDE = 1 << 3, |
19 | CONSOLE_CAP_CURSOR_MOVE = 1 << 4, |
20 | = 1 << 5, ///< extra setup required |
21 | CONSOLE_CAP_READ = 1 << 6, ///< console supports read |
22 | } console_caps; |
23 | |
24 | MOS_ENUM_OPERATORS(console_caps) |
25 | |
26 | typedef struct _console |
27 | { |
28 | as_linked_list; |
29 | io_t io; |
30 | struct console_ops *ops; |
31 | const char *name; |
32 | console_caps caps; |
33 | waitlist_t waitlist; // waitlist for read |
34 | |
35 | struct |
36 | { |
37 | spinlock_t lock; |
38 | ring_buffer_pos_t pos; |
39 | u8 *buf; |
40 | size_t size; |
41 | } read; |
42 | |
43 | struct |
44 | { |
45 | spinlock_t lock; |
46 | } write; |
47 | |
48 | standard_color_t default_fg, default_bg; |
49 | } console_t; |
50 | |
51 | typedef struct console_ops |
52 | { |
53 | bool (*)(console_t *con); |
54 | |
55 | size_t (*write)(console_t *con, const char *data, size_t size); |
56 | |
57 | bool (*get_size)(console_t *con, u32 *width, u32 *height); |
58 | |
59 | bool (*set_cursor)(console_t *con, bool show); |
60 | bool (*move_cursor)(console_t *con, u32 x, u32 y); |
61 | bool (*get_cursor)(console_t *con, u32 *x, u32 *y); |
62 | |
63 | // VGA standard color codes |
64 | bool (*get_color)(console_t *con, standard_color_t *fg, standard_color_t *bg); |
65 | bool (*set_color)(console_t *con, standard_color_t fg, standard_color_t bg); |
66 | |
67 | bool (*clear)(console_t *con); |
68 | } console_ops_t; |
69 | |
70 | extern list_head consoles; |
71 | |
72 | __BEGIN_DECLS |
73 | void console_register(console_t *con); |
74 | console_t *console_get(const char *name); |
75 | console_t *console_get_by_prefix(const char *prefix); |
76 | |
77 | size_t console_write(console_t *con, const char *data, size_t size); |
78 | size_t console_write_color(console_t *con, const char *data, size_t size, standard_color_t fg, standard_color_t bg); |
79 | |
80 | void console_putc(console_t *con, u8 c); |
81 | __END_DECLS |
82 | |