#ifndef INCLUDED_Mickey2_h_ // このファイル INCLUDED_Mickey2_h_ が定義されていなければ #define INCLUDED_MIckey2_h_ // このファイル INCLUDED_Mickey2_h_ を定義する #include "Shared/ERS7Info.h" // AIBOの機種(ERS7)に関する部品ファイル #include "Shared/WorldState.h" // 状態を監視するための部品ファイル #include "StateHeader.h" // 状態と遷移に必要な部品ファイル #include "StartCommFromPC.h" // PCから合図を受信するための部品ファイル // クラス Mickey2 class Mickey2 : 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: // コンストラクタ Mickey2() : StateNode("Mickey2"), 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) {} // デコンストラクタ ~Mickey2() { 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 * sit_node = new SmallMotionSequenceNode("Sit","sitsit.mot"); addNode(sit_node); // 立ち姿勢ノード StateNode * stand_node = new MediumMotionSequenceNode("Stand","sitwalk.mot"); addNode(stand_node); // 座って歩く姿勢ノード StateNode * sitwalk_node = new MediumMotionSequenceNode("sitwalk","sitwalk.mot"); addNode(sitwalk_node); // 頭ニュートラル_ノード StateNode * headneutral_node = new SmallMotionSequenceNode("HeadNeutral","headneut.mot"); addNode(headneutral_node); // 前進歩行ノード WalkNode * move_node = new WalkNode("Move",150,0,0); addNode(move_node); //前奏1_2ノード StateNode * zensou1_2_node = new XLargeMotionSequenceNode("zensou1_2","zen1_2.mot"); addNode(zensou1_2_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); // 足踏み2ノード作成 StateNode * asibumi2_node = new XLargeMotionSequenceNode("asibumi2","asibumi2.mot"); addNode(asibumi2_node); // サビ1ノード作成 StateNode * sabi1_12_node = new XLargeMotionSequenceNode("sabi1_12","sabi1_12.mot"); addNode(sabi1_12_node); // 足踏み3ノード作成 StateNode * asibumi3_node = new XLargeMotionSequenceNode("asibumi3","asibumi3.mot"); addNode(asibumi3_node); // Bメロ2ノード作成 StateNode * Bmero2_2_node = new XLargeMotionSequenceNode("Bmero2_2","Bmero2_2.mot"); addNode(Bmero2_2_node); // サビ2ノード作成 StateNode * sabi2_2_node = new XLargeMotionSequenceNode("sabi2_2","sabi2_2.mot"); addNode(sabi2_2_node); // Allグループ GroupNode * all_group = new GroupNode("AllGroup"); addNode(all_group); // サビ3ノード作成 StateNode * sabi3_2_node = new XLargeMotionSequenceNode("sabi3_2","sabi3_2.mot"); all_group->addNode(sabi3_2_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_2) EventTrans * textTrans = new EventTrans(zensou1_2_node,EventBase::textmsgEGID); lie_node->addTransition(textTrans); // 遷移(前奏1_2→4秒前進歩行→座り→前奏3→足踏み1→足踏み2→サビ1→足踏み3→Bメロ2→サビ2→サビ3) zensou1_2_node->addTransition(new CompletionTrans(move_node)); move_node->addTransition(new TimeOutTrans(sit_node,3500)); sit_node->addTransition(new CompletionTrans(zensou3_node)); zensou3_node->addTransition(new CompletionTrans(asibumi1_node)); asibumi1_node->addTransition(new CompletionTrans(asibumi2_node)); asibumi2_node->addTransition(new CompletionTrans(sabi1_12_node)); sabi1_12_node->addTransition(new CompletionTrans(asibumi3_node)); asibumi3_node->addTransition(new CompletionTrans(Bmero2_2_node)); Bmero2_2_node->addTransition(new CompletionTrans(sabi2_2_node)); sabi2_2_node->addTransition(new CompletionTrans(all_group)); sabi3_2_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::HeadWhiteLEDMask, 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::HeadWhiteLEDMask, 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: // コンパイル時の警告を避けるためのダミー関数 Mickey2(const Mickey2&); Mickey2 operator=(const Mickey2&); }; #endif