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
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
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, ¶m)) {
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
00122 for(i=0; i<FSM_CNT; i++) {
00123
00124 __fsm_signal(&robot.fsm[i], EV_EXIT);
00125 }
00126 return 0;
00127 }
00128
00134 int robot_wait()
00135 {
00136 int i;
00137
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++) {
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