source: mainline/uspace/srv/hid/fb/ctl/serial.c@ c7f9037

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c7f9037 was 7c014d1, checked in by Martin Decky <martin@…>, 14 years ago

console and framebuffer server rewrite

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * Copyright (c) 2008 Martin Decky
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @file
31 */
32
33#include <sys/types.h>
34#include <errno.h>
35#include <malloc.h>
36#include <screenbuffer.h>
37#include "../proto/vt100.h"
38#include "../fb.h"
39#include "serial.h"
40
41/** Draw the character at the specified position in viewport.
42 *
43 * @param state VT100 protocol state.
44 * @param vp Viewport.
45 * @param col Screen position relative to viewport.
46 * @param row Screen position relative to viewport.
47 *
48 */
49static void draw_vp_char(vt100_state_t *state, fbvp_t *vp, sysarg_t col,
50 sysarg_t row)
51{
52 sysarg_t x = vp->x + col;
53 sysarg_t y = vp->y + row;
54
55 charfield_t *field = screenbuffer_field_at(vp->backbuf, col, row);
56
57 vt100_goto(state, x, y);
58 vt100_set_attr(state, field->attrs);
59 vt100_putchar(state, field->ch);
60}
61
62static int serial_yield(fbdev_t *dev)
63{
64 vt100_state_t *state = (vt100_state_t *) dev->data;
65 return vt100_yield(state);
66}
67
68static int serial_claim(fbdev_t *dev)
69{
70 vt100_state_t *state = (vt100_state_t *) dev->data;
71 return vt100_claim(state);
72}
73
74static int serial_get_resolution(fbdev_t *dev, sysarg_t *width, sysarg_t *height)
75{
76 vt100_state_t *state = (vt100_state_t *) dev->data;
77 vt100_get_resolution(state, width, height);
78 return EOK;
79}
80
81static void serial_font_metrics(fbdev_t *dev, sysarg_t width, sysarg_t height,
82 sysarg_t *cols, sysarg_t *rows)
83{
84 *cols = width;
85 *rows = height;
86}
87
88static int serial_vp_create(fbdev_t *dev, fbvp_t *vp)
89{
90 vp->attrs.type = CHAR_ATTR_STYLE;
91 vp->attrs.val.style = STYLE_NORMAL;
92 vp->data = NULL;
93
94 return EOK;
95}
96
97static void serial_vp_destroy(fbdev_t *dev, fbvp_t *vp)
98{
99 /* No-op */
100}
101
102static void serial_vp_clear(fbdev_t *dev, fbvp_t *vp)
103{
104 vt100_state_t *state = (vt100_state_t *) dev->data;
105
106 for (sysarg_t row = 0; row < vp->rows; row++) {
107 for (sysarg_t col = 0; col < vp->cols; col++) {
108 charfield_t *field =
109 screenbuffer_field_at(vp->backbuf, col, row);
110
111 field->ch = 0;
112 field->attrs = vp->attrs;
113
114 draw_vp_char(state, vp, col, row);
115 }
116 }
117}
118
119static console_caps_t serial_vp_get_caps(fbdev_t *dev, fbvp_t *vp)
120{
121 return (CONSOLE_CAP_STYLE | CONSOLE_CAP_INDEXED);
122}
123
124static void serial_vp_cursor_update(fbdev_t *dev, fbvp_t *vp,
125 sysarg_t prev_col, sysarg_t prev_row, sysarg_t col, sysarg_t row,
126 bool visible)
127{
128 vt100_state_t *state = (vt100_state_t *) dev->data;
129
130 vt100_goto(state, vp->x + col, vp->y + row);
131 vt100_cursor_visibility(state, visible);
132}
133
134static void serial_vp_char_update(fbdev_t *dev, fbvp_t *vp, sysarg_t col,
135 sysarg_t row)
136{
137 vt100_state_t *state = (vt100_state_t *) dev->data;
138 draw_vp_char(state, vp, col, row);
139}
140
141static fbdev_ops_t serial_ops = {
142 .yield = serial_yield,
143 .claim = serial_claim,
144 .get_resolution = serial_get_resolution,
145 .font_metrics = serial_font_metrics,
146 .vp_create = serial_vp_create,
147 .vp_destroy = serial_vp_destroy,
148 .vp_clear = serial_vp_clear,
149 .vp_get_caps = serial_vp_get_caps,
150 .vp_cursor_update = serial_vp_cursor_update,
151 .vp_char_update = serial_vp_char_update
152};
153
154int serial_init(vt100_putchar_t putchar_fn,
155 vt100_control_puts_t control_puts_fn)
156{
157 vt100_state_t *state =
158 vt100_state_create(80, 24, putchar_fn, control_puts_fn);
159 if (state == NULL)
160 return ENOMEM;
161
162 fbdev_t *dev = fbdev_register(&serial_ops, state);
163 if (dev == NULL)
164 return EINVAL;
165
166 return EOK;
167}
168
169/** @}
170 */
Note: See TracBrowser for help on using the repository browser.