Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/console.c

    r7c014d1 r96b02eb9  
    3737#include <libc.h>
    3838#include <async.h>
    39 #include <errno.h>
    40 #include <stdio.h>
    41 #include <malloc.h>
    42 #include <vfs/vfs_sess.h>
    4339#include <io/console.h>
    4440#include <ipc/console.h>
    4541
    46 console_ctrl_t *console_init(FILE *ifile, FILE *ofile)
     42void console_clear(int phone)
    4743{
    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;
     44        async_msg_0(phone, CONSOLE_CLEAR);
    6945}
    7046
    71 void console_done(console_ctrl_t *ctrl)
     47int console_get_size(int phone, sysarg_t *cols, sysarg_t *rows)
    7248{
    73         free(ctrl);
     49        return async_req_0_2(phone, CONSOLE_GET_SIZE, cols, rows);
    7450}
    7551
    76 bool console_kcon(void)
     52void console_set_style(int phone, uint8_t style)
    7753{
    78         return __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE);
     54        async_msg_1(phone, CONSOLE_SET_STYLE, style);
    7955}
    8056
    81 void console_flush(console_ctrl_t *ctrl)
     57void console_set_color(int phone, uint8_t fg_color, uint8_t bg_color,
     58    uint8_t flags)
    8259{
    83         fflush(ctrl->output);
     60        async_msg_3(phone, CONSOLE_SET_COLOR, fg_color, bg_color, flags);
    8461}
    8562
    86 void console_clear(console_ctrl_t *ctrl)
     63void console_set_rgb_color(int phone, uint32_t fg_color, uint32_t bg_color)
    8764{
    88         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    89         async_req_0_0(exch, CONSOLE_CLEAR);
    90         async_exchange_end(exch);
     65        async_msg_2(phone, CONSOLE_SET_RGB_COLOR, fg_color, bg_color);
    9166}
    9267
    93 int console_get_size(console_ctrl_t *ctrl, sysarg_t *cols, sysarg_t *rows)
     68void console_cursor_visibility(int phone, bool show)
    9469{
    95         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    96         int rc = async_req_0_2(exch, CONSOLE_GET_SIZE, cols, rows);
    97         async_exchange_end(exch);
    98        
    99         return rc;
     70        async_msg_1(phone, CONSOLE_CURSOR_VISIBILITY, (show != false));
    10071}
    10172
    102 void console_set_style(console_ctrl_t *ctrl, uint8_t style)
     73int console_get_color_cap(int phone, sysarg_t *ccap)
    10374{
    104         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    105         async_req_1_0(exch, CONSOLE_SET_STYLE, style);
    106         async_exchange_end(exch);
     75        return async_req_0_1(phone, CONSOLE_GET_COLOR_CAP, ccap);
    10776}
    10877
    109 void console_set_color(console_ctrl_t *ctrl, uint8_t bgcolor, uint8_t fgcolor,
    110     uint8_t flags)
     78void console_kcon_enable(int phone)
    11179{
    112         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    113         async_req_3_0(exch, CONSOLE_SET_COLOR, bgcolor, fgcolor, flags);
    114         async_exchange_end(exch);
     80        async_msg_0(phone, CONSOLE_KCON_ENABLE);
    11581}
    11682
    117 void console_set_rgb_color(console_ctrl_t *ctrl, uint32_t bgcolor,
    118     uint32_t fgcolor)
     83int console_get_pos(int phone, sysarg_t *col, sysarg_t *row)
    11984{
    120         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    121         async_req_2_0(exch, CONSOLE_SET_RGB_COLOR, bgcolor, fgcolor);
    122         async_exchange_end(exch);
     85        return async_req_0_2(phone, CONSOLE_GET_POS, col, row);
    12386}
    12487
    125 void console_cursor_visibility(console_ctrl_t *ctrl, bool show)
     88void console_set_pos(int phone, sysarg_t col, sysarg_t row)
    12689{
    127         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    128         async_req_1_0(exch, CONSOLE_CURSOR_VISIBILITY, (show != false));
    129         async_exchange_end(exch);
     90        async_msg_2(phone, CONSOLE_GOTO, col, row);
    13091}
    13192
    132 int console_get_color_cap(console_ctrl_t *ctrl, sysarg_t *ccap)
     93bool console_get_event(int phone, console_event_t *event)
    13394{
    134         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    135         int rc = async_req_0_1(exch, CONSOLE_GET_COLOR_CAP, ccap);
    136         async_exchange_end(exch);
     95        sysarg_t type;
     96        sysarg_t key;
     97        sysarg_t mods;
     98        sysarg_t c;
    13799       
    138         return rc;
    139 }
    140 
    141 int console_get_pos(console_ctrl_t *ctrl, sysarg_t *col, sysarg_t *row)
    142 {
    143         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    144         int rc = async_req_0_2(exch, CONSOLE_GET_POS, col, row);
    145         async_exchange_end(exch);
     100        int rc = async_req_0_4(phone, CONSOLE_GET_EVENT, &type, &key, &mods, &c);
     101        if (rc < 0)
     102                return false;
    146103       
    147         return rc;
    148 }
    149 
    150 void console_set_pos(console_ctrl_t *ctrl, sysarg_t col, sysarg_t row)
    151 {
    152         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    153         async_req_2_0(exch, CONSOLE_GOTO, col, row);
    154         async_exchange_end(exch);
    155 }
    156 
    157 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event)
    158 {
    159         if (ctrl->input_aid == 0) {
    160                 sysarg_t type;
    161                 sysarg_t key;
    162                 sysarg_t mods;
    163                 sysarg_t c;
    164                
    165                 async_exch_t *exch = async_exchange_begin(ctrl->input_sess);
    166                 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c);
    167                 async_exchange_end(exch);
    168                
    169                 if (rc != EOK) {
    170                         errno = rc;
    171                         return false;
    172                 }
    173                
    174                 event->type = type;
    175                 event->key = key;
    176                 event->mods = mods;
    177                 event->c = c;
    178         } else {
    179                 sysarg_t retval;
    180                 async_wait_for(ctrl->input_aid, &retval);
    181                
    182                 ctrl->input_aid = 0;
    183                
    184                 if (retval != EOK) {
    185                         errno = (int) retval;
    186                         return false;
    187                 }
    188                
    189                 event->type = IPC_GET_ARG1(ctrl->input_call);
    190                 event->key = IPC_GET_ARG2(ctrl->input_call);
    191                 event->mods = IPC_GET_ARG3(ctrl->input_call);
    192                 event->c = IPC_GET_ARG4(ctrl->input_call);
    193         }
    194        
    195         return true;
    196 }
    197 
    198 bool console_get_kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event,
    199     suseconds_t *timeout)
    200 {
    201         struct timeval t0;
    202         gettimeofday(&t0, NULL);
    203        
    204         if (ctrl->input_aid == 0) {
    205                 async_exch_t *exch = async_exchange_begin(ctrl->input_sess);
    206                 ctrl->input_aid = async_send_0(exch, CONSOLE_GET_EVENT,
    207                     &ctrl->input_call);
    208                 async_exchange_end(exch);
    209         }
    210        
    211         sysarg_t retval;
    212         int rc = async_wait_timeout(ctrl->input_aid, &retval, *timeout);
    213         if (rc != EOK) {
    214                 *timeout = 0;
    215                 errno = rc;
    216                 return false;
    217         }
    218        
    219         ctrl->input_aid = 0;
    220        
    221         if (retval != EOK) {
    222                 errno = (int) retval;
    223                 return false;
    224         }
    225        
    226         event->type = IPC_GET_ARG1(ctrl->input_call);
    227         event->key = IPC_GET_ARG2(ctrl->input_call);
    228         event->mods = IPC_GET_ARG3(ctrl->input_call);
    229         event->c = IPC_GET_ARG4(ctrl->input_call);
    230        
    231         /* Update timeout */
    232         struct timeval t1;
    233         gettimeofday(&t1, NULL);
    234         *timeout -= tv_sub(&t1, &t0);
     104        event->type = type;
     105        event->key = key;
     106        event->mods = mods;
     107        event->c = c;
    235108       
    236109        return true;
Note: See TracChangeset for help on using the changeset viewer.