source: mainline/console/gcons.c@ e1c4849

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since e1c4849 was e1c4849, checked in by Ondrej Palkovsky <ondrap@…>, 19 years ago

Added slighyly graphical console.

  • Property mode set to 100644
File size: 4.3 KB
Line 
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 <ipc/fb.h>
30#include <ipc/ipc.h>
31#include <async.h>
32#include <stdio.h>
33
34#include "console.h"
35#include "gcons.h"
36
37#define CONSOLE_TOP 50
38#define CONSOLE_MARGIN 10
39
40#define STATUS_SPACE 20
41#define STATUS_WIDTH 40
42#define STATUS_HEIGHT 30
43
44#define MAIN_COLOR 0x118811
45
46static int use_gcons = 0;
47static ipcarg_t xres,yres;
48
49static int console_vp;
50static int cstatus_vp[CONSOLE_COUNT];
51static int cstat_row, cstat_col; /* Size of cstatus buttons */
52
53static int fbphone;
54
55enum butstate {
56 CONS_ACTIVE = 0,
57 CONS_IDLE,
58 CONS_HAS_INPUT
59};
60
61static struct {
62 int fgcolor;
63 int bgcolor;
64} stat_colors[] = {
65 {0xd0d0d0, 0x808080},
66 {0xd0d0d0, 0x0},
67 {0xd0d0d0, 0xa04040}
68};
69
70static int active_console = 0;
71
72static void vp_switch(int vp)
73{
74 nsend_call(fbphone,FB_VIEWPORT_SWITCH, vp);
75}
76
77/** Create view port */
78static int vp_create(unsigned int x, unsigned int y,
79 unsigned int width, unsigned int height)
80{
81 /* Init function, use ipc_call_sync */
82 return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE,
83 (x << 16) | y, (width << 16) | height,
84 NULL, NULL);
85}
86
87static void clear(void)
88{
89 nsend_call(fbphone, FB_CLEAR, 0);
90
91}
92
93static void set_style(int fgcolor, int bgcolor)
94{
95 nsend_call_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor);
96}
97
98static void putch(char c, int row, int col)
99{
100 nsend_call_3(fbphone, FB_PUTCHAR, c, row, col);
101}
102
103static void draw_stat(int consnum, enum butstate state)
104{
105 char data[5];
106 int i;
107
108 vp_switch(cstatus_vp[consnum]);
109 set_style(stat_colors[state].fgcolor, stat_colors[state].bgcolor);
110 clear();
111 snprintf(data, 5, "%d", consnum+1);
112 for (i=0;data[i];i++)
113 putch(data[i], 0, i);
114}
115
116void gcons_change_console(int consnum)
117{
118 if (!use_gcons)
119 return;
120
121 draw_stat(active_console, CONS_IDLE);
122 active_console = consnum;
123 draw_stat(consnum, CONS_ACTIVE);
124 vp_switch(console_vp);
125}
126
127void gcons_notify_char(int consnum)
128{
129 if (!use_gcons)
130 return;
131
132 vp_switch(console_vp);
133}
134
135void gcons_redraw_console(void)
136{
137 int i;
138
139 if (!use_gcons)
140 return;
141
142 vp_switch(0);
143 set_style(MAIN_COLOR, MAIN_COLOR);
144 clear();
145
146 for (i=0;i < CONSOLE_COUNT; i++)
147 draw_stat(i, i == active_console ? CONS_ACTIVE : CONS_IDLE);
148 vp_switch(console_vp);
149}
150
151/** Initialize nice graphical console environment */
152void gcons_init(int phone)
153{
154 int rc;
155 int i;
156
157 fbphone = phone;
158
159 rc = ipc_call_sync_2(phone, FB_GET_RESOLUTION, 0, 0, &xres, &yres);
160 if (rc)
161 return;
162
163 if (xres < 800 || yres < 600)
164 return;
165
166 /* create console viewport */
167 console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, xres-2*CONSOLE_MARGIN,
168 yres-(CONSOLE_TOP+CONSOLE_MARGIN));
169 if (console_vp < 0)
170 return;
171
172 /* Create status buttons */
173 for (i=0; i < CONSOLE_COUNT; i++) {
174 cstatus_vp[i] = vp_create(CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE),
175 CONSOLE_MARGIN, STATUS_WIDTH, STATUS_HEIGHT);
176 if (cstatus_vp[i] < 0)
177 return;
178 }
179
180 use_gcons = 1;
181 gcons_redraw_console();
182}
Note: See TracBrowser for help on using the repository browser.