Subversion Repositories shark

Rev

Rev 1468 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1090 pj 1
/*
2
 * Project: S.Ha.R.K.
3
 *
4
 * Coordinators:
5
 *   Giorgio Buttazzo    <giorgio@sssup.it>
6
 *   Paolo Gai           <pj@gandalf.sssup.it>
7
 *
8
 * Authors     :
9
 *   Paolo Gai           <pj@gandalf.sssup.it>
10
 *   Massimiliano Giorgi <massy@gandalf.sssup.it>
11
 *   Luca Abeni          <luca@gandalf.sssup.it>
12
 *   (see the web pages for full authors list)
13
 *
14
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
15
 *
16
 * http://www.sssup.it
17
 * http://retis.sssup.it
18
 * http://shark.sssup.it
19
 */
20
 
1590 tullio 21
/* CVS :        $Id: aereo.c,v 1.3 2006-07-03 15:10:15 tullio Exp $ */
1090 pj 22
 
23
/*
24
 * Copyright (C) 2000 Fabio Calabrese <fabiocalabrese77@yahoo.it>
25
 *
26
 * This program is free software; you can redistribute it and/or modify
27
 * it under the terms of the GNU General Public License as published by
28
 * the Free Software Foundation; either version 2 of the License, or
29
 * (at your option) any later version.
30
 *
31
 * This program is distributed in the hope that it will be useful,
32
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
33
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34
 * GNU General Public License for more details.
35
 *
36
 * You should have received a copy of the GNU General Public License
37
 * along with this program; if not, write to the Free Software
38
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
39
 *
40
 */
41
 
1590 tullio 42
#include "bca.h"
1090 pj 43
 
44
TASK aereo_creator(void * arg)
45
{ int             i, index, last;
46
  WORD            count;
47
  PID             pid=-1;
48
  COLOR           col;
49
  double          vel;
50
  int             dir;
51
  WORD            h;
52
  double          l;
53
  WORD            x, y;
54
 
55
  while(1){
56
 
57
    count=0;
58
    index=-1;
59
    last=-1;
60
 
61
    for (i=0; i<AEREO_N_MAX; i++)  // Conteggio aerei attivi
62
      if (aereo_table[i].status) {
63
         count++;
64
         last=i;          //...ultima posizione occupata in tabella...
65
         }
66
      else {
67
         if (index==-1) index=i;   //...prima posizione libera in tabella...
68
         }
69
 
70
    if (count<aereo_count && index!=-1) { // Richiesta nuovo aereo
71
      aereo_table[index].status =  1;     //...occupa posizione...
72
      aereo_table[index].killing = 0;     //...disattiva richiesta di kill...
73
      col = FAB_rgb(FAB_int_rand(50,255), //...nuovo colore...
74
                    FAB_int_rand(50,255),
75
                    FAB_int_rand(50,255));
76
      vel = FAB_double_rand(AEREO_V_MIN,AEREO_V_MAX); //...velocita'...
77
      dir = FAB_sign_rand();                          //...direzione...
78
      h   = FAB_int_rand(AEREO_H_MIN,AEREO_H_MAX);    //...altezza...
79
      y   = Y0 + 500 - h*500/BASE_H;
80
      l   = (dir>0) ? AEREO_L_MIN : AEREO_L_MAX;      //...posizione iniz...
81
      x   = (dir>0) ? AEREO_X_MIN : AEREO_X_MAX;
82
      // ... settaggio valori in tabella ...
83
      aereo_table[index].color = col;
84
      if (index>0) {
85
        if (dir>0) FAB_image_copy(image_aereo[0],aereo_table[index].image);
86
        else       FAB_image_copy(image_aereo[1],aereo_table[index].image);
87
        }
88
      else {
89
        if (dir>0) FAB_image_copy(image_aereo[2],aereo_table[index].image);
90
        else       FAB_image_copy(image_aereo[3],aereo_table[index].image);
91
        }
92
      FAB_image_color_change(aereo_table[index].image,AEREO_BASE_COL,col);
93
      aereo_table[index].vel = vel;
94
      aereo_table[index].dir = dir;
95
      aereo_table[index].h   = h;
96
      aereo_table[index].l   = l;
97
      aereo_table[index].x   = x;
98
      aereo_table[index].y   = y;
99
      if (index==0) pid = crea_hard_aereo(index); // sempre il 1 hard
100
      else          pid = crea_soft_aereo(index); // tutti gli altri soft
101
      aereo_table[index].pid = pid;
102
      if (pid!=NIL) task_activate(pid);
103
      else {           //ripristino il posto libero in tabella;
104
        aereo_table[index].status =  0;
105
        aereo_table[index].killing = 0;
106
        }
107
      }
108
 
109
    else if (count>aereo_count) {       // Richiesta cancellazione aereo
110
      aereo_table[last].killing = 1;
111
      }
112
 
113
    task_endcycle();
114
    }
115
  return NULL;
116
}
117
 
