#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

 

void        init_vp910(void)

{

#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();

}

 

void        stop_vp910(void)

{

        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);

        }

}