Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:e35627187804, 2013-10-28 (annotated)
- Committer:
- d3alek
- Date:
- Mon Oct 28 10:28:21 2013 +0000
- Revision:
- 2:e35627187804
- Parent:
- 1:d290d6a34bef
- Child:
- 3:eb3c3c9587d7
buggy?
Who changed what in which revision?
| User | Revision | Line number | New 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 | 2:e35627187804 | 39 | int s1bytenum = 0; |
| d3alek | 2:e35627187804 | 40 | char s1bytes[3]; |
| d3alek | 2:e35627187804 | 41 | |
| d3alek | 2:e35627187804 | 42 | int s2bytenum = 0; |
| d3alek | 2:e35627187804 | 43 | char s2bytes[3]; |
| d3alek | 2:e35627187804 | 44 | |
| d3alek | 2:e35627187804 | 45 | char s1c, s2c; |
| d3alek | 2:e35627187804 | 46 | s1c = sensor1.getc(); |
| d3alek | 2:e35627187804 | 47 | s2c = sensor2.getc(); |
| d3alek | 2:e35627187804 | 48 | |
| d3alek | 2:e35627187804 | 49 | sensorToPrint[0] = sensorToPrint[1] = false; |
| d3alek | 2:e35627187804 | 50 | |
| d3alek | 0:94cffad90b69 | 51 | while(1) { |
| d3alek | 2:e35627187804 | 52 | if (ENABLE_1) { |
| d3alek | 2:e35627187804 | 53 | s1bytenum = process_sensor_input(s1c, s1bytenum, s1bytes, 0); |
| d3alek | 2:e35627187804 | 54 | s1c = sensor1.getc(); |
| d3alek | 2:e35627187804 | 55 | } |
| d3alek | 2:e35627187804 | 56 | if (ENABLE_2) { |
| d3alek | 2:e35627187804 | 57 | s2bytenum = process_sensor_input(s2c, s2bytenum, s2bytes, 1); |
| d3alek | 2:e35627187804 | 58 | s2c = sensor2.getc(); |
| d3alek | 2:e35627187804 | 59 | } |
| d3alek | 2:e35627187804 | 60 | // TODO only prints when both are enabled now |
| d3alek | 2:e35627187804 | 61 | if (sensorToPrint[0] || sensorToPrint[1]) { |
| d3alek | 2:e35627187804 | 62 | printf("%d : %d %d %d %d\n\r", 2, sensorXs[0], sensorYs[0], sensorXs[1], sensorYs[1]); |
| d3alek | 2:e35627187804 | 63 | sensorToPrint[0] = sensorToPrint[1] = false; |
| d3alek | 2:e35627187804 | 64 | sensorXs[0] = sensorYs[0] = sensorXs[1] = sensorYs[1] = 0; |
| d3alek | 0:94cffad90b69 | 65 | } |
| d3alek | 0:94cffad90b69 | 66 | } |
| d3alek | 0:94cffad90b69 | 67 | } |
| d3alek | 0:94cffad90b69 | 68 | |
| d3alek | 2:e35627187804 | 69 | int process_sensor_input(char c, int bytenum, char* bytes, int ind) |
| d3alek | 2:e35627187804 | 70 | { |
| d3alek | 2:e35627187804 | 71 | if (c == 255) { |
| d3alek | 2:e35627187804 | 72 | bytenum = -1; |
| d3alek | 2:e35627187804 | 73 | } else if (bytenum % 3 == 0) { |
| d3alek | 2:e35627187804 | 74 | bytes[0] = c; |
| d3alek | 2:e35627187804 | 75 | if (!((1 << 3) & c)) { |
| d3alek | 2:e35627187804 | 76 | // not byte[0] wrong offset, skip c |
| d3alek | 2:e35627187804 | 77 | bytenum = -1; |
| d3alek | 0:94cffad90b69 | 78 | } |
| d3alek | 2:e35627187804 | 79 | } else if (bytenum % 3 == 1) { |
| d3alek | 2:e35627187804 | 80 | bytes[1] = c; |
| d3alek | 2:e35627187804 | 81 | } else if (bytenum % 3 == 2) { |
| d3alek | 2:e35627187804 | 82 | bytes[2] = c; |
| d3alek | 0:94cffad90b69 | 83 | |
| d3alek | 2:e35627187804 | 84 | //TODO: check for overflow |
| d3alek | 2:e35627187804 | 85 | if ((1 << 6) & bytes[0]) { |
| d3alek | 2:e35627187804 | 86 | printf("Overflow x!\n\r"); |
| d3alek | 0:94cffad90b69 | 87 | } |
| d3alek | 2:e35627187804 | 88 | if ((1 << 7) & bytes[0]) { |
| d3alek | 2:e35627187804 | 89 | printf("Overflow y!\n\r"); |
| d3alek | 2:e35627187804 | 90 | printf("Byte1 is %d\n\r", bytes[0]); |
| d3alek | 0:94cffad90b69 | 91 | } |
| d3alek | 2:e35627187804 | 92 | // check x and y signs |
| d3alek | 2:e35627187804 | 93 | int x = bytes[1] - ((bytes[0] << 4) & 0x100); |
| d3alek | 2:e35627187804 | 94 | int y = bytes[2] - ((bytes[0] << 3) & 0x100); |
| d3alek | 2:e35627187804 | 95 | //printf("%s: x = %d y = %d\n\r", id, x, y); |
| d3alek | 2:e35627187804 | 96 | sensorXs[ind] = x; |
| d3alek | 2:e35627187804 | 97 | sensorYs[ind] = y; |
| d3alek | 2:e35627187804 | 98 | sensorToPrint[ind] = true; |
| d3alek | 2:e35627187804 | 99 | bytenum = -1; |
| d3alek | 0:94cffad90b69 | 100 | } |
| d3alek | 2:e35627187804 | 101 | return (bytenum + 1) % 3; |
| d3alek | 0:94cffad90b69 | 102 | } |