Skip to content

Commit

Permalink
Merge pull request #326 from ut-issl/feature/modify_utl_pytest
Browse files Browse the repository at this point in the history
Pre Release (v3.6.0-beta.4): WINGS側でUTLが0.1s精度で打てるようになったことへの対応
  • Loading branch information
chutaro authored May 16, 2022
2 parents 7e9691b + f76c30d commit e9f102b
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ def test_tmgr_set_and_reset_cycle_correction():
@pytest.mark.sils
@pytest.mark.real
def test_tmgr_utl_cmd():
# TLテレメをTL0のページ0にセット
# TLテレメを TL_gs の ページ0 にセット
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TLCD_SET_ID_FOR_TLM,
Expand All @@ -153,25 +153,40 @@ def test_tmgr_utl_cmd():
c2a_enum.Tlm_CODE_HK,
)

# ===== 実行unixtime > unixtime_at_ti0 の場合 =====
unixtime_at_ti0 = time.time()
test_utl_cmd_ten_times(unixtime_at_ti0, TMGR_DEFAULT_UNIXTIME_EPOCH_FOR_UTL, 1.0)
# ===== 通常時 =====
check_utl_cmd_with(TMGR_DEFAULT_UNIXTIME_EPOCH_FOR_UTL, 1.0)

# ===== 実行unixtime < unixtime_at_ti0 の場合 =====
# TODO: TL0に登録されないことを確認する
# ===== 過去の時刻を指定した場合 =====
# コマンドが登録されず TLC_PAST_TIME のエラーが出ることを確認する
# generate_and_receive_tlm を使うとそれが成功して CMD_ACK = SUCCESS と上書きされてしまうので, utl で3秒後に generate_tlm を発火させる
wings.util.send_utl_cmd(
ope,
time.time() + 3,
c2a_enum.Cmd_CODE_GENERATE_TLM,
(0x40, c2a_enum.Tlm_CODE_GS, 1),
)
wings.util.send_utl_cmd(
ope,
time.time() - 100000,
c2a_enum.Cmd_CODE_NOP,
(),
)
time.sleep(3)
tlm_GS = ope.get_latest_tlm(c2a_enum.Tlm_CODE_GS)[0]
assert tlm_GS["GS.CCSDS.RX.CMD_ACK"] == "TLC_PAST_TIME"

# ===== CYCLES_PER_SEC を補正した場合 =====
# 0.5 <= set_value <= 2.0 でランダムに補正倍率をセットする
set_value = random.uniform(0.5, 2.0)
test_utl_cmd_ten_times(unixtime_at_ti0, TMGR_DEFAULT_UNIXTIME_EPOCH_FOR_UTL, set_value)
# 0.7 <= set_value <= 1.3 でランダムに補正倍率をセット
set_value = random.uniform(0.7, 1.3)
check_utl_cmd_with(TMGR_DEFAULT_UNIXTIME_EPOCH_FOR_UTL, set_value)

# ===== epoch が変わった場合 =====
new_epoch = time.time()
test_utl_cmd_ten_times(unixtime_at_ti0, new_epoch, 1.0)
# ===== epoch を変えた場合 =====
new_epoch = time.time() - 86400 * 30 # 例えば30日前に変更
check_utl_cmd_with(new_epoch, 1.0)

# ===== epoch を変えて CYCLES_PER_SEC も補正した場合 =====
set_value = random.uniform(0.5, 2.0)
test_utl_cmd_ten_times(unixtime_at_ti0, new_epoch, set_value)
set_value = random.uniform(0.7, 1.3)
check_utl_cmd_with(new_epoch, set_value)


@pytest.mark.sils
Expand All @@ -185,7 +200,7 @@ def test_tmgr_final_check():
c2a_enum.Tlm_CODE_HK,
)

# TL0をクリア
# TL_gs をクリア
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TLCD_CLEAR_ALL_TIMELINE,
Expand All @@ -194,14 +209,8 @@ def test_tmgr_final_check():
)


