34,12 → 34,10 |
*/ |
|
#include "kernel/kern.h" |
#include <drivers/fg.h> |
#include <drivers/glib.h> |
#include <drivers/keyb.h> |
#include <unistd.h> |
#include <stdlib.h> |
|
#include "drivers/shark_keyb26.h" |
#include "drivers/shark_videodev26.h" |
|
#define WIDTH 640 |
#define HEIGHT 480 |
#define BYTES_PP 2 |
53,39 → 51,72 |
#define FG_W 320 |
#define FG_H 200 |
|
unsigned int color = FG_MONO; |
void program_end(void *arg) |
{ |
|
extern DWORD flbaddr; |
sys_end(); |
|
} |
|
static void screen() |
{ |
TASK grab_task(void *arg) { |
|
/* graphic card Initialization */ |
if (grx_init() < 1) { |
sys_abort(1); |
} |
|
if (grx_open(640, 480, 16) < 0) { |
cprintf("GRX Err\n"); |
sys_abort(1); |
} |
struct video_picture vpic; |
struct video_buffer fbuf; |
struct video_window win; |
struct video_channel chan; |
|
video_buf = (unsigned char *)flbaddr; |
|
} |
task_nopreempt(); |
|
void program_end(void *arg) |
{ |
VIDEODEV26_open(0); |
|
VIDEODEV26_ioctl(0,VIDIOCGCHAN,(unsigned long)&chan); |
|
chan.channel = (int)(arg); |
|
VIDEODEV26_ioctl(0,VIDIOCSCHAN,(unsigned long)&chan); |
|
VIDEODEV26_ioctl(0,VIDIOCGPICT,(unsigned long)&vpic); |
|
vpic.palette = VIDEO_PALETTE_RGB565; |
|
VIDEODEV26_ioctl(0,VIDIOCSPICT,(unsigned long)&vpic); |
|
fbuf.base = malloc(640*480*2); |
fbuf.width = 320; |
fbuf.height = 200; |
fbuf.bytesperline = 640*2; |
fbuf.depth = 16; |
|
VIDEODEV26_ioctl(0,VIDIOCSFBUF,(unsigned long)&fbuf); |
|
grx_close(); |
VIDEODEV26_ioctl(0,VIDIOCGWIN,(unsigned long)&win); |
|
sys_end(); |
win.x = 0; |
win.y = 0; |
win.width = 320; |
win.height = 200; |
|
VIDEODEV26_ioctl(0,VIDIOCSWIN,(unsigned long)&win); |
|
task_preempt(); |
|
while(1) { |
|
task_nopreempt(); |
|
VIDEODEV26_ioctl(0,VIDIOCCAPTURE,NULL); |
|
task_preempt(); |
|
task_endcycle(); |
|
} |
|
} |
|
void elaborate_image(void *imageptr) |
{ |
|
/* |
WORD x,y; |
BYTE *col; |
|
112,9 → 143,9 |
} |
|
} |
|
//printf_xy(0,0,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 50*FG_W + 50)); |
//printf_xy(0,1,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 51*FG_W + 50)); |
*/ |
printf_xy(0,0,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 50*FG_W + 50)); |
printf_xy(0,1,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 51*FG_W + 50)); |
|
} |
|
121,33 → 152,27 |
int main(int argc, char **argv) |
{ |
|
int channel = 0; |
|
if (argc < 2) { |
channel = 0; |
} else { |
channel = atoi(argv[1]); |
} |
|
sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT); |
|
screen(); |
//video_buf = malloc(RGB565MEM); |
SOFT_TASK_MODEL st; |
PID grab_task_pid; |
|
sleep(1); |
soft_task_default_model(st); |
soft_task_def_period(st,50000); |
soft_task_def_met(st,10000); |
soft_task_def_arg(st, (void *)(1)); |
soft_task_def_ctrl_jet(st); |
|
FG_init(FG_PERIOD, FG_WCET, FG_W, FG_H, color, channel); |
grab_task_pid = task_create("GrabTask",grab_task,&st,NULL); |
if (grab_task_pid == NIL) { |
cprintf("ERROR: Cannot create grab task\n"); |
sys_end(); |
} |
|
FG_set_hook(elaborate_image); |
task_activate(grab_task_pid); |
|
FG_start_grabbing(); |
|
while(keyb_getch(BLOCK) != ESC); |
|
FG_close(); |
sys_end(); |
|
sys_end(); |
|
return 0; |
|
} |