source: mainline/uspace/srv/fb/msim.c@ ac49f5d1

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

clear screen not until successful connection from console

  • Property mode set to 100644
File size: 5.0 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/** @defgroup msimfb MSIM text console
31 * @brief HelenOS MSIM text console.
32 * @ingroup fbs
33 * @{
34 */
35/** @file
36 */
37
38#include <async.h>
39#include <ipc/fb.h>
40#include <ipc/ipc.h>
41#include <libc.h>
42#include <errno.h>
43#include <string.h>
44#include <libc.h>
45#include <stdio.h>
46#include <ipc/fb.h>
47#include <sysinfo.h>
48#include <as.h>
49#include <align.h>
50#include <ddi.h>
51
52#include "msim.h"
53
54#define WIDTH 80
55#define HEIGHT 25
56
57#define MAX_CONTROL 20
58
59/* Allow only 1 connection */
60static int client_connected = 0;
61
62static char *virt_addr;
63
64static void msim_putc(const char c)
65{
66 *virt_addr = c;
67}
68
69static void msim_puts(char *str)
70{
71 while (*str)
72 *virt_addr = *(str++);
73}
74
75static void msim_clrscr(void)
76{
77 msim_puts("\033[2J");
78}
79
80static void msim_goto(const unsigned int row, const unsigned int col)
81{
82 if ((row > HEIGHT) || (col > WIDTH))
83 return;
84
85 char control[MAX_CONTROL];
86 snprintf(control, MAX_CONTROL, "\033[%u;%uf", row + 1, col + 1);
87 msim_puts(control);
88}
89
90static void msim_set_style(const unsigned int mode)
91{
92 char control[MAX_CONTROL];
93 snprintf(control, MAX_CONTROL, "\033[%um", mode);
94 msim_puts(control);
95}
96
97static void msim_cursor_disable(void)
98{
99 msim_puts("\033[?25l");
100}
101
102static void msim_cursor_enable(void)
103{
104 msim_puts("\033[?25h");
105}
106
107static void msim_scroll(int i)
108{
109 if (i > 0) {
110 msim_goto(HEIGHT - 1, 0);
111 while (i--)
112 msim_puts("\033D");
113 } else if (i < 0) {
114 msim_goto(0, 0);
115 while (i++)
116 msim_puts("\033M");
117 }
118}
119
120static void msim_client_connection(ipc_callid_t iid, ipc_call_t *icall)
121{
122 int retval;
123 ipc_callid_t callid;
124 ipc_call_t call;
125 char c;
126 int lastcol = 0;
127 int lastrow = 0;
128 int newcol;
129 int newrow;
130 int fgcolor;
131 int bgcolor;
132 int i;
133
134 if (client_connected) {
135 ipc_answer_0(iid, ELIMIT);
136 return;
137 }
138
139 client_connected = 1;
140 ipc_answer_0(iid, EOK);
141
142 /* Clear the terminal, set scrolling region
143 to 0 - 25 lines */
144 msim_clrscr();
145 msim_goto(0, 0);
146 msim_puts("\033[0;25r");
147
148 while (true) {
149 callid = async_get_call(&call);
150 switch (IPC_GET_METHOD(call)) {
151 case IPC_M_PHONE_HUNGUP:
152 client_connected = 0;
153 ipc_answer_0(callid, EOK);
154 return;
155 case FB_PUTCHAR:
156 c = IPC_GET_ARG1(call);
157 newrow = IPC_GET_ARG2(call);
158 newcol = IPC_GET_ARG3(call);
159 if ((lastcol != newcol) || (lastrow != newrow))
160 msim_goto(newrow, newcol);
161 lastcol = newcol + 1;
162 lastrow = newrow;
163 msim_putc(c);
164 retval = 0;
165 break;
166 case FB_CURSOR_GOTO:
167 newrow = IPC_GET_ARG1(call);
168 newcol = IPC_GET_ARG2(call);
169 msim_goto(newrow, newcol);
170 lastrow = newrow;
171 lastcol = newcol;
172 retval = 0;
173 break;
174 case FB_GET_CSIZE:
175 ipc_answer_2(callid, EOK, HEIGHT, WIDTH);
176 continue;
177 case FB_CLEAR:
178 msim_clrscr();
179 retval = 0;
180 break;
181 case FB_SET_STYLE:
182 fgcolor = IPC_GET_ARG1(call);
183 bgcolor = IPC_GET_ARG2(call);
184 if (fgcolor < bgcolor)
185 msim_set_style(0);
186 else
187 msim_set_style(7);
188 retval = 0;
189 break;
190 case FB_SCROLL:
191 i = IPC_GET_ARG1(call);
192 if ((i > HEIGHT) || (i < -HEIGHT)) {
193 retval = EINVAL;
194 break;
195 }
196 msim_scroll(i);
197 msim_goto(lastrow, lastcol);
198 retval = 0;
199 break;
200 case FB_CURSOR_VISIBILITY:
201 if(IPC_GET_ARG1(call))
202 msim_cursor_enable();
203 else
204 msim_cursor_disable();
205 retval = 0;
206 break;
207 default:
208 retval = ENOENT;
209 }
210 ipc_answer_0(callid, retval);
211 }
212}
213
214int msim_init(void)
215{
216 void *phys_addr = (void *) sysinfo_value("fb.address.physical");
217 virt_addr = (char *) as_get_mappable_page(1);
218
219 physmem_map(phys_addr, virt_addr, 1, AS_AREA_READ | AS_AREA_WRITE);
220
221 async_set_client_connection(msim_client_connection);
222 return 0;
223}
224
225/**
226 * @}
227 */
Note: See TracBrowser for help on using the repository browser.