Subversion Repositories shark

Rev

Rev 1130 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1127 giacomo 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
 *   Giacomo Guidi       <giacomo@gandalf.sssup.it>
10
 *
11
 *
12
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
13
 *
14
 * http://www.sssup.it
15
 * http://retis.sssup.it
16
 * http://shark.sssup.it
17
 */
18
 
19
#include <drivers/vga.h>
20
#include <drivers/keyb.h>
21
 
22
#include <GL/osmesa.h>
23
#include <GL/glut.h>
24
 
25
#include <math.h>
26
#include <stdlib.h>
27
 
28
#include <kernel/log.h>
29
#include <kernel/kern.h>
30
 
31
#ifndef M_PI
32
#define M_PI 3.14159265
33
#endif
34
 
35
#define WIDTH 640
36
#define HEIGHT 480
37
#define BYTES_PP 2 //BytesPerPixel
38
#define INITSTR G640x480x64K //SVGAlib standard mode definitions
39
#define CARD NV3 //Video driver (Supported SAVAGE, NV3, R128 from SVGALib)
40
 
41
OSMesaContext ctx;
42
 
43
unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
44
unsigned char *video_buf = NULL; //Video Buffer
45
 
46
unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
47
unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
48
 
49
unsigned long int PERIOD_REFRESH = 50000; //fps = 20 Test
50
unsigned long int PERIOD_DISEGNA = 50000;
51
 
52
unsigned long int WCET_REFRESH, WCET_DISEGNA;
53
 
54
TASK refesh(void);
55
TASK disegna(void);
56
 
57
PID refresh_PID, disegna_PID;
58
 
59
static void
60
gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
61
  GLint teeth, GLfloat tooth_depth)
62
{
63
  GLint i;
64
  GLfloat r0, r1, r2;
65
  GLfloat angle, da;
66
  GLfloat u, v, len;
67
 
68
  r0 = inner_radius;
69
  r1 = outer_radius - tooth_depth / 2.0;
70
  r2 = outer_radius + tooth_depth / 2.0;
71
 
72
  da = 2.0 * M_PI / teeth / 4.0;
73
 
74
  glShadeModel(GL_FLAT);
75
 
76
  glNormal3f(0.0, 0.0, 1.0);
77
 
78
  glBegin(GL_QUAD_STRIP);
79
  for (i = 0; i <= teeth; i++) {
80
    angle = i * 2.0 * M_PI / teeth;
81
    glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
82
    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
83
    if (i < teeth) {
84
      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
85
      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
86
    }
87
  }
88
  glEnd();
89
 
90
  glBegin(GL_QUADS);
91
  da = 2.0 * M_PI / teeth / 4.0;
92
  for (i = 0; i < teeth; i++) {
93
    angle = i * 2.0 * M_PI / teeth;
94
 
95
    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
96
    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
97
    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
98
    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
99
  }
100
  glEnd();
101
 
102
  glNormal3f(0.0, 0.0, -1.0);
103
 
104
  glBegin(GL_QUAD_STRIP);
105
  for (i = 0; i <= teeth; i++) {
106
    angle = i * 2.0 * M_PI / teeth;
107
    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
108
    glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
109
    if (i < teeth) {
110
      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
111
      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
112
    }
113
  }
114
  glEnd();
115
 
116
  glBegin(GL_QUADS);
117
  da = 2.0 * M_PI / teeth / 4.0;
118
  for (i = 0; i < teeth; i++) {
119
    angle = i * 2.0 * M_PI / teeth;
120
 
121
    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
122
    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
123
    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
124
    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
125
  }
126
  glEnd();
127
 
128
  glBegin(GL_QUAD_STRIP);
129
  for (i = 0; i < teeth; i++) {
130
    angle = i * 2.0 * M_PI / teeth;
131
 
132
    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
133
    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
134
    u = r2 * cos(angle + da) - r1 * cos(angle);
135
    v = r2 * sin(angle + da) - r1 * sin(angle);
136
    len = sqrt(u * u + v * v);
137
    u /= len;
138
    v /= len;
139
    glNormal3f(v, -u, 0.0);
140
    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
141
    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
142
    glNormal3f(cos(angle), sin(angle), 0.0);
143
    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
144
    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
145
    u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
146
    v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
147
    glNormal3f(v, -u, 0.0);
148
    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
149
    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
150
    glNormal3f(cos(angle), sin(angle), 0.0);
151
  }
152
 
153
  glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
154
  glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
155
 
156
  glEnd();
157
 
158
  glShadeModel(GL_SMOOTH);
159
 
160
  glBegin(GL_QUAD_STRIP);
161
  for (i = 0; i <= teeth; i++) {
162
    angle = i * 2.0 * M_PI / teeth;
163
    glNormal3f(-cos(angle), -sin(angle), 0.0);
164
    glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
165
    glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
166
  }
167
  glEnd();
168
 
169
}
170
 
