#include "vp910.h"
#include "vpxdef.h"
#include "vpxsys.h"
#include "vpxfnc.h"
DEVID devID;
int ImgYUV,ImgUV,ImgEMC,ImgRGB,ImgG,ImgB;
IMG_FRAME_SIZE size; // No Use
#define FrameStartX (512-480)/2 // 512X480 -> 480X480
#define FrameStartY 0
{
#ifndef NO_VP910
if((devID = OpenIPDev(IPBOARD_0, 0)) == ISPX_NULL)
{
TRACE("Cannot Open VP910\n");
exit(0);
}
if(ResetIPSys(devID))
{
TRACE("Cannot Reset\n");
exit(0);
}
if(LoadIPSys(devID, IPCOMMAND, REGISTRY_PATH))
{
TRACE("Cannot Load\n");
exit(0);
}
if(BootIPSys(devID))
{
TRACE("Cannot Boot\n");
exit(0);
}
if(InitIP(devID))
{
TRACE("Cannot Command Init\n");
exit(0);
}
if(SelectCamera(devID, CAMERA_PORT0, YUV_CAMERA))
{
TRACE("Cannot Select Camera\n");
exit(0);
}
size.xsize = VPW;
size.ysize = VPH;
if(SetVideoFrame(devID, INTERLACE, CAP_SIZE))
{
TRACE("Cannot SetVideoFrame\n");
exit(0);
}
if((ImgYUV = AllocYUVImg(devID, BUF_SIZE)) < 0)
{
TRACE("Cannot AllocYUV for ImgYUV\n");
exit(0);
}
ImgUV = GetUVImgID(devID, ImgYUV);
if((ImgEMC = AllocImg(devID, BUF_SIZE)) < 0)
{
TRACE("Cannot AllocYUV for ImgYUVMC\n");
exit(0);
}
if((ImgRGB = AllocRGBImg(devID, BUF_SIZE)) < 0)
{
TRACE("Cannot AllocYUV for ImgRGB\n");
exit(0);
}
ImgG = GetGImgID(devID, ImgRGB);
ImgB = GetBImgID(devID, ImgRGB);
if(SetAllWindow(devID, FrameStartX, FrameStartY
, FrameStartX + VPW - 1, FrameStartY + VPH - 1))
{
TRACE("Cannot SetAllWindow\n");
exit(0);
}
disp_camera_vp910();
}
{
if(devID != ISPX_NULL)
CloseIPDev(devID);
}
void disp_camera_vp910(void)
{
if(DispCamera(devID))
{
TRACE("Cannot SetAllWindow\n");
exit(0);
}
}
void disp_vp910(void)
{
GetCamera(devID, ImgYUV);
ISP_BusyWait(devID, VP_BUSY);
DispImg(devID, ImgYUV);
}
void get_camera(void)
{
GetCamera(devID, ImgYUV);
}
#define FASTRGB
static unsigned char imgtmp[VPH][VPW];
void get_rgb_vp910(RGBTRIPLE buf[][VPW])
{
int h, w;
ISP_BusyWait(devID, VP_BUSY);
#ifndef FASTRGB
IP_ConvertYUVtoRGB(devID, ImgYUV, ImgRGB, ImgG, ImgB); // 遅いけど正確?
#else
IP_ConvertYUVtoRGBfast(devID, ImgYUV, ImgRGB); // 速いけどいいかげん?
#endif
ReadImgReverse(devID, ImgRGB, (char*)imgtmp, VPW * VPH);
for(h = 0; h < VPH; h++)
for(w = 0; w < VPW; w++)
buf[h][w].rgbtRed = imgtmp[h][w];
ReadImgReverse(devID, ImgG, (char*)imgtmp, VPW * VPH);
for(h = 0; h < VPH; h++)
for(w = 0; w < VPW; w++)
buf[h][w].rgbtGreen = imgtmp[h][w];
ReadImgReverse(devID, ImgB, (char*)imgtmp, VPW * VPH);
for(h = 0; h < VPH; h++)
for(w = 0; w < VPW; w++)
buf[h][w].rgbtBlue = imgtmp[h][w];
}
YUVTRIPLE get_pixel_yuv(int x, int y)
{
YUVTRIPLE yuv;
static unsigned char tmp[2][VPH][VPW];
ISP_BusyWait(devID, VP_BUSY);
ReadImg(devID, ImgYUV, (char*)tmp, VPW * VPH);
yuv.Y = tmp[0][VPH - y - 1][x];
yuv.U = tmp[1][VPH - y - 1][(x & 0xfffffffe)];
yuv.V = tmp[1][VPH - y - 1][(x & 0xfffffffe) + 1];
return yuv;
}
YUVTRIPLE yuvtable[20];
static yuvtable_num = 0;
void clear_yuvtable(void)
{
if(yuvtable_num == 0)
OpenMultiColor(devID, IPMultiYUV);
ClearMultiColor(devID, 0);
yuvtable_num = 0;
memset((void*)buf3, 0, sizeof(buf3));
memset((void*)buf5, 0, sizeof(buf5));
}
#define Yunder 10
#define Yover 10
#define Uunder 10
#define Uover 10
#define Vunder 10
#define Vover 10
#define MAX(A,B) ( ((A)>(B)) ? (A):(B))
#define MIN(A,B) ( ((A)<(B)) ? (A):(B))
void set_yuvtable(YUVTRIPLE yuv)
{
if(yuvtable_num == 0)
OpenMultiColor(devID, IPMultiYUV);
if(yuvtable_num < sizeof(yuvtable) / sizeof(YUVTRIPLE))
{
yuvtable[yuvtable_num] = yuv;
yuvtable_num++;
SetMultiColor(devID, (yuvtable_num - 1) % 8 + 1, yuvtable_num
, MAX(yuv.Y - Yunder, 1), MIN(yuv.Y + Yover, 255)
, MAX(yuv.U - Uunder, 1), MIN(yuv.U + Uover, 255)
, MAX(yuv.V - Vunder, 1), MIN(yuv.V + Vover, 255));
}
}
void get_multi_color_yuv(unsigned char buf[][VPW])
{
if(yuvtable_num)
{
ISP_BusyWait(devID, VP_BUSY);
IP_ExtractMultiColor(devID, ImgYUV, ImgEMC, NORMAL_EXTRACT, MULTICOLOR_LABEL);
ISP_BusyWait(devID, VP_BUSY);
ReadImgReverse(devID, ImgEMC, (char*)buf, VPW * VPH);
ReadImgReverse(devID, ImgEMC, (char*)buf, VPW * VPH);
}
}