roboorte.c

00001 #include <orte.h>
00002 
00003 #ifdef CONFIG_ORTE_RTL
00004 #include <linux/module.h>
00005 #include <posix/pthread.h>
00006 #define printf rtl_printf
00007 #elif defined CONFIG_ORTE_RTAI
00008 #include <linux/module.h>
00009 #include <rtai/compat.h>  
00010 #define printf rt_printk
00011 #else
00012 #include <stdio.h>
00013 #endif
00014 
00015 #include "robot.h"
00016 #include <RobotType.h>
00017 #include <math.h>
00018 
00019 ORTEDomain *d=NULL;
00020 double k0 = 0;
00021 double k1 = 0;
00022 double rozvor = 0.255; // rozvor - zjistit
00023 double aktUhel = 0;
00024 int firstRun = 1;
00025 motionPos initPos;
00026 
00027 static void recvCallBackLaser(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00028         struct laserData_type *instance=(struct laserData_type*)vinstance;
00029 
00030         switch (info->status) {
00031                 case NEW_DATA:
00032                         printf("laser data received\n");
00033                         ROBOT_LOCK(laser_recv);
00034                         robot.laser_recv = *instance;
00035                         ROBOT_UNLOCK(laser_recv);
00036                         FSM_SIGNAL(LOC, EV_LASER_RECEIVED);
00037                         break;
00038                 case DEADLINE:
00039                         printf("laser data deadline\n");
00040                         //DBG("laser deadline occurred\n");
00041                         break;
00042         }
00043 }
00044 
00045 static void *subscriberLaserCreate(void *arg) {
00046         static struct laserData_type orte_laserData;
00047 
00048         ORTESubscription    *s;
00049         NtpTime             deadline,minimumSeparation;
00050 
00051         NTPTIME_BUILD(deadline,10);
00052         NTPTIME_BUILD(minimumSeparation,0);
00053         laserData_type_register(d);
00054         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "laser", "laserData", 
00055                                  &robot.laser_recv, &deadline, &minimumSeparation, 
00056                                  recvCallBackLaser, NULL, IPADDRESS_INVALID);
00057         return arg;
00058 }
00059 
00060 
00061 static void recvSharp1CallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00062         struct sharpLongs_type *instance=(struct sharpLongs_type*)vinstance;
00063 
00064         switch (info->status) {
00065                 case NEW_DATA:
00066                         ROBOT_LOCK(sharpsOpponent);
00067                         robot.sharpsOpponent = *instance;
00068                         ROBOT_UNLOCK(sharpsOpponent);
00069                         //DBG("Callback\n");
00070                         //fsm_signal(FSM(LOC), EV_LASER_RECEIVED); 
00071                         break;
00072                 case DEADLINE:
00073                         //DBG("long sharps deadline occurred\n");
00074                         break;
00075         }
00076 }
00077 
00078 static void recvSharp2CallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00079         struct sharpShorts_type *instance=(struct sharpShorts_type*)vinstance;
00080 
00081         switch (info->status) {
00082                 case NEW_DATA:
00083                         ROBOT_LOCK(sharpsWaste);
00084                         robot.sharpsWaste = *instance;
00085                         ROBOT_UNLOCK(sharpsWaste);
00086                         
00087                         //fsm_signal(FSM(LOC), EV_LASER_RECEIVED); 
00088                         break;
00089                 case DEADLINE:
00090                         //DBG("short sharps deadline occurred\n");
00091                         break;
00092         }
00093 }
00094 
00095 static void recvIRCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00096         struct stateInnerIR_type *instance=(struct stateInnerIR_type*)vinstance;
00097 
00098         switch (info->status) {
00099                 case NEW_DATA:
00100                         ROBOT_LOCK(IRsensors);
00101                         robot.IRsensors = *instance;
00102                         ROBOT_UNLOCK(IRsensors);
00103                         
00104                         //fsm_signal(FSM(LOC), EV_LASER_RECEIVED); 
00105                         break;
00106                 case DEADLINE:
00107                         //DBG("IR deadline occurred\n");
00108                         break;
00109         }
00110 }
00111 
00112 static void recvOdoCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00113         struct motionPos_type *instance=(struct motionPos_type*)vinstance;
00114         static struct motionPos_type prevInstance;
00115         static int firstRun = 1;
00116         double n = (double)(28.0 / 1.0); // spocitat prevodovy pomer
00117         double c = (M_PI*2*ROBOT_WHEEL_RADIUS_MM/1000) / (n * 4*500.0); // vzdalenost na pulz - 4.442 je empiricka konstanta :)
00118         
00119         double aktk0 = 0;
00120         double aktk1 = 0;
00121         double deltaU = 0;
00122         double dk0 = 0;
00123         double dk1 = 0;
00124         double deltAlfa = 0;
00125 
00126         switch (info->status) {
00127                 case NEW_DATA:
00128                         robot.odometry = *instance;
00129                         if(firstRun) {
00130                                 prevInstance = *instance;
00131                                 firstRun = 0;
00132                                 break;
00133                         }
00134                         else {
00135                                 robot.odometry.left -= initPos.left;
00136                                 robot.odometry.right -= initPos.right;
00137                         }
00138                         
00139                         aktk0 = (prevInstance.left - instance->left) >> 8;
00140                         aktk1 = (instance->right - prevInstance.right) >> 8;                    
00141                         prevInstance = *instance;
00142                         dk0 = aktk0;
00143                         dk1 = aktk1;    
00144 
00145                         k0 = aktk0;
00146                         k1 = aktk1;
00147 
00148                         dk0 *= c;
00149                         dk1 *= c;
00150                         //printf("dk.left=%f dk.right=%f\n",dk0,dk1);
00151                         deltaU = (dk0 + dk1) / 2;
00152 
00153                         deltAlfa = (dk1 - dk0) / (2.0*ROBOT_ROTATION_RADIUS_MM/1000);    // dk1 - dk0
00154                         ROBOT_LOCK(act_pos);
00155                         aktUhel = robot.act_pos.phi;
00156                         ROBOT_UNLOCK(act_pos);
00157                         
00158                         aktUhel += deltAlfa;            // aktualni uhel
00159 
00160                         ROBOT_LOCK(act_pos);
00161                         robot.act_pos.x += deltaU * cos(aktUhel);
00162                         robot.act_pos.y += deltaU * sin(aktUhel);
00163                         robot.act_pos.phi = aktUhel;
00164                         ROBOT_UNLOCK(act_pos);
00165                         break;
00166                 case DEADLINE:
00167                         break;
00168         }
00169 }
00170 
00171 static void recvStartCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00172         struct stateDigIn_type *instance=(struct stateDigIn_type*)vinstance;
00173         static int lastState = 0;
00174         switch (info->status) {
00175                 case NEW_DATA:
00176                         if((instance->state==0) && (lastState==0)) //ZAVOLAM STARTOVACI FUNKCI;
00177                                 lastState=1;
00178                                 robot.start = 0;
00179                         if((instance->state==1) && (lastState==1)) //ZAVOLAM STARTOVACI FUNKCI;
00180                         {
00181                                 lastState = 2;
00182                                 robot.start = 1;
00183                                 
00184                         }
00185                         //fsm_signal(FSM(LOC), EV_LASER_RECEIVED); 
00186                         break;
00187                 case DEADLINE:
00188                         //DBG("IR deadline occurred\n");
00189                         break;
00190         }
00191 }
00192 
00193 static void recvJoyCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam) {
00194         struct joyData_type *instance=(struct joyData_type*)vinstance;
00195 
00196         switch (info->status) {
00197                 case NEW_DATA:
00198                         ROBOT_LOCK(joy);
00199                         robot.joy = *instance;
00200                         ROBOT_UNLOCK(joy);
00201                         
00202                         //fsm_signal(FSM(LOC), EV_LASER_RECEIVED); 
00203                         break;
00204                 case DEADLINE:
00205                         //DBG("IR deadline occurred\n");
00206                         break;
00207         }
00208 }
00209 
00210 void *subscriberJoyCreate(void *arg) {
00211         ORTESubscription    *s;
00212         NtpTime             deadline,minimumSeparation;
00213 
00214         joyData_type_register(d);
00215 //      ORTETypeRegisterAdd(d,"SharpMsg1",NULL,NULL,NULL,sizeof(sharpToRecv)); 
00216         NTPTIME_BUILD(deadline,10);
00217         NTPTIME_BUILD(minimumSeparation,0);
00218         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "joy", "joyData",          &(robot.joy), &deadline, &minimumSeparation, recvJoyCallBack, arg, IPADDRESS_INVALID);
00219         return arg;
00220 }
00221 
00222 void *subscriberIRCreate(void *arg) {
00223         ORTESubscription    *s;
00224         NtpTime             deadline,minimumSeparation;
00225 
00226         stateInnerIR_type_register(d);
00227 //      ORTETypeRegisterAdd(d,"SharpMsg1",NULL,NULL,NULL,sizeof(sharpToRecv)); 
00228         NTPTIME_BUILD(deadline,10);
00229         NTPTIME_BUILD(minimumSeparation,0);
00230         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "IR", "stateInnerIR",              &(robot.IRsensors), &deadline, &minimumSeparation, recvIRCallBack, arg, IPADDRESS_INVALID);
00231         return arg;
00232 }
00233 
00234 void *subscriberOdoCreate(void *arg) {
00235         ORTESubscription    *s;
00236         NtpTime             deadline,minimumSeparation;
00237 
00238         motionPos_type_register(d);
00239 //      ORTETypeRegisterAdd(d,"SharpMsg1",NULL,NULL,NULL,sizeof(sharpToRecv)); 
00240         NTPTIME_BUILD(deadline,10);
00241         NTPTIME_BUILD(minimumSeparation,0);
00242         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "position", "motionPos",           &(robot.odometry), &deadline, &minimumSeparation, recvOdoCallBack, arg, IPADDRESS_INVALID);
00243         return arg;
00244 }
00245 
00246 void *subscriberDICreate(void *arg) {
00247         ORTESubscription    *s;
00248         NtpTime             deadline,minimumSeparation;
00249 
00250         stateDigIn_type_register(d);
00251         NTPTIME_BUILD(deadline,10);
00252         NTPTIME_BUILD(minimumSeparation,0);
00253         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "DI", "stateDigIn",                &(robot.startBit), &deadline, &minimumSeparation, recvStartCallBack, arg, IPADDRESS_INVALID);
00254         return arg;
00255 }
00256 
00257 void *subscriberSharp1Create(void *arg) {
00258         ORTESubscription    *s;
00259         NtpTime             deadline,minimumSeparation;
00260 
00261         sharpLongs_type_register(d);
00262 //      ORTETypeRegisterAdd(d,"SharpMsg1",NULL,NULL,NULL,sizeof(sharpToRecv));
00263         NTPTIME_BUILD(deadline,10);
00264         NTPTIME_BUILD(minimumSeparation,0);
00265         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "sharpSouper", "sharpLongs",
00266                                  &(robot.sharpsOpponent), &deadline, &minimumSeparation, recvSharp1CallBack, arg, IPADDRESS_INVALID);
00267                                  //FIXME: ^ Orte to prepisuje? Neni to lockovany!!!!
00268         return arg;
00269 }
00270 
00271 void *subscriberSharp2Create(void *arg) {
00272         ORTESubscription    *s;
00273         NtpTime             deadline,minimumSeparation;
00274 
00275         sharpShorts_type_register(d);
00276 //      ORTETypeRegisterAdd(d,"SharpMsg1",NULL,NULL,NULL,sizeof(sharpToRecv)); 
00277         NTPTIME_BUILD(deadline,10);
00278         NTPTIME_BUILD(minimumSeparation,0);
00279         s=ORTESubscriptionCreate(d, IMMEDIATE, BEST_EFFORTS, "sharpLahve", "sharpShorts",               &(robot.sharpsWaste), &deadline, &minimumSeparation, recvSharp2CallBack, arg, IPADDRESS_INVALID);
00280         return arg;
00281 }
00282 
00283 void sendCallBackMotor(const ORTESendInfo *info,void *instance, void *sendCallBackParam) {
00284         switch (info->status) {
00285                 case NEED_DATA:
00286                         //DBG("need data\n");
00287                         break;
00288                 case CQL:
00289                         //DBG("cql\n");
00290                         break;
00291         }
00292 }
00293 static void *publisherMotorCreate(void *arg) {
00294         NtpTime             persistence, delay;
00295 
00296         motionSpeed_type_register(d);
00297 
00298         NTPTIME_BUILD(persistence,3);
00299         NTPTIME_BUILD(delay,1); 
00300         robot.publisherMotor=ORTEPublicationCreate(d, "motor", "motionSpeed", 
00301                                                    &robot.orte_speed, &persistence, 1, 
00302                                                    sendCallBackMotor,  NULL, &delay);
00303         return arg;
00304 }
00305 
00306 void *publisherCreateServo(void *arg) {
00307         NtpTime             persistence, delay;
00308 
00309         stateServa_type_register(d);
00310         NTPTIME_BUILD(persistence,3);
00311         NTPTIME_BUILD(delay,1); 
00312         robot.publisherServa=ORTEPublicationCreate(d, "serva", "stateServa", &(robot.serva), &persistence, 1, NULL, arg, &delay);
00313         return arg;
00314 }
00315 
00316 void sendCallBackPosition(const ORTESendInfo *info,void *vinstance, void *sendCallBackParam) {
00317         position *instance=(position*)vinstance;
00318 
00319         switch (info->status) {
00320                 case NEED_DATA:
00321                         instance = &(robot.act_pos);
00322                         break;
00323                 case CQL:  //criticalQueueLevel
00324                         break;
00325         }
00326 }
00327 
00328 void *publisherCreatePosition(void *arg) {
00329         NtpTime             persistence, delay;
00330 
00331         position_type_register(d);
00332         NTPTIME_BUILD(persistence,3);
00333         NtpTimeAssembFromMs(delay,0,40); 
00334         robot.publisherPosition=ORTEPublicationCreate(d, "pos", "position", &(robot.act_pos), &persistence, 1, sendCallBackPosition, arg, &delay);
00335         return arg;
00336 }
00337 
00338 void initOrte() {
00339         ORTEInit();
00340 
00341         ORTEVerbositySetOptions("ALL.0");
00342         d=ORTEDomainAppCreate(ORTE_DEFAULT_DOMAIN,NULL,NULL,ORTE_FALSE);
00343         if (!d) {
00344                 printf("ORTEDomainAppCreate failed!\n");
00345         }
00346         subscriberJoyCreate(NULL);
00347         subscriberLaserCreate(NULL);
00348         publisherMotorCreate(NULL);
00349         publisherCreateServo(NULL);
00350         subscriberSharp1Create(NULL);
00351         subscriberSharp2Create(NULL);
00352         subscriberIRCreate(NULL);
00353         subscriberDICreate(NULL);
00354         subscriberOdoCreate(NULL);
00355         publisherCreatePosition(NULL);
00356 }
00357 
00358 void terminateOrte() {
00359         ORTEDomainAppDestroy(d);
00360 }

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