171
static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
172
static GLint gear1, gear2, gear3;
173
static GLfloat angle = 0.0;
174
 
175
static void draw(void)
176
{
177
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
178
 
179
  glPushMatrix();
180
    glRotatef(view_rotx, 1.0, 0.0, 0.0);
181
    glRotatef(view_roty, 0.0, 1.0, 0.0);
182
    glRotatef(view_rotz, 0.0, 0.0, 1.0);
183
 
184
    glPushMatrix();
185
      glTranslatef(-3.0, -2.0, 0.0);
186
      glRotatef(angle, 0.0, 0.0, 1.0);
187
      glCallList(gear1);
188
    glPopMatrix();
189
 
190
    glPushMatrix();
191
      glTranslatef(3.1, -2.0, 0.0);
192
      glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
193
      glCallList(gear2);
194
    glPopMatrix();
195
 
196
    glPushMatrix();
197
      glTranslatef(-3.1, 4.2, 0.0);
198
      glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
199
      glCallList(gear3);
200
    glPopMatrix();
201
 
202
  glPopMatrix();
203
 
204
  glFinish();
205
 
206
}
207
 
208
static void gl_init()
209
{
210
 
211
  static GLfloat red[4] = {1.0, 0.0, 0.0, 1.0};
212
  static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
213
  static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
214
  static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0};
215
  static GLfloat h = (GLfloat) HEIGHT / (GLfloat) WIDTH;
216
 
217
  //Create the OSMesa Context
218
  ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL);
219
 
220
  //Make Current Context
221
  OSMesaMakeCurrent(ctx, rgb_565_buf, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
222
 
223
  glLightfv(GL_LIGHT0, GL_POSITION, pos);
224
  glEnable(GL_CULL_FACE);
225
  glEnable(GL_LIGHTING);
226
  glEnable(GL_LIGHT0);
227
  glEnable(GL_DEPTH_TEST);
228
 
229
  /* make the gears */
230
  gear1 = glGenLists(1);
231
  glNewList(gear1, GL_COMPILE);
232
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
233
  gear(1.0, 4.0, 1.0, 20, 0.7);
234
  glEndList();
235
 
236
  gear2 = glGenLists(1);
237
  glNewList(gear2, GL_COMPILE);
238
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
239
  gear(0.5, 2.0, 2.0, 10, 0.7);
240
  glEndList();
241
 
242
  gear3 = glGenLists(1);
243
  glNewList(gear3, GL_COMPILE);
244
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
245
  gear(1.3, 2.0, 0.5, 10, 0.7);
246
  glEndList();
247
 
248
  glEnable(GL_NORMALIZE);
249
 
250
  glViewport(0, 0, (GLint) WIDTH, (GLint) HEIGHT);
251
  glMatrixMode(GL_PROJECTION);
252
  glLoadIdentity();
253
  glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
254
  glMatrixMode(GL_MODELVIEW);
255
  glLoadIdentity();
256
  glTranslatef(0.0, 0.0, -40.0);
257
 
258
}
259
 
