00001 #include "robot.h"
00002 #include "robofsm.h"
00003 #include "movefsm.h"
00004 #include "trgen.h"
00005 #include <orte.h>
00006
00007 static int wait_move(struct robo_fsm *fsm, int ret);
00008 static int go2(struct robo_fsm *fsm, int ret);
00009 static int go1(struct robo_fsm *fsm, int ret);
00010 static int test_move(struct robo_fsm *fsm, int ret);
00011
00012 static int wait_move(struct robo_fsm *fsm, int ret)
00013 {
00014 DBG_STATE();
00015 switch (fsm->event) {
00016 case EV_TRAJECTORY_DONE:
00017 DBG("Trajectory done\n");
00018 FSM_TIMEOUT(3000);
00019 return RC_WAIT;
00020 break;
00021 case EV_TRAJECTORY_DONE_AND_CLOSE:
00022 DBG("Trajectory done and close\n");
00023 FSM_TIMEOUT(3000);
00024 return RC_WAIT;
00025 break;
00026 case EV_TRAJECTORY_LOST:
00027 DBG("Trajectory lost\n");
00028 FSM_TIMEOUT(3000);
00029 return RC_WAIT;
00030 break;
00031 case EV_TIMEOUT:
00032 DBG("Timeout\n");
00033 FRET();
00034 return RC_PROC;
00035 break;
00036 default:
00037 break;
00038 }
00039 return RC_WAIT;
00040 }
00041
00042 #define SPEED_RATIO 3
00043
00044 static int go2(struct robo_fsm *fsm, int ret)
00045 {
00046 DBG_STATE();
00047 struct TrajectoryConstraints tc = trajectoryConstraintsDefault;
00048 tc.maxv /= SPEED_RATIO;
00049 tc.maxomega /= SPEED_RATIO;
00050 tc.maxacc /= SPEED_RATIO;
00051 robot_trajectory_new(&tc, -180);
00052 robot_trajectory_add_point(0.5, 0);
00053 robot_trajectory_add_point(0.5, 0.5);
00054 robot_trajectory_add_point(0, 0.5);
00055 robot_trajectory_add_point(0, 0);
00056 fsm_signal(FSM(MOT), EV_NEW_TRAJECTORY);
00057 FCALL2(wait_move, go1);
00058 return RC_WAIT;
00059 }
00060
00061 static int go1(struct robo_fsm *fsm, int ret)
00062 {
00063 struct TrajectoryConstraints tc = trajectoryConstraintsDefault;
00064 tc.maxv /= SPEED_RATIO;
00065 tc.maxomega /= SPEED_RATIO;
00066 tc.maxacc /= SPEED_RATIO;
00067 DBG_STATE();
00068 robot_trajectory_new(&tc, 180);
00069 robot_trajectory_add_point(0, 0.5);
00070 robot_trajectory_add_point(0.5, 0.5);
00071 robot_trajectory_add_point(0.5, 0);
00072 robot_trajectory_add_point(0, 0);
00073
00074 fsm_signal(FSM(MOT), EV_NEW_TRAJECTORY);
00075 FCALL2(wait_move, go2);
00076 return RC_WAIT;
00077 }
00078
00079 static int test_move(struct robo_fsm *fsm, int ret)
00080 {
00081 DBG_STATE();
00082 switch (fsm->event) {
00083 case EV_INIT:
00084 FSM_TIMEOUT(500);
00085 return RC_WAIT;
00086 case EV_TIMEOUT:
00087 FNEXT(go1);
00088 return RC_PROC;
00089 default:
00090 break;
00091 }
00092 return RC_WAIT;
00093 }
00094
00095 int main()
00096 {
00097
00098 robot_init();
00099
00100
00101
00102 FSM(MAIN)->fnc_act = test_move;
00103 FSM(MAIN)->debug_events = 1;
00104 FSM(MOT)->fnc_act = fsm_move_init;
00105 FSM(MOT)->debug_events = 1;
00106
00107 robot_start();
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 robot_wait();
00120 robot_destroy();
00121
00122 return 0;
00123 }