Subversion Repositories shark

Rev

Rev 1468 | Go to most recent revision | Details | 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
 
21
/* CVS :        $Id: aereo.c,v 1.1 2002-10-01 10:25:00 pj Exp $ */
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
 
42
//************************
43
//* file:        aereo.c *
44
//* included by: bca.c   *
45
//************************
46
 
47
TASK aereo_creator(void * arg)
48
{ int             i, index, last;
49
  WORD            count;
50
  PID             pid=-1;
51
  COLOR           col;
52
  double          vel;
53
  int             dir;
54
  WORD            h;
55
  double          l;
56
  WORD            x, y;
57
 
58
  while(1){
59
 
60
    count=0;
61
    index=-1;
62
    last=-1;
63
 
64
    for (i=0; i<AEREO_N_MAX; i++)  // Conteggio aerei attivi
65
      if (aereo_table[i].status) {
66
         count++;
67
         last=i;          //...ultima posizione occupata in tabella...
68
         }
69
      else {
70
         if (index==-1) index=i;   //...prima posizione libera in tabella...
71
         }
72
 
73
    if (count<aereo_count && index!=-1) { // Richiesta nuovo aereo
74
      aereo_table[index].status =  1;     //...occupa posizione...
75
      aereo_table[index].killing = 0;     //...disattiva richiesta di kill...
76
      col = FAB_rgb(FAB_int_rand(50,255), //...nuovo colore...
77
                    FAB_int_rand(50,255),
78
                    FAB_int_rand(50,255));
79
      vel = FAB_double_rand(AEREO_V_MIN,AEREO_V_MAX); //...velocita'...
80
      dir = FAB_sign_rand();                          //...direzione...
81
      h   = FAB_int_rand(AEREO_H_MIN,AEREO_H_MAX);    //...altezza...
82
      y   = Y0 + 500 - h*500/BASE_H;
83
      l   = (dir>0) ? AEREO_L_MIN : AEREO_L_MAX;      //...posizione iniz...
84
      x   = (dir>0) ? AEREO_X_MIN : AEREO_X_MAX;
85
      // ... settaggio valori in tabella ...
86
      aereo_table[index].color = col;
87
      if (index>0) {
88
        if (dir>0) FAB_image_copy(image_aereo[0],aereo_table[index].image);
89
        else       FAB_image_copy(image_aereo[1],aereo_table[index].image);
90
        }
91
      else {
92
        if (dir>0) FAB_image_copy(image_aereo[2],aereo_table[index].image);
93
        else       FAB_image_copy(image_aereo[3],aereo_table[index].image);
94
        }
95
      FAB_image_color_change(aereo_table[index].image,AEREO_BASE_COL,col);
96
      aereo_table[index].vel = vel;
97
      aereo_table[index].dir = dir;
98
      aereo_table[index].h   = h;
99
      aereo_table[index].l   = l;
100
      aereo_table[index].x   = x;
101
      aereo_table[index].y   = y;
102
      if (index==0) pid = crea_hard_aereo(index); // sempre il 1ø hard
103
      else          pid = crea_soft_aereo(index); // tutti gli altri soft
104
      aereo_table[index].pid = pid;
105
      if (pid!=NIL) task_activate(pid);
106
      else {           //ripristino il posto libero in tabella;
107
        aereo_table[index].status =  0;
108
        aereo_table[index].killing = 0;
109
        }
110
      }
111
 
112
    else if (count>aereo_count) {       // Richiesta cancellazione aereo
113
      aereo_table[last].killing = 1;
114
      }
115
 
116
    task_endcycle();
117
    }
118
  return NULL;
119
}
120
 