260
static int screen(int mode)
261
{
262
 
263
  vga_modeinfo *minf;
264
 
265
  vga_setmode(mode,CARD);
266
  minf = vga_getmodeinfo(mode);
267
  if(! (minf->flags & CAPABLE_LINEAR)){
268
    vga_setmode(TEXT,CARD);
269
    printk(KERN_INFO "The mode %d is not capable of linear\n",mode);
270
    return 1;
271
  }
272
  vga_setpage(0);
273
  if(vga_setlinearaddressing() == -1) {
274
    vga_setmode(TEXT,CARD);
275
    printk(KERN_INFO "Could not set linear addressing for mode %d\n",mode);
276
    return 1;
277
  }
278
 
279
  video_buf = vga_getgraphmem();
280
  rgb_565_buf = malloc(RGB565MEM);
281
 
282
  grx_setbuffer(rgb_565_buf, WIDTH, HEIGHT);    //Init of RGB16 version of grx functions
283
                                                //created to work with Mesa buffer
284
  return 0;
285
 
286
}
287
 
288
void program_end(void *arg)
289
{
290
 
291
  OSMesaDestroyContext(ctx);
292
  free(rgb_565_buf);
293
 
294
  vga_setmode(TEXT,CARD);
295
 
296
  sys_end();
297
 
298
}
299
 
300
void program_key_end(KEY_EVT *k)
301
{
302
 
303
  sys_end();
304
 
305
}
306
 
307
TASK refresh(void)
308
{
309
 
310
  while(1) {
311
 
312
    copy_videomem_16to16(rgb_565_buf, video_buf, VMEMLONG);
313
    task_endcycle();
314
 
315
  }
316
 
317
  sys_end();
318
 
319
}
320
 
321
 
322
TASK disegna(void)
323
{
324
 
325
  char text[100];
326
  TIME disegna_TIME, refresh_TIME;
327
 
328
  while(1) {
329
 
330
    jet_gettable(refresh_PID, &refresh_TIME, 1);
331
    jet_gettable(disegna_PID, &disegna_TIME, 1);
332
 
333
    angle += 1.0;
334
 
335
    draw();
336
 
337
    sprintf(text,"Hard Task Refresh PER:%6d us EX:%6d us",(int)PERIOD_REFRESH,(int)refresh_TIME);
338
    grx_text(text,10,5,rgb16(0,0,255),0);    
339
    sprintf(text,"Hard Task Draw    PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
340
    grx_text(text,10,15,rgb16(0,0,255),0);
341
 
342
    task_endcycle();
343
 
344
  }
345
 
346
  sys_end();
347
 
348
}
349
 
350
int main (int argc, char *argv[])
351
{
352
 
353
    HARD_TASK_MODEL ht_refresh, ht_disegna;
354
 
355
    sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
356
 
357
    clear();
358
 
359
    WCET_REFRESH =((long int) PERIOD_REFRESH * (0.3));
360
    WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.65));
361
 
362
    hard_task_default_model(ht_refresh);
363
    hard_task_def_wcet(ht_refresh,WCET_REFRESH);
364
    hard_task_def_mit(ht_refresh,PERIOD_REFRESH);
365
    hard_task_def_usemath(ht_refresh);
366
    hard_task_def_group(ht_refresh,1);
367
    hard_task_def_ctrl_jet(ht_refresh);
368
 
369
    refresh_PID = task_create("refresh", refresh, &ht_refresh, NULL);
370
    if (refresh_PID == -1) {
371
      sys_end();
372
      exit(4);
373
    }
374
 
375
    hard_task_default_model(ht_disegna);
376
    hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
377
    hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
378
    hard_task_def_group(ht_disegna,1);
379
    hard_task_def_ctrl_jet(ht_disegna);
380
    hard_task_def_usemath(ht_disegna);
381
 
382
    disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
383
    if (disegna_PID == -1) {
384
      sys_end();
385
      exit(4);
386
    }
387
 
388
    {
389
      KEY_EVT k;
390
      k.flag = ALTL_BIT;
391
      k.scan = KEY_C;
392
      k.ascii = 'c';
393
      keyb_hook(k,program_key_end);
394
    }
395
 
396
    if (screen(INITSTR)) {
397
        printk(KERN_INFO "Graphical initialization failed !!\n");
398
        sys_end();
399
    }
400
 
401
    memset(rgb_565_buf, 0, RGB565MEM);
402
 
403
    gl_init();
404
 
405
    group_activate(1);
406
 
407
    return 0;
408
 
409
}