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へ続く…