Dependencies:   I2CMotor I2CServo Robot XBee

Dependents:   OBROT_ALL

Revision:
2:6c60a3006881
Parent:
1:01d881dc1170
--- a/I2CDevice.h	Fri Aug 21 04:51:59 2015 +0000
+++ b/I2CDevice.h	Wed Oct 14 03:50:56 2015 +0000
@@ -5,36 +5,69 @@
 
 class I2CDevice{
 public:
-    static void initI2C( PinName sda, PinName scl ){
-        mI2C = new I2C( sda, scl );
+    static void resetI2C(){
+        destroyI2C();
+        createI2C();
+    }
+    static void createI2C(){
+        for ( int i = 0; i < mNumOfI2C; ++i ){
+            mI2C[ i ] = new I2C( mSDA[ i ], mSCL[ i ] );
+        }
+    }
+    static void destroyI2C(){
+        for ( int i = 0; i < mNumOfI2C; ++i ){
+            delete mI2C[ i ];
+        }
     }
 
     I2CDevice( char address ) : mAddress( address ){
     }
     
-    virtual void write() = 0;
-    virtual void read() = 0;
+    virtual int write(){
+        return 0;
+    }
+    virtual int read(){
+        return 0;
+    }
     
-    void write( char* data, size_t len ) const{
-        mI2C->write( mAddress, data, len );
+    void writeI2C(){
+        if ( write() ){
+            resetI2C();
+        }
     }
-    void read( char* data, size_t len ) const{
-        mI2C->read( mAddress, data, len );
+    
+    void readI2C(){
+        if ( read() ){
+            resetI2C();
+        }
     }
     
-    void writeReg( char devAddr, char regAddr, char data ){
+    int write( char* data, size_t len ) const{
+        return getI2C()->write( mAddress, data, len );
+    }
+    int read( char* data, size_t len ) const{
+        return getI2C()->read( mAddress, data, len );
+    }
+    
+    int writeReg( char devAddr, char regAddr, char data ){
         char d[ 2 ] = { regAddr, data };
-        mI2C->write( devAddr, d, 2 );
+        return getI2C()->write( devAddr, d, 2 );
     }
     
-    void readReg( char devAddr, char regAddr, char* data, size_t len ){
+    int readReg( char devAddr, char regAddr, char* data, size_t len ){
         regAddr |= 0x80;
-        mI2C->write( devAddr, &regAddr, 1, true );
-        mI2C->read( devAddr | 1, data, len );
+        getI2C()->write( devAddr, &regAddr, 1, true );
+        return getI2C()->read( devAddr | 1, data, len );
     }
     
-    static I2C* mI2C;
 protected:
+    I2C* getI2C() const;
+
+    static const uint32_t mNumOfI2C;
+    static const PinName mSDA[];
+    static const PinName mSCL[];
+    static I2C* mI2C[];
+    
     const char mAddress;
 };