Subversion Repositories shark

Rev

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

Rev Author Line No. Line
1174 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
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
12
 *
13
 * http://www.sssup.it
14
 * http://retis.sssup.it
15
 * http://shark.sssup.it
16
 */
17
 
18
/*
19
 * Copyright (C) 2003 Giacomo Guidi
20
 *
21
 * This program is free software; you can redistribute it and/or modify
22
 * it under the terms of the GNU General Public License as published by
23
 * the Free Software Foundation; either version 2 of the License, or
24
 * (at your option) any later version.
25
 *
26
 * This program is distributed in the hope that it will be useful,
27
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29
 * GNU General Public License for more details.
30
 *
31
 * You should have received a copy of the GNU General Public License
32
 * along with this program; if not, write to the Free Software
33
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
34
 */
35
 
36
#include "kernel/kern.h"
1424 giacomo 37
#include "stdlib.h"
1432 giacomo 38
#include "unistd.h"
1174 giacomo 39
 
1423 giacomo 40
#include "drivers/shark_keyb26.h"
41
#include "drivers/shark_videodev26.h"
1424 giacomo 42
#include "drivers/shark_fb26.h"
1423 giacomo 43
 
1474 giacomo 44
#include "tracer.h"
45
 
1174 giacomo 46
#define WIDTH 640
47
#define HEIGHT 480
48
#define BYTES_PP 2
49
 
1443 giacomo 50
//#define COLOR
1551 mauro 51
//#define MAX_SPEED
1443 giacomo 52
 
1444 giacomo 53
#define FRAME_GRABBER_NUMBER 0
54
 
1480 giacomo 55
#define FG_PERIOD 40000 //ONLY IF MAX_SPEED IS DISABLED
1174 giacomo 56
#define FG_WCET 30000
57
#define FG_W 320                
1474 giacomo 58
#define FG_H 240
1174 giacomo 59
 
1487 giacomo 60
unsigned int frame_number = 0;
61
 
1423 giacomo 62
void program_end(void *arg)
63
{
1174 giacomo 64
 
1550 pj 65
  exit(0);
1423 giacomo 66
 
67
}
1174 giacomo 68
 
1424 giacomo 69
void elaborate_image(void *imageptr);
70
 
1470 giacomo 71
void start_frame_grabber(PID elaborate_task_PID, int channel, struct video_buffer *fbuf) {
1174 giacomo 72
 
1423 giacomo 73
  struct video_window win;
74
  struct video_channel chan;
1443 giacomo 75
  struct video_tuner tuner;
1470 giacomo 76
  struct video_picture vpic;
1474 giacomo 77
  int res;
1174 giacomo 78
 
1432 giacomo 79
  /* Init videodev driver */
1444 giacomo 80
  VIDEODEV26_open(FRAME_GRABBER_NUMBER);
1432 giacomo 81
 
1444 giacomo 82
  /* Select the input channel */
1474 giacomo 83
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGCHAN,(unsigned long)&chan);
84
  //cprintf("res = %d\n",res);
1443 giacomo 85
 
1470 giacomo 86
  chan.channel = channel;
1443 giacomo 87
  chan.type = VIDEO_VC_TUNER;
1432 giacomo 88
  chan.norm = VIDEO_TYPE_CAMERA;
1423 giacomo 89
 
1474 giacomo 90
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSCHAN,(unsigned long)&chan);
91
  //cprintf("res = %d\n",res);
1432 giacomo 92
 
1444 giacomo 93
  /* Enable the tuner */
1443 giacomo 94
 
1474 giacomo 95
  tuner.tuner = 0;
1443 giacomo 96
  tuner.mode = VIDEO_MODE_PAL;
97
 
1474 giacomo 98
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSTUNER,(unsigned long)&tuner);
99
  //cprintf("res = %d\n",res);
1443 giacomo 100
 
1427 giacomo 101
  /* Select palette and depth */
1474 giacomo 102
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGPICT,(unsigned long)&vpic);
103
  //cprintf("res = %d\n",res);  
104
 
1443 giacomo 105
  #ifdef COLOR
106
        vpic.palette = VIDEO_PALETTE_RGB24;
107
        vpic.depth = 24;
108
  #else
109
        vpic.palette = VIDEO_PALETTE_GREY;
110
        vpic.depth = 8;
111
  #endif
112
 
113
  vpic.brightness = 35000;
114
  vpic.hue = 32000;
115
  vpic.contrast = 32000;
