00001 #include "WalkControllerBehavior.h"
00002 #include "Behaviors/Controller.h"
00003
00004 WalkControllerBehavior* WalkControllerBehavior::theOne = NULL;
00005
00006 void WalkControllerBehavior::runCommand(unsigned char *command) {
00007
00008 erouter->removeTimer(this);
00009
00010
00011 float param;
00012 unsigned char *paramp = (unsigned char *) ¶m;
00013
00014 paramp[0] = command[1];
00015 paramp[1] = command[2];
00016 paramp[2] = command[3];
00017 paramp[3] = command[4];
00018
00019
00020 switch(command[0]) {
00021 case CMD_fwd:
00022 dx = param;
00023 break;
00024 case CMD_roto:
00025 da = param;
00026 break;
00027 case CMD_side:
00028 dy = param;
00029 break;
00030 case CMD_opt0:
00031 {
00032
00033
00034
00035
00036 break;
00037 }
00038 case CMD_opt1:
00039 case CMD_opt2:
00040 case CMD_opt3:
00041 case CMD_opt4:
00042 cout << "MECHA: hey, reprogram this button!" << endl;
00043 break;
00044 case CMD_opt5:
00045 sndman->PlayFile("howl.wav");
00046 break;
00047 case CMD_opt6:
00048 sndman->PlayFile("yap.wav");
00049 break;
00050 case CMD_opt7:
00051 sndman->PlayFile("whimper.wav");
00052 break;
00053 case CMD_opt8:
00054 sndman->PlayFile("growl.wav");
00055 break;
00056 case CMD_opt9:
00057 sndman->PlayFile("barkmed.wav");
00058 break;
00059
00060 default:
00061 cout << "MECHA: unknown command " << command[0] << endl;
00062 }
00063
00064
00065
00066 switch(command[0]) {
00067 case CMD_fwd:
00068 case CMD_roto:
00069 case CMD_side:
00070 {
00071 MMAccessor<WalkMC> walker(getWalkID());
00072 walker->setTargetVelocity(dx,dy,da);
00073 }
00074 }
00075
00076
00077
00078 erouter->addTimer(this, 0, 3000, false);
00079 }
00080
00081 void WalkControllerBehavior::DoStart() {
00082
00083 BehaviorBase::DoStart();
00084
00085 erouter->addListener(this, EventBase::timerEGID);
00086
00087 motman->addMotion(shared_walker);
00088
00089 theLastOne=theOne;
00090 theOne=this;
00091 wireless->setReceiver(cmdsock->sock, mechacmd_callback);
00092 wireless->listen(cmdsock->sock, config->main.walkControl_port);
00093
00094 Controller::loadGUI("org.tekkotsu.mon.WalkGUI","WalkGUI",config->main.walkControl_port);
00095 }
00096
00097 void WalkControllerBehavior::DoStop() {
00098
00099 Controller::closeGUI("WalkGUI");
00100
00101 erouter->forgetListener(this);
00102
00103 wireless->close(cmdsock);
00104 theOne=theLastOne;
00105
00106 motman->removeMotion(getWalkID());
00107
00108 BehaviorBase::DoStop();
00109 }
00110
00111
00112 int WalkControllerBehavior::mechacmd_callback(char *buf, int bytes) {
00113 static char cb_buf[5];
00114 static int cb_buf_filled;
00115
00116
00117
00118
00119 if(cb_buf_filled) {
00120 while((cb_buf_filled < 5) && bytes) {
00121 cb_buf[cb_buf_filled++] = *buf++;
00122 --bytes;
00123 }
00124
00125 if(cb_buf_filled == 5) {
00126 if(WalkControllerBehavior::theOne) WalkControllerBehavior::theOne->runCommand((unsigned char*) cb_buf);
00127 cb_buf_filled = 0;
00128 }
00129 }
00130
00131
00132 while(bytes >= 5) {
00133 if(WalkControllerBehavior::theOne) WalkControllerBehavior::theOne->runCommand((unsigned char *) buf);
00134 bytes -= 5;
00135 buf += 5;
00136 }
00137
00138
00139 while(bytes) {
00140 cb_buf[cb_buf_filled++] = *buf++;
00141 --bytes;
00142 }
00143
00144 return 0;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159