-
Notifications
You must be signed in to change notification settings - Fork 20
sim_ev3_src_change
I-am-one-2018 edited this page Sep 15, 2020
·
10 revisions
シミュレータについては、完全に実機をシミュレーションしたものではありません。それにより以下の差異が生じます。
- シミュレータと実機とのパラメータや個体差
- シミュレータと実機とのAPI(ログ出力等)
それぞれでソースを分けることも実装の一つですが、シミュレータと実機をビルド時に切り替えることで、ソースコードを共有することが可能です。
その方法として、以下の方法があります。
- プリプロセッサを使用し、実機またはシミュレーションのターゲットを切り分ける。
また、APIの差異については、以下を確認してください。
切替方法などについては、実行委員より提供している、「
sample_c4
」をもとに説明します。
【
sample_c4
の構成】
項番 | ファイル名 | 内容 | 備考 |
---|---|---|---|
① | app.c | サンプルプログラム | 説明対象 |
② | app.h | サンプルプログラムのヘッダーファイル | |
③ | app.cfg | コンフィグファイル |
差異によるソースコードの切り分けの実装例は以下の通りです。
34 /**
35 * シミュレータかどうかの定数を定義します
36 */
37 #if defined(MAKE_SIM)
38 static const int _SIM = 1;
39 #elif defined(MAKE_EV3)
40 static const int _SIM = 0;
41 #else
42 static const int _SIM = 0;
43 #endif
解説
38行目にて、シミュレータの場合、シミュレータか否かを判別フラグ(_SIM
)に有効(1
)が設定される。
40行目にて、実機の場合、判別フラグ(_SIM
)に無効(0
)が設定される。
なお、42行目については、シミュレータの動作と同様となります。
それにより、下記ソースコード(132~133行目)でスタート時のアクションの切り分け方が行えます。
129 ev3_led_set_color(LED_ORANGE); /* 初期化完了通知 */
130
131 _log("Go to the start, ready?");
132 if (_SIM) _log("Hit SPACE bar to start");
133 else _log("Tap Touch Sensor to start");
解説
- シミュレータの場合
リモート接続しているコンソールに、Hit SPACE bar to start
が表示され、スペースキー
の押下で走行体のライントレースが開始 - 実機の場合
EV3のコンソールに、Tap Touch Sensor to start
が表示され、タッチセンサー
の押下で走行体のライントレースが開始
シミュレータ/実機を切り替えるには、以下のビルド方法になります。
【ビルド方法】
区分 | コマンド |
---|---|
シミュレーター | make app=sample_c4 sim |
実機 | make app=sample_c4 |
完全な実機のシミュレーションではないため、使用するAPIによって実機との差異があります。
そのひとつに、ログ出力に差異があります。
区分 | API | 補足 |
---|---|---|
シミュレーター | syslog |
シミュレーションを起動したコンソール上に出力 |
実機 | ev3_lcd_draw_string |
実機のLCDに出力 |
282 static void _syslog(int level, char* text){
283 static int _log_line = 0;
284 if (_SIM)
285 {
286 syslog(level, text);
287 }
288 else
289 {
290 ev3_lcd_draw_string(text, 0, CALIB_FONT_HEIGHT*_log_line++);
291 }
292 }
解説
「1.シミュレータと実機とのパラメータや個体差の切り分け方について」にて実装例で示した、判別フラグ(_SIM
)を使用して実機とシミュレーションでのAPIの差異を切り分けすること可能となります。
Copyright (C) 2020-2024 ETロボコン実行委員会, Released under the MIT License.