source: mainline/uspace/srv/fb/sysio.c@ cc76be3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since cc76be3 was b74959bd, checked in by Jakub Jermar <jakub@…>, 18 years ago

Modify ipc_answer_*() to make use of all six syscall arguments. The recommended
means of answering calls is via the ipc_answer_m() macros (where m denotes the
number of return arguments) that automatically decide between the fast register
version or the slow universal version of ipc_answer().

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @defgroup sysio SysIO
30 * @brief HelenOS framebuffer emulation via kernel.
31 * @ingroup fbs
32 * @{
33 */
34/** @file
35 */
36
37#include <async.h>
38#include <ipc/fb.h>
39#include <ipc/ipc.h>
40#include <libc.h>
41#include <errno.h>
42#include <string.h>
43#include <libc.h>
44#include <stdio.h>
45
46#include "sysio.h"
47
48#define WIDTH 80
49#define HEIGHT 25
50
51/* Allow only 1 connection */
52static int client_connected = 0;
53
54static void sysput(char c)
55{
56 __SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1);
57}
58
59static void sysputs(char *s)
60{
61 while (*s) {
62 sysput(*(s++));
63 }
64// __SYSCALL3(SYS_IO, 1, (sysarg_t)s, strlen(s));
65}
66
67/** Send clearscreen sequence to console */
68static void clrscr(void)
69{
70 sysputs("\033[2J");
71}
72
73/** Send ansi sequence to console to change cursor position */
74static void curs_goto(unsigned int row, unsigned int col)
75{
76 char control[20];
77
78 if (row > 200 || col > 200)
79 return;
80
81 snprintf(control, 20, "\033[%d;%df",row+1, col+1);
82 sysputs(control);
83}
84
85static void set_style(int mode)
86{
87 char control[20];
88
89 snprintf(control, 20, "\033[%dm", mode);
90 sysputs(control);
91}
92
93static void scroll(int i)
94{
95 if (i > 0) {
96 curs_goto(HEIGHT-1, 0);
97 while (i--)
98 sysputs("\033D");
99 } else if (i < 0) {
100 curs_goto(0,0);
101 while (i++)
102 sysputs("\033M");
103 }
104}
105
106/** ANSI terminal emulation main thread */
107static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall)
108{
109 int retval;
110 ipc_callid_t callid;
111 ipc_call_t call;
112 char c;
113 int lastcol=0;
114 int lastrow=0;
115 int newcol,newrow;
116 int fgcolor,bgcolor;
117 int i;
118
119 if (client_connected) {
120 ipc_answer_0(iid, ELIMIT);
121 return;
122 }
123
124 client_connected = 1;
125 ipc_answer_0(iid, EOK); /* Accept connection */
126 while (1) {
127 callid = async_get_call(&call);
128 switch (IPC_GET_METHOD(call)) {
129 case IPC_M_PHONE_HUNGUP:
130 client_connected = 0;
131 ipc_answer_0(callid, EOK);
132 return; /* Exit thread */
133 case FB_PUTCHAR:
134 c = IPC_GET_ARG1(call);
135 newrow = IPC_GET_ARG2(call);
136 newcol = IPC_GET_ARG3(call);
137 if ((lastcol != newcol) || (lastrow != newrow))
138 curs_goto(newrow, newcol);
139 lastcol = newcol + 1;
140 lastrow = newrow;
141 sysput(c);
142 retval = 0;
143 break;
144 case FB_CURSOR_GOTO:
145 newrow = IPC_GET_ARG1(call);
146 newcol = IPC_GET_ARG2(call);
147 curs_goto(newrow, newcol);
148 lastrow = newrow;
149 lastcol = newcol;
150 retval = 0;
151 break;
152 case FB_GET_CSIZE:
153 ipc_answer_2(callid, EOK, HEIGHT, WIDTH);
154 continue;
155 case FB_CLEAR:
156 clrscr();
157 retval = 0;
158 break;
159 case FB_SET_STYLE:
160 fgcolor = IPC_GET_ARG1(call);
161 bgcolor = IPC_GET_ARG2(call);
162 if (fgcolor < bgcolor)
163 set_style(0);
164 else
165 set_style(7);
166 retval = 0;
167 break;
168 case FB_SCROLL:
169 i = IPC_GET_ARG1(call);
170 if ((i > HEIGHT) || (i < -HEIGHT)) {
171 retval = EINVAL;
172 break;
173 }
174 scroll(i);
175 curs_goto(lastrow, lastcol);
176 retval = 0;
177 break;
178 default:
179 retval = ENOENT;
180 }
181
182 ipc_answer_0(callid, retval);
183 }
184}
185
186/** ANSI terminal emulation initialization */
187void sysio_init(void)
188{
189 async_set_client_connection(sysio_client_connection);
190 clrscr();
191 curs_goto(0,0);
192 /* Set scrolling region to 0-25 lines */
193 sysputs("\033[0;25r");
194}
195
196/**
197 * @}
198 */
Note: See TracBrowser for help on using the repository browser.