📄 main.c
字号:
InputBuffer=OutputBuffer=NULL;
InputType=DEVICE_UNKNOWN;
gfx_init(&Overlay,Mode,OverlayData,0,0,0,0);
Transparent=gfx_getcolour(&Overlay,16,16,16);
gfx_frame(&Overlay,Transparent);
OverlayColour=gfx_getcolour(&Overlay,0,64,255);
switch (Overlay.Mode)
{
case GFX_MODE_VGA:
gfx_init(&Header,Overlay.Mode,OverlayData,10,10,Overlay.Width/2,40);
break;
case GFX_MODE_PALI:
case GFX_MODE_NTSCI:
gfx_init(&Header,Overlay.Mode,OverlayData,30,20,-60,40);
}
gfx_init(&Info,Overlay.Mode,OverlayData,Header.Left,Header.Top+Header.Height+10,Header.Width,75);
gfx_boxf(&Info,0,0,Info.Width-1,Info.Height-1,OverlayColour,Transparent);
gfx_line(&Info,1,15,Info.Width-2,15,OverlayColour);
gfx_init(&Info,Overlay.Mode,OverlayData,Info.Left+5,Info.Top+5,Info.Width-10,10);
gfx_setfont(&Info,3);
gfx_setcolour(&Info,OverlayColour);
gfx_printf(&Info,"Hardware Status");
gfx_init(&Info,Overlay.Mode,OverlayData,Info.Left,Info.Top+15,Info.Width,50);
gfx_boxf(&Header,0,0,Header.Width-1,Header.Height-1,OverlayColour,Transparent);
gfx_line(&Header,1,15,Header.Width-2,15,OverlayColour);
gfx_init(&Header,Overlay.Mode,OverlayData,Header.Left+5,Header.Top+5,Header.Width-10,10);
gfx_setfont(&Header,3);
gfx_setcolour(&Header,OverlayColour);
gfx_printf(&Header,"%s",VERSION);
gfx_init(&Header,Overlay.Mode,OverlayData,Header.Left,Header.Top+15,Header.Width,20);
gfx_setfont(&Header,2);
gfx_setcolour(&Header,OverlayColour);
gfx_printf(&Header,"This is a sensor input to %s output test with overlay.",
(char *)(Overlay.Mode==GFX_MODE_VGA?"VGA LCD":
Overlay.Mode==GFX_MODE_PAL||Overlay.Mode==GFX_MODE_PALI?"PAL video":
"NTSC video"));
gfx_init(&Header,Overlay.Mode,OverlayData,0,Overlay.Height-40,Overlay.Width,40);
gfx_setfont(&Header,4);
gfx_setcolour(&Header,OverlayColour);
gfx_setjustify(&Header,GFX_JUSTIFY_CENTER);
gfx_goto(&Header,Header.Width/2,0);
gfx_printf(&Header,"www.analog.com/blackfin");
}
Retry=10;
State=STATE_OUTPUT_OPEN;
}
case STATE_OUTPUT_OPEN:
{
ADI_DEV_CMD_VALUE_PAIR *Config=NULL;
u32 Refresh=1;
switch (Mode)
{
case GFX_MODE_VGA:
{
static ADI_DEV_CMD_VALUE_PAIR Args[]={
{ADI_DEV_CMD_END,NULL}
};
Type=DEVICE_NL6448BC33;
Refresh=VIDEO_REFRESH_VGA;
Config=Args;
Mask=1;
break;
}
case GFX_MODE_PALI:
{
static ADI_DEV_CMD_VALUE_PAIR Args[]={
{ENCODER_CMD_SET_MODE,(void *)GFX_MODE_PALI},
{ADI_DEV_CMD_END,NULL}
};
Type=DEVICE_ADV7179;
Refresh=VIDEO_REFRESH_PAL;
Config=Args;
Mask=3;
break;
}
default: //default mode is NTSC
{
static ADI_DEV_CMD_VALUE_PAIR Args[]={
{ENCODER_CMD_SET_MODE,(void *)GFX_MODE_NTSCI},
{ADI_DEV_CMD_END,NULL}
};
Mode=GFX_MODE_NTSCI;
Type=DEVICE_ADV7179;
Refresh=VIDEO_REFRESH_NTSC;
Config=Args;
Mask=3;
break;
}
}
ModeOld=Mode;
TypeOld=Type;
FrameCount=OutputFrame+(InputType==DEVICE_UNKNOWN?1:4*Refresh);
if (Output==NULL) Output=device_open(Type,OUTPUT_PPI,(u16 *)OutputData,sizeof(OutputData[0]),CallbackOutput,Config);
if (Output) State=STATE_OUTPUT_FRAME;
else if (Retry--<=0) State=STATE_OUTPUT; // if cant open output then try again
break;
}
case STATE_OUTPUT_FRAME:
{
if (Frame!=OutputFrame)
{
u32 NotFound,Found,Running;
// copy the overlay/input image to the output buffer
ImageCopy(Mask==0?3:Mask,InputType,Mode,InputBuffer,OutputBuffer,&Overlay,Transparent);
NotFound=gfx_getcolour(&Info,128,128,128);
Found=gfx_getcolour(&Info,0,128,0);
Running=gfx_getcolour(&Info,0,160,0);
// update the hardware status window only
gfx_fill(&Info,Transparent);
gfx_setfont(&Info,2);
gfx_setcolour(&Info,Running);
gfx_goto(&Info,0,0);
gfx_printf(&Info,"Input frames %lu",InputFrame);
gfx_goto(&Info,0,10);
gfx_printf(&Info,"Output frames %lu",OutputFrame);
gfx_goto(&Info,0,20);
switch (device_detect(DEVICE_ADV7179))
{
case ADI_DEV_RESULT_SUCCESS:
gfx_setcolour(&Info,Found);
gfx_printf(&Info,"Analog device ADV7179 detected");
break;
case ADI_DEV_RESULT_DEVICE_IN_USE:
gfx_setcolour(&Info,Running);
gfx_printf(&Info,"Analog device ADV7179 in use");
break;
default:
gfx_setcolour(&Info,NotFound);
gfx_printf(&Info,"Analog device ADV7179 not found");
}
gfx_goto(&Info,0,30);
switch (device_detect(DEVICE_OV7648))
{
case ADI_DEV_RESULT_SUCCESS:
gfx_setcolour(&Info,Found);
gfx_printf(&Info,"Omnivision OV7X48 detected");
break;
case ADI_DEV_RESULT_DEVICE_IN_USE:
gfx_setcolour(&Info,Running);
gfx_printf(&Info,"Omnivision OV7X48 in use");
break;
default:
gfx_setcolour(&Info,NotFound);
gfx_printf(&Info,"Omnivision OV7X48 not found");
}
gfx_goto(&Info,0,40);
switch (device_detect(DEVICE_MT9V022M))
{
case ADI_DEV_RESULT_SUCCESS:
gfx_setcolour(&Info,Found);
gfx_printf(&Info,"Micron MT9V022 detected");
break;
case ADI_DEV_RESULT_DEVICE_IN_USE:
gfx_setcolour(&Info,Running);
gfx_printf(&Info,"Micron MT9V022 in use");
break;
default:
gfx_setcolour(&Info,NotFound);
gfx_printf(&Info,"Micron MT9V022 not found");
}
Frame=OutputFrame;
Mask^=3;
}
if ((OutputFrame-FrameCount)&0x80000000) break;
State=INPUT_PPI==OUTPUT_PPI?STATE_OUTPUT_CLOSE:STATE_INPUT;
break;
}
case STATE_OUTPUT_CLOSE:
State=STATE_INPUT;
device_close(Output);
Output=NULL;
break;
default:
State=STATE_OUTPUT;
}
}
// all done, so input and output devices
device_close(Input);
device_close(Output);
// close the Device
adi_ssl_Terminate();
WAIL();
return Code;
}
/******************************************************************************
Exception interrupt handlers
Note: should never get an exception or hardware error...
******************************************************************************/
static ADI_INT_HANDLER(ExceptionHandler)
{
WAIL();
return ADI_INT_RESULT_PROCESSED;
}
static ADI_INT_HANDLER(HWErrorHandler)
{
WAIL();
return ADI_INT_RESULT_PROCESSED;
}
/******************************************************************************
Function: CallbackInput
Description: The default callback for input devices
******************************************************************************/
void CallbackInput(void *Handle,u32 Event,void *pArg)
{
switch (Event)
{
case ADI_DEV_EVENT_BUFFER_PROCESSED:
{
if (Handle&&pArg&&((ADI_DEV_BUFFER *)pArg)->TwoD.pAdditionalInfo!=ADI_DEV_BUFFER_UNDEFINED)
adi_dev_Read(
*((ADI_DEV_DEVICE_HANDLE *)Handle),
(ADI_DEV_BUFFER_TYPE)((ADI_DEV_BUFFER *)pArg)->TwoD.pAdditionalInfo,
((ADI_DEV_BUFFER *)pArg));
InputBuffer=(ADI_DEV_BUFFER *)pArg;
InputFrame++;
break;
}
}
}
/******************************************************************************
Function: CallbackOutput
Description: The output device callback routine
******************************************************************************/
void CallbackOutput(void *Handle,u32 Event,void *pArg)
{
switch (Event)
{
case ADI_DEV_EVENT_BUFFER_PROCESSED:
if (Handle&&pArg&&((ADI_DEV_BUFFER *)pArg)->TwoD.pAdditionalInfo!=ADI_DEV_BUFFER_UNDEFINED)
adi_dev_Write(
*((ADI_DEV_DEVICE_HANDLE *)Handle),
(ADI_DEV_BUFFER_TYPE)((ADI_DEV_BUFFER *)pArg)->TwoD.pAdditionalInfo,
((ADI_DEV_BUFFER *)pArg));
OutputBuffer=(ADI_DEV_BUFFER *)pArg;
OutputFrame++;
break;
}
}
/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -