bool execute_master_command_2(Meridim90Union a_meridim, bool a_flg_exe)


Master Commandの第2群を実行する. 受信コマンドに基づき, 異なる処理を行う.
引数1 : a_meridim 実行したいコマンドの入ったMeridim配列を渡す.
引数2 : a_flg_exe Meridimの受信成功判定フラグを渡す.
戻り値 : コマンドを実行した場合はtrue, しなかった場合はfalseを返す.


/// @brief Master Commandの第2群を実行する. 受信コマンドに基づき, 異なる処理を行う.
/// @param a_meridim 実行したいコマンドの入ったMeridim配列を渡す.
/// @param a_flg_exe Meridimの受信成功判定フラグを渡す.
/// @return コマンドを実行した場合はtrue, しなかった場合はfalseを返す.
bool execute_master_command_2(Meridim90Union a_meridim, bool a_flg_exe) {
  if (!a_flg_exe) {
    return false;
  }

  // コマンド[90]: 1~999は MeridimのLength. デフォルトは90

  // コマンド:[0] 全サーボ脱力
  if (a_meridim.sval[MRD_MASTER] == 0) {
    mrd_servos_all_off(s_udp_meridim);
    return true;
  }

  // コマンド:[1] サーボオン 通常動作

  // コマンド:MCMD_UPDATE_YAW_CENTER (10002) IMU/AHRSのヨー軸リセット
  if (a_meridim.sval[MRD_MASTER] == MCMD_UPDATE_YAW_CENTER) {
    ahrs.yaw_origin = ahrs.yaw_source;
    Serial.println("cmd: yaw reset.");
    return true;
  }

  // コマンド:MCMD_ENTER_TRIM_MODE (10003) トリムモードに入る(既存のものは廃止し, 検討中)

  // コマンド:MCMD_BOARD_TRANSMIT_PASSIVE (10006) UDP受信の通信周期制御をPC側主導に(SSH的な動作)
  if (a_meridim.sval[MRD_MASTER] == MCMD_BOARD_TRANSMIT_PASSIVE) {
    flg.udp_board_passive = true; // UDP送信をパッシブモードに
    flg.frame_timer_reset = true; // フレームの管理時計をリセットフラグをセット
    return true;
  }

  // コマンド:MCMD_RESET_MRD_TIMER) (10007) フレーム管理時計tmr.mrd_milを現在時刻にリセット
  if (a_meridim.sval[MRD_MASTER] == MCMD_RESET_MRD_TIMER) {
    flg.frame_timer_reset = true; // フレームの管理時計をリセットフラグをセット
    return true;
  }

  // コマンド:MCMD_STOP_BOARD_DURING (10008) ボードの末端処理を指定時間だけ止める.
  if (a_meridim.sval[MRD_MASTER] == MCMD_STOP_BOARD_DURING) {
    flg.stop_board_during = true; // ボードの処理停止フラグをセット
    // ボードの末端処理をmeridim[2]ミリ秒だけ止める.
    Serial.print("Stop ESP32's processing during ");
    Serial.print(int(a_meridim.sval[MRD_STOP_FRAMES_MS]));
    Serial.println(" ms.");
    for (int i = 0; i < int(a_meridim.sval[MRD_STOP_FRAMES_MS]); i++) {
      delay(1);
    }
    flg.stop_board_during = false; // ボードの処理停止フラグをクリア
    flg.frame_timer_reset = true; // フレームの管理時計をリセットフラグをセット
    return true;
  }
  return false;
}