Changeset 41811af in mainline for uspace/lib/c/generic/io/console.c
- Timestamp:
- 2011-06-10T10:14:26Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ab547063
- Parents:
- 9536e6e (diff), 390d80d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/console.c
r9536e6e r41811af 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> 39 43 #include <io/console.h> 40 44 #include <ipc/console.h> 41 45 42 void console_clear(int phone) 43 { 44 async_msg_0(phone, CONSOLE_CLEAR); 45 } 46 47 int console_get_size(int phone, sysarg_t *cols, sysarg_t *rows) 48 { 49 return async_req_0_2(phone, CONSOLE_GET_SIZE, cols, rows); 50 } 51 52 void console_set_style(int phone, uint8_t style) 53 { 54 async_msg_1(phone, CONSOLE_SET_STYLE, style); 55 } 56 57 void console_set_color(int phone, uint8_t fg_color, uint8_t bg_color, 46 console_ctrl_t *console_init(FILE *ifile, FILE *ofile) 47 { 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; 69 } 70 71 void console_done(console_ctrl_t *ctrl) 72 { 73 free(ctrl); 74 } 75 76 bool console_kcon(void) 77 { 78 #if 0 79 return __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE); 80 #endif 81 82 return false; 83 } 84 85 void console_flush(console_ctrl_t *ctrl) 86 { 87 fflush(ctrl->output); 88 } 89 90 void console_clear(console_ctrl_t *ctrl) 91 { 92 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 93 async_msg_0(exch, CONSOLE_CLEAR); 94 async_exchange_end(exch); 95 } 96 97 int console_get_size(console_ctrl_t *ctrl, sysarg_t *cols, sysarg_t *rows) 98 { 99 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 100 int rc = async_req_0_2(exch, CONSOLE_GET_SIZE, cols, rows); 101 async_exchange_end(exch); 102 103 return rc; 104 } 105 106 void console_set_style(console_ctrl_t *ctrl, uint8_t style) 107 { 108 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 109 async_msg_1(exch, CONSOLE_SET_STYLE, style); 110 async_exchange_end(exch); 111 } 112 113 void console_set_color(console_ctrl_t *ctrl, uint8_t fg_color, uint8_t bg_color, 58 114 uint8_t flags) 59 115 { 60 async_msg_3(phone, CONSOLE_SET_COLOR, fg_color, bg_color, flags); 61 } 62 63 void console_set_rgb_color(int phone, uint32_t fg_color, uint32_t bg_color) 64 { 65 async_msg_2(phone, CONSOLE_SET_RGB_COLOR, fg_color, bg_color); 66 } 67 68 void console_cursor_visibility(int phone, bool show) 69 { 70 async_msg_1(phone, CONSOLE_CURSOR_VISIBILITY, (show != false)); 71 } 72 73 int console_get_color_cap(int phone, sysarg_t *ccap) 74 { 75 return async_req_0_1(phone, CONSOLE_GET_COLOR_CAP, ccap); 76 } 77 78 void console_kcon_enable(int phone) 79 { 80 async_msg_0(phone, CONSOLE_KCON_ENABLE); 81 } 82 83 int console_get_pos(int phone, sysarg_t *col, sysarg_t *row) 84 { 85 return async_req_0_2(phone, CONSOLE_GET_POS, col, row); 86 } 87 88 void console_set_pos(int phone, sysarg_t col, sysarg_t row) 89 { 90 async_msg_2(phone, CONSOLE_GOTO, col, row); 91 } 92 93 bool console_get_event(int phone, console_event_t *event) 94 { 95 sysarg_t type; 96 sysarg_t key; 97 sysarg_t mods; 98 sysarg_t c; 99 100 int rc = async_req_0_4(phone, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 101 if (rc < 0) 116 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 117 async_msg_3(exch, CONSOLE_SET_COLOR, fg_color, bg_color, flags); 118 async_exchange_end(exch); 119 } 120 121 void console_set_rgb_color(console_ctrl_t *ctrl, uint32_t fg_color, 122 uint32_t bg_color) 123 { 124 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 125 async_msg_2(exch, CONSOLE_SET_RGB_COLOR, fg_color, bg_color); 126 async_exchange_end(exch); 127 } 128 129 void console_cursor_visibility(console_ctrl_t *ctrl, bool show) 130 { 131 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 132 async_msg_1(exch, CONSOLE_CURSOR_VISIBILITY, (show != false)); 133 async_exchange_end(exch); 134 } 135 136 int console_get_color_cap(console_ctrl_t *ctrl, sysarg_t *ccap) 137 { 138 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 139 int rc = async_req_0_1(exch, CONSOLE_GET_COLOR_CAP, ccap); 140 async_exchange_end(exch); 141 142 return rc; 143 } 144 145 int console_get_pos(console_ctrl_t *ctrl, sysarg_t *col, sysarg_t *row) 146 { 147 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 148 int rc = async_req_0_2(exch, CONSOLE_GET_POS, col, row); 149 async_exchange_end(exch); 150 151 return rc; 152 } 153 154 void console_set_pos(console_ctrl_t *ctrl, sysarg_t col, sysarg_t row) 155 { 156 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 157 async_msg_2(exch, CONSOLE_GOTO, col, row); 158 async_exchange_end(exch); 159 } 160 161 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event) 162 { 163 if (ctrl->input_aid == 0) { 164 sysarg_t type; 165 sysarg_t key; 166 sysarg_t mods; 167 sysarg_t c; 168 169 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 170 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c); 171 async_exchange_end(exch); 172 173 if (rc != EOK) { 174 errno = rc; 175 return false; 176 } 177 178 event->type = type; 179 event->key = key; 180 event->mods = mods; 181 event->c = c; 182 } else { 183 sysarg_t retval; 184 async_wait_for(ctrl->input_aid, &retval); 185 186 ctrl->input_aid = 0; 187 188 if (retval != EOK) { 189 errno = (int) retval; 190 return false; 191 } 192 193 event->type = IPC_GET_ARG1(ctrl->input_call); 194 event->key = IPC_GET_ARG2(ctrl->input_call); 195 event->mods = IPC_GET_ARG3(ctrl->input_call); 196 event->c = IPC_GET_ARG4(ctrl->input_call); 197 } 198 199 return true; 200 } 201 202 bool console_get_kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event, 203 suseconds_t *timeout) 204 { 205 struct timeval t0; 206 gettimeofday(&t0, NULL); 207 208 if (ctrl->input_aid == 0) { 209 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 210 ctrl->input_aid = async_send_0(exch, CONSOLE_GET_EVENT, 211 &ctrl->input_call); 212 async_exchange_end(exch); 213 } 214 215 sysarg_t retval; 216 int rc = async_wait_timeout(ctrl->input_aid, &retval, *timeout); 217 if (rc != EOK) { 218 *timeout = 0; 219 errno = rc; 102 220 return false; 103 104 event->type = type; 105 event->key = key; 106 event->mods = mods; 107 event->c = c; 221 } 222 223 ctrl->input_aid = 0; 224 225 if (retval != EOK) { 226 errno = (int) retval; 227 return false; 228 } 229 230 event->type = IPC_GET_ARG1(ctrl->input_call); 231 event->key = IPC_GET_ARG2(ctrl->input_call); 232 event->mods = IPC_GET_ARG3(ctrl->input_call); 233 event->c = IPC_GET_ARG4(ctrl->input_call); 234 235 /* Update timeout */ 236 struct timeval t1; 237 gettimeofday(&t1, NULL); 238 *timeout -= tv_sub(&t1, &t0); 108 239 109 240 return true;
Note:
See TracChangeset
for help on using the changeset viewer.