source: mainline/console/gcons.c@ 59ed572

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

Made tetris compile and somewhat run.
Slightly better console.

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