Our PS2 converted into library

Dependents:   Position_Mouse Test_Mouse

Mouse.h

Committer:
joshwilkins2013
Date:
2015-03-31
Revision:
0:eb8581df1f5e
Child:
1:11b4710b30c2

File content as of revision 0:eb8581df1f5e:

#ifndef MOUSE_H
#define MOUSE_H
 
#include "mbed.h"

#define sensorConfig 0x00
#define sensorStatus 0x01
#define Delta_Y 0x02
#define Delta_X 0x03

DigitalInOut pinC(PTB23);
DigitalInOut pinD(PTA2);

class MOUSE {
 
    protected:
 
    public:

//=====================================
//====== Set of useful functions ======
//=====================================

    void init(){
        pinC.output();
        pinD.input();
        reSync();
        forceAwake(1); // LED on
        wait_ms(100);
    }

    void reSync(){
        pinC = 1; // ReSync (startup) mouse
        wait_us(5);
        pinC = 0;
        wait_us(1);
        pinC = 1; 
        wait_us(1000);  // wait for OptiMouse serial transaction timer to time out:
    }
    
    uint8_t readRegister(uint8_t address){ // Bitbang SPI read operation
        int i = 7;
        uint8_t r = 0;
        pinD.output();   // Write the address of the register we want to read:
        for (; i>=0; i--){
            pinC = 0;
            pinD = (address & (1 << i));
            pinC = 1;
        }
        pinD.input();    // Switch data line from OUTPUT to INPUT
        wait_us(100);   // Wait according to datasheet
        for (i=7; i>=0; i--){     // Fetch the data!                          
            pinC = 0;
            pinC = 1;
            r |= ((pinD.read()) << i);
        }
        wait_us(100);
        return r;
    }

    void writeRegister(uint8_t address, uint8_t data){
        int i = 7;  
        address |= 0x80;// Set MSB high, to indicate write operation:
        pinD.output();  // Write the address:
        for (; i>=0; i--){
            pinC = 0;
            pinD = (address & (1 << i));
            pinC = 1;
        } 
        for (i=7; i>=0; i--){ // Write the data:
            pinC = 0;
            pinD = (data & (1 << i));
            pinC = 1;
        }
    }

    void forceAwake(char value){
        if (value>0) writeRegister(sensorConfig,0x01); 
        else writeRegister(sensorConfig,0x00);
    }

    signed char getDx(void){
        return (signed char) readRegister(Delta_X);
    }

    signed char getDy(void){
        return (signed char) readRegister(Delta_Y);
    }

    signed char status(void){
        return (signed char) readRegister(sensorStatus);
    }
};
#endif