Subversion Repositories HelenOS-historic

Rev

Rev 1500 | Rev 1535 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Ondrej Palkovsky
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #include <async.h>
  30. #include <ipc/fb.h>
  31. #include <ipc/ipc.h>
  32. #include <libc.h>
  33. #include <errno.h>
  34. #include <string.h>
  35. #include <libc.h>
  36. #include <stdio.h>
  37.  
  38. #include "sysio.h"
  39.  
  40. /* Allow only 1 connection */
  41. static int client_connected = 0;
  42.  
  43. static void sysput(char c)
  44. {
  45.     __SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1);
  46. }
  47.  
  48. static void sysputs(char *s)
  49. {
  50.     __SYSCALL3(SYS_IO, 1, (sysarg_t)s, strlen(s));
  51. }
  52.  
  53. /** Send clearscreen sequence to console */
  54. static void clrscr(void)
  55. {
  56.     sysputs("\033[2J");
  57. }
  58.  
  59. /** Send ansi sequence to console to change cursor position */
  60. static void curs_goto(unsigned int row, unsigned int col)
  61. {
  62.     char control[20];
  63.  
  64.     if (row > 200 || col > 200)
  65.         return;
  66.  
  67.     snprintf(control, 20, "\033[%d;%df",row+1, col+1);
  68.     sysputs(control);
  69. }
  70.  
  71. static void set_style(int mode)
  72. {
  73.     char control[20];
  74.    
  75.     snprintf(control, 20, "\033[%df", mode);
  76.     sysputs(control);
  77. }
  78.  
  79. /** ANSI terminal emulation main thread */
  80. static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall)
  81. {
  82.     int retval;
  83.     ipc_callid_t callid;
  84.     ipc_call_t call;
  85.     char c;
  86.     int lastcol=0;
  87.     int lastrow=0;
  88.     int newcol,newrow;
  89.     int fgcolor,bgcolor;
  90.  
  91.     if (client_connected) {
  92.         ipc_answer_fast(iid, ELIMIT, 0,0);
  93.         return;
  94.     }
  95.     client_connected = 1;
  96.     ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
  97.     while (1) {
  98.         callid = async_get_call(&call);
  99.         switch (IPC_GET_METHOD(call)) {
  100.         case IPC_M_PHONE_HUNGUP:
  101.             client_connected = 0;
  102.             ipc_answer_fast(callid,0,0,0);
  103.             return; /* Exit thread */
  104.         case FB_PUTCHAR:
  105.             c = IPC_GET_ARG1(call);
  106.             newrow = IPC_GET_ARG2(call);
  107.             newcol = IPC_GET_ARG3(call);
  108.             if (lastcol != newcol || lastrow!=newrow)
  109.                 curs_goto(newrow, newcol);
  110.             lastcol = newcol + 1;
  111.             lastrow = newrow;
  112.             sysput(c);
  113.             retval = 0;
  114.             break;
  115.         case FB_CURSOR_GOTO:
  116.             newrow = IPC_GET_ARG1(call);
  117.             newcol = IPC_GET_ARG2(call);
  118.             curs_goto(newrow, newcol);
  119.             break;
  120.         case FB_GET_CSIZE:
  121.             ipc_answer_fast(callid, 0, 25, 80);
  122.             continue;
  123.         case FB_CLEAR:
  124.             clrscr();
  125.             retval = 0;
  126.             break;
  127.         case FB_SET_STYLE:
  128.             fgcolor = IPC_GET_ARG1(call);
  129.             bgcolor = IPC_GET_ARG2(call);
  130.             if (fgcolor > bgcolor)
  131.                 set_style(0);
  132.             else
  133.                 set_style(7);
  134.             retval = 0;
  135.             break;
  136.         default:
  137.             retval = ENOENT;
  138.         }
  139.         ipc_answer_fast(callid,retval,0,0);
  140.     }
  141. }
  142.  
  143. /** ANSI terminal emulation initialization */
  144. void sysio_init(void)
  145. {
  146.     async_set_client_connection(sysio_client_connection);
  147.     clrscr();
  148.     curs_goto(0,0);
  149. }
  150.