Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1472 → Rev 1476

/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);
}
}