Lab 4 part 2

Dependencies:   MMA8451Q3

Committer:
sebbarpar
Date:
Thu Mar 05 11:12:10 2020 +0000
Revision:
1:5b640ef43893
Parent:
0:4de96d5b7032
Lab 4 part 2;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sebbarpar 0:4de96d5b7032 1 #include "mbed.h"
sebbarpar 0:4de96d5b7032 2 #include "MMA8451Q.h"
sebbarpar 0:4de96d5b7032 3
sebbarpar 0:4de96d5b7032 4 PinName const SDA = PTE25;
sebbarpar 0:4de96d5b7032 5 PinName const SCL = PTE24;
sebbarpar 0:4de96d5b7032 6
sebbarpar 0:4de96d5b7032 7 #define MMA8451_I2C_ADDRESS (0x1d<<1)
sebbarpar 0:4de96d5b7032 8 Ticker tick;
sebbarpar 0:4de96d5b7032 9 DigitalOut rled(LED1,1);
sebbarpar 0:4de96d5b7032 10 DigitalOut gled(LED2,1);
sebbarpar 0:4de96d5b7032 11 Serial pc(USBTX, USBRX); // tx, rx
sebbarpar 0:4de96d5b7032 12 Timer t;
sebbarpar 0:4de96d5b7032 13
sebbarpar 0:4de96d5b7032 14 EventQueue queue; // creates an event queue, to call read ADC
sebbarpar 0:4de96d5b7032 15 Thread eventThread;
sebbarpar 0:4de96d5b7032 16 EventFlags flag;
sebbarpar 0:4de96d5b7032 17
sebbarpar 0:4de96d5b7032 18 enum state { intermediate, flat, over, down, up, left, right};
sebbarpar 0:4de96d5b7032 19 volatile int state;
sebbarpar 0:4de96d5b7032 20 enum seq {f, r, u, trig, err};
sebbarpar 0:4de96d5b7032 21 volatile int seq=f;
sebbarpar 0:4de96d5b7032 22 volatile uint32_t flags_read=1;
sebbarpar 0:4de96d5b7032 23
sebbarpar 0:4de96d5b7032 24
sebbarpar 0:4de96d5b7032 25 void checksequence(){
sebbarpar 0:4de96d5b7032 26 switch (seq){
sebbarpar 0:4de96d5b7032 27 case f:
sebbarpar 0:4de96d5b7032 28 flags_read=flag.wait_any(flat|down|over|up|left|right,10000,true);
sebbarpar 0:4de96d5b7032 29 pc.printf("Position:%d\r\n", flags_read);
sebbarpar 0:4de96d5b7032 30 if (flags_read==-2) {rled=1;}
sebbarpar 0:4de96d5b7032 31 else{
sebbarpar 0:4de96d5b7032 32 if (flags_read!=1 && t.read()<10){seq=err;}
sebbarpar 0:4de96d5b7032 33 if (flags_read==6 && t.read()>10) {seq=r; t.reset();}
sebbarpar 0:4de96d5b7032 34 if ((flags_read!=6 && flags_read!=1) && t.read()>10){seq=err;}
sebbarpar 0:4de96d5b7032 35 }
sebbarpar 0:4de96d5b7032 36 break;
sebbarpar 0:4de96d5b7032 37
sebbarpar 0:4de96d5b7032 38 case r:
sebbarpar 0:4de96d5b7032 39 flags_read=flag.wait_any(flat|down|over|up|left|right,6000,true);
sebbarpar 0:4de96d5b7032 40 pc.printf("Position:%d\r\n", flags_read);
sebbarpar 0:4de96d5b7032 41 if (flags_read!=6 && t.read()<2){seq=err;}
sebbarpar 0:4de96d5b7032 42 if (flags_read==4 && t.read()>2) {seq=u; t.reset();}
sebbarpar 0:4de96d5b7032 43 if (flags_read!=6 && flags_read!=4){seq=err;}
sebbarpar 0:4de96d5b7032 44 break;
sebbarpar 0:4de96d5b7032 45
sebbarpar 0:4de96d5b7032 46 case u:
sebbarpar 0:4de96d5b7032 47 flags_read=flag.wait_any(flat|down|over|up|left|right,8000,true);
sebbarpar 0:4de96d5b7032 48 pc.printf("Position:%d\r\n", flags_read);
sebbarpar 0:4de96d5b7032 49 if (flags_read!=4 && t.read()<4){seq=err;}
sebbarpar 0:4de96d5b7032 50 if (flags_read==1 && t.read()>4) {seq=trig;}
sebbarpar 0:4de96d5b7032 51 if (flags_read!=1 && flags_read!=4){seq=err;}
sebbarpar 0:4de96d5b7032 52 break;
sebbarpar 0:4de96d5b7032 53
sebbarpar 0:4de96d5b7032 54 case trig:
sebbarpar 0:4de96d5b7032 55 gled=0;
sebbarpar 0:4de96d5b7032 56 break;
sebbarpar 0:4de96d5b7032 57
sebbarpar 0:4de96d5b7032 58 case err:
sebbarpar 0:4de96d5b7032 59 rled=0;
sebbarpar 0:4de96d5b7032 60 flag.wait_any(flat, osWaitForever, true);
sebbarpar 0:4de96d5b7032 61 seq=f;
sebbarpar 0:4de96d5b7032 62 t.reset();
sebbarpar 0:4de96d5b7032 63 break;
sebbarpar 0:4de96d5b7032 64 }
sebbarpar 0:4de96d5b7032 65 }
sebbarpar 0:4de96d5b7032 66
sebbarpar 0:4de96d5b7032 67 int main(void)
sebbarpar 0:4de96d5b7032 68 {
sebbarpar 0:4de96d5b7032 69 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
sebbarpar 0:4de96d5b7032 70
sebbarpar 0:4de96d5b7032 71 // Start the event queue
sebbarpar 0:4de96d5b7032 72 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
sebbarpar 0:4de96d5b7032 73 // call the readA0 function every 10ms
sebbarpar 0:4de96d5b7032 74 queue.call_every(10, checksequence) ;
sebbarpar 0:4de96d5b7032 75
sebbarpar 0:4de96d5b7032 76 pc.printf("MMA8451 ID: %d\n", acc.getWhoAmI());
sebbarpar 0:4de96d5b7032 77 state=flat;
sebbarpar 0:4de96d5b7032 78 t.start();
sebbarpar 0:4de96d5b7032 79
sebbarpar 0:4de96d5b7032 80
sebbarpar 0:4de96d5b7032 81 while (true) {
sebbarpar 0:4de96d5b7032 82 float x, y, z;
sebbarpar 0:4de96d5b7032 83 x = acc.getAccX();
sebbarpar 0:4de96d5b7032 84 y = acc.getAccY();
sebbarpar 0:4de96d5b7032 85 z = acc.getAccZ();
sebbarpar 0:4de96d5b7032 86 switch (state){
sebbarpar 0:4de96d5b7032 87 case intermediate:
sebbarpar 0:4de96d5b7032 88 //rled=1;
sebbarpar 0:4de96d5b7032 89 //gled=1;
sebbarpar 0:4de96d5b7032 90 if (z>0.9) {state=flat; flag.set(flat);}
sebbarpar 0:4de96d5b7032 91 if (z<-0.9) {state=over; flag.set(over);}
sebbarpar 0:4de96d5b7032 92 if (x>0.9) {state=down; flag.set(down);}
sebbarpar 0:4de96d5b7032 93 if (x<-0.9) {state=up; flag.set(up);}
sebbarpar 0:4de96d5b7032 94 if (y>0.9) {state=left; flag.set(left);}
sebbarpar 0:4de96d5b7032 95 if (y<-0.9) {state=right; flag.set(right);}
sebbarpar 0:4de96d5b7032 96 break;
sebbarpar 0:4de96d5b7032 97
sebbarpar 0:4de96d5b7032 98 case flat:
sebbarpar 0:4de96d5b7032 99 //rled=0;
sebbarpar 0:4de96d5b7032 100 if (z<0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 101 break;
sebbarpar 0:4de96d5b7032 102
sebbarpar 0:4de96d5b7032 103 case over:
sebbarpar 0:4de96d5b7032 104 //gled=0;
sebbarpar 0:4de96d5b7032 105
sebbarpar 0:4de96d5b7032 106 if (z>-0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 107 break;
sebbarpar 0:4de96d5b7032 108
sebbarpar 0:4de96d5b7032 109 case down:
sebbarpar 0:4de96d5b7032 110 //bled=0;
sebbarpar 0:4de96d5b7032 111
sebbarpar 0:4de96d5b7032 112 if (x<0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 113 break;
sebbarpar 0:4de96d5b7032 114
sebbarpar 0:4de96d5b7032 115 case up:
sebbarpar 0:4de96d5b7032 116 //rled=0;
sebbarpar 0:4de96d5b7032 117 //gled=0;
sebbarpar 0:4de96d5b7032 118
sebbarpar 0:4de96d5b7032 119 if (x>-0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 120 break;
sebbarpar 0:4de96d5b7032 121
sebbarpar 0:4de96d5b7032 122 case left:
sebbarpar 0:4de96d5b7032 123 //gled=0;
sebbarpar 0:4de96d5b7032 124 //bled=0;
sebbarpar 0:4de96d5b7032 125
sebbarpar 0:4de96d5b7032 126 if (y<0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 127 break;
sebbarpar 0:4de96d5b7032 128
sebbarpar 0:4de96d5b7032 129 case right:
sebbarpar 0:4de96d5b7032 130 //rled=0;
sebbarpar 0:4de96d5b7032 131 //bled=0;
sebbarpar 0:4de96d5b7032 132 if (y>-0.8) state=intermediate;
sebbarpar 0:4de96d5b7032 133 break;
sebbarpar 0:4de96d5b7032 134 }
sebbarpar 0:4de96d5b7032 135 ThisThread::sleep_for(300); // wait(0.3);
sebbarpar 0:4de96d5b7032 136 pc.printf("state:%d, sequence:%d, timing:%f \n", state, seq, t.read());
sebbarpar 0:4de96d5b7032 137
sebbarpar 0:4de96d5b7032 138 }
sebbarpar 0:4de96d5b7032 139 }