Rev 1550 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
/**
------------
CVS : $Id: ball.c,v 1.8 2005-05-10 17:21:17 mauro Exp $
File: $File$
Revision: $Revision: 1.8 $
Last update: $Date: 2005-05-10 17:21:17 $
------------
**/
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/*--------------------------------------------------------------*/
/* SIMULATION OF JUMPING BALLS */
/*--------------------------------------------------------------*/
#include "demo.h"
#include <kernel/func.h>
#include <stdlib.h>
#define R 8 /* dimension of a ball */
#define G 9.8 /* acceleration of gravity */
static int ballexit = 0;
static int npc = 0; /* number of tasks created */
/*--------------------------------------------------------------*/
/* Delay function for jumping balls */
/*--------------------------------------------------------------*/
void my_delay(void)
{
int xxx;
for (xxx=0; xxx<BALL_DELAY; xxx++);
}
/*--------------------------------------------------------------*/
/* Periodic task for ball simulation */
/*--------------------------------------------------------------*/
TASK palla(int i)
{
int x, y; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int x0, y0; /* posizione iniziale X pallina */
float vx, vy; /* velocitÂ… della pallina */
float vy0; /* velocita' pallina al primo rimbalzo */
float ty, tx; /* variabile temporale */
float dt; /* incremento temporale */
y = oy = y0 = BALL_HEIGHT;
x = ox = x0 = BALL_XMIN;
vy0= sqrt(2. * G * (float)BALL_HEIGHT);
vy = 0;
vx = BALL_VELX + myrand(9);
tx = 0;
ty = 0;
dt = ((float)PERIOD_BALL)/100000;
while (1) {
y = y0 + vy*ty - .5*G*ty*ty;
x = x0 + vx * tx;
if (y < 0) {
y = 0;
if (vy == 0.0)
vy = vy0;
else if (vy < BALL_VYMIN)
vy = vy0 * (1.0 - myrand(50)/100.0);
else
vy = 0.9 * vy;
ty = 0.0;
y0 = 0;
}
if (x > BALL_XMAX) {
tx = 0.0;
x0 = BALL_XMAX;
vx = -vx;
x = x0 + vx * tx;
}
if (x < BALL_XMIN) {
tx = 0.0;
x0 = BALL_XMIN;
vx = -vx;
x = x0 + vx * tx;
}
mutex_lock(&mutex);
grx_disc(ox, oy, R, 0);
ox = x;
oy = BALL_Y - y;
mutex_unlock(&mutex);
if (ballexit && i!=0xFFFF) {
npc--;
return 0;
}
mutex_lock(&mutex);
grx_disc(ox, oy, R, i);
mutex_unlock(&mutex);
my_delay();
ty += dt;
tx += dt;
task_endcycle();
}
}
void killball(KEY_EVT *k)
{
ballexit = 1;
}
void ballfun(KEY_EVT *k)
{
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
char palla_str[]="palla ";
if (npc == BALL_MAX_P) return;
ballexit = 0;
r = 64 + myrand(190);
g = 64 + myrand(190);
b = 64 + myrand(190);
itoa(npc,palla_str+5);
soft_task_default_model(mp);
soft_task_def_level(mp,2);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, (void *)rgb16(r,g,b));
soft_task_def_group(mp, BALL_GROUP);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create(palla_str, palla, &mp, NULL);
if (pid != NIL) {
task_activate(pid);
npc++;
}
}
void hardball()
{
HARD_TASK_MODEL mp;
int r,g,b;
PID pid;
r = 255;
g = 255;
b = 255;
hard_task_default_model(mp);
hard_task_def_ctrl_jet(mp);
hard_task_def_arg(mp, (void *)rgb16(r,g,b));
hard_task_def_wcet(mp, WCET_HARD_BALL);
hard_task_def_mit(mp,PERIOD_BALL);
hard_task_def_usemath(mp);
pid = task_create("pallaEDF", palla, &mp, NULL);
if (pid == NIL) {
sys_shutdown_message("Could not create task <pallaEDF>");
exit(1);
}
else
task_activate(pid);
}
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
void scenario_ball()
{
grx_text("Noise", 0, 45 /*BALL_Y-BALL_HEIGHT-15*/, rgb16(0,0,255), black);
grx_line(0,55,383,55,red);
grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
}
void init_ball(void)
{
KEY_EVT k;
hardball();
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
k.status = KEY_PRESSED;
keyb_hook(k,ballfun,FALSE);
k.flag = 0;
k.scan = KEY_BKS;
k.ascii = 0;
k.status = KEY_PRESSED;
keyb_hook(k,killball,FALSE);
}
/*--------------------------------------------------------------*/