📄 framemgr.c
字号:
/*********************************************************
Module Name: FrameMgr.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This modules is responsible for performing
both medium and high level processing on image data.
This is performed at both the line level as well as
the frame level. It controls the main flow of the
system, adhering to all the critical timing
requirements (such as when serial data can be transferred,
etc).
*********************************************************/
/* Includes */
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include "Executive.h"
#include "UIMgr.h"
#include "FrameMgr.h"
#include "CamInterface.h"
#include "UartInterface.h"
#include "Utility.h"
#include "I2CInterface.h"
#include "CamConfig.h"
#include "CommonDefs.h"
/* Local Structures and Typedefs */
enum
{
ST_FrameMgr_idle,
ST_FrameMgr_DumpingFrame
};
typedef unsigned char FrameMgr_State_t;
/* This define is used to turn off the timer overflow interrupt
that is generated when the PCLK overflows TIMER1 */
#define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
/* Local Variables */
/* The trackedObjectTable is used to hold up to eight tracked objects
while they are being acquired. */
static unsigned char lineCount = 0;
static FrameMgr_State_t currentState = ST_FrameMgr_idle;
/* Extern Functions */
/* These functions are located in assembly files, and thus
must be externed here so they can be referenced in the source below. */
extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
/***********************************************************
Function Name: FrameMgr_init
Function Description: This function is responsible
for initializing the FrameMgr. This includes
setting up the various buffers and data needed to
process each frame of image data.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_init(void)
{
}
/***********************************************************
Function Name: FrameMgr_dispatchEvent
Function Description: This function is responsible for
taking an incoming event and performing the needed
actions with it as pertains to the FrameMgr.
Inputs: event - the generated event
Outputs: none
***********************************************************/
void FrameMgr_dispatchEvent(unsigned char event)
{
switch(event)
{
case EV_DUMP_FRAME:
/* try re-initializing the camera before we start dumping */
CamConfig_setCamReg(0x11,0x01); /* reduce the frame rate for dumping*/
CamConfig_sendFifoCmds();
Utility_delay(1000); /* allow the new frame rate to settle */
lineCount = 0;
currentState = ST_FrameMgr_DumpingFrame;
//CamIntAsm_waitForNewDumpFrame(currentLineBuffer,previousLineBuffer);
FrameMgr_acquireLine();
break;
case EV_PROCESS_FRAME_COMPLETE://second here
//FrameMgr_acquireFrame();
break;
case EV_SERIAL_DATA_RECEIVED:////////////////first reach here
//if (currentState != ST_FrameMgr_idle)
//{
/* we need to go back to processing line data, since
serial data reception interrupted us....just trash the
frame and act like the frame has been processed, which
will kick off the system to wait for the next line */
//PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);//Exec_writeEventFifo(event)
//}
break;
}
}
/***********************************************************
Function Name: FrameMgr_acquireLine
Function Description: This function is responsible for
acquiring a line of data from the camera interface.
The acquisition of this line depends on the current
state of the FrameMgr.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_acquireLine(void)
{
//unsigned char tmpLineCount;
int tmpLineCount;
/* clearing out the buffers takes too long...we should
just overwrite the data here without a problem when
we start acquiring...at no point do we check for
a 0x00 value in the current or previous lineBuffers,
so it was a bit excessive :-) */
/* check which state we are in and proceed as needed */
if (currentState == ST_FrameMgr_DumpingFrame)
{
tmpLineCount = lineCount*2;
/* clearing out the line data in dump mode is ok, and actually
is needed, since it is possible for the first dump line in
a frame to come back with the last line captured of the
last capture session...*/
memset(currentLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
memset(previousLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
/* wait for another VSYNC so we know which frame to use
to start looking for a line to receive */
WAIT_FOR_VSYNC_HIGH();
WAIT_FOR_VSYNC_LOW();
/* look at lineCount to determine how many HREFs we should
wait before we start sampling */
while(tmpLineCount != 0)
{
WAIT_FOR_HREF_HIGH();
tmpLineCount--;
WAIT_FOR_HREF_LOW();
}
/* we should now be ready to sample our line...*/
CamIntAsm_acquireDumpLine(currentLineBuffer,previousLineBuffer);
}
}
/***********************************************************
Function Name: FrameMgr_processLine
Function Description: This function is responsible for
parsing the received image line and performing either
connected region mapping (if in the Tracking state) or
sending out the raw sampled data (if in the Dumping
state).
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_processLine(void)
{
//unsigned char i;
int i;
volatile unsigned char dataToSend;
if (currentState == ST_FrameMgr_DumpingFrame)
{
/* we want to sit in a tight loop and send the acquired data
sitting in current and previous line buffers out the serial
port...it is sent out the serial port immediately instead
of going into the UIMgr tx fifo because we can't do anything
until its sent out anyway...may as well just get it out now */
/* currentLineBuffer is getting "g" previousLineBuffer is getting "b-r" */
UartInt_txByte(0x0B); /* send the header byte */
UartInt_txByte(lineCount); /* send the line count */
for (i=0; i<NUM_PIXELS_IN_A_DUMP_LINE; i+=2)////176
{
/* when a dump line is sampled, the upper byte can potentially
have garbage in it...we don't have time to mask it off as we're
sampling, so it is done here before we send it out...we also
combine the samples together so we really are sending up a
sample for line N as well as line N+1 */
dataToSend = previousLineBuffer[i];
dataToSend &= 0xF0;
dataToSend >>= 4;
dataToSend |= (currentLineBuffer[i] & 0xF0);
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
/* flip the colors around since we are doing all G on Y and BR on UV */
dataToSend = currentLineBuffer[i+1];
dataToSend &= 0xF0;
dataToSend >>= 4;
dataToSend |= (previousLineBuffer[i+1] & 0xF0);
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
}
UartInt_txByte(0x0F); /* send line end */
/* once all the data is sent, increment out line count by 2 since
we really get 2 lines worth of pixels on each pass */
/* Update...increment only by 1, but only send 72 double-lines */
lineCount++;
if(lineCount%61==0)
{
Utility_delay(500);
}
/* check to see if we have retrieved all of the needed lines */
if (lineCount >= 120) /* half 144, since we send two lines at a time */
{
/* we're done, so send the dump complete?...nope, just change
states and we should be fine */
lineCount = 0;
currentState = ST_FrameMgr_idle;
/* disable the PCLK counting overflow interrupt */
TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;////0xfb
CamConfig_setCamReg(0x11,0x00); /* reset the frame rate to normal*/
CamConfig_sendFifoCmds();
}
else
{
/* we have more lines to acquire in this frame, so keep on truckin...*/
PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
}
}
else
{
/* ...and here? */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -