synch the camera trigger with the signal in phase and quadrature (every frame or every N frames). We can also simulate the product by the in-phase signal (with a small arbitrary phase difference)
Flipper.h@1:4284f27d638d, 2014-12-08 (annotated)
- Committer:
- mbedalvaro
- Date:
- Mon Dec 08 07:03:38 2014 +0000
- Revision:
- 1:4284f27d638d
- Parent:
- 0:4b5874bff9bb
this is the latest code for the active markers project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbedalvaro | 0:4b5874bff9bb | 1 | #ifndef Flipper_h |
mbedalvaro | 0:4b5874bff9bb | 2 | #define Flipper_h |
mbedalvaro | 0:4b5874bff9bb | 3 | |
mbedalvaro | 0:4b5874bff9bb | 4 | #include "mbed.h" |
mbedalvaro | 0:4b5874bff9bb | 5 | |
mbedalvaro | 1:4284f27d638d | 6 | #define ledPin p23 // the actual modulation of the LED source (equal to PHASE or QUAD signal every N frames) |
mbedalvaro | 1:4284f27d638d | 7 | #define shutterPin p22 // for tests |
mbedalvaro | 1:4284f27d638d | 8 | #define cameraTriggerPin p21 |
mbedalvaro | 0:4b5874bff9bb | 9 | |
mbedalvaro | 0:4b5874bff9bb | 10 | // A class for flip()-ing a DigitalOut using a timer |
mbedalvaro | 0:4b5874bff9bb | 11 | |
mbedalvaro | 0:4b5874bff9bb | 12 | //1) Class for toggling the LED (in phase or quadrature, with a multiplier) |
mbedalvaro | 0:4b5874bff9bb | 13 | class Flipper { |
mbedalvaro | 0:4b5874bff9bb | 14 | public: |
mbedalvaro | 0:4b5874bff9bb | 15 | static DigitalOut _pin; |
mbedalvaro | 0:4b5874bff9bb | 16 | static bool state; |
mbedalvaro | 0:4b5874bff9bb | 17 | static bool multiplier;//=true; // this is for simulating the deconvolution |
mbedalvaro | 0:4b5874bff9bb | 18 | // NOTE initialization needs to be in the cpp file, unless it's a const |
mbedalvaro | 0:4b5874bff9bb | 19 | |
mbedalvaro | 0:4b5874bff9bb | 20 | static void delay90() {state = !state; _pin=state;} |
mbedalvaro | 0:4b5874bff9bb | 21 | static void multImmediate() { _pin=state&&multiplier;} |
mbedalvaro | 0:4b5874bff9bb | 22 | |
mbedalvaro | 0:4b5874bff9bb | 23 | |
mbedalvaro | 0:4b5874bff9bb | 24 | Flipper(PinName pin, unsigned int interval): us_interval(interval) { |
mbedalvaro | 0:4b5874bff9bb | 25 | Flipper::_pin=pin; |
mbedalvaro | 0:4b5874bff9bb | 26 | state=true; |
mbedalvaro | 0:4b5874bff9bb | 27 | _pin=state; |
mbedalvaro | 0:4b5874bff9bb | 28 | } |
mbedalvaro | 0:4b5874bff9bb | 29 | |
mbedalvaro | 0:4b5874bff9bb | 30 | void start() { |
mbedalvaro | 1:4284f27d638d | 31 | myTicker.attach_us(this, &Flipper::flip, (unsigned int)(0.5*us_interval)); // the address of the object, member function, and interval |
mbedalvaro | 0:4b5874bff9bb | 32 | } |
mbedalvaro | 0:4b5874bff9bb | 33 | |
mbedalvaro | 0:4b5874bff9bb | 34 | void stop() { |
mbedalvaro | 0:4b5874bff9bb | 35 | myTicker.detach(); |
mbedalvaro | 0:4b5874bff9bb | 36 | } |
mbedalvaro | 0:4b5874bff9bb | 37 | |
mbedalvaro | 0:4b5874bff9bb | 38 | void flip() { |
mbedalvaro | 0:4b5874bff9bb | 39 | state = !state; |
mbedalvaro | 0:4b5874bff9bb | 40 | _pin=state&&multiplier; |
mbedalvaro | 0:4b5874bff9bb | 41 | } |
mbedalvaro | 0:4b5874bff9bb | 42 | |
mbedalvaro | 0:4b5874bff9bb | 43 | private: |
mbedalvaro | 0:4b5874bff9bb | 44 | unsigned int us_interval; |
mbedalvaro | 0:4b5874bff9bb | 45 | Ticker myTicker; |
mbedalvaro | 0:4b5874bff9bb | 46 | }; |
mbedalvaro | 0:4b5874bff9bb | 47 | |
mbedalvaro | 0:4b5874bff9bb | 48 | // 2) Camera trigger class (NOTE: we are using MODE 2 of Point gray, meaning we control the exposure) |
mbedalvaro | 0:4b5874bff9bb | 49 | class Trigger { |
mbedalvaro | 0:4b5874bff9bb | 50 | |
mbedalvaro | 0:4b5874bff9bb | 51 | friend class Flipper; // because we will call delay90() method |
mbedalvaro | 0:4b5874bff9bb | 52 | |
mbedalvaro | 0:4b5874bff9bb | 53 | public: |
mbedalvaro | 0:4b5874bff9bb | 54 | |
mbedalvaro | 0:4b5874bff9bb | 55 | enum triggerState { |
mbedalvaro | 0:4b5874bff9bb | 56 | WAITING=0, |
mbedalvaro | 0:4b5874bff9bb | 57 | EXPOSE, |
mbedalvaro | 0:4b5874bff9bb | 58 | NUM_STATES |
mbedalvaro | 0:4b5874bff9bb | 59 | }; |
mbedalvaro | 0:4b5874bff9bb | 60 | |
mbedalvaro | 1:4284f27d638d | 61 | //Trigger(PinName pin, float fps, unsigned int exposure) : _pin(pin) { |
mbedalvaro | 1:4284f27d638d | 62 | // _pin=1; |
mbedalvaro | 1:4284f27d638d | 63 | // us_exposureTime=exposure; |
mbedalvaro | 1:4284f27d638d | 64 | // us_waitingTime=(unsigned int)(1000000.0/fps-us_exposureTime); |
mbedalvaro | 1:4284f27d638d | 65 | // framesQPToggle=2; // default number of frames before toggling between Q and P signals (delaying the Flipper signal by 90 deg). |
mbedalvaro | 1:4284f27d638d | 66 | // QP_Mode=true; |
mbedalvaro | 1:4284f27d638d | 67 | // } |
mbedalvaro | 1:4284f27d638d | 68 | |
mbedalvaro | 1:4284f27d638d | 69 | Trigger(PinName pin, unsigned int waitingtime, unsigned int exposure) : _pin(pin) { |
mbedalvaro | 0:4b5874bff9bb | 70 | _pin=1; |
mbedalvaro | 0:4b5874bff9bb | 71 | us_exposureTime=exposure; |
mbedalvaro | 1:4284f27d638d | 72 | us_waitingTime=waitingtime; |
mbedalvaro | 0:4b5874bff9bb | 73 | framesQPToggle=2; // default number of frames before toggling between Q and P signals (delaying the Flipper signal by 90 deg). |
mbedalvaro | 0:4b5874bff9bb | 74 | QP_Mode=true; |
mbedalvaro | 0:4b5874bff9bb | 75 | } |
mbedalvaro | 0:4b5874bff9bb | 76 | |
mbedalvaro | 0:4b5874bff9bb | 77 | void setQPToggleFrames(unsigned int numToggleQPFrames) { |
mbedalvaro | 0:4b5874bff9bb | 78 | framesQPToggle=numToggleQPFrames; |
mbedalvaro | 0:4b5874bff9bb | 79 | } |
mbedalvaro | 0:4b5874bff9bb | 80 | |
mbedalvaro | 1:4284f27d638d | 81 | // void setFrameRate(float fps) { |
mbedalvaro | 1:4284f27d638d | 82 | // us_waitingTime=(unsigned int)(1000000.0/fps-us_exposureTime); |
mbedalvaro | 1:4284f27d638d | 83 | // } |
mbedalvaro | 1:4284f27d638d | 84 | |
mbedalvaro | 1:4284f27d638d | 85 | void setFrameRate(unsigned int waitingtime) { |
mbedalvaro | 1:4284f27d638d | 86 | us_waitingTime=waitingtime; |
mbedalvaro | 0:4b5874bff9bb | 87 | } |
mbedalvaro | 0:4b5874bff9bb | 88 | |
mbedalvaro | 0:4b5874bff9bb | 89 | void setExposure(unsigned int exposure) { |
mbedalvaro | 0:4b5874bff9bb | 90 | us_exposureTime=exposure; |
mbedalvaro | 0:4b5874bff9bb | 91 | } |
mbedalvaro | 0:4b5874bff9bb | 92 | |
mbedalvaro | 0:4b5874bff9bb | 93 | void start() { |
mbedalvaro | 0:4b5874bff9bb | 94 | // We start in WAITING and go to EXPOSE |
mbedalvaro | 0:4b5874bff9bb | 95 | myTimer.attach_us(this, &Trigger::trigger, us_waitingTime); // the address of the object, member function, and interval |
mbedalvaro | 0:4b5874bff9bb | 96 | myTriggerState=WAITING; |
mbedalvaro | 0:4b5874bff9bb | 97 | frameCounter=0; |
mbedalvaro | 0:4b5874bff9bb | 98 | } |
mbedalvaro | 0:4b5874bff9bb | 99 | |
mbedalvaro | 0:4b5874bff9bb | 100 | void toggleQP(bool mode) { |
mbedalvaro | 0:4b5874bff9bb | 101 | QP_Mode=mode; |
mbedalvaro | 0:4b5874bff9bb | 102 | } |
mbedalvaro | 0:4b5874bff9bb | 103 | |
mbedalvaro | 0:4b5874bff9bb | 104 | void stop() { |
mbedalvaro | 0:4b5874bff9bb | 105 | myTimer.detach(); |
mbedalvaro | 0:4b5874bff9bb | 106 | } |
mbedalvaro | 0:4b5874bff9bb | 107 | |
mbedalvaro | 0:4b5874bff9bb | 108 | void trigger() { |
mbedalvaro | 0:4b5874bff9bb | 109 | switch(myTriggerState) { |
mbedalvaro | 0:4b5874bff9bb | 110 | case WAITING: // if the state was "wait" and we got here, we need to start exposing: |
mbedalvaro | 0:4b5874bff9bb | 111 | _pin=0; // a high-low change triggers the camera |
mbedalvaro | 0:4b5874bff9bb | 112 | // now we need to reset the timeout and give it another value: |
mbedalvaro | 0:4b5874bff9bb | 113 | myTimer.attach_us(this, &Trigger::trigger, us_exposureTime); |
mbedalvaro | 0:4b5874bff9bb | 114 | myTriggerState=EXPOSE; |
mbedalvaro | 0:4b5874bff9bb | 115 | break; |
mbedalvaro | 0:4b5874bff9bb | 116 | case EXPOSE: // if the state was EXPOSE, we need to stop exposing and go to wait: |
mbedalvaro | 0:4b5874bff9bb | 117 | _pin=1; // a low-high stop exposing |
mbedalvaro | 0:4b5874bff9bb | 118 | // now we need to reset the timeout and give it another value: |
mbedalvaro | 0:4b5874bff9bb | 119 | myTimer.attach_us(this, &Trigger::trigger, us_waitingTime); |
mbedalvaro | 0:4b5874bff9bb | 120 | myTriggerState=WAITING; |
mbedalvaro | 0:4b5874bff9bb | 121 | |
mbedalvaro | 0:4b5874bff9bb | 122 | // Also, this means we acquired ONE frame... |
mbedalvaro | 0:4b5874bff9bb | 123 | // Switch the from phase to quadrature int the friend class Flipper, every N frames (if we want): |
mbedalvaro | 0:4b5874bff9bb | 124 | frameCounter=(frameCounter+1)%framesQPToggle; |
mbedalvaro | 0:4b5874bff9bb | 125 | if (QP_Mode&&frameCounter==0) { |
mbedalvaro | 0:4b5874bff9bb | 126 | //Flipper::state = ! Flipper::state ; // this correspond to calling the flip function (but without multiplier) |
mbedalvaro | 0:4b5874bff9bb | 127 | Flipper::delay90(); |
mbedalvaro | 0:4b5874bff9bb | 128 | } |
mbedalvaro | 0:4b5874bff9bb | 129 | break; |
mbedalvaro | 0:4b5874bff9bb | 130 | default: |
mbedalvaro | 0:4b5874bff9bb | 131 | break; |
mbedalvaro | 0:4b5874bff9bb | 132 | } |
mbedalvaro | 0:4b5874bff9bb | 133 | } |
mbedalvaro | 0:4b5874bff9bb | 134 | |
mbedalvaro | 0:4b5874bff9bb | 135 | private: |
mbedalvaro | 0:4b5874bff9bb | 136 | DigitalOut _pin; |
mbedalvaro | 0:4b5874bff9bb | 137 | bool QP_Mode; // this is to select toggling or not |
mbedalvaro | 0:4b5874bff9bb | 138 | triggerState myTriggerState; |
mbedalvaro | 0:4b5874bff9bb | 139 | unsigned int frameCounter; |
mbedalvaro | 0:4b5874bff9bb | 140 | unsigned int framesQPToggle; |
mbedalvaro | 0:4b5874bff9bb | 141 | unsigned int us_exposureTime, us_waitingTime; |
mbedalvaro | 0:4b5874bff9bb | 142 | Timeout myTimer; // I need to use a timeout, and not a ticker because the intervals are different for the trigger period and exposure time |
mbedalvaro | 0:4b5874bff9bb | 143 | }; |
mbedalvaro | 0:4b5874bff9bb | 144 | |
mbedalvaro | 0:4b5874bff9bb | 145 | // 3) The simulation of the LCD shutter: |
mbedalvaro | 0:4b5874bff9bb | 146 | class Shutter{ |
mbedalvaro | 0:4b5874bff9bb | 147 | friend class Flipper; // because we will modify the Flipper variable "multiplier" |
mbedalvaro | 0:4b5874bff9bb | 148 | |
mbedalvaro | 0:4b5874bff9bb | 149 | public: |
mbedalvaro | 0:4b5874bff9bb | 150 | // Note: we don't really need a toggling pin for this, but it can be good to see it on the oscilloscope |
mbedalvaro | 0:4b5874bff9bb | 151 | Shutter(PinName pin, unsigned int interval) : _pin(pin), us_interval(interval) { |
mbedalvaro | 0:4b5874bff9bb | 152 | state=true; |
mbedalvaro | 0:4b5874bff9bb | 153 | _pin=state; |
mbedalvaro | 0:4b5874bff9bb | 154 | mix=true; |
mbedalvaro | 0:4b5874bff9bb | 155 | } |
mbedalvaro | 0:4b5874bff9bb | 156 | |
mbedalvaro | 0:4b5874bff9bb | 157 | void start() { |
mbedalvaro | 1:4284f27d638d | 158 | myTicker.attach_us(this, &Shutter::flip, (unsigned int)(0.5*us_interval)); // the address of the object, member function, and interval |
mbedalvaro | 0:4b5874bff9bb | 159 | } |
mbedalvaro | 0:4b5874bff9bb | 160 | |
mbedalvaro | 0:4b5874bff9bb | 161 | void mixSignal(bool mode) { |
mbedalvaro | 0:4b5874bff9bb | 162 | mix=mode; |
mbedalvaro | 0:4b5874bff9bb | 163 | } |
mbedalvaro | 0:4b5874bff9bb | 164 | |
mbedalvaro | 0:4b5874bff9bb | 165 | void stop() { |
mbedalvaro | 0:4b5874bff9bb | 166 | myTicker.detach(); |
mbedalvaro | 0:4b5874bff9bb | 167 | } |
mbedalvaro | 0:4b5874bff9bb | 168 | |
mbedalvaro | 0:4b5874bff9bb | 169 | // the shutter "flip" function also affect the friend variable "multiplier": |
mbedalvaro | 0:4b5874bff9bb | 170 | void flip() { |
mbedalvaro | 0:4b5874bff9bb | 171 | state = !state; |
mbedalvaro | 0:4b5874bff9bb | 172 | _pin=state; |
mbedalvaro | 0:4b5874bff9bb | 173 | if (mix) { |
mbedalvaro | 0:4b5874bff9bb | 174 | Flipper::multiplier=state; |
mbedalvaro | 0:4b5874bff9bb | 175 | } |
mbedalvaro | 0:4b5874bff9bb | 176 | else { |
mbedalvaro | 0:4b5874bff9bb | 177 | Flipper::multiplier=true; |
mbedalvaro | 0:4b5874bff9bb | 178 | } |
mbedalvaro | 0:4b5874bff9bb | 179 | Flipper::multImmediate(); |
mbedalvaro | 0:4b5874bff9bb | 180 | } |
mbedalvaro | 0:4b5874bff9bb | 181 | |
mbedalvaro | 0:4b5874bff9bb | 182 | private: |
mbedalvaro | 0:4b5874bff9bb | 183 | bool mix; // this is for mixing this signal with the led (ie, product) |
mbedalvaro | 0:4b5874bff9bb | 184 | bool state; |
mbedalvaro | 0:4b5874bff9bb | 185 | DigitalOut _pin; |
mbedalvaro | 0:4b5874bff9bb | 186 | unsigned int us_interval; |
mbedalvaro | 0:4b5874bff9bb | 187 | Ticker myTicker; |
mbedalvaro | 0:4b5874bff9bb | 188 | }; |
mbedalvaro | 0:4b5874bff9bb | 189 | |
mbedalvaro | 0:4b5874bff9bb | 190 | #endif |