Program that uses the EOF sequence of Vizualeyez motion tracker to trigger an output.

Dependencies:   mbed

Committer:
vsluiter
Date:
Wed Nov 02 21:17:55 2016 +0000
Revision:
3:ac5de80f4b6c
Parent:
2:7509f2c717aa
Removed comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:6190ebfd8112 1 #include "mbed.h"
vsluiter 0:6190ebfd8112 2
vsluiter 3:ac5de80f4b6c 3 DigitalOut gpo(PTD7);
vsluiter 0:6190ebfd8112 4 DigitalOut led(LED_RED);
vsluiter 0:6190ebfd8112 5
vsluiter 0:6190ebfd8112 6 InterruptIn trig(PTD1);
vsluiter 0:6190ebfd8112 7 Timer trigtimer;
vsluiter 0:6190ebfd8112 8 Timeout output_timeout;
vsluiter 1:381c49f999b8 9 Timeout input_timeout;
vsluiter 0:6190ebfd8112 10
vsluiter 0:6190ebfd8112 11
vsluiter 1:381c49f999b8 12 typedef enum {TRIG_DETECT_IDLE, TRIG_LOW, TRIG_FIRST_HIGH} trig_enum_t;
vsluiter 1:381c49f999b8 13 typedef enum {TRIG_EVENT_RISING, TRIG_EVENT_FALLING, TRIG_EVENT_TIMEOUT} trig_event_t;
vsluiter 1:381c49f999b8 14
vsluiter 1:381c49f999b8 15 trig_enum_t trigger = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 16
vsluiter 1:381c49f999b8 17 //Function declarations
vsluiter 1:381c49f999b8 18 void input_timeout_handler(void);
vsluiter 1:381c49f999b8 19 void get_new_state(trig_enum_t * trig, trig_event_t event);
vsluiter 1:381c49f999b8 20 void set_output(void);
vsluiter 1:381c49f999b8 21 void trig_rise_event(void);
vsluiter 1:381c49f999b8 22 void trig_fall_event(void);
vsluiter 1:381c49f999b8 23
vsluiter 1:381c49f999b8 24
vsluiter 1:381c49f999b8 25
vsluiter 1:381c49f999b8 26 void input_timeout_handler(void)
vsluiter 1:381c49f999b8 27 {
vsluiter 1:381c49f999b8 28 get_new_state(&trigger, TRIG_EVENT_TIMEOUT);
vsluiter 1:381c49f999b8 29 }
vsluiter 1:381c49f999b8 30
vsluiter 1:381c49f999b8 31 void get_new_state(trig_enum_t * trig, trig_event_t event)
vsluiter 1:381c49f999b8 32 {
vsluiter 3:ac5de80f4b6c 33 const int jitter = 8;
vsluiter 1:381c49f999b8 34 switch(*trig)
vsluiter 1:381c49f999b8 35 {
vsluiter 1:381c49f999b8 36 case TRIG_DETECT_IDLE:
vsluiter 1:381c49f999b8 37 {
vsluiter 1:381c49f999b8 38 if(event == TRIG_EVENT_FALLING)
vsluiter 1:381c49f999b8 39 {
vsluiter 1:381c49f999b8 40 *trig = TRIG_LOW;
vsluiter 1:381c49f999b8 41 trigtimer.reset();
vsluiter 1:381c49f999b8 42 }
vsluiter 1:381c49f999b8 43 else // should not happen
vsluiter 1:381c49f999b8 44 *trig = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 45 break;
vsluiter 1:381c49f999b8 46 }
vsluiter 1:381c49f999b8 47 case TRIG_LOW:
vsluiter 1:381c49f999b8 48 {
vsluiter 1:381c49f999b8 49 if(event == TRIG_EVENT_RISING)
vsluiter 1:381c49f999b8 50 {
vsluiter 2:7509f2c717aa 51 if(trigtimer.read_us() > (30 - jitter) && trigtimer.read_us() < (30+jitter) ) //if first low period detected
vsluiter 1:381c49f999b8 52 {
vsluiter 1:381c49f999b8 53 *trig = TRIG_FIRST_HIGH;
vsluiter 1:381c49f999b8 54 input_timeout.attach_us(input_timeout_handler, 60);
vsluiter 1:381c49f999b8 55 }
vsluiter 1:381c49f999b8 56 else //pulse too short or too long
vsluiter 1:381c49f999b8 57 *trig = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 58 }
vsluiter 1:381c49f999b8 59
vsluiter 1:381c49f999b8 60 else // should not happen
vsluiter 1:381c49f999b8 61 *trig = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 62 break;
vsluiter 1:381c49f999b8 63 }
vsluiter 1:381c49f999b8 64 case TRIG_FIRST_HIGH:
vsluiter 1:381c49f999b8 65 {
vsluiter 3:ac5de80f4b6c 66 led=!led;
vsluiter 1:381c49f999b8 67 if(event == TRIG_EVENT_TIMEOUT)
vsluiter 1:381c49f999b8 68 {
vsluiter 1:381c49f999b8 69 gpo.write(0);
vsluiter 1:381c49f999b8 70 output_timeout.attach_us(set_output, 1000);
vsluiter 1:381c49f999b8 71 *trig = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 72 }
vsluiter 1:381c49f999b8 73
vsluiter 1:381c49f999b8 74 else // should not happen, maybe falling edge due to TOP684
vsluiter 1:381c49f999b8 75 {
vsluiter 1:381c49f999b8 76 *trig = TRIG_DETECT_IDLE;
vsluiter 1:381c49f999b8 77 input_timeout.detach();
vsluiter 1:381c49f999b8 78 }
vsluiter 1:381c49f999b8 79 break;
vsluiter 1:381c49f999b8 80 }
vsluiter 1:381c49f999b8 81 default:
vsluiter 1:381c49f999b8 82 break;
vsluiter 1:381c49f999b8 83 }
vsluiter 1:381c49f999b8 84
vsluiter 1:381c49f999b8 85 }
vsluiter 1:381c49f999b8 86
vsluiter 1:381c49f999b8 87
vsluiter 0:6190ebfd8112 88 void set_output(void)
vsluiter 0:6190ebfd8112 89 {
vsluiter 0:6190ebfd8112 90 gpo.write(1);
vsluiter 0:6190ebfd8112 91 }
vsluiter 0:6190ebfd8112 92
vsluiter 0:6190ebfd8112 93
vsluiter 0:6190ebfd8112 94 void trig_rise_event(void)
vsluiter 0:6190ebfd8112 95 {
vsluiter 1:381c49f999b8 96 get_new_state(&trigger, TRIG_EVENT_RISING);
vsluiter 0:6190ebfd8112 97 }
vsluiter 0:6190ebfd8112 98
vsluiter 0:6190ebfd8112 99
vsluiter 0:6190ebfd8112 100 void trig_fall_event(void)
vsluiter 0:6190ebfd8112 101 {
vsluiter 1:381c49f999b8 102 get_new_state(&trigger, TRIG_EVENT_FALLING);
vsluiter 3:ac5de80f4b6c 103
vsluiter 0:6190ebfd8112 104 }
vsluiter 0:6190ebfd8112 105
vsluiter 0:6190ebfd8112 106 int main()
vsluiter 0:6190ebfd8112 107 {
vsluiter 2:7509f2c717aa 108 trigtimer.start();
vsluiter 0:6190ebfd8112 109 trig.rise(trig_rise_event);
vsluiter 0:6190ebfd8112 110 trig.fall(trig_fall_event);
vsluiter 0:6190ebfd8112 111 while (true) {
vsluiter 0:6190ebfd8112 112 //gpo = !gpo; // toggle pin
vsluiter 3:ac5de80f4b6c 113 //led = !led; // toggle led
vsluiter 0:6190ebfd8112 114 wait(0.2f);
vsluiter 0:6190ebfd8112 115 }
vsluiter 0:6190ebfd8112 116 }