CAMCTL - One shot capture. - Calibration of camera to be able to work under different light conditions.

Dependents:   frdm_MasterVehicle

camctl.cpp

Committer:
JalilChavez
Date:
2014-10-14
Revision:
0:6cad676fdc0c

File content as of revision 0:6cad676fdc0c:

#include "camctl.h"

/**********************************************************************************
* Object declaration
***********************************************************************************/

DigitalOut CAMCTL__xPinSI(PTD1);
DigitalOut CAMCTL__xPinCLK(PTD3);
AnalogIn CAMCTL__xPinAN(PTB2);
DigitalOut debug(PTB3);
DigitalOut debugGetData(PTB10);

Timeout CAMCTL__xGlobalTimer;
Timeout CAMCTL__xClkTimer;
Timeout CAMCTL__xSiTimer;

/**********************************************************************************
* Local function prototypes
***********************************************************************************/
static void CAMCTL__vGlobalTimer(void);
static void CAMCTL__vSignalHdlr_SI(void);
static void CAMCTL__vSignalHdlr_CLK(void);

/**********************************************************************************
* Local variables
***********************************************************************************/
static CAMCTL__tstCameraOptions CAMCTL__stCameraOptions;
static uint16_t CAMCTL__au16LineBuffer[BUFFER_LENGTH] = {0};

/**********************************************************************************
* CAMCTL-Module
***********************************************************************************/
static void CAMCTL__vGlobalTimer()
{
    static bool boStartDone = false;
    if ( CAMCTL__stCameraOptions.enCaptureMode == nOneShot &&
         CAMCTL__stCameraOptions.u8ActiveCapture == true    &&
         CAMCTL__stCameraOptions.u8ClkEnd == false &&
         boStartDone == false )
    {
        CAMCTL__xSiTimer.attach_us(&CAMCTL__vSignalHdlr_SI, START_DELAY);
        CAMCTL__xClkTimer.attach_us(&CAMCTL__vSignalHdlr_CLK, START_DELAY + CLK_PULSE_WIDTH_HALF);
        boStartDone = true;
    }
    else if( CAMCTL__stCameraOptions.enCaptureMode == nOneShot &&
             CAMCTL__stCameraOptions.u8ActiveCapture == true    &&
             CAMCTL__stCameraOptions.u8ClkEnd == true &&
             boStartDone == true )
    {        
        boStartDone = false;
        CAMCTL__xGlobalTimer.detach();
        CAMCTL__xClkTimer.detach();
        CAMCTL__xSiTimer.detach();
    }
    else
    {
    }
    CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
}
void CAMCTL__vSignalHdlr_SI()
{
    static bool boSIDone = false;
    if( boSIDone == false )
    {
        boSIDone = true;
        CAMCTL__xPinSI = true;
        CAMCTL__xSiTimer.attach_us(&CAMCTL__vSignalHdlr_SI, SI_PULSE_WIDTH);
    }
    else
    {
        CAMCTL__xPinSI = false;
        boSIDone = false;
    }        
}
void CAMCTL__vSignalHdlr_CLK()
{
    static uint8_t u8PulseCtr = 0;
    
    if( u8PulseCtr < NO_OF_CLK_PULSES )
    {
        if ( u8PulseCtr == 0 )
        {
            CAMCTL__xPinCLK = true;
            u8PulseCtr++;
        }
        else
        {
            CAMCTL__xPinCLK = !CAMCTL__xPinCLK;
            if( CAMCTL__xPinCLK == false )
            {
                if( ( u8PulseCtr >= 1 ) && (u8PulseCtr < BUFFER_LENGTH )  )
                {
                    CAMCTL__au16LineBuffer[u8PulseCtr-1] = CAMCTL__xPinAN.read_u16();
                }
                u8PulseCtr++;
            }
        }
        CAMCTL__xClkTimer.attach_us(&CAMCTL__vSignalHdlr_CLK, CLK_PULSE_WIDTH);
    }
    else
    {
        u8PulseCtr = 0;
        CAMCTL__stCameraOptions.u8ClkEnd = true;
    }
        
}

void CAMCTL_vTriggerOneShotCapture()
{
    CAMCTL__stCameraOptions.u8ActiveCapture = true;
    CAMCTL__stCameraOptions.u8ClkEnd = false;
    CAMCTL__stCameraOptions.enCaptureMode = nOneShot;
    CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
}

void CAMCTL_vTriggerContinuousCapture()
{
    CAMCTL__stCameraOptions.u8ActiveCapture = true;
    CAMCTL__stCameraOptions.u8ClkEnd = false;
    CAMCTL__stCameraOptions.enCaptureMode = nContinuous;
    CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
}

void CAMCTL_vStopContinuousCapture( void )
{
    CAMCTL__stCameraOptions.u8ActiveCapture = false;
    CAMCTL__stCameraOptions.enCaptureMode = nNone;
    CAMCTL__xGlobalTimer.detach();
    CAMCTL__xClkTimer.detach();
    CAMCTL__xSiTimer.detach();
}

uint16_t * CAMCTL_pu16GetData( void )
{
    debugGetData = !debugGetData;
    debug = CAMCTL__stCameraOptions.u8ClkEnd;
    if( CAMCTL__stCameraOptions.u8ClkEnd == true )
    {
        return CAMCTL__au16LineBuffer;
    }
    else
    {
        return NULL;    
    }
}

void CAMCTL_vInit(void)
{
    CAMCTL__stCameraOptions.u8ActiveCapture = false;
    CAMCTL__stCameraOptions.u8ClkEnd = false;
    CAMCTL__stCameraOptions.enCaptureMode = nNone;
}

bool CAMCTL_boCalibrateCamera(uint16_t* pu16ThreshCalibration, uint8_t u8Frames2Wait)
{
    static uint8_t u8FrameCtr = 0;
    uint16_t* pu16DataBuffer;
    bool boConvDone = false;
    
    CAMCTL_vTriggerOneShotCapture();
    pu16DataBuffer = NULL;
    while( pu16DataBuffer == NULL )
    {
        pu16DataBuffer = CAMCTL_pu16GetData();
    }
    u8FrameCtr++;        
    if( u8FrameCtr > u8Frames2Wait )
    {
        u8FrameCtr = 0;
        boConvDone = true;
        memcpy( pu16ThreshCalibration, pu16DataBuffer, (BUFFER_LENGTH)*sizeof(uint16_t));
    }
    return boConvDone;
}