robot.c

00001 #include "robot.h"
00002 #include <signal.h>
00003 #include "fsmmove.h"
00004 #include <unistd.h>
00005 #include "serva.h"
00006 #include "movehelper.h"
00007 
00008 static int thread_priorities[] = {
00009         [FSM_ID_MOTION] = 25,
00010         [FSM_ID_MAIN] = 20,
00011         [FSM_ID_DET] = 15,
00012         [FSM_ID_LOC] = 10
00013 };
00014 
00015 static char *fsm_name[] = {
00016         [FSM_ID_MOTION] = "motion",
00017         [FSM_ID_MAIN] = "main",
00018         [FSM_ID_DET] = "detection",
00019         [FSM_ID_LOC] = "localization",
00020         [FSM_ID_PICKUP] = "pickup"
00021 };
00022 
00023 struct robo_priv robot;
00024 
00025 static void block_signals()
00026 {
00027         sigset_t sigset;
00028         int i;
00029 
00030         sigemptyset(&sigset);
00031         for (i=0; i<7; i++)
00032                 sigaddset(&sigset, SIGRTMIN+i);
00033 
00034         pthread_sigmask(SIG_BLOCK, &sigset, (sigset_t*)NULL);
00035 }
00036 
00037 static void int_handler(int sig)
00038 {
00039         robot_exit();
00040 }
00041 
00042 int fsm_det_in(struct robo_fsm *fsm, int ret_code);
00043 
00050 int robot_init()
00051 {
00052         int i;
00053         robot.mode = ROBO_TESTING;
00054 
00055         pthread_mutex_init(&robot.lock, NULL);
00056         pthread_mutex_init(&robot.lock_act_pos, NULL);
00057 
00058         /* FSM initialization */
00059         for (i=0; i<FSM_CNT; i++)
00060                 fsm_init(&robot.fsm[i], fsm_name[i]);
00061         
00062         signal(SIGINT, int_handler);
00063         block_signals();
00064 
00065         robot.serva.release = FRONT_LAUNCH_LOCK;
00066         robot.serva.frontDoor = FRONT_DOOR_UP;
00067         robot.serva.innerDoor = INNER_DOOR_UP;
00068         robot.serva.backDoor = BACK_DOOR_UP;
00069         robot.serva.transporterFront = FRONT_TRANSPORTER_STOP;
00070         robot.serva.transporterInner = INNER_TRANSPORTER_STOP;
00071 
00072         robot.sharpsOpponent.longSharpDist1 = 2.0;
00073         robot.sharpsOpponent.longSharpDist2 = 2.0;
00074         robot.sharpsOpponent.longSharpDist3 = 2.0;
00075 
00076         initOrte();
00077         ORTEPublicationSend(robot.publisherServa);
00078         
00079         return 0;
00080 }
00086 int robot_start()
00087 {
00088         int i;
00089 
00090         /* start FSM threads */
00091         for(i=0; i<FSM_CNT; i++) {
00092                 pthread_attr_t attr;
00093                 struct sched_param param;
00094 
00095                 pthread_attr_init(&attr);
00096 
00097                 param.sched_priority = thread_priorities[i];
00098                 pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
00099                 if (pthread_attr_setschedparam(&attr, &param)) {
00100                         perror("pthread_attr_setschedparam");
00101                         exit(1);
00102                 }
00103 
00104                 
00105                 if (fsm_start(&robot.fsm[i], &attr) != 0) {
00106                         perror("fsm_start");
00107                         exit(1);
00108                 }
00109         }
00110 
00111         return 0;
00112 }
00113 
00118 int robot_exit()
00119 {
00120         int i;
00121         /* start FSM threads */
00122         for(i=0; i<FSM_CNT; i++) {
00123                 //robot.fsm[i].exit_flag=1;
00124                 __fsm_signal(&robot.fsm[i], EV_EXIT);
00125         }
00126         return 0;
00127 }
00128 
00134 int robot_wait()
00135 {
00136         int i;
00137         /* wait for threads */
00138         for (i=0; i<FSM_CNT; i++) {
00139                 pthread_join(robot.fsm[i].threadid, NULL);
00140         }
00141         return 0;
00142 }
00143 
00150 int robot_destroy()
00151 {
00152         int i;
00153         printf("\n\n\n");
00154         for (i=0;i<3;i++) {     /* For better reliability :( */
00155                 robot_trajectory_stop();
00156                 frontDoorDown();
00157                 frontDoorUp();
00158                 innerDoorUp();
00159                 backDoorUp();
00160                 frontTransporterStop();
00161                 innerTransporterStop();
00162                 lockFront();
00163                 usleep(100000);
00164         }
00165 
00166         for (i=0; i<FSM_CNT; i++)
00167                 fsm_destroy(&robot.fsm[i]);
00168         DBG("robofsm: stop.\n");
00169         terminateOrte();
00170         return 0;
00171 }
00172 

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