#ifndef INCLUDED_Mickey4_h_ // このファイル INCLUDED_Mickey4_h_ が定義されていなければ #define INCLUDED_Mickey4_h_ // このファイル INCLUDED_Mickey4_h_ を定義する #include "Shared/ERS7Info.h" // AIBOの機種(ERS7)に関する部品ファイル #include "Shared/WorldState.h" // 状態を監視するための部品ファイル #include "StateHeader.h" // 状態と遷移に必要な部品ファイル #include "StartCommFromPC.h" // PCから合図を受信するための部品ファイル // クラス Mickey4 class Mickey4 : public StateNode { protected: StateNode * start_node; // start_nodeは、クラス全体で使用するのでココに定義する StartCommFromPC fromPC; // PCからの合図を受け取るオブジェクト private: SharedObject leds1a_mc; SharedObject leds1b_mc; SharedObject leds2a_mc; SharedObject leds2b_mc; SharedObject leds3a_mc; SharedObject leds3b_mc; MotionManager::MC_ID leds1a_id; MotionManager::MC_ID leds1b_id; MotionManager::MC_ID leds2a_id; MotionManager::MC_ID leds2b_id; MotionManager::MC_ID leds3a_id; MotionManager::MC_ID leds3b_id; public: // コンストラクタ Mickey4() : StateNode("Mickey4"), start_node(NULL), fromPC(), leds1a_mc(), leds1b_mc(), leds2a_mc(), leds2b_mc(), leds3a_mc(), leds3b_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), leds3a_id(MotionManager::invalid_MC_ID), leds3b_id(MotionManager::invalid_MC_ID) {} // デコンストラクタ ~Mickey4() { if(issetup) teardown(); } virtual void setup() { // 親クラスStateNodeのsetup()関数を呼ぶ StateNode::setup(); // 伏せノード作成 StateNode * lie_node = new SmallMotionSequenceNode("Lie","lielie.mot"); addNode(lie_node); // 伏せノード2作成 StateNode * lie2_node = new SmallMotionSequenceNode("Lie2","lielie.mot"); addNode(lie2_node); // 立ち姿勢ノード StateNode * stand_node = new MediumMotionSequenceNode("Stand","sitwalk.mot"); addNode(stand_node); // 座って歩くノード StateNode * sitwalk_node = new MediumMotionSequenceNode("sitwalk","sitwalk.mot"); addNode(sitwalk_node); //前奏1_4ノード StateNode * zensou1_4_node = new XLargeMotionSequenceNode("zensou1_4","zen1_4.mot"); addNode(zensou1_4_node); //前奏2_4ノード StateNode * zensou2_4_node = new XLargeMotionSequenceNode("zensou2_4","zen2_4.mot"); addNode(zensou2_4_node); //前奏3ノード StateNode * zensou3_node = new XLargeMotionSequenceNode("zensou3","zen3.mot"); addNode(zensou3_node); // 足踏み1ノード作成 StateNode * asibumi1_node = new XLargeMotionSequenceNode("asibumi1","asibumi1.mot"); addNode(asibumi1_node); //Aメロ2_4ノード StateNode * Amero2_4_node = new XLargeMotionSequenceNode("Amero2_4","Amero2_4.mot"); addNode(Amero2_4_node); // サビ1ノード作成 StateNode * sabi1_34_node = new XLargeMotionSequenceNode("sabi1_34","sabi1_34.mot"); addNode(sabi1_34_node); // 足踏み3ノード作成 StateNode * asibumi3_node = new XLargeMotionSequenceNode("asibumi3","asibumi3.mot"); addNode(asibumi3_node); // 足踏み4ノード作成 StateNode * asibumi4_node = new XLargeMotionSequenceNode("asibumi4","asibumi4.mot"); addNode(asibumi4_node); // サビ2ノード作成 StateNode * sabi2_4_node = new XLargeMotionSequenceNode("sabi2_4","sabi2_4.mot"); addNode(sabi2_4_node); // Allグループ GroupNode * all_group = new GroupNode("AllGroup"); addNode(all_group); // サビ3ノード作成 StateNode * sabi3_4_node = new XLargeMotionSequenceNode("sabi3_4","sabi3_4.mot"); all_group->addNode(sabi3_4_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); // 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; // PCからの合図(TextMessageEvent)による遷移(伏せ→前奏1_1) EventTrans * textTrans = new EventTrans(zensou1_4_node,EventBase::textmsgEGID); lie_node->addTransition(textTrans); // 遷移(前奏1_1→前奏2_1→前奏3→足踏み1→足踏み2→サビ1→Bメロ→足踏み4→サビ2→サビ3) zensou1_4_node->addTransition(new CompletionTrans(zensou2_4_node)); zensou2_4_node->addTransition(new CompletionTrans(zensou3_node)); zensou3_node->addTransition(new CompletionTrans(asibumi1_node)); asibumi1_node->addTransition(new CompletionTrans(Amero2_4_node)); Amero2_4_node->addTransition(new CompletionTrans(sabi1_34_node)); sabi1_34_node->addTransition(new CompletionTrans(asibumi3_node)); asibumi3_node->addTransition(new CompletionTrans(asibumi4_node)); asibumi4_node->addTransition(new CompletionTrans(sabi2_4_node)); sabi2_4_node->addTransition(new CompletionTrans(all_group)); sabi3_4_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,26000,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,19000,false); leds1a_mc->cycle(RobotInfo::FaceLEDMask, 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,36000,false); break; case 3: i=4; erouter->addTimer(this,1003,2000,false); leds2a_mc->cycle(RobotInfo::WirelessLEDMask, 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: i=5; motman->removeMotion(leds2a_id); motman->removeMotion(leds2b_id); erouter->addTimer(this,1003,43000,false); break; case 5: i=6; erouter->addTimer(this,1004,2000,false); leds3a_mc->cycle(RobotInfo::WirelessLEDMask, 1000, 100.0); leds3a_id = motman->addPersistentMotion(leds3a_mc); leds3b_mc->cycle(RobotInfo::ModeRedLEDMask, 1000, 100.0); leds3b_id = motman->addPersistentMotion(leds3b_mc); break; case 6: motman->removeMotion(leds3a_id); motman->removeMotion(leds3b_id); break; default: std::cout << "CASE i ERROR" << std::endl; } break; default: std::cout << "CASE event ERROR" << std::endl; } } private: // コンパイル時の警告を避けるためのダミー関数 Mickey4(const Mickey4&); Mickey4 operator=(const Mickey4&); }; #endif