02 cloocaチュートリアル(gr-sakura)
-
Upload
kenji-hisazumi -
Category
Documents
-
view
689 -
download
0
Transcript of 02 cloocaチュートリアル(gr-sakura)
目次• Clooca 上の MEXU ツールを使用して GR-SAKURA を制
御する• MEXU ツールはひとつのクラス図とクラスに所属するス
テートマシン図から C++ ソースコードを生成する• 手順
• Clooca 上• アカウントの作成• MEXU ツールのインポート• プロジェクトの作成• クラス図の作成• ステートマシン図の作成
• クラウドコンパイラ上• ビルド
2
ステートマシン図
10
開始擬似状態が必要
初期状態状態名は C+
+ の命名規則に沿っていれば自由に設定できる
状態遷移を引きイベントを設定
イベント名は C++ の命名規則に沿っていれば自由に設定
できる
ステートにアクションを記述
11
状態を選択して entry アクションを記述状態遷移が発生した時に一回だけ実行されるアクションは C++ で記述(生成されたコードにそのまま埋め込まれる)main.h に記載されている関数,変数は利用可能
注意! :初期状態の entry アクションは起動時に1回無条件に実行される
インスタンスの生成 / 初期化
Controller controller;
void setup_classes(void) {
pinMode(PIN_LED0, OUTPUT);
}
12
1) Model Explorer から ClassDiagram を選択
2) Property の bodyhook に記述
bodyhook の中身
インスタンス群を生成
setup_classes 関数が起動時に一回だけ呼び出されるので
初期化を行う
イベントの送信• 送信先 .sendEvent( イベント ID)
• 送信先• 送信先インスタンス
• イベント ID• イベント ID は「クラス名 _EVENT_ イベント名」のマクロで定義され
る
• bodyhook 中で定義したインスタンスは,ステートマシン図のアクション記述の中で参照可能
13
タイマ• 以下のコードで指定した時間後に,イベント送信先に,
イベントが送信される• timer.add( ミリ秒,イベント送信先,イベント名 )
• 例 :• timer.add(500, this, Controller_EVENT_fire);• 500 ミリ秒後に自分自身に fire イベントを送信
• イベントは一回のみ送信される• timer.addR( ミリ秒,イベント送信先,イベント名 )
• イベント繰り返し発生する• (あまりテストされていないので使用注意)
14
ビルド (1) : ランタイムライブラリの設定• clooca / MEXU ランタイムライブラリをダウンロード
• https://dl.dropboxusercontent.com/u/6138936/mexu/sakura.zip• stm.h / stm.cpp を動作させる他に必要なランタイムライブラリ
• MEXU.cpp, MEXU.h, main.cpp, main.h• +α : grsakura.sh, grsakura-inspection.sh
• クラウドコンパイラに上記 zip ファイルをインポート• Project_Root を右クリック→ zip ファイルインポート
• (モデルによって変化しない)固定部分なので1度のみ実行で OK
15
ビルド (2) : 生成コードのアップロード• clooca でソースコードをダウンロード
• zip ファイルがダウンロード出来る• zip ファイル中の stm.h / stm.cpp が生成されたコード
• クラウドコンパイラに上記 zip ファイルをインポート• Project_Root を右クリック→ zip ファイルインポート
• あとは通常と同様
16
loop 関数のカスタマイズ
void loop(void) {
eventManager.execute();
/* このあたりに追加 */
}
17
外部デバイスをポーリングしモデルにイベントを送信したい場合にloop 関数にコードを追加するloop 関数は main.cpp で定義
eventManager.execute(); によりステートマシンを実行必ず一定時間に一回はこの行を実行する必要あり
追加コードでブロックしてしまわないこと
loop 関数のカスタマイズ : SW2 の読み出しsetup 関数に pinMode(PIN_SW, INPUT); を追加.
void sw2_polling(void) {
static int button_pushed = 0;
int sw = digitalRead(PIN_SW);
if (sw != button_pushed) {
button_pushed = sw;
if (sw == HIGH) {
extern Controller controller;
controller.sendEvent(Controller_EVENT_pushed);
}
}
}
void loop(void) {
eventManager.execute();
sw2_polling();
}
18
ボタンが押された時に controller にpushed イベントを送信
モデリング上の注意• Model Explorer と Diagram の一貫性が崩れるとコンパイ
ルがうまくいかない可能性がある• 特にダイアグラムからモデル要素を削除した場合に発生する• Model Explorer を見てすでにないモデル要素を探す
• 発見した場合には右クリックして削除する.
19
参考 : grsakura.sh (1)• clooca で記述したソフトウェアを GR-SAKURA にダウン
ロードするまでを自動化するスクリプト• Mac OS X 上でのみ動作確認済み
• スクリプト中の以下の変数を定義する必要あり• CLOOCAUSERPASS
• clooca のユーザ名とパスワードを「 : 」で区切ったもの• CLOOCAPROJECTID
• clooca のプロジェクト ID URL から取得
• (次ページに続く)
20
参考 : grsakura.sh (2)• スクリプト中の以下の変数を定義する必要あり(続き)
• WEBCOMAPIKEY• ウェブコンパイラのキー ヘルプから取得
• WEBCOMPROJECTID• ウェブコンパイラ上のプロジェクト IDgrsakura-inspect.sh を実行して取得• 例 : sh grsakura-inspect.sh Ab7IatdwWUn8wgJV
• {"projects":[{ "id":"15996" , "name":"2013-07-22-test" }]}
• WEBCOMBINID• ウェブコンパイラ上の sketch.bin のオブジェクト ID• grsakura-inspect.sh を実行して取得• 例 : sh grsakura-inspect.sh Ab7IatdwWUn8wgJV 15996
• {"projects":[{ "id":"15996" , "name":"2013-07-22-test" }]}• {"structure":[{ "id":"985181" , "name":"gr_build" , "type":"1" },{ "id":"985187" ,
"name":"gr_common" , "type":"1" },{ "id":"985247" , "name":"gr_reference_e.html" , "type":"2" },{ "id":"985248" , "name":"gr_reference_j.html" , "type":"2" },{ "id":"1019989" , "name":"main.cpp" , "type":"2" },{ "id":"1019990" , "name":"main.h" , "type":"2" },{ "id":"985250" , "name":"makefile" , "type":"2" },{ "id":"1019991" , "name":"MEXU.cpp" , "type":"2" },{ "id":"1019992" , "name":"MEXU.h" , "type":"2" },{ "id":"985251" , "name":"sketch.bin" , "type":"2" },{ "id":"1019993" , "name":"stm.cpp" , "type":"2" },{ "id":"1041119" , "name":"stm.h" , "type":"2" }]}
21
API キー
API キー
API キー