Dependents:   XBEE_LPC1114

Committer:
inst
Date:
Wed Oct 14 06:09:52 2015 +0000
Revision:
0:f55382f220f2
Child:
1:a3a4ae2c5af2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
inst 0:f55382f220f2 1 #include "mbed.h"
inst 0:f55382f220f2 2 #include "SerialToI2C.h"
inst 0:f55382f220f2 3
inst 0:f55382f220f2 4 SerialToI2C* SerialToI2C::mInstance = NULL;
inst 0:f55382f220f2 5 const char SerialToI2C::mControlMask = 0x30;
inst 0:f55382f220f2 6 const char SerialToI2C::mDetailMask = 0x0F;
inst 0:f55382f220f2 7 const char SerialToI2C::mDutyMask = 0xC0;
inst 0:f55382f220f2 8
inst 0:f55382f220f2 9 const PinName SerialToI2C::mAddressDeciderPinName[] = {
inst 0:f55382f220f2 10 dp17, dp18, dp26, dp25
inst 0:f55382f220f2 11 };
inst 0:f55382f220f2 12
inst 0:f55382f220f2 13 SerialToI2C::SerialToI2C( PinName sda, PinName scl, PinName tx, PinName rx ){
inst 0:f55382f220f2 14 mMoveDirection = 0;
inst 0:f55382f220f2 15 mMoveCoeff = 0.0f;
inst 0:f55382f220f2 16 mRoll = 0.0f;
inst 0:f55382f220f2 17 mActionType = STOP;
inst 0:f55382f220f2 18 mRecv = OWN_POLE | STOP;
inst 0:f55382f220f2 19 mI2CSentData = mRecv;
inst 0:f55382f220f2 20 mIsI2CSentDataChangeable = true;
inst 0:f55382f220f2 21 mAimState = OWN_POLE;
inst 0:f55382f220f2 22 mStopDetailType = HIGH_SPEED;
inst 0:f55382f220f2 23
inst 0:f55382f220f2 24 mLED = new DigitalOut( LED1, true );
inst 0:f55382f220f2 25
inst 0:f55382f220f2 26 mAddress = 0xA0; // 10100000(2)
inst 0:f55382f220f2 27 for ( int i = 0; i < 4; ++i ){
inst 0:f55382f220f2 28 // 101xxxx0 --- xxxxの部分に入力データが入る
inst 0:f55382f220f2 29 DigitalIn d( mAddressDeciderPinName[ i ] );
inst 0:f55382f220f2 30 mAddress |= d.read() << ( i + 1 );
inst 0:f55382f220f2 31 }
inst 0:f55382f220f2 32
inst 0:f55382f220f2 33 mI2C = new I2CSlave( sda, scl );
inst 0:f55382f220f2 34 mI2C->address( mAddress );
inst 0:f55382f220f2 35
inst 0:f55382f220f2 36 mXBee = new RawSerial( tx, rx );
inst 0:f55382f220f2 37 mXBee->baud( 19200 );
inst 0:f55382f220f2 38
inst 0:f55382f220f2 39 mXBee->attach( this, &SerialToI2C::recvSerial, Serial::RxIrq );
inst 0:f55382f220f2 40 }
inst 0:f55382f220f2 41
inst 0:f55382f220f2 42 void SerialToI2C::update(){
inst 0:f55382f220f2 43 stringToI2CData();
inst 0:f55382f220f2 44 updateI2CSlave();
inst 0:f55382f220f2 45 }
inst 0:f55382f220f2 46
inst 0:f55382f220f2 47 void SerialToI2C::updateI2CSlave(){
inst 0:f55382f220f2 48 switch ( mI2C->receive() ){
inst 0:f55382f220f2 49 case I2CSlave::ReadAddressed:{
inst 0:f55382f220f2 50 char buf[] = { mActionType, 0, mAimState, mIsSupplying };
inst 0:f55382f220f2 51
inst 0:f55382f220f2 52 switch ( mActionType ){
inst 0:f55382f220f2 53 case STOP:
inst 0:f55382f220f2 54 buf[ 1 ] = mStopDetailType;
inst 0:f55382f220f2 55 break;
inst 0:f55382f220f2 56
inst 0:f55382f220f2 57 case MOVE:
inst 0:f55382f220f2 58 buf[ 1 ] = mMoveDirection;
inst 0:f55382f220f2 59 break;
inst 0:f55382f220f2 60
inst 0:f55382f220f2 61 case ROLL:
inst 0:f55382f220f2 62 buf[ 1 ] = mRoll;
inst 0:f55382f220f2 63 break;
inst 0:f55382f220f2 64
inst 0:f55382f220f2 65 case SHOOT:
inst 0:f55382f220f2 66 break;
inst 0:f55382f220f2 67
inst 0:f55382f220f2 68 default:
inst 0:f55382f220f2 69 mActionType = STOP;
inst 0:f55382f220f2 70 break;
inst 0:f55382f220f2 71 }
inst 0:f55382f220f2 72
inst 0:f55382f220f2 73 mI2C->write( buf, 4 );
inst 0:f55382f220f2 74
inst 0:f55382f220f2 75 /*
inst 0:f55382f220f2 76 if ( ( mActionType == STOP ) &&
inst 0:f55382f220f2 77 ( ( mStopDetailType == INCREMENT ) || ( mStopDetailType == DECREMENT ) ) ){
inst 0:f55382f220f2 78 //mRecv &= 0xF0;
inst 0:f55382f220f2 79 mRecv &= 0xF8;
inst 0:f55382f220f2 80 }
inst 0:f55382f220f2 81 */
inst 0:f55382f220f2 82
inst 0:f55382f220f2 83 mI2CSentData = mRecv;
inst 0:f55382f220f2 84 break;
inst 0:f55382f220f2 85 }
inst 0:f55382f220f2 86 case I2CSlave::WriteGeneral:
inst 0:f55382f220f2 87 break;
inst 0:f55382f220f2 88
inst 0:f55382f220f2 89 case I2CSlave::WriteAddressed:
inst 0:f55382f220f2 90 break;
inst 0:f55382f220f2 91
inst 0:f55382f220f2 92 case I2CSlave::NoData:
inst 0:f55382f220f2 93 break;
inst 0:f55382f220f2 94 };
inst 0:f55382f220f2 95 }
inst 0:f55382f220f2 96
inst 0:f55382f220f2 97 void SerialToI2C::stringToI2CData(){
inst 0:f55382f220f2 98 // 受信したデータをロボットの行動情報に変換
inst 0:f55382f220f2 99 mActionType = static_cast< ActionType >( mRecv & 0x18 ); // 00011000(2)
inst 0:f55382f220f2 100 char detail = mRecv & 0x07; // 00000111(2)
inst 0:f55382f220f2 101 mAimState = static_cast< AimState >( mRecv & 0xC0 ); // 11000000(2)
inst 0:f55382f220f2 102 mIsSupplying = mRecv & 0x20; // 00100000(2)
inst 0:f55382f220f2 103
inst 0:f55382f220f2 104 switch ( mActionType ){
inst 0:f55382f220f2 105 case MOVE:{
inst 0:f55382f220f2 106 mMoveDirection = detail;
inst 0:f55382f220f2 107 break;
inst 0:f55382f220f2 108 }
inst 0:f55382f220f2 109 case ROLL:
inst 0:f55382f220f2 110 mRoll = detail;
inst 0:f55382f220f2 111 break;
inst 0:f55382f220f2 112
inst 0:f55382f220f2 113 case STOP:
inst 0:f55382f220f2 114 mStopDetailType = static_cast< StopDetailType >( detail );
inst 0:f55382f220f2 115 break;
inst 0:f55382f220f2 116
inst 0:f55382f220f2 117 case SHOOT:
inst 0:f55382f220f2 118 break;
inst 0:f55382f220f2 119
inst 0:f55382f220f2 120 default:
inst 0:f55382f220f2 121 break;
inst 0:f55382f220f2 122 }
inst 0:f55382f220f2 123 }
inst 0:f55382f220f2 124
inst 0:f55382f220f2 125 void SerialToI2C::recvSerial(){
inst 0:f55382f220f2 126 char recv = mXBee->getc();
inst 0:f55382f220f2 127
inst 0:f55382f220f2 128 if ( ( recv != mRecv ) &&
inst 0:f55382f220f2 129 ( mI2CSentData == mRecv ) ){
inst 0:f55382f220f2 130 mRecv = recv;
inst 0:f55382f220f2 131 }
inst 0:f55382f220f2 132 }