def test_utl_cmd_ten_times(unixtime_at_ti0, utl_unixtime_epoch, cycle_correction):
# unixtime_at_ti0, utl_unixtime_epoch, cycle_correction を設定する
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TMGR_UPDATE_UNIXTIME,
(unixtime_at_ti0, 0, 0),
c2a_enum.Tlm_CODE_HK,
)
def check_utl_cmd_with(utl_unixtime_epoch, cycle_correction):
# utl_unixtime_epoch, cycle_correction を設定する
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TMGR_SET_UTL_UNIXTIME_EPOCH,
Expand All @@ -212,28 +221,32 @@ def test_utl_cmd_ten_times(unixtime_at_ti0, utl_unixtime_epoch, cycle_correction
ope, c2a_enum.Cmd_CODE_TMGR_SET_CYCLE_CORRECTION, (cycle_correction,), c2a_enum.Tlm_CODE_HK
)

# 最初にTL0をクリアしておく
# unixtime_info を現在の unixtime と ti で同期する
# 必ず Cmd_CODE_TMGR_SET_CYCLE_CORRECTION のあとに送ること
unixtime_now = time.time()
tlm_HK = ope.get_latest_tlm(c2a_enum.Tlm_CODE_HK)[0]
ti_now = tlm_HK["HK.SH.TI"]
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TLCD_CLEAR_ALL_TIMELINE,
(c2a_enum.TLCD_ID_FROM_GS,),
c2a_enum.Cmd_CODE_TMGR_UPDATE_UNIXTIME,
(unixtime_now, ti_now, 0),
c2a_enum.Tlm_CODE_HK,
)
unixtime_at_ti0 = unixtime_now - ti_now / (OBCT_CYCLES_PER_SEC * cycle_correction)

