Annotation of prex-old/usr/sample/balls/balls.c, Revision 1.1.1.1
1.1 nbrk 1: /*
2: * Copyright (c) 2007, Kohsuke Ohtani
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: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. Neither the name of the author nor the names of any co-contributors
14: * may be used to endorse or promote products derived from this software
15: * without specific prior written permission.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27: * SUCH DAMAGE.
28: */
29:
30: #include <prex/prex.h>
31: #include <sys/ioctl.h>
32: #include <stdio.h>
33: #include <stdlib.h>
34:
35: #define NBALLS 30
36: #define STACKLEN 512
37:
38: /* Screen size */
39: static int max_x;
40: static int max_y;
41:
42: static char stack[NBALLS][STACKLEN];
43:
44: static thread_t
45: thread_run(void (*start)(void), char *stack)
46: {
47: thread_t th;
48:
49: if (thread_create(task_self(), &th) != 0)
50: return 0;
51: if (thread_load(th, start, stack) != 0)
52: return 0;
53: if (thread_resume(th) != 0)
54: return 0;
55: return th;
56: }
57:
58: /*
59: * A thread to move one ball.
60: */
61: static void
62: move_ball(void)
63: {
64: int x, y;
65: int delta_x, delta_y;
66: int old_x, old_y;
67: int color;
68:
69: /* Get random value for moving speed. */
70: old_x = old_y = 0;
71: color = 31 + (random() % 7);
72: x = random() % max_x;
73: y = random() % max_y;
74: delta_x = (random() % 10) + 1;
75: delta_y = (random() % 10) + 1;
76:
77: for (;;) {
78: /* Erase ball at old position */
79: printf("\33[%d;%dH ", old_y / 10, old_x / 10);
80:
81: /* Print ball at new position */
82: printf("\33[%d;%dH\033[%dm*", y / 10, x / 10, color);
83:
84: /* Wait 5ms */
85: timer_sleep(5, 0);
86:
87: /* Update position */
88: old_x = x;
89: old_y = y;
90: x += delta_x;
91: y += delta_y;
92: if (x < 10 || x >= max_x)
93: delta_x = -delta_x;
94: if (y < 10 || y >= max_y)
95: delta_y = -delta_y;
96: }
97: /* NOTREACHED */
98: }
99:
100: int
101: main(int argc, char *argv[])
102: {
103: struct winsize ws;
104: int rows, cols, i;
105: device_t cons;
106:
107: /* Get screen size */
108: device_open("console", 0, &cons);
109: if (device_ioctl(cons, TIOCGWINSZ, (u_long)&ws) == 0) {
110: rows = ws.ws_row;
111: cols = ws.ws_col;
112: } else {
113: /* Use default screen setting */
114: rows = 25;
115: cols = 80;
116: }
117: device_close(cons);
118:
119: max_x = (cols - 1) * 10;
120: max_y = (rows - 2) * 10;
121:
122: /* Clear screen */
123: printf("\33[2J");
124:
125: /* Create threads and run them. */
126: for (i = 0; i < NBALLS; i++) {
127: if (thread_run(move_ball, stack[i]+STACKLEN) == 0)
128: panic("failed to create thread");
129: }
130:
131: /* Don't return */
132: for (;;);
133: /* NOTREACHED */
134: return 0;
135: }
CVSweb