121
TASK aereo(void *arg)
122
{
123
  int        index;    // indice nella aereo_table
124
  FAB_IMAGE* image;
125
  int        xx0,yy0,xx1,yy1;
126
  int        y;
127
  double     x;
128
  double     old_x;    // [pixel]: conserva valore x prima di aggiornare
129
  double     dx;       // [pixel/us]: spostamento periodico
130
  int        first_time;
131
 
132
  index = (int)arg;
133
  image =      aereo_table[index].image;
134
  y = aereo_table[index].y;
135
  x = aereo_table[index].x;
136
  dx = aereo_table[index].vel * (AEREO_X_MAX-AEREO_X_MIN) / (double)BASE_L
137
       * (AEREO_PERIOD / (60*60*1000000.0))
138
       * aereo_table[index].dir;
139
  first_time = 1;
140
 
141
  while(1){
142
 
143
   old_x = x;
144
   x += dx;
145
 
146
   xx0 = old_x - AEREO_LX/2;
147
   yy0 = y - AEREO_LY/2;
148
   xx1 = xx0   + AEREO_LX - 1;
149
   yy1 = yy0   + AEREO_LY - 1;
150
 
151
   aereo_table[index].x = x;   //...aggiornamento posizione in tabella...
152
 
153
   if (x<AEREO_X_MIN || x>AEREO_X_MAX) {
154
      aereo_table[index].killing = 1;
155
      }
156
 
157
   if (aereo_table[index].killing) {
158
      if (!first_time) {
159
          mutex_lock(&grx_mutex);
160
          FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1);
161
          mutex_unlock(&grx_mutex);
162
          }
163
      aereo_table[index].status=0;
164
      aereo_table[index].pid=-2;
165
      aereo_table[index].killing=0;
166
      //il task aereo_creator si accorge che c'Š un aereo in meno
167
      // quindi ne ricreer… uno nuovo!!!
168
      return NULL;
169
      }
170
 
171
   if(aereo_table[index].x!=(int)old_x) {//...se c'Š lo spostamento reale
172
                                         //        di almeno un pixel...
173
     mutex_lock(&grx_mutex);   //...aggiorna disegno...
174
     if (first_time) {
175
         first_time=0;
176
         }
177
     else {
178
         FAB_image_put_within(image_bca,X0,Y0,xx0,yy0,xx1,yy1);
179
         }
180
 
181
     FAB_image_put_within(image, x - AEREO_LX/2, y - AEREO_LY/2,
182
                                 X0, Y0, X1, Y1);
183
     mutex_unlock(&grx_mutex);
184
     }
185
 
186
   task_endcycle();
187
 }
188
 
189
return NULL;
190
}
191
 
192
PID crea_soft_aereo_creator()
193
{
194
  SOFT_TASK_MODEL m;
195
  PID pid;
196
 
197
  soft_task_default_model(m);
198
  soft_task_def_periodic(m);
199
  soft_task_def_period(m,AEREO_CREATOR_PERIOD);
200
  soft_task_def_wcet(m,AEREO_CREATOR_WCET);
201
  soft_task_def_met(m,AEREO_CREATOR_MET);
202
 
203
  pid = task_create("aereo_creator", aereo_creator, &m, NULL);
204
  return pid;
205
}
206
 
207
PID crea_hard_aereo(int index)
208
{
209
  HARD_TASK_MODEL m;
210
  PID pid;
211
 
212
  hard_task_default_model(m);
213
  hard_task_def_level(m,0);
214
  hard_task_def_arg(m,(void*)index);
215
  hard_task_def_periodic(m);
216
  hard_task_def_wcet(m, AEREO_WCET);
217
  hard_task_def_mit(m,AEREO_PERIOD);
218
  hard_task_def_usemath(m);
219
 
220
  pid = task_create("hard_aereo", aereo, &m, NULL);
221
  return pid;
222
}
223
 
224
PID crea_soft_aereo(int index)
225
{
226
  SOFT_TASK_MODEL m;
227
  PID pid;
228
 
229
  soft_task_default_model(m);
230
  soft_task_def_level(m,0);
231
  soft_task_def_arg(m,(void*)index);
232
  soft_task_def_periodic(m);
233
  soft_task_def_period(m,AEREO_PERIOD);
234
  soft_task_def_wcet(m, AEREO_WCET);
235
  soft_task_def_met(m,AEREO_MET);
236
  soft_task_def_usemath(m);
237
 
238
  pid = task_create("soft aereo", aereo, &m, NULL);
239
  return pid;
240
}
241