Changes in uspace/lib/c/generic/io/console.c [7c014d1:96b02eb9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/console.c
r7c014d1 r96b02eb9 37 37 #include <libc.h> 38 38 #include <async.h> 39 #include <errno.h>40 #include <stdio.h>41 #include <malloc.h>42 #include <vfs/vfs_sess.h>43 39 #include <io/console.h> 44 40 #include <ipc/console.h> 45 41 46 console_ctrl_t *console_init(FILE *ifile, FILE *ofile)42 void console_clear(int phone) 47 43 { 48 console_ctrl_t *ctrl = malloc(sizeof(console_ctrl_t)); 49 if (!ctrl) 50 return NULL; 51 52 ctrl->input_sess = fsession(EXCHANGE_SERIALIZE, ifile); 53 if (!ctrl->input_sess) { 54 free(ctrl); 55 return NULL; 56 } 57 58 ctrl->output_sess = fsession(EXCHANGE_SERIALIZE, ofile); 59 if (!ctrl->output_sess) { 60 free(ctrl); 61 return NULL; 62 } 63 64 ctrl->input = ifile; 65 ctrl->output = ofile; 66 ctrl->input_aid = 0; 67 68 return ctrl; 44 async_msg_0(phone, CONSOLE_CLEAR); 69 45 } 70 46 71 void console_done(console_ctrl_t *ctrl)47 int console_get_size(int phone, sysarg_t *cols, sysarg_t *rows) 72 48 { 73 free(ctrl);49 return async_req_0_2(phone, CONSOLE_GET_SIZE, cols, rows); 74 50 } 75 51 76 bool console_kcon(void)52 void console_set_style(int phone, uint8_t style) 77 53 { 78 return __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE);54 async_msg_1(phone, CONSOLE_SET_STYLE, style); 79 55 } 80 56 81 void console_flush(console_ctrl_t *ctrl) 57 void console_set_color(int phone, uint8_t fg_color, uint8_t bg_color, 58 uint8_t flags) 82 59 { 83 fflush(ctrl->output);60 async_msg_3(phone, CONSOLE_SET_COLOR, fg_color, bg_color, flags); 84 61 } 85 62 86 void console_ clear(console_ctrl_t *ctrl)63 void console_set_rgb_color(int phone, uint32_t fg_color, uint32_t bg_color) 87 64 { 88 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 89 async_req_0_0(exch, CONSOLE_CLEAR); 90 async_exchange_end(exch); 65 async_msg_2(phone, CONSOLE_SET_RGB_COLOR, fg_color, bg_color); 91 66 } 92 67 93 int console_get_size(console_ctrl_t *ctrl, sysarg_t *cols, sysarg_t *rows)68 void console_cursor_visibility(int phone, bool show) 94 69 { 95 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 96 int rc = async_req_0_2(exch, CONSOLE_GET_SIZE, cols, rows); 97 async_exchange_end(exch); 98 99 return rc; 70 async_msg_1(phone, CONSOLE_CURSOR_VISIBILITY, (show != false)); 100 71 } 101 72 102 void console_set_style(console_ctrl_t *ctrl, uint8_t style)73 int console_get_color_cap(int phone, sysarg_t *ccap) 103 74 { 104 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 105 async_req_1_0(exch, CONSOLE_SET_STYLE, style); 106 async_exchange_end(exch); 75 return async_req_0_1(phone, CONSOLE_GET_COLOR_CAP, ccap); 107 76 } 108 77 109 void console_set_color(console_ctrl_t *ctrl, uint8_t bgcolor, uint8_t fgcolor, 110 uint8_t flags) 78 void console_kcon_enable(int phone) 111 79 { 112 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 113 async_req_3_0(exch, CONSOLE_SET_COLOR, bgcolor, fgcolor, flags); 114 async_exchange_end(exch); 80 async_msg_0(phone, CONSOLE_KCON_ENABLE); 115 81 } 116 82 117 void console_set_rgb_color(console_ctrl_t *ctrl, uint32_t bgcolor, 118 uint32_t fgcolor) 83 int console_get_pos(int phone, sysarg_t *col, sysarg_t *row) 119 84 { 120 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 121 async_req_2_0(exch, CONSOLE_SET_RGB_COLOR, bgcolor, fgcolor); 122 async_exchange_end(exch); 85 return async_req_0_2(phone, CONSOLE_GET_POS, col, row); 123 86 } 124 87 125 void console_ cursor_visibility(console_ctrl_t *ctrl, bool show)88 void console_set_pos(int phone, sysarg_t col, sysarg_t row) 126 89 { 127 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 128 async_req_1_0(exch, CONSOLE_CURSOR_VISIBILITY, (show != false)); 129 async_exchange_end(exch); 90 async_msg_2(phone, CONSOLE_GOTO, col, row); 130 91 } 131 92 132 int console_get_color_cap(console_ctrl_t *ctrl, sysarg_t *ccap)93 bool console_get_event(int phone, console_event_t *event) 133 94 { 134 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 135 int rc = async_req_0_1(exch, CONSOLE_GET_COLOR_CAP, ccap); 136 async_exchange_end(exch); 95 sysarg_t type; 96 sysarg_t key; 97 sysarg_t mods; 98 sysarg_t c; 137 99 138 return rc; 139 } 140 141 int console_get_pos(console_ctrl_t *ctrl, sysarg_t *col, sysarg_t *row) 142 { 143 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 144 int rc = async_req_0_2(exch, CONSOLE_GET_POS, col, row); 145 async_exchange_end(exch); 100 int rc = async_req_0_4(phone, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 101 if (rc < 0) 102 return false; 146 103 147 return rc; 148 } 149 150 void console_set_pos(console_ctrl_t *ctrl, sysarg_t col, sysarg_t row) 151 { 152 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 153 async_req_2_0(exch, CONSOLE_GOTO, col, row); 154 async_exchange_end(exch); 155 } 156 157 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event) 158 { 159 if (ctrl->input_aid == 0) { 160 sysarg_t type; 161 sysarg_t key; 162 sysarg_t mods; 163 sysarg_t c; 164 165 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 166 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 167 async_exchange_end(exch); 168 169 if (rc != EOK) { 170 errno = rc; 171 return false; 172 } 173 174 event->type = type; 175 event->key = key; 176 event->mods = mods; 177 event->c = c; 178 } else { 179 sysarg_t retval; 180 async_wait_for(ctrl->input_aid, &retval); 181 182 ctrl->input_aid = 0; 183 184 if (retval != EOK) { 185 errno = (int) retval; 186 return false; 187 } 188 189 event->type = IPC_GET_ARG1(ctrl->input_call); 190 event->key = IPC_GET_ARG2(ctrl->input_call); 191 event->mods = IPC_GET_ARG3(ctrl->input_call); 192 event->c = IPC_GET_ARG4(ctrl->input_call); 193 } 194 195 return true; 196 } 197 198 bool console_get_kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event, 199 suseconds_t *timeout) 200 { 201 struct timeval t0; 202 gettimeofday(&t0, NULL); 203 204 if (ctrl->input_aid == 0) { 205 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 206 ctrl->input_aid = async_send_0(exch, CONSOLE_GET_EVENT, 207 &ctrl->input_call); 208 async_exchange_end(exch); 209 } 210 211 sysarg_t retval; 212 int rc = async_wait_timeout(ctrl->input_aid, &retval, *timeout); 213 if (rc != EOK) { 214 *timeout = 0; 215 errno = rc; 216 return false; 217 } 218 219 ctrl->input_aid = 0; 220 221 if (retval != EOK) { 222 errno = (int) retval; 223 return false; 224 } 225 226 event->type = IPC_GET_ARG1(ctrl->input_call); 227 event->key = IPC_GET_ARG2(ctrl->input_call); 228 event->mods = IPC_GET_ARG3(ctrl->input_call); 229 event->c = IPC_GET_ARG4(ctrl->input_call); 230 231 /* Update timeout */ 232 struct timeval t1; 233 gettimeofday(&t1, NULL); 234 *timeout -= tv_sub(&t1, &t0); 104 event->type = type; 105 event->key = key; 106 event->mods = mods; 107 event->c = c; 235 108 236 109 return true;
Note:
See TracChangeset
for help on using the changeset viewer.