Changeset cf28036 in mainline


Ignore:
Timestamp:
2006-06-01T11:06:34Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a2ae4f4
Parents:
ad123964
Message:

Console stores unsatisfied getchar requests and handle them after keypress.
Fifo modified to be usable as structure member.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • console/console.c

    rad123964 rcf28036  
    3838#include <unistd.h>
    3939#include <async.h>
     40#include <libadt/fifo.h>
    4041
    4142static void sysput(char c)
     
    4647//#define CONSOLE_COUNT VFB_CONNECTIONS
    4748#define CONSOLE_COUNT 8
     49#define MAX_KEYREQUESTS_BUFFERED 32
    4850
    4951#define NAME "CONSOLE"
    5052
    5153int active_console = 1;
    52 
    5354
    5455typedef struct {
    5556        keybuffer_t keybuffer;
     57        FIFO_CREATE_STATIC(keyrequests, ipc_callid_t , MAX_KEYREQUESTS_BUFFERED);
     58        int keyrequest_counter;
    5659        int client_phone;
    57         int vfb_number; /* Not used */
    5860        int vfb_phone;
    5961        int used;
     
    107109                        /* got key from keyboard driver */
    108110                       
    109                         /* find active console */
    110                        
    111                         /* if client is awaiting key, send it */
    112                        
    113                         /*FIXME: else store key to its buffer */
    114111                        retval = 0;
    115112                        c = IPC_GET_ARG1(call);
    116113//                      ipc_call_sync_2(connections[3].vfb_phone, FB_PUTCHAR, 0, c,NULL,NULL);
     114               
    117115                        /* switch to another virtual console */
     116                       
    118117                        if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) {
    119118                                active_console = c - KBD_KEY_F1;
    120119                                break;
    121120                        }
     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 */
    122130                        keybuffer_push(&(connections[active_console].keybuffer), c);
    123131                       
     
    172180
    173181                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;
    178192                        };
    179193                        keybuffer_pop(&(connections[consnum].keybuffer), (char *)&arg1);
     
    209223                connections[i].used = 0;
    210224                keybuffer_init(&(connections[i].keybuffer));
     225               
    211226                /* TODO: init key_buffer */
    212227                while ((connections[i].vfb_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
    213228                        usleep(10000);
    214                         //ipc_call_async_2(connections[i].vfb_phone, FB_PUTCHAR, 'a', 'b', NULL, (void *)NULL);
    215229                }
     230                connections[i].keyrequests.head = connections[i].keyrequests.tail = 0;
     231                connections[i].keyrequests.items = MAX_KEYREQUESTS_BUFFERED;
     232                connections[i].keyrequest_counter = 0;
    216233        }
    217234       
  • libc/include/libadt/fifo.h

    rad123964 rcf28036  
    4545typedef unsigned long fifo_index_t;
    4646
     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
    4755/** Create and initialize static FIFO.
    4856 *
     
    5563 */
    5664#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) = {           \
    6366                .items = (itms),                        \
    6467                .head = 0,                              \
Note: See TracChangeset for help on using the changeset viewer.