sim_ev3_src_change - ETrobocon/etrobo GitHub Wiki
ETロボコンシミュレータにおける実機とシミュレータの切り分け方
はじめに
シミュレータについては、完全に実機をシミュレーションしたものではありません。それにより以下の差異が生じます。
- シミュレータと実機とのパラメータや個体差
- シミュレータと実機とのAPI(ログ出力等)
それぞれでソースを分けることも実装の一つですが、シミュレータと実機をビルド時に切り替えることで、ソースコードを共有することが可能です。
その方法として、以下の方法があります。
- プリプロセッサを使用し、実機またはシミュレーションのターゲットを切り分ける。
また、APIの差異については、以下を確認してください。
切替方法などについては、実行委員より提供している、「
sample_c4」をもとに説明します。
サンプルプログラムの構成
【
sample_c4の構成】
| 項番 | ファイル名 | 内容 | 備考 |
|---|---|---|---|
| ① | app.c | サンプルプログラム | 説明対象 |
| ② | app.h | サンプルプログラムのヘッダーファイル | |
| ③ | app.cfg | コンフィグファイル |
実装例
差異によるソースコードの切り分けの実装例は以下の通りです。
1.シミュレーターと実機とのパラメータや個体差の切り分け方について
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 |
2.シミュレータと実機とのAPI(ログ出力等)の切り分け方について
完全な実機のシミュレーションではないため、使用する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の差異を切り分けすること可能となります。