2626#include < string.h>
2727#include < stdarg.h>
2828#include < unistd.h>
29+ #include < fstream>
2930
3031// local library includes
3132#include " ./pendant.h"
@@ -749,11 +750,11 @@ void Hal::setStart(bool enabled)
749750 if (requestAutoMode (enabled))
750751 {
751752 if (enabled)
752- {
753- toggleStartResumeProgram ();
753+ {
754+ toggleStartResumeProgram ();
755+ }
756+ setPin (enabled, KeyCodes::Buttons.start .text );
754757 }
755- setPin (enabled, KeyCodes::Buttons.start .text );
756- }
757758
758759 if (!enabled)
759760 {
@@ -795,6 +796,24 @@ void Hal::clearStartResumeProgramStates()
795796 *memory->out .doRunProgram = false ;
796797 *memory->out .doResumeProgram = false ;
797798}
799+
800+ void Hal::checkState (bool state, hal_bit_t *pin)
801+ {
802+ // 500 milliseconds timeout
803+ unsigned int timeouts=500 ;
804+ unsigned int timeoutMs=1 ;
805+ do
806+ {
807+ if (state == *pin)
808+ {
809+ usleep (timeoutMs * 1000 );
810+ }
811+ else
812+ {
813+ break ;
814+ }
815+ } while ((state == *pin) && (--timeouts) > 0 );
816+ }
798817// ----------------------------------------------------------------------
799818void Hal::toggleStartResumeProgram ()
800819{
@@ -803,17 +822,21 @@ void Hal::toggleStartResumeProgram()
803822 *memory->out .doPauseProgram = false ;
804823 *memory->out .doRunProgram = false ;
805824 *memory->out .doResumeProgram = true ;
806- }
807- if (*memory->in .isProgramRunning )
825+ checkState (true , memory->in .isProgramPaused );
826+ *memory->out .doResumeProgram = false ;
827+ } else if (*memory->in .isProgramRunning )
808828 {
809829 *memory->out .doPauseProgram = true ;
830+ checkState (false , memory->in .isProgramPaused );
831+ *memory->out .doPauseProgram = false ;
810832 *memory->out .doRunProgram = false ;
811833 *memory->out .doResumeProgram = false ;
812- }
813- if (*memory->in .isProgramIdle )
834+ } else if (*memory->in .isProgramIdle )
814835 {
815836 *memory->out .doPauseProgram = false ;
816837 *memory->out .doRunProgram = true ;
838+ checkState (false , memory->in .isProgramRunning );
839+ *memory->out .doRunProgram = false ;
817840 *memory->out .doResumeProgram = false ;
818841 }
819842}
@@ -1335,8 +1358,8 @@ void Hal::setJogCounts(const HandWheelCounters& counters)
13351358 *memory->out .axisAJogCounts = counters.counts (HandWheelCounters::CounterNameToIndex::AXIS_A);
13361359 *memory->out .axisBJogCounts = counters.counts (HandWheelCounters::CounterNameToIndex::AXIS_B);
13371360 *memory->out .axisCJogCounts = counters.counts (HandWheelCounters::CounterNameToIndex::AXIS_C);
1338- requestManualMode (false );
1339- requestTeleopMode (false );
1361+ requestManualMode (false );
1362+ requestTeleopMode (false );
13401363}
13411364// ----------------------------------------------------------------------
13421365void Hal::setFunction (bool enabled)
@@ -1373,6 +1396,7 @@ bool Hal::requestMode(bool isRisingEdge, hal_bit_t *requestPin, hal_bit_t * mode
13731396{
13741397 if (isRisingEdge)
13751398 {
1399+ bool rv;
13761400 if (true == *modeFeedbackPin)
13771401 {
13781402 // shortcut for mode request which is already active
@@ -1381,15 +1405,16 @@ bool Hal::requestMode(bool isRisingEdge, hal_bit_t *requestPin, hal_bit_t * mode
13811405 // request mode
13821406 *requestPin = true ;
13831407 usleep (mHalRequestProfile .mode .holdMs * 1000 );
1408+ rv = waitForRequestedMode (modeFeedbackPin);
13841409 *requestPin = false ;
13851410 usleep (mHalRequestProfile .mode .spaceMs * 1000 );
1386- return waitForRequestedMode (modeFeedbackPin) ;
1411+ return rv ;
13871412 }
13881413 else
13891414 {
1390- // on button released always clear request
1391- *requestPin = false ;
1392- return false ;
1415+ // on button released always clear request
1416+ *requestPin = false ;
1417+ return false ;
13931418 }
13941419 return false ;
13951420}
@@ -1403,6 +1428,7 @@ bool Hal::waitForRequestedMode(volatile hal_bit_t * condition)
14031428 useconds_t timeoutMs = mHalRequestProfile .mode .modeCheckLoopTimeoutMs ;
14041429 unsigned int maxTimeouts = mHalRequestProfile .mode .modeCheckLoops ;
14051430 unsigned int timeouts = maxTimeouts;
1431+
14061432 do
14071433 {
14081434 if (false == *condition)
@@ -1417,7 +1443,7 @@ bool Hal::waitForRequestedMode(volatile hal_bit_t * condition)
14171443 if (false == *condition)
14181444 {
14191445 auto delay = (maxTimeouts - timeouts) * timeoutMs;
1420- std::cerr << " hal failed to wait for reqested mode. waited " << delay << " ms\n " ;
1446+ std::cerr << " hal failed to wait for requested mode. waited " << delay << " ms\n " ;
14211447 return false ;
14221448 }
14231449 else
0 commit comments