//-------------------------------------------------------------------------------- void AVCLanHonda::checkWait() //-------------------------------------------------------------------------------- { if ( isWait() && (getWaitTime() < millis()) ) { setWaitTime( 0L ); } }
// process action //-------------------------------------------------------------------------------- void AVCLanHonda::processAction( AvcActionID ActionID ) //-------------------------------------------------------------------------------- { if ( bFirstStart_20 ) { if ( (INIT2_TIME > millis()) && (ACT_CAM_ON == ActionID) ) { bShowRearCam = true; setHondaDisLast(false); bShowHondaDisp = true; bFirstStart_20 = false; setWaitTime(0L); return; } if ( INIT2_TIME < millis() ) bFirstStart_20 = false; } if ( bPrepareCamOff && (ACT_B_DISPOFF == ActionID) ) { ActionID = ACT_CAM_OFF; } else bPrepareCamOff = false; switch ( ActionID ) { case ACT_BUTTON_UP: { if ( !bShowRearCam || !isWait() ) { if ( ULONG_MAX > (millis() + BUTT_WAIT) ) setWaitTime( (unsigned long)((millis() + BUTT_WAIT)) ); else setWaitTime( BUTT_WAIT ); } } break; case ACT_CAM_ON: bShowRearCam = true; setHondaDisLast( isShowHondaDisp() ); bShowHondaDisp = true; setWaitTime(0L); break; case ACT_B_DISPOFF: case ACT_B_DISPFULL_UP: case ACT_B_DISPHULF: if ( !bShowRearCam ) { // need freeze on 2000 sec after code receiving. bShowHondaDisp = false; setHondaDisLast( false ); setWaitTime(0L); bFreeze = true; freezeTime = (millis() + FREEZE_TIME); } break; case ACT_CAM_OFF: bShowRearCam = false; bShowHondaDisp = bHondaDisLast; setWaitTime(0L); break; case ACT_PREP_CAMOFF: bPrepareCamOff = true; break; } };
void control( void ) { while (1) { if ( isWait() ) waiting(); eleStat.dir = newDirection( eleStat.dir, eleStat.floor ); if ( isStop( eleStat.dir, eleStat.floor ) ) stop( eleStat.dir, eleStat.floor ); showDir( eleStat.dir ); if ( eleStat.dir != 0 && !isStop( eleStat.dir, eleStat.floor ) ) move( eleStat.dir, &eleStat.floor ); } }
void waiting( void ) { int waitTime = 0; eleStat.dir = 0; while ( isWait() ) { //计时,等待超时则返回第一层 if ( waitTime > maxWaitTime ) if ( eleStat.floor != 1 ) { eleStat.inRqst[1] = 1; break; } waitTime ++; fprintf( oPtr, "%-4d:Wait at Floor %d\n", Time, eleStat.floor ); sprintf( msg, "%-4d:Wait at Floor %d\n", Time, eleStat.floor ); drawInfo( msg ); putClock( 1 ); } return; }
/** * スレッドのメイン処理 * @param diff 経過時間 * @return スレッド実行終了なら true */ bool Thread::_main(long diff) { // スレッドとして動作できてない場合は即終了 if (_status == THREAD_NONE) { return true; } if (_status == THREAD_LOADING_FILE) { // ファイル読み込み処理 const char *dataAddr; int dataSize; if (sqobjCheckFile(_fileHandler, &dataAddr, &dataSize)) { _init(); SQRESULT ret = sqstd_loadmemory(_thread, dataAddr, dataSize, _scriptName.getString(), SQTrue); sqobjCloseFile(_fileHandler); _fileHandler = NULL; if (SQ_SUCCEEDED(ret)) { _status = THREAD_RUN; } else { // exit相当 printError(); _exit(); return true; } } else { // 読み込み完了待ち return false; } } else if (_status == THREAD_LOADING_FUNC) { // スクリプト読み込み処理 _init(); _func.push(_thread); _func.clear(); _status = THREAD_RUN; } _currentTick += diff; // タイムアウト処理 if (_waitTimeout >= 0) { _waitTimeout -= diff; if (_waitTimeout < 0) { _clearWait(); } } // スレッド実行 if (!isWait() && _status == THREAD_RUN) { SQRESULT result; if (sq_getvmstate(_thread) == SQ_VMSTATE_SUSPENDED) { _waitResult.push(_thread); _waitResult.clear(); result = sq_wakeupvm(_thread, SQTrue, SQTrue, SQTrue, SQFalse); } else { sq_pushroottable(_thread); SQInteger n = _args.pushArray(_thread) + 1; _args.clear(); result = sq_call(_thread, n, SQTrue, SQTrue); } if (SQ_FAILED(result)) { // スレッドがエラー終了 printError(); _exit(); } else { // 終了コード取得。return/suspend の値が格納される _exitCode.getStack(_thread, -1); sq_pop(_thread, 1); if (sq_getvmstate(_thread) == SQ_VMSTATE_IDLE) { // スレッドが終了 _exit(); } } } return _status == THREAD_NONE; }
/** * @return 実行ステータス */ int Thread::getStatus() { return isWait() ? THREAD_WAIT : _status; }