Aleksandar Kodzhabashev / Mbed 2 deprecated TrackballQuery

Dependencies:   Servo mbed

Committer:
d3alek
Date:
Wed Nov 20 15:57:00 2013 +0000
Revision:
4:73f9fd797965
Parent:
3:eb3c3c9587d7
Child:
5:43d5529fbe1e
working before servo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d3alek 0:94cffad90b69 1 #include "PS2MS.h"
d3alek 0:94cffad90b69 2 #include "PS2MS_INIT.h"
d3alek 0:94cffad90b69 3 #include "mbed.h"
d3alek 0:94cffad90b69 4
d3alek 2:e35627187804 5 #define ENABLE_1 true
d3alek 2:e35627187804 6 #define ENABLE_2 true
d3alek 2:e35627187804 7
d3alek 0:94cffad90b69 8 DigitalOut myled(LED1);
d3alek 0:94cffad90b69 9 DigitalInOut clk(p23);
d3alek 0:94cffad90b69 10 DigitalInOut dat(p22);
d3alek 0:94cffad90b69 11 Serial pc(USBTX, USBRX); // tx, rx
d3alek 2:e35627187804 12 /*
d3alek 2:e35627187804 13 * 0xFF: Reset command.
d3alek 2:e35627187804 14 * 0xF3: Set sample rate.
d3alek 2:e35627187804 15 * 0xF2: Read device type.
d3alek 2:e35627187804 16 * 0xE8: Set resolution.
d3alek 2:e35627187804 17 * 0xE6: Set scaling.
d3alek 2:e35627187804 18 * 0xF4: Enable device.
d3alek 2:e35627187804 19 */
d3alek 0:94cffad90b69 20
d3alek 0:94cffad90b69 21 int send(uint8_t c);
d3alek 0:94cffad90b69 22 int recv();
d3alek 0:94cffad90b69 23
d3alek 2:e35627187804 24 //TODO should Iuse sensor1_init? maybe no 255s?
d3alek 2:e35627187804 25 PS2MS_INIT sensor1_init(p23, p22);
d3alek 2:e35627187804 26 PS2MS sensor1(p23, p22);
d3alek 2:e35627187804 27
d3alek 2:e35627187804 28 PS2MS_INIT sensor2_init(p26, p25);
d3alek 2:e35627187804 29 PS2MS sensor2(p26, p25);
d3alek 2:e35627187804 30
d3alek 2:e35627187804 31 int process_sensor_input(char c, int bytenum, char* bytes, int ind);
d3alek 2:e35627187804 32
d3alek 2:e35627187804 33 int sensorXs[2];
d3alek 2:e35627187804 34 int sensorYs[2];
d3alek 2:e35627187804 35 bool sensorToPrint[2];
d3alek 0:94cffad90b69 36
d3alek 2:e35627187804 37 int main()
d3alek 2:e35627187804 38 {
d3alek 4:73f9fd797965 39 printf("IMHERE START\n");
d3alek 2:e35627187804 40 int s1bytenum = 0;
d3alek 2:e35627187804 41 char s1bytes[3];
d3alek 2:e35627187804 42
d3alek 2:e35627187804 43 int s2bytenum = 0;
d3alek 2:e35627187804 44 char s2bytes[3];
d3alek 2:e35627187804 45
d3alek 2:e35627187804 46 char s1c, s2c;
d3alek 4:73f9fd797965 47 printf("IMHERE GET SENSORS\n");
d3alek 2:e35627187804 48 s1c = sensor1.getc();
d3alek 4:73f9fd797965 49 printf("IMHERE GOT S1\n");
d3alek 2:e35627187804 50 s2c = sensor2.getc();
d3alek 4:73f9fd797965 51 printf("IMHERE GOT S2\n");
d3alek 2:e35627187804 52 sensorToPrint[0] = sensorToPrint[1] = false;
d3alek 2:e35627187804 53
d3alek 0:94cffad90b69 54 while(1) {
d3alek 2:e35627187804 55 if (ENABLE_1) {
d3alek 2:e35627187804 56 s1bytenum = process_sensor_input(s1c, s1bytenum, s1bytes, 0);
d3alek 2:e35627187804 57 s1c = sensor1.getc();
d3alek 2:e35627187804 58 }
d3alek 2:e35627187804 59 if (ENABLE_2) {
d3alek 2:e35627187804 60 s2bytenum = process_sensor_input(s2c, s2bytenum, s2bytes, 1);
d3alek 2:e35627187804 61 s2c = sensor2.getc();
d3alek 2:e35627187804 62 }
d3alek 2:e35627187804 63 // TODO only prints when both are enabled now
d3alek 4:73f9fd797965 64 if (sensorToPrint[0] && sensorToPrint[1]) {
d3alek 2:e35627187804 65 printf("%d : %d %d %d %d\n\r", 2, sensorXs[0], sensorYs[0], sensorXs[1], sensorYs[1]);
d3alek 2:e35627187804 66 sensorToPrint[0] = sensorToPrint[1] = false;
d3alek 2:e35627187804 67 sensorXs[0] = sensorYs[0] = sensorXs[1] = sensorYs[1] = 0;
d3alek 0:94cffad90b69 68 }
d3alek 0:94cffad90b69 69 }
d3alek 0:94cffad90b69 70 }
d3alek 0:94cffad90b69 71
d3alek 2:e35627187804 72 int process_sensor_input(char c, int bytenum, char* bytes, int ind)
d3alek 2:e35627187804 73 {
d3alek 2:e35627187804 74 if (c == 255) {
d3alek 2:e35627187804 75 bytenum = -1;
d3alek 2:e35627187804 76 } else if (bytenum % 3 == 0) {
d3alek 2:e35627187804 77 bytes[0] = c;
d3alek 2:e35627187804 78 if (!((1 << 3) & c)) {
d3alek 2:e35627187804 79 // not byte[0] wrong offset, skip c
d3alek 2:e35627187804 80 bytenum = -1;
d3alek 0:94cffad90b69 81 }
d3alek 2:e35627187804 82 } else if (bytenum % 3 == 1) {
d3alek 2:e35627187804 83 bytes[1] = c;
d3alek 2:e35627187804 84 } else if (bytenum % 3 == 2) {
d3alek 2:e35627187804 85 bytes[2] = c;
d3alek 0:94cffad90b69 86
d3alek 2:e35627187804 87 //TODO: check for overflow
d3alek 2:e35627187804 88 if ((1 << 6) & bytes[0]) {
d3alek 3:eb3c3c9587d7 89 //printf("Overflow x!\n\r");
d3alek 3:eb3c3c9587d7 90 bytenum = -1;
d3alek 0:94cffad90b69 91 }
d3alek 3:eb3c3c9587d7 92 else if ((1 << 7) & bytes[0]) {
d3alek 3:eb3c3c9587d7 93 //printf("Overflow y!\n\r");
d3alek 3:eb3c3c9587d7 94 //printf("Byte1 is %d\n\r", bytes[0]);
d3alek 3:eb3c3c9587d7 95 bytenum = -1;
d3alek 0:94cffad90b69 96 }
d3alek 2:e35627187804 97 // check x and y signs
d3alek 3:eb3c3c9587d7 98 else {
d3alek 3:eb3c3c9587d7 99 int x = bytes[1] - ((bytes[0] << 4) & 0x100);
d3alek 3:eb3c3c9587d7 100 int y = bytes[2] - ((bytes[0] << 3) & 0x100);
d3alek 3:eb3c3c9587d7 101 //printf("%s: x = %d y = %d\n\r", id, x, y);
d3alek 3:eb3c3c9587d7 102 sensorXs[ind] = x;
d3alek 3:eb3c3c9587d7 103 sensorYs[ind] = y;
d3alek 3:eb3c3c9587d7 104 sensorToPrint[ind] = true;
d3alek 3:eb3c3c9587d7 105 bytenum = -1;
d3alek 3:eb3c3c9587d7 106 }
d3alek 0:94cffad90b69 107 }
d3alek 2:e35627187804 108 return (bytenum + 1) % 3;
d3alek 0:94cffad90b69 109 }