Rev 1490 | Rev 1498 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1490 | Rev 1492 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #include <async.h> |
29 | #include <async.h> |
30 | #include <ipc/fb.h> |
30 | #include <ipc/fb.h> |
31 | #include <ipc/ipc.h> |
31 | #include <ipc/ipc.h> |
32 | #include <libc.h> |
32 | #include <libc.h> |
33 | #include <errno.h> |
33 | #include <errno.h> |
- | 34 | #include <string.h> |
|
- | 35 | #include <libc.h> |
|
- | 36 | #include <stdio.h> |
|
34 | 37 | ||
35 | #include "sysio.h" |
38 | #include "sysio.h" |
36 | 39 | ||
37 | /* Allow only 1 connection */ |
40 | /* Allow only 1 connection */ |
38 | static int client_connected = 0; |
41 | static int client_connected = 0; |
39 | 42 | ||
- | 43 | #define CLRSCR "\033[2J" |
|
- | 44 | ||
40 | static void sysput(char c) |
45 | static void sysput(char c) |
41 | { |
46 | { |
42 | __SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1); |
47 | __SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1); |
43 | } |
48 | } |
44 | 49 | ||
- | 50 | static void sysputs(char *s) |
|
- | 51 | { |
|
- | 52 | __SYSCALL3(SYS_IO, 1, (sysarg_t)s, strlen(s)); |
|
- | 53 | } |
|
- | 54 | ||
- | 55 | static void curs_goto(unsigned int row, unsigned int col) |
|
- | 56 | { |
|
- | 57 | char control[20]; |
|
- | 58 | ||
- | 59 | if (row > 100 || col > 100) |
|
- | 60 | return; |
|
- | 61 | ||
- | 62 | snprintf(control, 20, "\033[%d;%df",row, col); |
|
- | 63 | sysputs(control); |
|
- | 64 | } |
|
- | 65 | ||
45 | static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
66 | static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
46 | { |
67 | { |
47 | int retval; |
68 | int retval; |
48 | ipc_callid_t callid; |
69 | ipc_callid_t callid; |
49 | ipc_call_t call; |
70 | ipc_call_t call; |
50 | char c; |
71 | char c; |
- | 72 | int lastcol=0; |
|
- | 73 | int lastrow=0; |
|
- | 74 | int newcol,newrow; |
|
51 | 75 | ||
52 | if (client_connected) { |
76 | if (client_connected) { |
53 | ipc_answer_fast(iid, ELIMIT, 0,0); |
77 | ipc_answer_fast(iid, ELIMIT, 0,0); |
54 | return; |
78 | return; |
55 | } |
79 | } |
Line 62... | Line 86... | ||
62 | client_connected = 0; |
86 | client_connected = 0; |
63 | ipc_answer_fast(callid,0,0,0); |
87 | ipc_answer_fast(callid,0,0,0); |
64 | return; /* Exit thread */ |
88 | return; /* Exit thread */ |
65 | case FB_PUTCHAR: |
89 | case FB_PUTCHAR: |
66 | c = IPC_GET_ARG1(call); |
90 | c = IPC_GET_ARG1(call); |
- | 91 | newrow = IPC_GET_ARG2(call); |
|
- | 92 | newcol = IPC_GET_ARG3(call); |
|
- | 93 | if (lastcol != newcol || lastrow!=newrow) |
|
- | 94 | curs_goto(newrow, newcol); |
|
- | 95 | lastcol = newcol + 1; |
|
- | 96 | lastrow = newrow; |
|
67 | sysput(c); |
97 | sysput(c); |
68 | retval = 0; |
98 | retval = 0; |
69 | break; |
99 | break; |
- | 100 | case FB_CURSOR_GOTO: |
|
- | 101 | newrow = IPC_GET_ARG1(call); |
|
- | 102 | newcol = IPC_GET_ARG2(call); |
|
- | 103 | curs_goto(newrow, newcol); |
|
- | 104 | break; |
|
70 | case FB_GET_CSIZE: |
105 | case FB_GET_CSIZE: |
71 | ipc_answer_fast(callid, 0, 25, 80); |
106 | ipc_answer_fast(callid, 0, 25, 80); |
72 | continue; |
107 | continue; |
- | 108 | case FB_CLEAR: |
|
- | 109 | sysputs(CLRSCR); |
|
- | 110 | retval = 0; |
|
- | 111 | break; |
|
73 | default: |
112 | default: |
74 | retval = ENOENT; |
113 | retval = ENOENT; |
75 | } |
114 | } |
76 | ipc_answer_fast(callid,retval,0,0); |
115 | ipc_answer_fast(callid,retval,0,0); |
77 | } |
116 | } |
78 | } |
117 | } |
79 | 118 | ||
80 | void sysio_init(void) |
119 | void sysio_init(void) |
81 | { |
120 | { |
82 | async_set_client_connection(sysio_client_connection); |
121 | async_set_client_connection(sysio_client_connection); |
- | 122 | sysputs(CLRSCR); |
|
- | 123 | curs_goto(0,0); |
|
83 | } |
124 | } |