118
TASK aereo(void *arg)
119
{
120
  int        index;    // indice nella aereo_table
121
  FAB_IMAGE* image;
122
  int        xx0,yy0,xx1,yy1;
123
  int        y;
124
  double     x;
125
  double     old_x;    // [pixel]: conserva valore x prima di aggiornare
126
  double     dx;       // [pixel/us]: spostamento periodico
127
  int        first_time;
128
 
129
  index = (int)arg;
130
  image =      aereo_table[index].image;
131
  y = aereo_table[index].y;
132
  x = aereo_table[index].x;
133
  dx = aereo_table[index].vel * (AEREO_X_MAX-AEREO_X_MIN) / (double)BASE_L
134
       * (AEREO_PERIOD / (60*60*1000000.0))
135
       * aereo_table[index].dir;
136
  first_time = 1;
137
 
138
  while(1){
139
 
140
   old_x = x;
141
   x += dx;
142
 
143
   xx0 = old_x - AEREO_LX/2;
144
   yy0 = y - AEREO_LY/2;
145
   xx1 = xx0   + AEREO_LX - 1;
146
   yy1 = yy0   + AEREO_LY - 1;
147
 
148
   aereo_table[index].x = x;   //...aggiornamento posizione in tabella...
149
 
150
   if (x<AEREO_X_MIN || x>AEREO_X_MAX) {
151
      aereo_table[index].killing = 1;
152
      }
153
 
154
   if (aereo_table[index].killing) {
155
      if (!first_time) {
156
          mutex_lock(&grx_mutex);
157
          FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1);
158
          mutex_unlock(&grx_mutex);
159
          }
160
      aereo_table[index].status=0;
161
      aereo_table[index].pid=-2;
162
      aereo_table[index].killing=0;
163
      //il task aereo_creator si accorge che c' un aereo in meno
164
      // quindi ne ricreer uno nuovo!!!
165
      return NULL;
166
      }
167
 
168
   if(aereo_table[index].x!=(int)old_x) {//...se c' lo spostamento reale
169
                                         //        di almeno un pixel...
170
     mutex_lock(&grx_mutex);   //...aggiorna disegno...
171
     if (first_time) {
172
         first_time=0;
173
         }
174
     else {
175
         FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1);
176
         }
177
 
178
     FAB_image_put_within(image, x - AEREO_LX/2, y - AEREO_LY/2,
179
                                 X0, Y0, X1, Y1);
180
     mutex_unlock(&grx_mutex);
181
     }
182
 
183
   task_endcycle();
184
 }
185
 
186
return NULL;
187
}
188
 
189
PID crea_soft_aereo_creator()
190
{
191
  SOFT_TASK_MODEL m;
192
  PID pid;
193
 
194
  soft_task_default_model(m);
195
  soft_task_def_periodic(m);
196
  soft_task_def_period(m,AEREO_CREATOR_PERIOD);
197
  soft_task_def_wcet(m,AEREO_CREATOR_WCET);
198
  soft_task_def_met(m,AEREO_CREATOR_MET);
199
 
200
  pid = task_create("aereo_creator", aereo_creator, &m, NULL);
201
  return pid;
202
}
203
 
204
PID crea_hard_aereo(int index)
205
{
206
  HARD_TASK_MODEL m;
207
  PID pid;
208
 
209
  hard_task_default_model(m);
1468 giacomo 210
  hard_task_def_level(m,1);
1090 pj 211
  hard_task_def_arg(m,(void*)index);
212
  hard_task_def_periodic(m);
213
  hard_task_def_wcet(m, AEREO_WCET);
214
  hard_task_def_mit(m,AEREO_PERIOD);
215
  hard_task_def_usemath(m);
216
 
217
  pid = task_create("hard_aereo", aereo, &m, NULL);
218
  return pid;
219
}
220
 
221
PID crea_soft_aereo(int index)
222
{
223
  SOFT_TASK_MODEL m;
224
  PID pid;
225
 
226
  soft_task_default_model(m);
1468 giacomo 227
  soft_task_def_level(m,2);
1090 pj 228
  soft_task_def_arg(m,(void*)index);
229
  soft_task_def_periodic(m);
230
  soft_task_def_period(m,AEREO_PERIOD);
231
  soft_task_def_wcet(m, AEREO_WCET);
232
  soft_task_def_met(m,AEREO_MET);
233
  soft_task_def_usemath(m);
234
 
235
  pid = task_create("soft aereo", aereo, &m, NULL);
236
  return pid;
237
}
238