tlm_HK = wings.util.generate_and_receive_tlm(
ope, c2a_enum.Cmd_CODE_GENERATE_TLM, c2a_enum.Tlm_CODE_HK
# 最初にTL_gsをクリアしておく
assert "SUC" == wings.util.send_rt_cmd_and_confirm(
ope,
c2a_enum.Cmd_CODE_TLCD_CLEAR_ALL_TIMELINE,
(c2a_enum.TLCD_ID_FROM_GS,),
c2a_enum.Tlm_CODE_HK,
)
unixtime_now = unixtime_at_ti0 + tlm_HK["HK.SH.TI"] / (OBCT_CYCLES_PER_SEC * cycle_correction)

# NOP を10個, 未来のランダムな unixtime で登録する
unixtime_of_cmds = generate_random_unixtime(unixtime_now, 10)
unixtime_of_cmds = generate_random_unixtime(10)
send_utl_nops(unixtime_of_cmds)

# 重複を削除して時刻順に並べ替え
unixtime_of_cmds = list(set(unixtime_of_cmds))
unixtime_of_cmds.sort()

# TL0 に正しく登録されているか確認
# TL_gs に正しく登録されているか確認
tlm_TL = wings.util.generate_and_receive_tlm(
ope, c2a_enum.Cmd_CODE_GENERATE_TLM, c2a_enum.Tlm_CODE_TL
)
Expand All @@ -249,11 +262,17 @@ def test_utl_cmd_ten_times(unixtime_at_ti0, utl_unixtime_epoch, cycle_correction


# 未来のランダムな時刻の unixtime を num 個生成する
def generate_random_unixtime(unixtime_now, num):
# TODO: wingsがutl_cmdの時刻引数を0.1秒刻みで受け付けるように改修されたら, 整数縛りをなくす
unixtime_future = (int)(unixtime_now) + 1000
# WINGS に合わせて0.1秒精度で指定する
def generate_random_unixtime(num):
unixtime_future = int(time.time() + 1000)
unixtimes = [
unixtime_future + random.randrange(0, 1000, 2) * 0.1 for i in range(num)
] # 少なくとも0.2秒間隔をあける

return [unixtime_future + random.randrange(100) for i in range(num)]
# 重複を削除して時刻順に並べ替え
unixtimes = list(set(unixtimes))
unixtimes.sort()
return unixtimes


def send_utl_nops(unixtime_of_cmds):
Expand All @@ -267,6 +286,7 @@ def send_utl_nops(unixtime_of_cmds):
)


# unixtime を ti に変換する(小数精度)
def calc_ti_from_unixtime(unixtime, unixtime_at_ti0, epoch, cycle_correction):
precise_cycles_per_sec = OBCT_CYCLES_PER_SEC * cycle_correction

Expand All @@ -278,9 +298,9 @@ def calc_ti_from_unixtime(unixtime, unixtime_at_ti0, epoch, cycle_correction):


if __name__ == "__main__":
test_tmgr_final_check()
# test_tmgr_set_time()
# test_tmgr_set_unixtime()
# test_tmgr_set_utl_unixtime_epoch()
# test_tmgr_utl_cmd()
test_tmgr_utl_cmd()
test_tmgr_final_check()
pass
46 changes: 25 additions & 21 deletions System/TimeManager/time_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/
#include "time_manager.h"
#include <string.h>
#include "../../Library/c2a_round.h"
#include "../TaskManager/task_dispatcher.h"
#include "../../TlmCmd/common_cmd_packet_util.h"

Expand Down Expand Up @@ -133,7 +134,7 @@ void TMGR_clear_unixtime_info(void)

TMGR_ACK TMGR_update_unixtime(const double unixtime, const ObcTime* time)
{
double ti_sec = TMGR_get_precice_ti_in_sec(time);
double ti_sec = TMGR_get_precise_ti_in_sec(time);

// unixtime が ti より小さいと困る
if (unixtime < ti_sec) return TMGR_ACK_PARAM_ERR;
Expand All @@ -153,38 +154,49 @@ double TMGR_get_utl_unixtime_epoch(void)
return time_manager_.unixtime_info_.utl_unixtime_epoch;
}

double TMGR_get_precice_cycles_per_sec(void)
double TMGR_get_precise_cycles_per_sec(void)
{
return OBCT_CYCLES_PER_SEC * time_manager_.unixtime_info_.cycle_correction;
}

double TMGR_get_precice_ti_in_sec(const ObcTime* time)
double TMGR_get_precise_ti_in_sec(const ObcTime* time)
{
double cycle = time->total_cycle + (double)time->step / OBCT_STEPS_PER_CYCLE;
return cycle / TMGR_get_precice_cycles_per_sec();
return cycle / TMGR_get_precise_cycles_per_sec();
}

double TMGR_get_current_unixtime(void)
{
return TMGR_get_unixtime_at_ti0() + TMGR_get_precice_ti_in_sec(&time_manager_.master_clock_);
return TMGR_get_unixtime_at_ti0() + TMGR_get_precise_ti_in_sec(&time_manager_.master_clock_);
}

double TMGR_get_unixtime_from_obc_time(const ObcTime* time)
{
return TMGR_get_unixtime_at_ti0() + TMGR_get_precice_ti_in_sec(time);
return TMGR_get_unixtime_at_ti0() + TMGR_get_precise_ti_in_sec(time);
}

double TMGR_get_unixtime_from_utl_unixtime(const cycle_t utl_unixtime)
{
return TMGR_get_utl_unixtime_epoch() + (double)utl_unixtime / OBCT_CYCLES_PER_SEC;
}

double TMGR_get_precise_ti_from_unixtime(const double unixtime)
{
double ti = (unixtime - TMGR_get_unixtime_at_ti0()) * TMGR_get_precise_cycles_per_sec();

// unixtime_at_ti0 より小さい引数は無効なのでゼロを返す
if (ti < 0) return 0;

return ti;
}

ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime)
{
double diff_in_cycle = (unixtime - TMGR_get_unixtime_at_ti0()) * TMGR_get_precice_cycles_per_sec();
double diff_in_cycle = TMGR_get_precise_ti_from_unixtime(unixtime);
cycle_t cycle;
step_t step;
ObcTime res;

if (diff_in_cycle < 0) // あり得ない, おかしい
{
return OBCT_create(0, 0, 0);
}
cycle = (cycle_t)diff_in_cycle; // cycle未満は切り捨て
step = (step_t)((diff_in_cycle - cycle) * OBCT_STEPS_PER_CYCLE); // step未満は切り捨て

Expand All @@ -195,20 +207,12 @@ ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime)
return res;
}

