Ignore:
File:
1 edited

Legend:

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

    r79ae36dd 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 #if 0
    79         return __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE);
    80 #endif
    81        
    82         return false;
     54        async_msg_1(phone, CONSOLE_SET_STYLE, style);
    8355}
    8456
    85 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)
    8659{
    87         fflush(ctrl->output);
     60        async_msg_3(phone, CONSOLE_SET_COLOR, fg_color, bg_color, flags);
    8861}
    8962
    90 void console_clear(console_ctrl_t *ctrl)
     63void console_set_rgb_color(int phone, uint32_t fg_color, uint32_t bg_color)
    9164{
    92         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    93         async_msg_0(exch, CONSOLE_CLEAR);
    94         async_exchange_end(exch);
     65        async_msg_2(phone, CONSOLE_SET_RGB_COLOR, fg_color, bg_color);
    9566}
    9667
    97 int console_get_size(console_ctrl_t *ctrl, sysarg_t *cols, sysarg_t *rows)
     68void console_cursor_visibility(int phone, bool show)
    9869{
    99         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    100         int rc = async_req_0_2(exch, CONSOLE_GET_SIZE, cols, rows);
    101         async_exchange_end(exch);
    102        
    103         return rc;
     70        async_msg_1(phone, CONSOLE_CURSOR_VISIBILITY, (show != false));
    10471}
    10572
    106 void console_set_style(console_ctrl_t *ctrl, uint8_t style)
     73int console_get_color_cap(int phone, sysarg_t *ccap)
    10774{
    108         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    109         async_msg_1(exch, CONSOLE_SET_STYLE, style);
    110         async_exchange_end(exch);
     75        return async_req_0_1(phone, CONSOLE_GET_COLOR_CAP, ccap);
    11176}
    11277
    113 void console_set_color(console_ctrl_t *ctrl, uint8_t fg_color, uint8_t bg_color,
    114     uint8_t flags)
     78void console_kcon_enable(int phone)
    11579{
    116         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    117         async_msg_3(exch, CONSOLE_SET_COLOR, fg_color, bg_color, flags);
    118         async_exchange_end(exch);
     80        async_msg_0(phone, CONSOLE_KCON_ENABLE);
    11981}
    12082
    121 void console_set_rgb_color(console_ctrl_t *ctrl, uint32_t fg_color,
    122     uint32_t bg_color)
     83int console_get_pos(int phone, sysarg_t *col, sysarg_t *row)
    12384{
    124         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    125         async_msg_2(exch, CONSOLE_SET_RGB_COLOR, fg_color, bg_color);
    126         async_exchange_end(exch);
     85        return async_req_0_2(phone, CONSOLE_GET_POS, col, row);
    12786}
    12887
    129 void console_cursor_visibility(console_ctrl_t *ctrl, bool show)
     88void console_set_pos(int phone, sysarg_t col, sysarg_t row)
    13089{
    131         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    132         async_msg_1(exch, CONSOLE_CURSOR_VISIBILITY, (show != false));
    133         async_exchange_end(exch);
     90        async_msg_2(phone, CONSOLE_GOTO, col, row);
    13491}
    13592
    136 int console_get_color_cap(console_ctrl_t *ctrl, sysarg_t *ccap)
     93bool console_get_event(int phone, console_event_t *event)
    13794{
    138         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    139         int rc = async_req_0_1(exch, CONSOLE_GET_COLOR_CAP, ccap);
    140         async_exchange_end(exch);
     95        sysarg_t type;
     96        sysarg_t key;
     97        sysarg_t mods;
     98        sysarg_t c;
    14199       
    142         return rc;
    143 }
    144 
    145 int console_get_pos(console_ctrl_t *ctrl, sysarg_t *col, sysarg_t *row)
    146 {
    147         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    148         int rc = async_req_0_2(exch, CONSOLE_GET_POS, col, row);
    149         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;
    150103       
    151         return rc;
    152 }
    153 
    154 void console_set_pos(console_ctrl_t *ctrl, sysarg_t col, sysarg_t row)
    155 {
    156         async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
    157         async_msg_2(exch, CONSOLE_GOTO, col, row);
    158         async_exchange_end(exch);
    159 }
    160 
    161 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event)
    162 {
    163         if (ctrl->input_aid == 0) {
    164                 sysarg_t type;
    165                 sysarg_t key;
    166                 sysarg_t mods;
    167                 sysarg_t c;
    168                
    169                 async_exch_t *exch = async_exchange_begin(ctrl->input_sess);
    170                 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c);
    171                 async_exchange_end(exch);
    172                
    173                 if (rc != EOK) {
    174                         errno = rc;
    175                         return false;
    176                 }
    177                
    178                 event->type = type;
    179                 event->key = key;
    180                 event->mods = mods;
    181                 event->c = c;
    182         } else {
    183                 sysarg_t retval;
    184                 async_wait_for(ctrl->input_aid, &retval);
    185                
    186                 ctrl->input_aid = 0;
    187                
    188                 if (retval != EOK) {
    189                         errno = (int) retval;
    190                         return false;
    191                 }
    192                
    193                 event->type = IPC_GET_ARG1(ctrl->input_call);
    194                 event->key = IPC_GET_ARG2(ctrl->input_call);
    195                 event->mods = IPC_GET_ARG3(ctrl->input_call);
    196                 event->c = IPC_GET_ARG4(ctrl->input_call);
    197         }
    198        
    199         return true;
    200 }
    201 
    202 bool console_get_kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event,
    203     suseconds_t *timeout)
    204 {
    205         struct timeval t0;
    206         gettimeofday(&t0, NULL);
    207        
    208         if (ctrl->input_aid == 0) {
    209                 async_exch_t *exch = async_exchange_begin(ctrl->input_sess);
    210                 ctrl->input_aid = async_send_0(exch, CONSOLE_GET_EVENT,
    211                     &ctrl->input_call);
    212                 async_exchange_end(exch);
    213         }
    214        
    215         sysarg_t retval;
    216         int rc = async_wait_timeout(ctrl->input_aid, &retval, *timeout);
    217         if (rc != EOK) {
    218                 *timeout = 0;
    219                 errno = rc;
    220                 return false;
    221         }
    222        
    223         ctrl->input_aid = 0;
    224        
    225         if (retval != EOK) {
    226                 errno = (int) retval;
    227                 return false;
    228         }
    229        
    230         event->type = IPC_GET_ARG1(ctrl->input_call);
    231         event->key = IPC_GET_ARG2(ctrl->input_call);
    232         event->mods = IPC_GET_ARG3(ctrl->input_call);
    233         event->c = IPC_GET_ARG4(ctrl->input_call);
    234        
    235         /* Update timeout */
    236         struct timeval t1;
    237         gettimeofday(&t1, NULL);
    238         *timeout -= tv_sub(&t1, &t0);
     104        event->type = type;
     105        event->key = key;
     106        event->mods = mods;
     107        event->c = c;
    239108       
    240109        return true;
Note: See TracChangeset for help on using the changeset viewer.