Statistics
| Branch: | Revision:

root / prex-0.9.0 / usr / sample / balls / balls.c @ 03e9c04a

History | View | Annotate | Download (3.44 KB)

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
/*
31
 * ball.c - move many balls within screen.
32
 */
33

    
34
#include <sys/prex.h>
35

    
36
#include <termios.h>
37
#include <stdio.h>
38
#include <stdlib.h>
39

    
40
#define NBALLS                30
41
#define STACKLEN        512
42

    
43
/* Screen size */
44
static int max_x;
45
static int max_y;
46

    
47
static char stack[NBALLS][STACKLEN];
48

    
49
static thread_t
50
thread_run(void (*start)(void), char *stack)
51
{
52
        thread_t t;
53

    
54
        if (thread_create(task_self(), &t) != 0)
55
                return 0;
56
        if (thread_load(t, start, stack) != 0)
57
                return 0;
58
        if (thread_resume(t) != 0)
59
                return 0;
60
        return t;
61
}
62

    
63
/*
64
 * A thread to move one ball.
65
 */
66
static void
67
move_ball(void)
68
{
69
        int x, y;
70
        int delta_x, delta_y;
71
        int old_x, old_y;
72
        u_long wait_msec;
73

    
74
        /* Get random value for moving speed. */
75
        old_x = old_y = 0;
76
        x = random() % max_x;
77
        y = random() % max_y;
78
        delta_x = (random() % 10) + 1;
79
        delta_y = (random() % 10) + 1;
80
        wait_msec = (u_long)((random() % 20) + 1);
81

    
82
        for (;;) {
83
                /* Erase ball at old position */
84
                printf("\33[%d;%dH ", old_y / 10, old_x / 10);
85

    
86
                /* Print ball at new position */
87
                printf("\33[%d;%dH*", y / 10, x / 10);
88

    
89
                /* Wait msec */
90
                timer_sleep(wait_msec, 0);
91

    
92
                /* Update position */
93
                old_x = x;
94
                old_y = y;
95
                x += delta_x;
96
                y += delta_y;
97
                if (x < 10 || x >= max_x)
98
                        delta_x = -delta_x;
99
                if (y < 10 || y >= max_y)
100
                        delta_y = -delta_y;
101
        }
102
        /* NOTREACHED */
103
}
104

    
105
int
106
main(int argc, char *argv[])
107
{
108
        struct winsize ws;
109
        int rows, cols, i;
110
        device_t cons;
111

    
112
        /* Get screen size */
113
        device_open("tty", 0, &cons);
114
        if (device_ioctl(cons, TIOCGWINSZ, &ws) == 0) {
115
                rows = (int)ws.ws_row;
116
                cols = (int)ws.ws_col;
117
        } else {
118
                /* Use default screen setting */
119
                rows = 25;
120
                cols = 80;
121
        }
122
        device_close(cons);
123

    
124
        max_x = (cols - 1) * 10;
125
        max_y = (rows - 2) * 10;
126

    
127
        /* Clear screen */
128
        printf("\33[2J");
129

    
130
        /* Create threads and run them. */
131
        for (i = 0; i < NBALLS; i++) {
132
                if (thread_run(move_ball, stack[i]+STACKLEN) == 0)
133
                        panic("failed to create thread");
134
        }
135

    
136
        /* Don't return */
137
        for (;;)
138
                thread_yield();
139

    
140
        /* NOTREACHED */
141
        return 0;
142
}