Prex Home / Browse Source - Prex Version: 0.9.0

root/usr/sample/balls/balls.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. thread_run
  2. move_ball
  3. main

   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 }

/* [<][>][^][v][top][bottom][index][help] */