Aleksandar Kodzhabashev / Mbed 2 deprecated TrackballQuery

Dependencies:   Servo mbed

Committer:
d3alek
Date:
Sun Oct 20 11:35:09 2013 +0000
Revision:
1:d290d6a34bef
Parent:
0:94cffad90b69
Child:
2:e35627187804
working version;

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 0:94cffad90b69 5 DigitalOut myled(LED1);
d3alek 0:94cffad90b69 6 DigitalInOut clk(p23);
d3alek 0:94cffad90b69 7 DigitalInOut dat(p22);
d3alek 0:94cffad90b69 8 Serial pc(USBTX, USBRX); // tx, rx
d3alek 0:94cffad90b69 9 static const int MAX_RETRY = 1000000;
d3alek 0:94cffad90b69 10 /*
d3alek 0:94cffad90b69 11 * 0xFF: Reset command.
d3alek 0:94cffad90b69 12 * 0xF3: Set sample rate.
d3alek 0:94cffad90b69 13 * 0xF2: Read device type.
d3alek 0:94cffad90b69 14 * 0xE8: Set resolution.
d3alek 0:94cffad90b69 15 * 0xE6: Set scaling.
d3alek 0:94cffad90b69 16 * 0xF4: Enable device.
d3alek 0:94cffad90b69 17 */
d3alek 0:94cffad90b69 18
d3alek 0:94cffad90b69 19 int send(uint8_t c);
d3alek 0:94cffad90b69 20 int recv();
d3alek 0:94cffad90b69 21
d3alek 0:94cffad90b69 22 PS2MS_INIT ps2ms_init(p23, p22);
d3alek 0:94cffad90b69 23 PS2MS ps2ms(p23, p22);
d3alek 0:94cffad90b69 24
d3alek 0:94cffad90b69 25 int main() {
d3alek 0:94cffad90b69 26 int bytenum = 0;
d3alek 0:94cffad90b69 27 char byte1, byte2, byte3;
d3alek 0:94cffad90b69 28 char c;
d3alek 0:94cffad90b69 29 while(1) {
d3alek 0:94cffad90b69 30 //char c = pc.getc();
d3alek 0:94cffad90b69 31 //send(c);
d3alek 0:94cffad90b69 32 c = ps2ms.getc();
d3alek 0:94cffad90b69 33 //TODO: c overflows, c >= 0 is always true, check c < 25? !
d3alek 0:94cffad90b69 34 while(c >= 0) {
d3alek 0:94cffad90b69 35 if (c == 255) {
d3alek 0:94cffad90b69 36 bytenum = 0;
d3alek 0:94cffad90b69 37 while (ps2ms.getc() >= 0) {};
d3alek 0:94cffad90b69 38 break;
d3alek 0:94cffad90b69 39 }
d3alek 0:94cffad90b69 40 if (bytenum % 3 == 0) {
d3alek 0:94cffad90b69 41 byte1 = c;
d3alek 0:94cffad90b69 42 // not byte1, wrong offset, clear remaining buffer
d3alek 0:94cffad90b69 43 if (!((1 << 3) & byte1)) {
d3alek 0:94cffad90b69 44 //while (ps2ms.getc() >= 0 && c != 255) {};
d3alek 0:94cffad90b69 45 ps2ms.init_work();
d3alek 0:94cffad90b69 46 bytenum = 0;
d3alek 0:94cffad90b69 47 c = ps2ms.getc();
d3alek 0:94cffad90b69 48 continue;
d3alek 0:94cffad90b69 49 }
d3alek 0:94cffad90b69 50 }
d3alek 0:94cffad90b69 51 else if (bytenum % 3 == 1) {
d3alek 0:94cffad90b69 52 byte2 = c;
d3alek 0:94cffad90b69 53 }
d3alek 0:94cffad90b69 54 else if (bytenum % 3 == 2) {
d3alek 0:94cffad90b69 55 byte3 = c;
d3alek 0:94cffad90b69 56
d3alek 0:94cffad90b69 57 //TODO: check for overflow
d3alek 0:94cffad90b69 58 if ((1 << 6) & byte1) {
d3alek 0:94cffad90b69 59 printf("Overflow x!\n\r");
d3alek 0:94cffad90b69 60 }
d3alek 0:94cffad90b69 61 if ((1 << 7) & byte1) {
d3alek 0:94cffad90b69 62 printf("Overflow y!\n\r");
d3alek 0:94cffad90b69 63 printf("Byte1 is %d\n\r", byte1);
d3alek 0:94cffad90b69 64 }
d3alek 0:94cffad90b69 65 // check x and y signs
d3alek 0:94cffad90b69 66 int x = ((1 << 4) & byte1) ? int(byte2) - 255 : int(byte2);
d3alek 0:94cffad90b69 67 int y = ((1 << 5) & byte1) ? int(byte3) - 255 : int(byte3);
d3alek 0:94cffad90b69 68 x = byte2 - ((byte1 << 4) & 0x100);
d3alek 0:94cffad90b69 69 y = byte3 - ((byte1 << 3) & 0x100);
d3alek 0:94cffad90b69 70 printf("x=%d y=%d\n\r", x, y);
d3alek 0:94cffad90b69 71 bytenum = 0;
d3alek 0:94cffad90b69 72 break;
d3alek 0:94cffad90b69 73 }
d3alek 0:94cffad90b69 74 bytenum = (bytenum + 1) % 3;
d3alek 0:94cffad90b69 75 c = ps2ms.getc();
d3alek 0:94cffad90b69 76 }
d3alek 0:94cffad90b69 77 }
d3alek 0:94cffad90b69 78 }
d3alek 0:94cffad90b69 79 /**
d3alek 0:94cffad90b69 80 * Wait a clock down edge.
d3alek 0:94cffad90b69 81 *
d3alek 0:94cffad90b69 82 * @return true if wait done.
d3alek 0:94cffad90b69 83 */
d3alek 0:94cffad90b69 84 bool waitClockDownEdge(void) {
d3alek 0:94cffad90b69 85 int cnt;
d3alek 0:94cffad90b69 86 /*
d3alek 0:94cffad90b69 87 * Wait until clock is low.
d3alek 0:94cffad90b69 88 */
d3alek 0:94cffad90b69 89 cnt = 0;
d3alek 0:94cffad90b69 90 while (clk.read() == 0) {
d3alek 0:94cffad90b69 91 cnt++;
d3alek 0:94cffad90b69 92 if (MAX_RETRY < cnt) {
d3alek 0:94cffad90b69 93 return false;
d3alek 0:94cffad90b69 94 }
d3alek 0:94cffad90b69 95 wait_us(1);
d3alek 0:94cffad90b69 96 }
d3alek 0:94cffad90b69 97 /*
d3alek 0:94cffad90b69 98 * Wait until clock is high.
d3alek 0:94cffad90b69 99 */
d3alek 0:94cffad90b69 100 cnt = 0;
d3alek 0:94cffad90b69 101 while (clk.read() == 1) {
d3alek 0:94cffad90b69 102 cnt++;
d3alek 0:94cffad90b69 103 if (MAX_RETRY < cnt) {
d3alek 0:94cffad90b69 104 return false;
d3alek 0:94cffad90b69 105 }
d3alek 0:94cffad90b69 106 wait_us(1);
d3alek 0:94cffad90b69 107 }
d3alek 0:94cffad90b69 108 return true;
d3alek 0:94cffad90b69 109 }
d3alek 0:94cffad90b69 110
d3alek 0:94cffad90b69 111 /**
d3alek 0:94cffad90b69 112 * Wait a clock up level.
d3alek 0:94cffad90b69 113 *
d3alek 0:94cffad90b69 114 * @return true if wait done.
d3alek 0:94cffad90b69 115 */
d3alek 0:94cffad90b69 116 bool waitClockUpLevel(void) {
d3alek 0:94cffad90b69 117 int cnt;
d3alek 0:94cffad90b69 118 /*
d3alek 0:94cffad90b69 119 * Wait until clock is low.
d3alek 0:94cffad90b69 120 */
d3alek 0:94cffad90b69 121 cnt = 0;
d3alek 0:94cffad90b69 122 while (clk.read() == 0) {
d3alek 0:94cffad90b69 123 cnt++;
d3alek 0:94cffad90b69 124 if (MAX_RETRY < cnt) {
d3alek 0:94cffad90b69 125 return false;
d3alek 0:94cffad90b69 126 }
d3alek 0:94cffad90b69 127 wait_us(1);
d3alek 0:94cffad90b69 128 }
d3alek 0:94cffad90b69 129 return true;
d3alek 0:94cffad90b69 130 }
d3alek 0:94cffad90b69 131
d3alek 0:94cffad90b69 132 /**
d3alek 0:94cffad90b69 133 * Send a byte data.
d3alek 0:94cffad90b69 134 *
d3alek 0:94cffad90b69 135 * @param c a character.
d3alek 0:94cffad90b69 136 *
d3alek 0:94cffad90b69 137 * @return Negative value is a error number.
d3alek 0:94cffad90b69 138 */
d3alek 0:94cffad90b69 139 int send(uint8_t c) {
d3alek 0:94cffad90b69 140 clk.output();
d3alek 0:94cffad90b69 141 dat.output();
d3alek 0:94cffad90b69 142
d3alek 0:94cffad90b69 143 clk.write(0);
d3alek 0:94cffad90b69 144 wait_us(200);
d3alek 0:94cffad90b69 145
d3alek 0:94cffad90b69 146 dat.write(0);
d3alek 0:94cffad90b69 147 wait_us(10);
d3alek 0:94cffad90b69 148 clk.write(1);
d3alek 0:94cffad90b69 149 wait_us(10);
d3alek 0:94cffad90b69 150
d3alek 0:94cffad90b69 151 clk.input();
d3alek 0:94cffad90b69 152 int parcnt = 0;
d3alek 0:94cffad90b69 153 for (int i = 0; i < 10; i++) {
d3alek 0:94cffad90b69 154 if (!waitClockDownEdge()) {
d3alek 0:94cffad90b69 155 return -1;
d3alek 0:94cffad90b69 156 }
d3alek 0:94cffad90b69 157 if ((0 <= i) && (i <= 7)) {
d3alek 0:94cffad90b69 158 /*
d3alek 0:94cffad90b69 159 * Data bit.
d3alek 0:94cffad90b69 160 */
d3alek 0:94cffad90b69 161 if ((c & (1 << i)) == 0) {
d3alek 0:94cffad90b69 162 dat.write(0);
d3alek 0:94cffad90b69 163 } else {
d3alek 0:94cffad90b69 164 dat.write(1);
d3alek 0:94cffad90b69 165 parcnt++;
d3alek 0:94cffad90b69 166 }
d3alek 0:94cffad90b69 167 }
d3alek 0:94cffad90b69 168 if (i == 8) {
d3alek 0:94cffad90b69 169 /*
d3alek 0:94cffad90b69 170 * Parity bit.
d3alek 0:94cffad90b69 171 */
d3alek 0:94cffad90b69 172 if ((parcnt % 2) == 0) {
d3alek 0:94cffad90b69 173 dat.write(1);
d3alek 0:94cffad90b69 174 } else {
d3alek 0:94cffad90b69 175 dat.write(0);
d3alek 0:94cffad90b69 176 }
d3alek 0:94cffad90b69 177 }
d3alek 0:94cffad90b69 178 if (i == 9) {
d3alek 0:94cffad90b69 179 /*
d3alek 0:94cffad90b69 180 * Stop bit.
d3alek 0:94cffad90b69 181 */
d3alek 0:94cffad90b69 182 dat.write(1);
d3alek 0:94cffad90b69 183 }
d3alek 0:94cffad90b69 184 }
d3alek 0:94cffad90b69 185 dat.input();
d3alek 0:94cffad90b69 186
d3alek 0:94cffad90b69 187 /*
d3alek 0:94cffad90b69 188 * Check a ACK.
d3alek 0:94cffad90b69 189 */
d3alek 0:94cffad90b69 190 if (!waitClockDownEdge()) {
d3alek 0:94cffad90b69 191 return -2;
d3alek 0:94cffad90b69 192 }
d3alek 0:94cffad90b69 193 if (dat.read() != 0) {
d3alek 0:94cffad90b69 194 return -3;
d3alek 0:94cffad90b69 195 }
d3alek 0:94cffad90b69 196
d3alek 0:94cffad90b69 197 if (!waitClockUpLevel()) {
d3alek 0:94cffad90b69 198 return -4;
d3alek 0:94cffad90b69 199 }
d3alek 0:94cffad90b69 200
d3alek 0:94cffad90b69 201 return 0;
d3alek 0:94cffad90b69 202 }
d3alek 0:94cffad90b69 203
d3alek 0:94cffad90b69 204 /**
d3alek 0:94cffad90b69 205 * Receive a byte data.
d3alek 0:94cffad90b69 206 *
d3alek 0:94cffad90b69 207 * @return return a data. Negative value is a error number.
d3alek 0:94cffad90b69 208 */
d3alek 0:94cffad90b69 209 int recv(void) {
d3alek 0:94cffad90b69 210 uint8_t c = 0;
d3alek 0:94cffad90b69 211 clk.input();
d3alek 0:94cffad90b69 212 dat.input();
d3alek 0:94cffad90b69 213 int parcnt = 0;
d3alek 0:94cffad90b69 214 for (int i = 0; i < 11; i++) {
d3alek 0:94cffad90b69 215 if (!waitClockDownEdge()) {
d3alek 0:94cffad90b69 216 return -1;
d3alek 0:94cffad90b69 217 }
d3alek 0:94cffad90b69 218 if (i == 0) {
d3alek 0:94cffad90b69 219 /*
d3alek 0:94cffad90b69 220 * Start bit.
d3alek 0:94cffad90b69 221 */
d3alek 0:94cffad90b69 222 if (dat.read() != 0) {
d3alek 0:94cffad90b69 223 return -2;
d3alek 0:94cffad90b69 224 }
d3alek 0:94cffad90b69 225 }
d3alek 0:94cffad90b69 226 if ((1 <= i) && (i <= 8)) {
d3alek 0:94cffad90b69 227 /*
d3alek 0:94cffad90b69 228 * Data bit.
d3alek 0:94cffad90b69 229 */
d3alek 0:94cffad90b69 230 if (dat.read() == 0) {
d3alek 0:94cffad90b69 231 c &= ~(1 << (i - 1));
d3alek 0:94cffad90b69 232 } else {
d3alek 0:94cffad90b69 233 c |= (1 << (i - 1));
d3alek 0:94cffad90b69 234 parcnt++;
d3alek 0:94cffad90b69 235 }
d3alek 0:94cffad90b69 236 }
d3alek 0:94cffad90b69 237 if (i == 9) {
d3alek 0:94cffad90b69 238 /*
d3alek 0:94cffad90b69 239 * Parity bit.
d3alek 0:94cffad90b69 240 */
d3alek 0:94cffad90b69 241 if (dat.read() == 0) {
d3alek 0:94cffad90b69 242 if ((parcnt % 2) != 1) {
d3alek 0:94cffad90b69 243 return -3;
d3alek 0:94cffad90b69 244 }
d3alek 0:94cffad90b69 245 } else {
d3alek 0:94cffad90b69 246 if ((parcnt % 2) != 0) {
d3alek 0:94cffad90b69 247 return -4;
d3alek 0:94cffad90b69 248 }
d3alek 0:94cffad90b69 249 }
d3alek 0:94cffad90b69 250 }
d3alek 0:94cffad90b69 251 if (i == 10) {
d3alek 0:94cffad90b69 252 /*
d3alek 0:94cffad90b69 253 * Stop bit.
d3alek 0:94cffad90b69 254 */
d3alek 0:94cffad90b69 255 if (dat.read() != 1) {
d3alek 0:94cffad90b69 256 return -5;
d3alek 0:94cffad90b69 257 }
d3alek 0:94cffad90b69 258 }
d3alek 0:94cffad90b69 259 }
d3alek 0:94cffad90b69 260 return (int)c;
d3alek 0:94cffad90b69 261 }
d3alek 0:94cffad90b69 262
d3alek 0:94cffad90b69 263