Changeset cf28036 in mainline
- Timestamp:
- 2006-06-01T11:06:34Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a2ae4f4
- Parents:
- ad123964
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
console/console.c
rad123964 rcf28036 38 38 #include <unistd.h> 39 39 #include <async.h> 40 #include <libadt/fifo.h> 40 41 41 42 static void sysput(char c) … … 46 47 //#define CONSOLE_COUNT VFB_CONNECTIONS 47 48 #define CONSOLE_COUNT 8 49 #define MAX_KEYREQUESTS_BUFFERED 32 48 50 49 51 #define NAME "CONSOLE" 50 52 51 53 int active_console = 1; 52 53 54 54 55 typedef struct { 55 56 keybuffer_t keybuffer; 57 FIFO_CREATE_STATIC(keyrequests, ipc_callid_t , MAX_KEYREQUESTS_BUFFERED); 58 int keyrequest_counter; 56 59 int client_phone; 57 int vfb_number; /* Not used */58 60 int vfb_phone; 59 61 int used; … … 107 109 /* got key from keyboard driver */ 108 110 109 /* find active console */110 111 /* if client is awaiting key, send it */112 113 /*FIXME: else store key to its buffer */114 111 retval = 0; 115 112 c = IPC_GET_ARG1(call); 116 113 // ipc_call_sync_2(connections[3].vfb_phone, FB_PUTCHAR, 0, c,NULL,NULL); 114 117 115 /* switch to another virtual console */ 116 118 117 if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) { 119 118 active_console = c - KBD_KEY_F1; 120 119 break; 121 120 } 121 122 /* if client is awaiting key, send it */ 123 if (connections[active_console].keyrequest_counter > 0) { 124 connections[active_console].keyrequest_counter--; 125 ipc_answer_fast(fifo_pop(connections[active_console].keyrequests), 0, c, 0); 126 break; 127 } 128 129 /*FIXME: else store key to its buffer */ 122 130 keybuffer_push(&(connections[active_console].keybuffer), c); 123 131 … … 172 180 173 181 case CONSOLE_GETCHAR: 174 /* FIXME: Only temporary solution until request storage will be created */ 175 while (keybuffer_empty(&(connections[consnum].keybuffer))) { 176 /* FIXME: buffer empty -> store request */ 177 async_usleep(1000); 182 if (keybuffer_empty(&(connections[consnum].keybuffer))) { 183 /* buffer is empty -> store request */ 184 if (connections[consnum].keyrequest_counter < MAX_KEYREQUESTS_BUFFERED) { 185 fifo_push(connections[consnum].keyrequests, callid); 186 connections[consnum].keyrequest_counter++; 187 } else { 188 /* no key available and too many requests => fail */ 189 ipc_answer_fast(callid, ELIMIT, 0, 0); 190 } 191 continue; 178 192 }; 179 193 keybuffer_pop(&(connections[consnum].keybuffer), (char *)&arg1); … … 209 223 connections[i].used = 0; 210 224 keybuffer_init(&(connections[i].keybuffer)); 225 211 226 /* TODO: init key_buffer */ 212 227 while ((connections[i].vfb_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) { 213 228 usleep(10000); 214 //ipc_call_async_2(connections[i].vfb_phone, FB_PUTCHAR, 'a', 'b', NULL, (void *)NULL);215 229 } 230 connections[i].keyrequests.head = connections[i].keyrequests.tail = 0; 231 connections[i].keyrequests.items = MAX_KEYREQUESTS_BUFFERED; 232 connections[i].keyrequest_counter = 0; 216 233 } 217 234 -
libc/include/libadt/fifo.h
rad123964 rcf28036 45 45 typedef unsigned long fifo_index_t; 46 46 47 #define FIFO_CREATE_STATIC(name, t, itms) \ 48 struct { \ 49 t fifo[(itms)]; \ 50 fifo_count_t items; \ 51 fifo_index_t head; \ 52 fifo_index_t tail; \ 53 } name 54 47 55 /** Create and initialize static FIFO. 48 56 * … … 55 63 */ 56 64 #define FIFO_INITIALIZE_STATIC(name, t, itms) \ 57 struct { \ 58 t fifo[(itms)]; \ 59 fifo_count_t items; \ 60 fifo_index_t head; \ 61 fifo_index_t tail; \ 62 } name = { \ 65 FIFO_CREATE_STATIC(name, t, itms) = { \ 63 66 .items = (itms), \ 64 67 .head = 0, \
Note:
See TracChangeset
for help on using the changeset viewer.