fsmpickup.c

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 }

Generated on Thu Sep 13 11:28:28 2007 for DCE-Eurobot by  doxygen 1.5.3