Our PS2 converted into library
Dependents: Position_Mouse Test_Mouse
Mouse.h@0:eb8581df1f5e, 2015-03-31 (annotated)
- Committer:
- joshwilkins2013
- Date:
- Tue Mar 31 22:29:38 2015 +0000
- Revision:
- 0:eb8581df1f5e
- Child:
- 1:11b4710b30c2
Fixed position; added rgb stuff; added interrupt w/ sw3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joshwilkins2013 | 0:eb8581df1f5e | 1 | #ifndef MOUSE_H |
joshwilkins2013 | 0:eb8581df1f5e | 2 | #define MOUSE_H |
joshwilkins2013 | 0:eb8581df1f5e | 3 | |
joshwilkins2013 | 0:eb8581df1f5e | 4 | #include "mbed.h" |
joshwilkins2013 | 0:eb8581df1f5e | 5 | |
joshwilkins2013 | 0:eb8581df1f5e | 6 | #define sensorConfig 0x00 |
joshwilkins2013 | 0:eb8581df1f5e | 7 | #define sensorStatus 0x01 |
joshwilkins2013 | 0:eb8581df1f5e | 8 | #define Delta_Y 0x02 |
joshwilkins2013 | 0:eb8581df1f5e | 9 | #define Delta_X 0x03 |
joshwilkins2013 | 0:eb8581df1f5e | 10 | |
joshwilkins2013 | 0:eb8581df1f5e | 11 | DigitalInOut pinC(PTB23); |
joshwilkins2013 | 0:eb8581df1f5e | 12 | DigitalInOut pinD(PTA2); |
joshwilkins2013 | 0:eb8581df1f5e | 13 | |
joshwilkins2013 | 0:eb8581df1f5e | 14 | class MOUSE { |
joshwilkins2013 | 0:eb8581df1f5e | 15 | |
joshwilkins2013 | 0:eb8581df1f5e | 16 | protected: |
joshwilkins2013 | 0:eb8581df1f5e | 17 | |
joshwilkins2013 | 0:eb8581df1f5e | 18 | public: |
joshwilkins2013 | 0:eb8581df1f5e | 19 | |
joshwilkins2013 | 0:eb8581df1f5e | 20 | //===================================== |
joshwilkins2013 | 0:eb8581df1f5e | 21 | //====== Set of useful functions ====== |
joshwilkins2013 | 0:eb8581df1f5e | 22 | //===================================== |
joshwilkins2013 | 0:eb8581df1f5e | 23 | |
joshwilkins2013 | 0:eb8581df1f5e | 24 | void init(){ |
joshwilkins2013 | 0:eb8581df1f5e | 25 | pinC.output(); |
joshwilkins2013 | 0:eb8581df1f5e | 26 | pinD.input(); |
joshwilkins2013 | 0:eb8581df1f5e | 27 | reSync(); |
joshwilkins2013 | 0:eb8581df1f5e | 28 | forceAwake(1); // LED on |
joshwilkins2013 | 0:eb8581df1f5e | 29 | wait_ms(100); |
joshwilkins2013 | 0:eb8581df1f5e | 30 | } |
joshwilkins2013 | 0:eb8581df1f5e | 31 | |
joshwilkins2013 | 0:eb8581df1f5e | 32 | void reSync(){ |
joshwilkins2013 | 0:eb8581df1f5e | 33 | pinC = 1; // ReSync (startup) mouse |
joshwilkins2013 | 0:eb8581df1f5e | 34 | wait_us(5); |
joshwilkins2013 | 0:eb8581df1f5e | 35 | pinC = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 36 | wait_us(1); |
joshwilkins2013 | 0:eb8581df1f5e | 37 | pinC = 1; |
joshwilkins2013 | 0:eb8581df1f5e | 38 | wait_us(1000); // wait for OptiMouse serial transaction timer to time out: |
joshwilkins2013 | 0:eb8581df1f5e | 39 | } |
joshwilkins2013 | 0:eb8581df1f5e | 40 | |
joshwilkins2013 | 0:eb8581df1f5e | 41 | uint8_t readRegister(uint8_t address){ // Bitbang SPI read operation |
joshwilkins2013 | 0:eb8581df1f5e | 42 | int i = 7; |
joshwilkins2013 | 0:eb8581df1f5e | 43 | uint8_t r = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 44 | pinD.output(); // Write the address of the register we want to read: |
joshwilkins2013 | 0:eb8581df1f5e | 45 | for (; i>=0; i--){ |
joshwilkins2013 | 0:eb8581df1f5e | 46 | pinC = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 47 | pinD = (address & (1 << i)); |
joshwilkins2013 | 0:eb8581df1f5e | 48 | pinC = 1; |
joshwilkins2013 | 0:eb8581df1f5e | 49 | } |
joshwilkins2013 | 0:eb8581df1f5e | 50 | pinD.input(); // Switch data line from OUTPUT to INPUT |
joshwilkins2013 | 0:eb8581df1f5e | 51 | wait_us(100); // Wait according to datasheet |
joshwilkins2013 | 0:eb8581df1f5e | 52 | for (i=7; i>=0; i--){ // Fetch the data! |
joshwilkins2013 | 0:eb8581df1f5e | 53 | pinC = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 54 | pinC = 1; |
joshwilkins2013 | 0:eb8581df1f5e | 55 | r |= ((pinD.read()) << i); |
joshwilkins2013 | 0:eb8581df1f5e | 56 | } |
joshwilkins2013 | 0:eb8581df1f5e | 57 | wait_us(100); |
joshwilkins2013 | 0:eb8581df1f5e | 58 | return r; |
joshwilkins2013 | 0:eb8581df1f5e | 59 | } |
joshwilkins2013 | 0:eb8581df1f5e | 60 | |
joshwilkins2013 | 0:eb8581df1f5e | 61 | void writeRegister(uint8_t address, uint8_t data){ |
joshwilkins2013 | 0:eb8581df1f5e | 62 | int i = 7; |
joshwilkins2013 | 0:eb8581df1f5e | 63 | address |= 0x80;// Set MSB high, to indicate write operation: |
joshwilkins2013 | 0:eb8581df1f5e | 64 | pinD.output(); // Write the address: |
joshwilkins2013 | 0:eb8581df1f5e | 65 | for (; i>=0; i--){ |
joshwilkins2013 | 0:eb8581df1f5e | 66 | pinC = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 67 | pinD = (address & (1 << i)); |
joshwilkins2013 | 0:eb8581df1f5e | 68 | pinC = 1; |
joshwilkins2013 | 0:eb8581df1f5e | 69 | } |
joshwilkins2013 | 0:eb8581df1f5e | 70 | for (i=7; i>=0; i--){ // Write the data: |
joshwilkins2013 | 0:eb8581df1f5e | 71 | pinC = 0; |
joshwilkins2013 | 0:eb8581df1f5e | 72 | pinD = (data & (1 << i)); |
joshwilkins2013 | 0:eb8581df1f5e | 73 | pinC = 1; |
joshwilkins2013 | 0:eb8581df1f5e | 74 | } |
joshwilkins2013 | 0:eb8581df1f5e | 75 | } |
joshwilkins2013 | 0:eb8581df1f5e | 76 | |
joshwilkins2013 | 0:eb8581df1f5e | 77 | void forceAwake(char value){ |
joshwilkins2013 | 0:eb8581df1f5e | 78 | if (value>0) writeRegister(sensorConfig,0x01); |
joshwilkins2013 | 0:eb8581df1f5e | 79 | else writeRegister(sensorConfig,0x00); |
joshwilkins2013 | 0:eb8581df1f5e | 80 | } |
joshwilkins2013 | 0:eb8581df1f5e | 81 | |
joshwilkins2013 | 0:eb8581df1f5e | 82 | signed char getDx(void){ |
joshwilkins2013 | 0:eb8581df1f5e | 83 | return (signed char) readRegister(Delta_X); |
joshwilkins2013 | 0:eb8581df1f5e | 84 | } |
joshwilkins2013 | 0:eb8581df1f5e | 85 | |
joshwilkins2013 | 0:eb8581df1f5e | 86 | signed char getDy(void){ |
joshwilkins2013 | 0:eb8581df1f5e | 87 | return (signed char) readRegister(Delta_Y); |
joshwilkins2013 | 0:eb8581df1f5e | 88 | } |
joshwilkins2013 | 0:eb8581df1f5e | 89 | |
joshwilkins2013 | 0:eb8581df1f5e | 90 | signed char status(void){ |
joshwilkins2013 | 0:eb8581df1f5e | 91 | return (signed char) readRegister(sensorStatus); |
joshwilkins2013 | 0:eb8581df1f5e | 92 | } |
joshwilkins2013 | 0:eb8581df1f5e | 93 | }; |
joshwilkins2013 | 0:eb8581df1f5e | 94 | #endif |