Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

// framegrabber stuffs

/* File name ......... : ELABOR.C
 * Project............ :
 * Object ............ :
 * Author ............ : Facchinetti Tullio
 * Language .......... : C
 * Compiler .......... : GNU C
 * Operative system .. : MS-DOS/HARTIK
 * Creation data ..... : 04/03/2000
 * Last modify ....... : 19/11/99
 */





#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"

PID image_elab_PID;
TIME periodo;
CAB PXC_CAB;

static CAB frameCAB; // CAB di deposito delle immagini
static TDataObj current, older;

// extern in INIT.C
int img_border    =  10;
int window_width  =  40;
int window_height =  40;

// a 256 grayscale palette
WORD gray_palette[256];

// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];


#ifdef __BLACK_ON_WHITE
TPixel pix_threshold = 64;
#else
TPixel pix_threshold = 243;
#endif


// Global for testing!!!
static char st[50];
TIME before;

TDataObj sequence[N_FRAMES];
int top_frame = 0;

double dist, speed;

static TPixel *grabber_frame;

void put_frame(TPixel *frame)
{
    register int i,j,col,row;

    for (i=1; i<IMG_ROW-1; i++)
      for (j=0; j<IMG_COL; j++) {
        col = (j*(N_COL-1))/(IMG_COL-1);
        row = (i*(N_ROW-1))/(IMG_ROW-1);
        converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
      }

    for (j=0; j<IMG_COL; j++) {
      converted_image[j] = gray_palette[0];
      converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
    }

    mutex_lock(&mutex);
    grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
                 (BYTE *)converted_image);
    mutex_unlock(&mutex);
}


TASK elab_image_TASK(void)
{
//  register int i, j;
  static unsigned int n_frame = 0;
  char found;
  int pred_x, pred_y;

  // Inizializzazione del task
  frameCAB = PXC_GetCab();

  while (1) {
    n_frame++;
    sprintf(st, "frame n. %5d", n_frame);

    mutex_lock(&mutex);
    grx_text(st, 400, 290, 255, 0);
    mutex_unlock(&mutex);

    // Acquisizione immagine corrente
    grabber_frame = cab_getmes(frameCAB);

    put_frame(grabber_frame);

    // Release CAB
    cab_unget(frameCAB, grabber_frame);

    task_endcycle();
  }
}


void start_listener(void);

void framegrabber_close(void *arg)
{
  PXC_Close();
}

void init_framegrabber(void)
{
  register int i;
  KEY_EVT my_key;

  // Aggiusta la palette
    for (i = 0; i < 256; i++)
      gray_palette[i] = rgb16(i,i,i);

  periodo = PXC_Initiate(3);
  PXC_CAB = PXC_GetCab();

  if (!periodo) {
    grx_close();
    cprintf("Problemi nell'inizializzazione del driver\n");
    sys_end();
  } else {
    start_listener();
  }

  sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}


void start_listener(void)
{
  SOFT_TASK_MODEL m_soft;

  soft_task_default_model(m_soft);
  soft_task_def_met(m_soft,IMAGING_WCET);
  soft_task_def_usemath(m_soft);
  soft_task_def_aperiodic(m_soft);
  soft_task_def_period(m_soft,(periodo));
  soft_task_def_group(m_soft,1);
  soft_task_def_ctrl_jet(m_soft);

  image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);

/*  task_activate(  image_elab_PID);
  PXC_Push_Listener(image_elab_PID,2);
  PXC_Start();*/

}

void start_framegrabber()
{
  PXC_Push_Listener(image_elab_PID,1);
  PXC_Start();
}