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 = 0; 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 robot_trajectory_add_final_point(2, 0.5, 0); 00030 } else { 00031 robot_trajectory_new_backward(&tc); 00032 robot_trajectory_add_final_point(1, 0.5, 180); 00033 } 00034 backward = !backward; 00035 } 00036 00037 FSM_STATE(rectangle) 00038 { 00039 switch (FSM_EVENT) { 00040 case EV_STATE_ENTERED: 00041 follow_rectangle(); 00042 break; 00043 case EV_TRAJECTORY_ERROR: 00044 FSM_TRANSITION(wait); 00045 break; 00046 case EV_MOTION_DONE: 00047 FSM_TRANSITION(wait); 00048 break; 00049 default: 00050 break; 00051 } 00052 } 00053 00054 FSM_STATE(turn) 00055 { 00056 switch (FSM_EVENT) { 00057 case EV_STATE_ENTERED: 00058 robot_trajectory_new(NULL); 00059 robot_trajectory_add_final_point(1, 0.5, -90); 00060 break; 00061 case EV_TRAJECTORY_ERROR: 00062 FSM_TRANSITION(wait); 00063 break; 00064 case EV_MOTION_DONE: 00065 FSM_TRANSITION(wait); 00066 break; 00067 default: 00068 break; 00069 } 00070 } 00071 00072 00073 FSM_STATE(wait) 00074 { 00075 FSM_TIMER(1000); 00076 switch (FSM_EVENT) { 00077 case EV_TIMER: 00078 FSM_TRANSITION(rectangle); 00079 break; 00080 default: 00081 break; 00082 } 00083 } 00084 00085 int main() 00086 { 00087 /* robot initialization */ 00088 robot_init(); 00089 00090 FSM(MAIN)->debug_states = 1; 00091 // FSM(MOVE)->debug_states = 1; 00092 00093 robot.fsm[FSM_ID_MAIN].state = &fsm_state_main_init; 00094 robot.fsm[FSM_ID_MOTION].state = &fsm_state_move_init; 00095 00096 /* Start threads and wait */ 00097 robot_start(); 00098 robot_wait(); 00099 00100 /* clean up */ 00101 robot_destroy(); 00102 00103 return 0; 00104 }