CAMCTL - One shot capture. - Calibration of camera to be able to work under different light conditions.
Dependents: frdm_MasterVehicle
camctl.cpp@0:6cad676fdc0c, 2014-10-14 (annotated)
- Committer:
- JalilChavez
- Date:
- Tue Oct 14 03:52:23 2014 +0000
- Revision:
- 0:6cad676fdc0c
controller of linescan camera
Who changed what in which revision?
User | Revision | Line number | New 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 | } |