/uspace/trunk/kbd/include/key_buffer.h |
---|
31,7 → 31,8 |
#include <types.h> |
#define KEYBUFFER_SIZE 128 /**< Size of buffer for pressed keys */ |
/** Size of buffer for pressed keys */ |
#define KEYBUFFER_SIZE 128 |
typedef struct { |
char fifo[KEYBUFFER_SIZE]; |
/uspace/trunk/kbd/generic/key_buffer.c |
---|
27,14 → 27,19 |
*/ |
#include <key_buffer.h> |
#include <futex.h> |
atomic_t keybuffer_futex = FUTEX_INITIALIZER; |
/** Clear key buffer. |
*/ |
void keybuffer_free(keybuffer_t *keybuffer) |
{ |
futex_down(&keybuffer_futex); |
keybuffer->head = 0; |
keybuffer->tail = 0; |
keybuffer->items = 0; |
keybuffer->head = keybuffer->tail = keybuffer->items = 0; |
futex_up(&keybuffer_futex); |
} |
/** Key buffer initialization. |
69,10 → 74,13 |
*/ |
void keybuffer_push(keybuffer_t *keybuffer, char key) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items < KEYBUFFER_SIZE) { |
keybuffer->fifo[keybuffer->tail = (keybuffer->tail + 1) < keybuffer->items ? (keybuffer->tail + 1) : 0] = (key); |
keybuffer->fifo[keybuffer->tail] = key; |
keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE; |
keybuffer->items++; |
} |
futex_up(&keybuffer_futex); |
} |
/** Pop character from buffer. |
81,11 → 89,15 |
*/ |
int keybuffer_pop(keybuffer_t *keybuffer, char *c) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items > 0) { |
keybuffer->items--; |
*c = keybuffer->fifo[keybuffer->head = (keybuffer->head + 1) < keybuffer->items ? (keybuffer->head + 1) : 0]; |
*c = keybuffer->fifo[keybuffer->head]; |
keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE; |
futex_up(&keybuffer_futex); |
return 1; |
} |
futex_up(&keybuffer_futex); |
return 0; |
} |
/uspace/trunk/console/console.c |
---|
44,11 → 44,11 |
} |
//#define CONSOLE_COUNT VFB_CONNECTIONS |
#define CONSOLE_COUNT 6 |
#define CONSOLE_COUNT 8 |
#define NAME "CONSOLE" |
int active_client = 0; |
int active_console = 1; |
typedef struct { |
93,6 → 93,7 |
ipc_call_t call; |
int retval; |
int i; |
char c; |
/* Ignore parameters, the connection is alread opened */ |
while (1) { |
111,16 → 112,18 |
/*FIXME: else store key to its buffer */ |
retval = 0; |
i = IPC_GET_ARG1(call) & 0xff; |
c = IPC_GET_ARG1(call); |
// ipc_call_sync_2(connections[3].vfb_phone, FB_PUTCHAR, 0, c,NULL,NULL); |
/* switch to another virtual console */ |
if ((i >= KBD_KEY_F1) && (i < KBD_KEY_F1 + CONSOLE_COUNT)) { |
active_client = i - KBD_KEY_F1; |
if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) { |
active_console = c - KBD_KEY_F1; |
break; |
} |
keybuffer_push(&(connections[active_client].keybuffer), i); |
keybuffer_push(&(connections[active_console].keybuffer), c); |
/* Send it to first FB, DEBUG */ |
// ipc_call_async_2(connections[0].vfb_phone, FB_PUTCHAR, 0, IPC_GET_ARG1(call),NULL,NULL); |
// ipc_call_sync_2(connections[0].vfb_phone, FB_PUTCHAR, 0, IPC_GET_ARG1(call),NULL,NULL); |
// ipc_call_sync_2(connections[4].vfb_phone, FB_PUTCHAR, 0, c,NULL,NULL); |
break; |
default: |
156,15 → 159,25 |
ipc_answer_fast(callid, 0,0,0); |
return; |
case CONSOLE_PUTCHAR: |
if (consnum != active_console) { |
} |
/* Send message to fb */ |
ipc_call_async_2(connections[consnum].vfb_phone, FB_PUTCHAR, IPC_GET_ARG1(call), IPC_GET_ARG2(call), NULL, NULL); |
ipc_call_sync_2(connections[consnum].vfb_phone, FB_PUTCHAR, IPC_GET_ARG1(call), IPC_GET_ARG2(call), NULL, NULL); |
// ipc_call_sync_2(connections[6].vfb_phone, FB_PUTCHAR, 0, IPC_GET_ARG2(call),NULL,NULL); |
break; |
case CONSOLE_CLEAR: |
break; |
case CONSOLE_GOTO: |
break; |
case CONSOLE_GETCHAR: |
/* FIXME: Only temporary solution until request storage will be created */ |
while (!keybuffer_pop(&(connections[active_client].keybuffer), (char *)&arg1)) { |
while (keybuffer_empty(&(connections[consnum].keybuffer))) { |
/* FIXME: buffer empty -> store request */ |
async_usleep(100000); |
async_usleep(1000); |
}; |
keybuffer_pop(&(connections[consnum].keybuffer), (char *)&arg1); |
// ipc_call_sync_2(connections[6].vfb_phone, FB_PUTCHAR, 0, arg1,NULL,NULL); |
break; |
} |
/uspace/trunk/console/console.h |
---|
29,8 → 29,10 |
#ifndef __CONSOLE_H__ |
#define __CONSOLE_H__ |
#define CONSOLE_GETCHAR 1025 |
#define CONSOLE_GETCHAR 1026 |
#define CONSOLE_PUTCHAR 1027 |
#define CONSOLE_CLEAR 1028 |
#define CONSOLE_GOTO 1029 |
#endif |
/uspace/trunk/fb/fb.c |
---|
140,9 → 140,19 |
return; /* Exit thread */ |
case FB_PUTCHAR: |
fb_putchar(vfb,IPC_GET_ARG2(call)); |
ipc_answer_fast(callid,0,0,0); |
break; |
/* |
* case FB_CLEAR: |
ipc_answer_fast(callid,0,0,0); |
fb_putchar(vfb,IPC_GET_ARG2(call)); |
break; |
* case FB_GOTO: |
ipc_answer_fast(callid,0,0,0); |
fb_putchar(vfb,IPC_GET_ARG2(call)); |
break; |
*/ |
default: |
ipc_answer_fast(callid,ENOENT,0,0); |
} |
/uspace/trunk/libc/generic/io/stream.c |
---|
118,8 → 118,7 |
if (console_phone < 0) { |
while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) { |
volatile int a; |
for (a = 0; a < 1048576; a++); |
usleep(10000); |
} |
} |