YMotorDriverSupplier.cpp
- Committer:
- inst
- Date:
- 2015-08-23
- Revision:
- 0:bb84da068c45
- Child:
- 1:9d8fe1f0ee36
File content as of revision 0:bb84da068c45:
#include "YMotorDriverBase.h" #include "YMotorDriverSupplier.h" #include "mbed.h" const float YMotorDriverSupplier::mDuty = 0.30f; const PinName YMotorDriverSupplier::mDinPinName[] = { dp2, // lazer dp4 // photointerrupter }; const float YMotorDriverSupplier::mTimeout_sec = 2.5f; YMotorDriverSupplier::YMotorDriverSupplier( char address ) : YMotorDriverBase( address ){ mLazerDin = new DigitalIn( mDinPinName[ LAZER ] ); mPhotointerrupter = new InterruptIn( mDinPinName[ PHOTOINTERRUPTER ] ); mPhotointerrupter->fall( this, &YMotorDriverSupplier::itr ); mPhotointerrupter->rise( this, &YMotorDriverSupplier::itr ); mTimer = new Timer; mTimer->stop(); mTimer->reset(); mLazerTimer = new Timer; mIsWorking = false; mIsMayStoppable = false; mHasFinished = false; mPrevInterrupterState = mPhotointerrupter->read(); } void YMotorDriverSupplier::itr(){ /* bool newState = mPhotointerrupter->read(); if ( newState != mPrevInterrupterState ){ mIsWorking = false; mPrevInterrupterState = newState; } */ float validSignalWidth_us = 80 * 1000; // if ( mTimer->read_us() > validSignalWidth_us ){ // //mIsWorking = false; mHasFinished = true; mTimer->reset(); mTimer->stop(); mLazerTimer->reset(); mLazerTimer->start(); // } // /* mIsStoppable = true; mNewInterrupterState = mPhotointerrupter->read(); mTimer->start(); */ } void YMotorDriverSupplier::update(){ switch ( mI2C->receive() ){ case I2CSlave::ReadAddressed:{ char buf = mIsWorking; mI2C->write( &buf, 1 ); break; } case I2CSlave::WriteGeneral: break; case I2CSlave::WriteAddressed:{ char buf; mI2C->read( &buf, 1 ); // if ( buf && !mIsWorking ){ mTimer->reset(); mTimer->start(); } // mIsWorking = buf; break; } case I2CSlave::NoData: break; } updateSupplier(); write(); } void YMotorDriverSupplier::updateSupplier(){ /* bool hasFinished = mIsWorking; hasFinished &= !mLazerDin->read(); hasFinished |= ( mTimer->read() > mTimeout_sec ); if ( hasFinished ){ mIsWorking = false; mTimer->stop(); mTimer->reset(); } */ /* float validSignalWidth_us = 100; if ( mIsMayStoppable ){ if ( mTimer->read_us() > validSignalWidth_us ){ mIsMayStoppable = false; mIsWorking = false; mTimer->stop(); mTimer->reset(); } } */ MotorAction action = BRAKE; int fallingAmmoTime_us = 500 * 1000; if ( mHasFinished ){ if ( !mLazerDin->read() ){ mIsWorking = false; mHasFinished = false; mLazerTimer->stop(); mLazerTimer->reset(); } else if ( mLazerTimer->read_us() > fallingAmmoTime_us ){ mHasFinished = false; mLazerTimer->stop(); mLazerTimer->reset(); mTimer->reset(); mTimer->start(); } } else if ( mIsWorking ){ action = FORWARD; setDuty( mDuty ); } /* if ( mIsWorking ){ action = FORWARD; setDuty( mDuty ); } */ setMotorAction( action ); }