00001 #define FSM_PICKUP 00002 #include "robot.h" 00003 #include <fsm.h> 00004 #include "serva.h" 00005 00006 FSM_STATE_DECL(start_pickup); 00007 FSM_STATE_DECL(pickup_wait); 00008 FSM_STATE_DECL(blbost); 00009 00010 FSM_STATE(start_pickup) { 00011 switch (FSM_EVENT) { 00012 case EV_PICKUP_START: 00013 releaseFront(); 00014 frontDoorDown(); 00015 FSM_TRANSITION(blbost); 00016 break; 00017 // case EV_TIMER: 00018 // frontTransporterForward(); 00019 // FSM_TRANSITION(pickup_wait); 00020 // break; 00021 default: break; 00022 } 00023 } 00024 00025 FSM_STATE(blbost) { 00026 FSM_TIMER(2000); 00027 00028 switch (FSM_EVENT) { 00029 case EV_TIMER: 00030 frontTransporterForward(); 00031 FSM_TRANSITION(pickup_wait); 00032 break; 00033 default: break; 00034 } 00035 00036 } 00037 00038 FSM_STATE_DECL(pickup_free); 00039 FSM_STATE_DECL(pickup_wait_for_success); 00040 FSM_STATE(pickup_wait) { 00041 switch (FSM_EVENT) { 00042 case EV_STATE_ENTERED: 00043 break; 00044 case EV_PICKUP_TRY: 00045 frontDoorUp(); 00046 FSM_TRANSITION(pickup_wait_for_success); 00047 break; 00048 case EV_PICKUP_FREE: 00049 FSM_TRANSITION(pickup_free); 00050 break; 00051 00052 default: break; 00053 } 00054 } 00055 00056 FSM_STATE(pickup_free) { 00057 FSM_TIMEOUT(1000); 00058 switch (FSM_EVENT) { 00059 case EV_STATE_ENTERED: 00060 if(robot.IRsensors.back != 0); 00061 00062 break; 00063 00064 00065 default:break; 00066 } 00067 } 00068 00069 00070 FSM_STATE(pickup_wait_for_success) { 00071 FSM_TIMEOUT(1000); 00072 switch (FSM_EVENT) { 00073 case EV_STATE_ENTERED: 00074 break; 00075 case EV_TIMEOUT: 00076 if(robot.frontDoorAngle.state>0x220) { 00077 FSM_SIGNAL(MAIN, EV_PICKUP_DONE); 00078 } 00079 else FSM_SIGNAL(MAIN, EV_PICKUP_FAILED); 00080 frontDoorDown(); 00081 FSM_TRANSITION(pickup_wait); 00082 break; 00083 default: break; 00084 } 00085 } 00086 00087 00088 00089 00090 00091 FSM_STATE(pickup_ready) { 00092 FSM_TIMEOUT(300); 00093 ROBOT_LOCK(sharpsWaste); 00094 robot.waste_cnt = 0; 00095 if(robot.sharpsWaste.short1 > 850) robot.waste_cnt++; 00096 if(robot.sharpsWaste.short2 > 850) robot.waste_cnt++; 00097 if(robot.sharpsWaste.short3 > 850) robot.waste_cnt++; 00098 if(robot.sharpsWaste.short4 > 850) robot.waste_cnt++; 00099 00100 printf("waste_cnt=%d\n",robot.waste_cnt); 00101 00102 switch (FSM_EVENT) { 00103 case EV_STATE_ENTERED: 00104 case EV_TIMEOUT: 00105 printf("EVENT_STATE_ENTERED - pickup ready\n"); 00106 if(robot.waste_cnt > 1) robot.bottle_under_belt = 1; 00107 else if(robot.waste_cnt==1) { 00108 frontTransporterBackward(); 00109 robot.bottle_under_belt = 0; 00110 FSM_TIMER(2000); 00111 break; 00112 } 00113 else robot.bottle_under_belt = 0; 00114 break; 00115 case EV_TIMER: 00116 printf("EV_TIMER - pickup ready\n"); 00117 frontTransporterForward(); 00118 break; 00119 default: 00120 DBG_PRINT_EVENT("Unhandled event:"); 00121 } 00122 00123 if (robot.bottle_under_belt) { //FIXME Jirkovi se to nelibi, at to laskave nekdo opravi 00124 frontTransporterForward(); 00125 robot.bottle_under_belt = 0; 00126 ROBOT_UNLOCK(sharpsWaste); 00127 // FSM_TRANSITION(try_pickup); 00128 } else { 00129 ROBOT_UNLOCK(sharpsWaste); 00130 // frontTransporterForward(); 00131 } 00132 00133 /* if (robot.bottle_under_belt) { 00134 robot.bottle_under_belt = 0; 00135 ROBOT_UNLOCK(); 00136 FSM_TRANSITION(try_pickup); 00137 } else { 00138 ROBOT_UNLOCK(); 00139 frontTransporterForward(); 00140 }*/ 00141 } 00142 00143 FSM_STATE_DECL(finish_pickup); 00144 FSM_STATE_DECL(jam); 00145 FSM_STATE(try_pickup) { 00146 switch (FSM_EVENT) { 00147 case EV_STATE_ENTERED: 00148 frontDoorUp(); 00149 FSM_TIMER(500); 00150 break; 00151 case EV_TIMER: 00152 if (/* TODO robot.frontDoorAngle*/ 0x221 < 0x220) 00153 FSM_TRANSITION(jam); 00154 else 00155 FSM_TRANSITION(finish_pickup); 00156 break; 00157 case EV_TRASH_GOES_UP: 00158 FSM_TRANSITION(finish_pickup); 00159 break; 00160 default: 00161 DBG_PRINT_EVENT("Unhandled event"); 00162 } 00163 } 00164 00165 FSM_STATE(finish_pickup) { 00166 switch (FSM_EVENT) { 00167 case EV_STATE_ENTERED: 00168 printf("front door down - finnish pickup\n"); 00169 frontDoorDown(); 00170 FSM_TIMER(1000); 00171 break; 00172 case EV_TIMER: 00173 //robot.trash_count++; 00174 //frontTransporterStop(); 00175 // fsm_signal(FSM(MOT),EV_FINISHED_PICKUP); 00176 FSM_TRANSITION(pickup_ready); 00177 default: break; 00178 } 00179 } 00180 00181 FSM_STATE(jam) { 00182 switch (FSM_EVENT) { 00183 case EV_STATE_ENTERED: 00184 frontDoorDown(); 00185 frontTransporterBackward(); 00186 FSM_TIMER(1500); 00187 //fsm_signal(FSM(MAIN), EV_JAM); 00188 break; 00189 case EV_TIMER: 00190 FSM_TRANSITION(pickup_ready); 00191 break; 00192 default: break; 00193 } 00194 }