116
  vpic.colour = 32000;                          
1424 giacomo 117
 
1474 giacomo 118
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSPICT,(unsigned long)&vpic);
119
  //cprintf("res = %d\n",res);
1424 giacomo 120
 
1474 giacomo 121
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCGWIN,(unsigned long)&win);
122
  //cprintf("res = %d\n",res);
123
 
1423 giacomo 124
  win.x = 0;
125
  win.y = 0;
1432 giacomo 126
  win.width = FG_W;
127
  win.height = FG_H;
1424 giacomo 128
 
1474 giacomo 129
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSWIN,(unsigned long)&win);
130
  //cprintf("res = %d\n",res);
131
 
1471 giacomo 132
  /* Set the buffer */
1474 giacomo 133
  res = VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSFBUF,(unsigned long)(fbuf));
134
  //cprintf("res = %d\n",res);
1471 giacomo 135
 
1470 giacomo 136
  /* IMPORTANT: Set the aperiodic elaboration task
137
   * This is a SHARK change on VIDIOCSYNC. When the
138
   * new frame is ready, the task elaborate_task_PID
139
   * is activated. Elabortate_task must be aperiodic !!
140
   * To link the task to BTTV use this function: */
141
 
142
  VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCSYNC,(unsigned long)(elaborate_task_PID));
143
 
144
}
145
 
1471 giacomo 146
/* Check if the frame grabber is ready */
1473 giacomo 147
volatile int ready_to_grab = 1;
1470 giacomo 148
 
1485 giacomo 149
void grab_command(void *arg) {
150
 
151
  SYS_FLAGS f;
152
 
153
  f = kern_fsave();
154
 
155
  int on = 1;
156
  VIDEODEV26_ioctl(FRAME_GRABBER_NUMBER,VIDIOCCAPTURE,(unsigned long)&on);
157
 
158
  kern_frestore(f);
159
 
160
}
161
 
1470 giacomo 162
/* Elaboration task, it is called when the frame
163
   grabber buffer is ready */
164
TASK elaborate_task(void *arg) {
165
 
166
  struct video_buffer *fbuf = (struct video_buffer *)(arg);
1487 giacomo 167
  char txt[100];
1470 giacomo 168
 
1423 giacomo 169
  while(1) {
1443 giacomo 170
 
1470 giacomo 171
    elaborate_image(fbuf->base);
1472 giacomo 172
    //cprintf("E");
173
 
174
    //Text version
175
    //printf_xy(1,20,WHITE,"%08x",
1487 giacomo 176
    //    *(unsigned int *)(fbuf->base+50*320*3+50*3));
1443 giacomo 177
 
1487 giacomo 178
    frame_number++;
179
    sprintf(txt,"Elapsed Time = %u us Frame = %u",(int)(sys_gettime(NULL)),frame_number);
180
    grx_text(txt, 10, 250, rgb16(255,255,255), 0);    
181
 
1471 giacomo 182
    ready_to_grab = 1;
183
 
1480 giacomo 184
    #ifdef MAX_SPEED
1485 giacomo 185
      grab_command(NULL);
1480 giacomo 186
    #endif
187
 
1432 giacomo 188
    task_testcancel();
1424 giacomo 189
    task_endcycle();
190
 
1423 giacomo 191
  }
192
 
1424 giacomo 193
  return NULL;
194
 
1174 giacomo 195
}
196
 
1470 giacomo 197
/* Send the grab command */
198
TASK grab_task(void *arg) {
199
 
200
  while(1) {
1471 giacomo 201
 
202
    if (ready_to_grab) {
1473 giacomo 203
 
1471 giacomo 204
      /* Grab */
1485 giacomo 205
      grab_command(NULL);
1470 giacomo 206
 
1472 giacomo 207
      //cprintf("G");
208
 
1471 giacomo 209
      ready_to_grab = 0;
210
 
211
    } else {
212
 
1472 giacomo 213
      //cprintf("S");
1471 giacomo 214
      /* Frame skipped */
215
 
216
    }
217
 
1470 giacomo 218
    task_testcancel();
219
    task_endcycle();
220
 
221
  }
222
 
223
  return NULL;
224
 
225
}
226
 
1424 giacomo 227
extern void *video_memory;
228
 
