00001 #define FSM_MAIN 00002 #include "fsmmove.h" 00003 #include "movehelper.h" 00004 #include "robot.h" 00005 #include "trgen.h" 00006 00007 FSM_STATE_DECL(rectangle); 00008 FSM_STATE_DECL(turn); 00009 FSM_STATE_DECL(wait); 00010 00011 FSM_STATE(main_init) { 00012 // Where we are at the begining? 00013 robot.act_pos.x = 1; 00014 robot.act_pos.y = 0.5; 00015 robot.act_pos.phi = M_PI/2; 00016 FSM_TRANSITION(rectangle); 00017 } 00018 00019 00020 void follow_rectangle() 00021 { 00022 static bool backward = false; 00023 struct TrajectoryConstraints tc = trajectoryConstraintsDefault; 00024 //tc.maxv *= 1.5; 00025 00026 // Allocate new trajectory 00027 if (!backward) 00028 robot_trajectory_new(&tc); 00029 else 00030 robot_trajectory_new_backward(&tc); 00031 backward = !backward; 00032 00033 // Add random point to the trajectory. 00034 robot_trajectory_add_point(2, 0.5); 00035 robot_trajectory_add_point(2, 1.5); 00036 robot_trajectory_add_point(1, 1.5); 00037 robot_trajectory_add_final_point(1, 0.5, 90); 00038 } 00039 00040 FSM_STATE(rectangle) 00041 { 00042 switch (FSM_EVENT) { 00043 case EV_STATE_ENTERED: 00044 follow_rectangle(); 00045 break; 00046 case EV_TRAJECTORY_ERROR: 00047 FSM_TRANSITION(turn); 00048 break; 00049 case EV_MOTION_DONE: 00050 FSM_TRANSITION(turn); 00051 break; 00052 default: 00053 break; 00054 } 00055 } 00056 00057 FSM_STATE(turn) 00058 { 00059 switch (FSM_EVENT) { 00060 case EV_STATE_ENTERED: 00061 robot_trajectory_new(NULL); 00062 robot_trajectory_add_final_point(1, 0.5, -90); 00063 break; 00064 case EV_TRAJECTORY_ERROR: 00065 FSM_TRANSITION(wait); 00066 break; 00067 case EV_MOTION_DONE: 00068 FSM_TRANSITION(wait); 00069 break; 00070 default: 00071 break; 00072 } 00073 } 00074 00075 00076 FSM_STATE(wait) 00077 { 00078 FSM_TIMER(1000); 00079 switch (FSM_EVENT) { 00080 case EV_TIMER: 00081 FSM_TRANSITION(rectangle); 00082 break; 00083 default: 00084 break; 00085 } 00086 } 00087 00088 int main() 00089 { 00090 /* robot initialization */ 00091 robot_init(); 00092 00093 FSM(MAIN)->debug_states = 1; 00094 // FSM(MOVE)->debug_states = 1; 00095 00096 robot.fsm[FSM_ID_MAIN].state = &fsm_state_main_init; 00097 robot.fsm[FSM_ID_MOTION].state = &fsm_state_move_init; 00098 00099 /* Start threads and wait */ 00100 robot_start(); 00101 robot_wait(); 00102 00103 /* clean up */ 00104 robot_destroy(); 00105 00106 return 0; 00107 }