SerialToI2C.cpp@0:f55382f220f2, 2015-10-14 (annotated)
- Committer:
- inst
- Date:
- Wed Oct 14 06:09:52 2015 +0000
- Revision:
- 0:f55382f220f2
- Child:
- 1:a3a4ae2c5af2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |