FRCプログラムが動く仕組み-Part2

2020年3月25日

こちらはPart2です。Part1をご覧になっていない方はまずはこちらからご覧ください。

LoopFunc()さん。ぱっと見長かったからPart切ったけど、後でまとめるかも。
ちなみにTimedRobotの親のIterativeRobotで実装された関数。


protected void loopFunc() {
/**
* ウォッチドッグタイマー は、コンピュータシステムにおいて定期的に発動することで、
* システムが機能し続けていることを確認させるためのタイマーである。 (ウィキペディア)
*/
m_watchdog.reset();
// Call the appropriate function depending upon the current robot mode
if (isDisabled()) {
/* 起動時or違うモードからの変化時に初期化する */
if (m_lastMode != Mode.kDisabled) {
// LiveWindowとShuffleboardの処理
disabledInit();
/* watchdogのHashMapにDisableになった時間を追加。他も同様。 */
     m_watchdog.addEpoch("disabledInit()");
m_lastMode = Mode.kDisabled;
}
    /** 
* Disable時に毎回呼ばれる。 
* DisableInit()と同じループで呼ばれることに注意。
*/
disabledPeriodic();
m_watchdog.addEpoch("disablePeriodic()");
} else if (isAutonomous()) {
// Disableと同様
} else if (isOperatorControl()) {
// Disableと同様。OperatorControlはTeleOpのこと。
} else {
// Disableと同様。Test時
}
/* いついかなる時も呼ばれる */
robotPeriodic();
m_watchdog.addEpoch("robotPeriodic()");
/* SmartDashboard, LiveWindow, Shuffleboardの更新、watchdogのHashMapに追加
// シミュレーションならその処理
m_watchdog.disable();
/**
* ループ時間をオーバーしたときに警告する
* ループ一周目に起きがち
*/ 
if (m_watchdog.isExpired()) {
m_watchdog.printEpochs();
}
}

まとめ

loopFunc()のフローチャート

図にするとこんな感じ。単純だけど、robotPeriodic()が常に実行されることに注意!

ここでほぼほぼ終わりです!

あとはおまけレベル。一周の時間を超過したときどうなるかってところを見ていきます。
Part3へ続く…