#ifndef INCLUDED_Maiahi1_h_ // このファイル INCLUDED_Maiahi1_h_ が定義されていなければ #define INCLUDED_Maiahi1_h_ // このファイル INCLUDED_Maiahi1_h_ を定義する #include "Shared/ERS7Info.h" // AIBOの機種(ERS7)に関する部品ファイル #include "Shared/WorldState.h" // 状態を監視するための部品ファイル #include "StateHeader.h" // 状態と遷移に必要な部品ファイル #include "StartCommFromPC.h" // PCから合図を受信するための部品ファイル // クラス Maiahi1 class Maiahi1 : public StateNode { protected: StateNode * start_node; // start_nodeは、クラス全体で使用するのでココに定義する StartCommFromPC fromPC; // PCからの合図を受け取るオブジェクト private: SharedObject leds1a_mc; SharedObject leds1b_mc; SharedObject leds2a_mc; SharedObject leds2b_mc; MotionManager::MC_ID leds1a_id; MotionManager::MC_ID leds1b_id; MotionManager::MC_ID leds2a_id; MotionManager::MC_ID leds2b_id; public: // コンストラクタ Maiahi1() : StateNode("Maiahi1"), start_node(NULL), fromPC(), leds1a_mc(), leds1b_mc(), leds2a_mc(), leds2b_mc(), leds1a_id(MotionManager::invalid_MC_ID), leds1b_id(MotionManager::invalid_MC_ID), leds2a_id(MotionManager::invalid_MC_ID), leds2b_id(MotionManager::invalid_MC_ID) {} // デコンストラクタ ~Maiahi1() { if(issetup) teardown(); } virtual void setup() { // 親クラスStateNodeのsetup()関数を呼ぶ StateNode::setup(); // 伏せ姿勢ノード(スタート姿勢) StateNode * lie_node = new SmallMotionSequenceNode("Lie","lielie.mot"); addNode(lie_node); // うなずき1回目 StateNode * unazuki1_node = new LargeMotionSequenceNode("Unazuki1","maiahi/unazuki.mot"); addNode(unazuki1_node); // うなずき2回目 StateNode * unazuki2_node = new LargeMotionSequenceNode("Unazuki2","maiahi/unazuki.mot"); addNode(unazuki2_node); // うなずき3回目 StateNode * unazuki3_node = new LargeMotionSequenceNode("Unazuki3","maiahi/unazuki.mot"); addNode(unazuki3_node); // うなずき4回目 StateNode * unazuki4_node = new LargeMotionSequenceNode("Unazuki4","maiahi/unazuki.mot"); addNode(unazuki4_node); // うなずき5回目 StateNode * unazuki5_node = new LargeMotionSequenceNode("Unazuki5","maiahi/unazuki.mot"); addNode(unazuki5_node); // ソロダンス1回目 StateNode * dance_solo1_node = new XLargeMotionSequenceNode("dance_solo1","maiahi/solo11.mot"); addNode(dance_solo1_node); // ソロダンス2回目 StateNode * dance_solo2_node = new XLargeMotionSequenceNode("dance_solo2","maiahi/solo12.mot"); addNode(dance_solo2_node); // 座り StateNode * sit_node = new MediumMotionSequenceNode("sit","sitsit.mot"); addNode(sit_node); // うなずき6回目 StateNode * unazuki6_node = new XLargeMotionSequenceNode("Unazuki6","maiahi/wait10.mot"); addNode(unazuki6_node); // →伏せ StateNode * sitlie_node = new MediumMotionSequenceNode("sitlie","sitlie.mot"); addNode(sitlie_node); // デュオダンス StateNode * dance_duo_node = new XLargeMotionSequenceNode("dance_duo","maiahi/duo12.mot"); addNode(dance_duo_node); // 座り2 StateNode * sit2_node = new MediumMotionSequenceNode("sit2","sitsit.mot"); addNode(sit2_node); // うなずき7回目 StateNode * unazuki7_node = new XLargeMotionSequenceNode("unazuki7","maiahi/wait24.mot"); addNode(unazuki7_node); // うなずき8回目 StateNode * unazuki8_node = new XLargeMotionSequenceNode("unazuki8","maiahi/wait27.mot"); addNode(unazuki8_node); // うなずき9回目 StateNode * unazuki9_node = new XLargeMotionSequenceNode("unazuki9","maiahi/wait10.mot"); addNode(unazuki9_node); // ALLグループ GroupNode * all_group = new GroupNode("AllGroup"); addNode(all_group); // ALLダンス1 StateNode * all1_node = new XLargeMotionSequenceNode("ALL_1","maiahi/all_1.mot"); all_group->addNode(all1_node); // LEDノードALL LedNode * led_all_node = new LedNode("led_all"); led_all_node->getMC()->cycle(RobotInfo::AllLEDMask, 1000, 100.0); all_group->addNode(led_all_node); // ALLダンス2 StateNode * all2_node = new XLargeMotionSequenceNode("ALL_2","maiahi/all_2.mot"); addNode(all2_node); // ALLダンス3 StateNode * all3_node = new XLargeMotionSequenceNode("ALL_3","maiahi/all_3.mot"); addNode(all3_node); // ALLダンス4 StateNode * all4_node = new XLargeMotionSequenceNode("ALL_4","maiahi/all_4.mot"); addNode(all4_node); // LEDオフ LedNode * led_off_node = new LedNode("led_off"); led_off_node->getMC()->set(RobotInfo::AllLEDMask, 0.0); addNode(led_off_node); // スタートは伏せ姿勢 start_node = lie_node; // ダンス開始 // TextMessageEventによる遷移(座り→うなずき1) EventTrans * textTrans = new EventTrans(unazuki1_node,EventBase::textmsgEGID); lie_node->addTransition(textTrans); // うなずき1→うなずき2 unazuki1_node->addTransition(new CompletionTrans(unazuki2_node)); // うなずき2→うなずき3 unazuki2_node->addTransition(new CompletionTrans(unazuki3_node)); // うなずき3→うなずき4 unazuki3_node->addTransition(new CompletionTrans(unazuki4_node)); // うなずき4→うなずき5 unazuki4_node->addTransition(new CompletionTrans(unazuki5_node)); // うなずき5→ソロダンス1 unazuki5_node->addTransition(new CompletionTrans(dance_solo1_node)); // ソロダンス1→ソロダンス2 dance_solo1_node->addTransition(new CompletionTrans(dance_solo2_node)); // ソロダンス2→座り dance_solo2_node->addTransition(new CompletionTrans(sit_node)); // 座り→うなずき6 sit_node->addTransition(new CompletionTrans(unazuki6_node)); // うなずき6→伏せ unazuki6_node->addTransition(new CompletionTrans(sitlie_node)); // 伏せ→デュオ sitlie_node->addTransition(new CompletionTrans(dance_duo_node)); // デュオ→座り2 dance_duo_node->addTransition(new CompletionTrans(sit2_node)); // 座り2→うなずき7 sit2_node->addTransition(new CompletionTrans(unazuki7_node)); // うなずき7→うなずき8 unazuki7_node->addTransition(new CompletionTrans(unazuki8_node)); // うなずき8→うなずき9 unazuki8_node->addTransition(new CompletionTrans(unazuki9_node)); // うなずき9→ALLダンス1 unazuki9_node->addTransition(new CompletionTrans(all_group)); // ALLダンス1→ALLダンス2 all1_node->addTransition(new CompletionTrans(all2_node)); // ALLダンス2→ALLダンス3 all2_node->addTransition(new CompletionTrans(all3_node)); // ALLダンス3→ALLダンス4 all3_node->addTransition(new CompletionTrans(all4_node)); // ALLダンス4→LEDオフ all4_node->addTransition(new CompletionTrans(led_off_node)); } virtual void DoStart() { StateNode::DoStart(); start_node->DoStart(); fromPC.DoStart(); // fromPCオブジェクトをスタート erouter->addListener(this, EventBase::textmsgEGID); // イベントリスナー } virtual void DoStop() { StateNode::DoStop(); fromPC.DoStop(); // fromPCオブジェクトをストップ } virtual void teardown() { StateNode::teardown(); } virtual void processEvent(const EventBase &event) { static int i=0; switch ( event.getGeneratorID() ) { case EventBase::textmsgEGID: erouter->addTimer(this,1001,30000,false); std::cout << "Timer set! " << std::endl; i = 1; break; case EventBase::timerEGID: std::cout << "Timer expired! " << event.getDescription() << std::endl; switch(i) { case 1: i=2; erouter->addTimer(this,1002,30000,false); leds1a_mc->cycle(RobotInfo::HeadColorLEDMask, 1000, 100.0); leds1a_id = motman->addPersistentMotion(leds1a_mc); leds1b_mc->cycle(RobotInfo::ModeRedLEDMask, 1000, 100.0); leds1b_id = motman->addPersistentMotion(leds1b_mc); break; case 2: i=3; motman->removeMotion(leds1a_id); motman->removeMotion(leds1b_id); erouter->addTimer(this,1003,14000,false); break; case 3: i=4; erouter->addTimer(this,1004,16000,false); leds2a_mc->cycle(RobotInfo::HeadColorLEDMask, 1000, 100.0); leds2a_id = motman->addPersistentMotion(leds2a_mc); leds2b_mc->cycle(RobotInfo::ModeRedLEDMask, 1000, 100.0); leds2b_id = motman->addPersistentMotion(leds2b_mc); break; case 4: motman->removeMotion(leds2a_id); motman->removeMotion(leds2b_id); break; default: std::cout << "CASE i ERROR" << std::endl; } break; default: std::cout << "CASE event ERROR" << std::endl; } } private: // コンパイル時の警告を避けるためのダミー関数 Maiahi1(const Maiahi1&); Maiahi1 operator=(const Maiahi1&); }; #endif