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