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

Dependents:   frdm_MasterVehicle

Committer:
JalilChavez
Date:
Tue Oct 14 03:52:23 2014 +0000
Revision:
0:6cad676fdc0c
controller of linescan camera

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JalilChavez 0:6cad676fdc0c 1 #include "camctl.h"
JalilChavez 0:6cad676fdc0c 2
JalilChavez 0:6cad676fdc0c 3 /**********************************************************************************
JalilChavez 0:6cad676fdc0c 4 * Object declaration
JalilChavez 0:6cad676fdc0c 5 ***********************************************************************************/
JalilChavez 0:6cad676fdc0c 6
JalilChavez 0:6cad676fdc0c 7 DigitalOut CAMCTL__xPinSI(PTD1);
JalilChavez 0:6cad676fdc0c 8 DigitalOut CAMCTL__xPinCLK(PTD3);
JalilChavez 0:6cad676fdc0c 9 AnalogIn CAMCTL__xPinAN(PTB2);
JalilChavez 0:6cad676fdc0c 10 DigitalOut debug(PTB3);
JalilChavez 0:6cad676fdc0c 11 DigitalOut debugGetData(PTB10);
JalilChavez 0:6cad676fdc0c 12
JalilChavez 0:6cad676fdc0c 13 Timeout CAMCTL__xGlobalTimer;
JalilChavez 0:6cad676fdc0c 14 Timeout CAMCTL__xClkTimer;
JalilChavez 0:6cad676fdc0c 15 Timeout CAMCTL__xSiTimer;
JalilChavez 0:6cad676fdc0c 16
JalilChavez 0:6cad676fdc0c 17 /**********************************************************************************
JalilChavez 0:6cad676fdc0c 18 * Local function prototypes
JalilChavez 0:6cad676fdc0c 19 ***********************************************************************************/
JalilChavez 0:6cad676fdc0c 20 static void CAMCTL__vGlobalTimer(void);
JalilChavez 0:6cad676fdc0c 21 static void CAMCTL__vSignalHdlr_SI(void);
JalilChavez 0:6cad676fdc0c 22 static void CAMCTL__vSignalHdlr_CLK(void);
JalilChavez 0:6cad676fdc0c 23
JalilChavez 0:6cad676fdc0c 24 /**********************************************************************************
JalilChavez 0:6cad676fdc0c 25 * Local variables
JalilChavez 0:6cad676fdc0c 26 ***********************************************************************************/
JalilChavez 0:6cad676fdc0c 27 static CAMCTL__tstCameraOptions CAMCTL__stCameraOptions;
JalilChavez 0:6cad676fdc0c 28 static uint16_t CAMCTL__au16LineBuffer[BUFFER_LENGTH] = {0};
JalilChavez 0:6cad676fdc0c 29
JalilChavez 0:6cad676fdc0c 30 /**********************************************************************************
JalilChavez 0:6cad676fdc0c 31 * CAMCTL-Module
JalilChavez 0:6cad676fdc0c 32 ***********************************************************************************/
JalilChavez 0:6cad676fdc0c 33 static void CAMCTL__vGlobalTimer()
JalilChavez 0:6cad676fdc0c 34 {
JalilChavez 0:6cad676fdc0c 35 static bool boStartDone = false;
JalilChavez 0:6cad676fdc0c 36 if ( CAMCTL__stCameraOptions.enCaptureMode == nOneShot &&
JalilChavez 0:6cad676fdc0c 37 CAMCTL__stCameraOptions.u8ActiveCapture == true &&
JalilChavez 0:6cad676fdc0c 38 CAMCTL__stCameraOptions.u8ClkEnd == false &&
JalilChavez 0:6cad676fdc0c 39 boStartDone == false )
JalilChavez 0:6cad676fdc0c 40 {
JalilChavez 0:6cad676fdc0c 41 CAMCTL__xSiTimer.attach_us(&CAMCTL__vSignalHdlr_SI, START_DELAY);
JalilChavez 0:6cad676fdc0c 42 CAMCTL__xClkTimer.attach_us(&CAMCTL__vSignalHdlr_CLK, START_DELAY + CLK_PULSE_WIDTH_HALF);
JalilChavez 0:6cad676fdc0c 43 boStartDone = true;
JalilChavez 0:6cad676fdc0c 44 }
JalilChavez 0:6cad676fdc0c 45 else if( CAMCTL__stCameraOptions.enCaptureMode == nOneShot &&
JalilChavez 0:6cad676fdc0c 46 CAMCTL__stCameraOptions.u8ActiveCapture == true &&
JalilChavez 0:6cad676fdc0c 47 CAMCTL__stCameraOptions.u8ClkEnd == true &&
JalilChavez 0:6cad676fdc0c 48 boStartDone == true )
JalilChavez 0:6cad676fdc0c 49 {
JalilChavez 0:6cad676fdc0c 50 boStartDone = false;
JalilChavez 0:6cad676fdc0c 51 CAMCTL__xGlobalTimer.detach();
JalilChavez 0:6cad676fdc0c 52 CAMCTL__xClkTimer.detach();
JalilChavez 0:6cad676fdc0c 53 CAMCTL__xSiTimer.detach();
JalilChavez 0:6cad676fdc0c 54 }
JalilChavez 0:6cad676fdc0c 55 else
JalilChavez 0:6cad676fdc0c 56 {
JalilChavez 0:6cad676fdc0c 57 }
JalilChavez 0:6cad676fdc0c 58 CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
JalilChavez 0:6cad676fdc0c 59 }
JalilChavez 0:6cad676fdc0c 60 void CAMCTL__vSignalHdlr_SI()
JalilChavez 0:6cad676fdc0c 61 {
JalilChavez 0:6cad676fdc0c 62 static bool boSIDone = false;
JalilChavez 0:6cad676fdc0c 63 if( boSIDone == false )
JalilChavez 0:6cad676fdc0c 64 {
JalilChavez 0:6cad676fdc0c 65 boSIDone = true;
JalilChavez 0:6cad676fdc0c 66 CAMCTL__xPinSI = true;
JalilChavez 0:6cad676fdc0c 67 CAMCTL__xSiTimer.attach_us(&CAMCTL__vSignalHdlr_SI, SI_PULSE_WIDTH);
JalilChavez 0:6cad676fdc0c 68 }
JalilChavez 0:6cad676fdc0c 69 else
JalilChavez 0:6cad676fdc0c 70 {
JalilChavez 0:6cad676fdc0c 71 CAMCTL__xPinSI = false;
JalilChavez 0:6cad676fdc0c 72 boSIDone = false;
JalilChavez 0:6cad676fdc0c 73 }
JalilChavez 0:6cad676fdc0c 74 }
JalilChavez 0:6cad676fdc0c 75 void CAMCTL__vSignalHdlr_CLK()
JalilChavez 0:6cad676fdc0c 76 {
JalilChavez 0:6cad676fdc0c 77 static uint8_t u8PulseCtr = 0;
JalilChavez 0:6cad676fdc0c 78
JalilChavez 0:6cad676fdc0c 79 if( u8PulseCtr < NO_OF_CLK_PULSES )
JalilChavez 0:6cad676fdc0c 80 {
JalilChavez 0:6cad676fdc0c 81 if ( u8PulseCtr == 0 )
JalilChavez 0:6cad676fdc0c 82 {
JalilChavez 0:6cad676fdc0c 83 CAMCTL__xPinCLK = true;
JalilChavez 0:6cad676fdc0c 84 u8PulseCtr++;
JalilChavez 0:6cad676fdc0c 85 }
JalilChavez 0:6cad676fdc0c 86 else
JalilChavez 0:6cad676fdc0c 87 {
JalilChavez 0:6cad676fdc0c 88 CAMCTL__xPinCLK = !CAMCTL__xPinCLK;
JalilChavez 0:6cad676fdc0c 89 if( CAMCTL__xPinCLK == false )
JalilChavez 0:6cad676fdc0c 90 {
JalilChavez 0:6cad676fdc0c 91 if( ( u8PulseCtr >= 1 ) && (u8PulseCtr < BUFFER_LENGTH ) )
JalilChavez 0:6cad676fdc0c 92 {
JalilChavez 0:6cad676fdc0c 93 CAMCTL__au16LineBuffer[u8PulseCtr-1] = CAMCTL__xPinAN.read_u16();
JalilChavez 0:6cad676fdc0c 94 }
JalilChavez 0:6cad676fdc0c 95 u8PulseCtr++;
JalilChavez 0:6cad676fdc0c 96 }
JalilChavez 0:6cad676fdc0c 97 }
JalilChavez 0:6cad676fdc0c 98 CAMCTL__xClkTimer.attach_us(&CAMCTL__vSignalHdlr_CLK, CLK_PULSE_WIDTH);
JalilChavez 0:6cad676fdc0c 99 }
JalilChavez 0:6cad676fdc0c 100 else
JalilChavez 0:6cad676fdc0c 101 {
JalilChavez 0:6cad676fdc0c 102 u8PulseCtr = 0;
JalilChavez 0:6cad676fdc0c 103 CAMCTL__stCameraOptions.u8ClkEnd = true;
JalilChavez 0:6cad676fdc0c 104 }
JalilChavez 0:6cad676fdc0c 105
JalilChavez 0:6cad676fdc0c 106 }
JalilChavez 0:6cad676fdc0c 107
JalilChavez 0:6cad676fdc0c 108 void CAMCTL_vTriggerOneShotCapture()
JalilChavez 0:6cad676fdc0c 109 {
JalilChavez 0:6cad676fdc0c 110 CAMCTL__stCameraOptions.u8ActiveCapture = true;
JalilChavez 0:6cad676fdc0c 111 CAMCTL__stCameraOptions.u8ClkEnd = false;
JalilChavez 0:6cad676fdc0c 112 CAMCTL__stCameraOptions.enCaptureMode = nOneShot;
JalilChavez 0:6cad676fdc0c 113 CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
JalilChavez 0:6cad676fdc0c 114 }
JalilChavez 0:6cad676fdc0c 115
JalilChavez 0:6cad676fdc0c 116 void CAMCTL_vTriggerContinuousCapture()
JalilChavez 0:6cad676fdc0c 117 {
JalilChavez 0:6cad676fdc0c 118 CAMCTL__stCameraOptions.u8ActiveCapture = true;
JalilChavez 0:6cad676fdc0c 119 CAMCTL__stCameraOptions.u8ClkEnd = false;
JalilChavez 0:6cad676fdc0c 120 CAMCTL__stCameraOptions.enCaptureMode = nContinuous;
JalilChavez 0:6cad676fdc0c 121 CAMCTL__xGlobalTimer.attach_us(&CAMCTL__vGlobalTimer,BASE_PERIOD);
JalilChavez 0:6cad676fdc0c 122 }
JalilChavez 0:6cad676fdc0c 123
JalilChavez 0:6cad676fdc0c 124 void CAMCTL_vStopContinuousCapture( void )
JalilChavez 0:6cad676fdc0c 125 {
JalilChavez 0:6cad676fdc0c 126 CAMCTL__stCameraOptions.u8ActiveCapture = false;
JalilChavez 0:6cad676fdc0c 127 CAMCTL__stCameraOptions.enCaptureMode = nNone;
JalilChavez 0:6cad676fdc0c 128 CAMCTL__xGlobalTimer.detach();
JalilChavez 0:6cad676fdc0c 129 CAMCTL__xClkTimer.detach();
JalilChavez 0:6cad676fdc0c 130 CAMCTL__xSiTimer.detach();
JalilChavez 0:6cad676fdc0c 131 }
JalilChavez 0:6cad676fdc0c 132
JalilChavez 0:6cad676fdc0c 133 uint16_t * CAMCTL_pu16GetData( void )
JalilChavez 0:6cad676fdc0c 134 {
JalilChavez 0:6cad676fdc0c 135 debugGetData = !debugGetData;
JalilChavez 0:6cad676fdc0c 136 debug = CAMCTL__stCameraOptions.u8ClkEnd;
JalilChavez 0:6cad676fdc0c 137 if( CAMCTL__stCameraOptions.u8ClkEnd == true )
JalilChavez 0:6cad676fdc0c 138 {
JalilChavez 0:6cad676fdc0c 139 return CAMCTL__au16LineBuffer;
JalilChavez 0:6cad676fdc0c 140 }
JalilChavez 0:6cad676fdc0c 141 else
JalilChavez 0:6cad676fdc0c 142 {
JalilChavez 0:6cad676fdc0c 143 return NULL;
JalilChavez 0:6cad676fdc0c 144 }
JalilChavez 0:6cad676fdc0c 145 }
JalilChavez 0:6cad676fdc0c 146
JalilChavez 0:6cad676fdc0c 147 void CAMCTL_vInit(void)
JalilChavez 0:6cad676fdc0c 148 {
JalilChavez 0:6cad676fdc0c 149 CAMCTL__stCameraOptions.u8ActiveCapture = false;
JalilChavez 0:6cad676fdc0c 150 CAMCTL__stCameraOptions.u8ClkEnd = false;
JalilChavez 0:6cad676fdc0c 151 CAMCTL__stCameraOptions.enCaptureMode = nNone;
JalilChavez 0:6cad676fdc0c 152 }
JalilChavez 0:6cad676fdc0c 153
JalilChavez 0:6cad676fdc0c 154 bool CAMCTL_boCalibrateCamera(uint16_t* pu16ThreshCalibration, uint8_t u8Frames2Wait)
JalilChavez 0:6cad676fdc0c 155 {
JalilChavez 0:6cad676fdc0c 156 static uint8_t u8FrameCtr = 0;
JalilChavez 0:6cad676fdc0c 157 uint16_t* pu16DataBuffer;
JalilChavez 0:6cad676fdc0c 158 bool boConvDone = false;
JalilChavez 0:6cad676fdc0c 159
JalilChavez 0:6cad676fdc0c 160 CAMCTL_vTriggerOneShotCapture();
JalilChavez 0:6cad676fdc0c 161 pu16DataBuffer = NULL;
JalilChavez 0:6cad676fdc0c 162 while( pu16DataBuffer == NULL )
JalilChavez 0:6cad676fdc0c 163 {
JalilChavez 0:6cad676fdc0c 164 pu16DataBuffer = CAMCTL_pu16GetData();
JalilChavez 0:6cad676fdc0c 165 }
JalilChavez 0:6cad676fdc0c 166 u8FrameCtr++;
JalilChavez 0:6cad676fdc0c 167 if( u8FrameCtr > u8Frames2Wait )
JalilChavez 0:6cad676fdc0c 168 {
JalilChavez 0:6cad676fdc0c 169 u8FrameCtr = 0;
JalilChavez 0:6cad676fdc0c 170 boConvDone = true;
JalilChavez 0:6cad676fdc0c 171 memcpy( pu16ThreshCalibration, pu16DataBuffer, (BUFFER_LENGTH)*sizeof(uint16_t));
JalilChavez 0:6cad676fdc0c 172 }
JalilChavez 0:6cad676fdc0c 173 return boConvDone;
JalilChavez 0:6cad676fdc0c 174 }