Subversion Repositories HelenOS

Rev

Rev 3618 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3618 Rev 3742
Line 36... Line 36...
36
 
36
 
37
/** @file
37
/** @file
38
 */
38
 */
39
 
39
 
40
#include <stdio.h>
40
#include <stdio.h>
-
 
41
#include <ipc/ipc.h>
-
 
42
#include <async.h>
-
 
43
#include <ipc/fb.h>
-
 
44
#include <bool.h>
-
 
45
#include <errno.h>
41
 
46
 
42
#include "serial_console.h"
47
#include "serial_console.h"
43
 
48
 
44
#define MAX_CONTROL 20
49
#define MAX_CONTROL 20
45
 
50
 
46
static uint32_t width;
51
static int width;
47
static uint32_t height;
52
static int height;
48
static putc_function_t putc_function;
53
static putc_function_t putc_function;
49
 
54
 
-
 
55
/* Allow only 1 connection */
-
 
56
static int client_connected = 0;
-
 
57
 
50
void serial_puts(char *str)
58
void serial_puts(char *str)
51
{
59
{
52
    while (*str)
60
    while (*str)
53
        putc_function(*(str++));
61
        putc_function(*(str++));
54
}
62
}
Line 86... Line 94...
86
    char control[MAX_CONTROL];
94
    char control[MAX_CONTROL];
87
    snprintf(control, MAX_CONTROL, "\033[%um", mode);
95
    snprintf(control, MAX_CONTROL, "\033[%um", mode);
88
    serial_puts(control);
96
    serial_puts(control);
89
}
97
}
90
 
98
 
-
 
99
/** Set scrolling region. */
-
 
100
void serial_set_scroll_region(unsigned last_row)
-
 
101
{
-
 
102
    char control[MAX_CONTROL];
-
 
103
    snprintf(control, MAX_CONTROL, "\033[0;%ur", last_row);
-
 
104
    serial_puts(control);
-
 
105
}
-
 
106
 
91
void serial_cursor_disable(void)
107
void serial_cursor_disable(void)
92
{
108
{
93
    serial_puts("\033[?25l");
109
    serial_puts("\033[?25l");
94
}
110
}
95
 
111
 
Line 103... Line 119...
103
    width = w;
119
    width = w;
104
    height = h;
120
    height = h;
105
    putc_function = putc_fn;
121
    putc_function = putc_fn;
106
}
122
}
107
 
123
 
-
 
124
/**
-
 
125
 * Main function of the thread serving client connections.
-
 
126
 */
-
 
127
void serial_client_connection(ipc_callid_t iid, ipc_call_t *icall)
-
 
128
{
-
 
129
    int retval;
-
 
130
    ipc_callid_t callid;
-
 
131
    ipc_call_t call;
-
 
132
    char c;
-
 
133
    int lastcol = 0;
-
 
134
    int lastrow = 0;
-
 
135
    int newcol;
-
 
136
    int newrow;
-
 
137
    int fgcolor;
-
 
138
    int bgcolor;
-
 
139
    int i;
-
 
140
   
-
 
141
    if (client_connected) {
-
 
142
        ipc_answer_0(iid, ELIMIT);
-
 
143
        return;
-
 
144
    }
-
 
145
   
-
 
146
    client_connected = 1;
-
 
147
    ipc_answer_0(iid, EOK);
-
 
148
   
-
 
149
    /* Clear the terminal, set scrolling region
-
 
150
       to 0 - height rows. */
-
 
151
    serial_clrscr();
-
 
152
    serial_goto(0, 0);
-
 
153
    serial_set_scroll_region(height);
-
 
154
   
-
 
155
    while (true) {
-
 
156
        callid = async_get_call(&call);
-
 
157
        switch (IPC_GET_METHOD(call)) {
-
 
158
        case IPC_M_PHONE_HUNGUP:
-
 
159
            client_connected = 0;
-
 
160
            ipc_answer_0(callid, EOK);
-
 
161
            return;
-
 
162
        case FB_PUTCHAR:
-
 
163
            c = IPC_GET_ARG1(call);
-
 
164
            newrow = IPC_GET_ARG2(call);
-
 
165
            newcol = IPC_GET_ARG3(call);
-
 
166
            if ((lastcol != newcol) || (lastrow != newrow))
-
 
167
                serial_goto(newrow, newcol);
-
 
168
            lastcol = newcol + 1;
-
 
169
            lastrow = newrow;
-
 
170
            (*putc_function)(c);
-
 
171
            retval = 0;
-
 
172
            break;
-
 
173
        case FB_CURSOR_GOTO:
-
 
174
            newrow = IPC_GET_ARG1(call);
-
 
175
            newcol = IPC_GET_ARG2(call);
-
 
176
            serial_goto(newrow, newcol);
-
 
177
            lastrow = newrow;
-
 
178
            lastcol = newcol;
-
 
179
            retval = 0;
-
 
180
            break;
-
 
181
        case FB_GET_CSIZE:
-
 
182
            ipc_answer_2(callid, EOK, height, width);
-
 
183
            continue;
-
 
184
        case FB_CLEAR:
-
 
185
            serial_clrscr();
-
 
186
            retval = 0;
-
 
187
            break;
-
 
188
        case FB_SET_STYLE:
-
 
189
            fgcolor = IPC_GET_ARG1(call);
-
 
190
            bgcolor = IPC_GET_ARG2(call);
-
 
191
            if (fgcolor < bgcolor)
-
 
192
                serial_set_style(0);
-
 
193
            else
-
 
194
                serial_set_style(7);
-
 
195
            retval = 0;
-
 
196
            break;
-
 
197
        case FB_SCROLL:
-
 
198
            i = IPC_GET_ARG1(call);
-
 
199
            if ((i > height) || (i < -height)) {
-
 
200
                retval = EINVAL;
-
 
201
                break;
-
 
202
            }
-
 
203
            serial_scroll(i);
-
 
204
            serial_goto(lastrow, lastcol);
-
 
205
            retval = 0;
-
 
206
            break;
-
 
207
        case FB_CURSOR_VISIBILITY:
-
 
208
            if(IPC_GET_ARG1(call))
-
 
209
                serial_cursor_enable();
-
 
210
            else
-
 
211
                serial_cursor_disable();
-
 
212
            retval = 0;
-
 
213
            break;
-
 
214
        default:
-
 
215
            retval = ENOENT;
-
 
216
        }
-
 
217
        ipc_answer_0(callid, retval);
-
 
218
    }
-
 
219
}
-
 
220
 
108
/**
221
/**
109
 * @}
222
 * @}
110
 */
223
 */