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
13typedef 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 CONSOLE_CAP_EXTRA_SETUP = 1 << 5, ///< extra setup required
21 CONSOLE_CAP_READ = 1 << 6, ///< console supports read
22} console_caps;
23
24MOS_ENUM_OPERATORS(console_caps)
25
26typedef 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
51typedef struct console_ops
52{
53 bool (*extra_setup)(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
70extern list_head consoles;
71
72__BEGIN_DECLS
73void console_register(console_t *con);
74console_t *console_get(const char *name);
75console_t *console_get_by_prefix(const char *prefix);
76
77size_t console_write(console_t *con, const char *data, size_t size);
78size_t console_write_color(console_t *con, const char *data, size_t size, standard_color_t fg, standard_color_t bg);
79
80void console_putc(console_t *con, u8 c);
81__END_DECLS
82