1174 giacomo 229
void elaborate_image(void *imageptr)
230
{
1424 giacomo 231
 
1174 giacomo 232
  WORD x,y;
233
  BYTE *col;
234
 
1443 giacomo 235
  #ifdef COLOR
236
 
1174 giacomo 237
    for(y = 0; y < FG_H; y++)
238
      for(x = 0; x < FG_W; x++) {
239
 
1443 giacomo 240
        col = (BYTE *)(imageptr + y * FG_W * 3 + x * 3);
241
        *(WORD *)(video_memory + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col+2),*(BYTE *)(col+1),*(BYTE *)(col+0));
1174 giacomo 242
 
243
    }
244
 
1443 giacomo 245
  #else
246
 
247
    for(y = 0; y < FG_H; y++)
248
      for(x = 0; x < FG_W; x++) {
249
 
250
        col = (BYTE *)(imageptr + y * FG_W + x);
251
        *(WORD *)(video_memory + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col),*(BYTE *)(col),*(BYTE *)(col));
252
 
253
    }
254
 
255
  #endif
256
 
1174 giacomo 257
}
258
 
259
int main(int argc, char **argv)
260
{
261
 
1470 giacomo 262
  HARD_TASK_MODEL gt;
1485 giacomo 263
  SOFT_TASK_MODEL et;
1470 giacomo 264
  PID grab_task_pid,elaborate_task_pid;
1174 giacomo 265
 
1470 giacomo 266
  struct video_buffer fbuf;
267
  int channel = 0;
268
 
1444 giacomo 269
  if (argc < 2) {
1445 giacomo 270
        sys_shutdown_message("ERROR: Enter the input channel [ex> %s 0]\n",argv[0]);
1550 pj 271
        exit(1);
1444 giacomo 272
  }
1432 giacomo 273
 
1470 giacomo 274
  channel = atoi(argv[1]);
275
 
1485 giacomo 276
  soft_task_default_model(et);
1487 giacomo 277
  soft_task_def_period(et,FG_PERIOD);
1485 giacomo 278
  soft_task_def_arg(et,(void *)(&fbuf));
279
  soft_task_def_met(et,FG_WCET);
280
  soft_task_def_aperiodic(et);
281
  soft_task_def_ctrl_jet(et);
1470 giacomo 282
 
283
  hard_task_default_model(gt);
1480 giacomo 284
  hard_task_def_mit(gt,FG_PERIOD);
1473 giacomo 285
  hard_task_def_wcet(gt,5000);
1470 giacomo 286
  hard_task_def_ctrl_jet(gt);
287
 
288
  grab_task_pid = task_create("GrabTask",grab_task,&gt,NULL);
1423 giacomo 289
  if (grab_task_pid == NIL) {
1444 giacomo 290
        sys_shutdown_message("ERROR: Cannot create grab task\n");
1550 pj 291
        exit(1);
1423 giacomo 292
  }
1174 giacomo 293
 
1470 giacomo 294
  elaborate_task_pid = task_create("ElaborateTask",elaborate_task,&et,NULL);
295
  if (grab_task_pid == NIL) {
296
        sys_shutdown_message("ERROR: Cannot create elaborate task\n");
1550 pj 297
        exit(1);
1470 giacomo 298
  }
299
 
300
  #ifdef COLOR
301
 
302
        fbuf.base = malloc(FG_W*FG_H*3);
303
        fbuf.height = FG_H;
304
        fbuf.width = FG_W;
305
        fbuf.bytesperline = FG_W*3;
306
        fbuf.depth = 24;
307
 
308
  #else
309
 
310
        fbuf.base = malloc(FG_W*FG_H);
311
        fbuf.height = FG_H;
312
        fbuf.width = FG_W;
313
        fbuf.bytesperline = FG_W;
314
        fbuf.depth = 8;
315
 
316
  #endif
317
 
318
  start_frame_grabber(elaborate_task_pid,channel,&fbuf);
319
 
1480 giacomo 320
  #ifndef MAX_SPEED
321
    /* Activate periodic grabbing */
322
    task_activate(grab_task_pid);
323
  #else
324
    /* Grab */
1485 giacomo 325
    grab_command(NULL);
1480 giacomo 326
  #endif
1174 giacomo 327
 
1189 giacomo 328
  while(keyb_getch(BLOCK) != ESC);
329
 
1480 giacomo 330
  #ifndef MAX_SPEED
331
    task_kill(grab_task_pid);
332
  #endif
1432 giacomo 333
 
334
  sleep(1);
335
 
1550 pj 336
  exit(1);
1189 giacomo 337
 
1174 giacomo 338
  return 0;
339
 
340
}