double TMGR_get_unixtime_from_utl_unixtime(const cycle_t utl_unixtime)
{
return TMGR_get_utl_unixtime_epoch() + (double)utl_unixtime / OBCT_CYCLES_PER_SEC;
}

cycle_t TMGR_get_ti_from_utl_unixtime(const cycle_t utl_unixtime)
{
double unixtime = TMGR_get_unixtime_from_utl_unixtime(utl_unixtime);
double ti_in_sec = unixtime - TMGR_get_unixtime_at_ti0();

// unixtime_at_ti0 より小さい実行時刻は無効なのでゼロを返す
if (ti_in_sec < 0) return 0;
double ti = TMGR_get_precise_ti_from_unixtime(unixtime);

return (cycle_t)(ti_in_sec * TMGR_get_precice_cycles_per_sec() );
return (cycle_t)c2a_round(ti);
}

static TMGR_ACK TMGR_set_utl_unixtime_epoch_(double utl_unixtime_epoch)
Expand Down
28 changes: 18 additions & 10 deletions System/TimeManager/time_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,14 +172,14 @@ double TMGR_get_utl_unixtime_epoch(void);
* @param void
* @return cycles_per_sec
*/
double TMGR_get_precice_cycles_per_sec(void);
double TMGR_get_precise_cycles_per_sec(void);

/**
* @brief OBC のクロック誤差を反映した正確な ti を秒単位で返す
* @param[in] time ti を保持している OBCTime
* @return ti(秒単位, 小数点以下も保持)
*/
double TMGR_get_precice_ti_in_sec(const ObcTime* time);
double TMGR_get_precise_ti_in_sec(const ObcTime* time);

/**
* @brief 現在の unixtime を OBC の ti をもとに計算して返す
Expand All @@ -195,14 +195,6 @@ double TMGR_get_current_unixtime(void);
*/
double TMGR_get_unixtime_from_obc_time(const ObcTime* time);

/**
* @brief unixtime を ObcTime に変換する
* @param[in] unixtime
* @retval {0, 0, 0} : 引数の unixtime が unixtime_at_ti0 より小さいとき
* @retval ObcTime : それ以外
*/
ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime);

/**
* @brief UTL_cmdで用いる utl_unixtime を 一般的なunixtimeに変換する
* @note utl_unixtime の単位としての cycle は, OBC のクロック誤差を含まない定義通りの値であることに注意
Expand All @@ -211,6 +203,22 @@ ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime);
*/
double TMGR_get_unixtime_from_utl_unixtime(const cycle_t utl_unixtime);

/**
* @brief unixtime を TI (cycle単位) に変換する
* @param[in] unixtime
* @retval 0 : 引数の unixtime が unixtime_at_ti0 より小さいとき
* @retval TI : それ以外. 整数に丸めず double のまま返す
*/
double TMGR_get_precise_ti_from_unixtime(const double unixtime);

/**
* @brief unixtime を ObcTime に変換する
* @param[in] unixtime
* @retval {0, 0, 0} : 引数の unixtime が unixtime_at_ti0 より小さいとき
* @retval ObcTime : それ以外
*/
ObcTime TMGR_get_obc_time_from_unixtime(const double unixtime);

/**
* @brief 引数で指定された utl_unixtime に対応する TI を返す
* @note UTL_cmd で実行時刻情報を TI に変換する際に用いる
Expand Down
2 changes: 1 addition & 1 deletion c2a_core_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ void C2A_core_main(void);
#define C2A_CORE_VER_MAJOR (3)
#define C2A_CORE_VER_MINOR (6)
#define C2A_CORE_VER_PATCH (0)
#define C2A_CORE_VER_PRE ("beta.3")
#define C2A_CORE_VER_PRE ("beta.4")

#endif

0 comments on commit e9f102b

Please sign in to comment.