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;
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
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
00070
00071 break;
00072 case DEADLINE:
00073
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
00088 break;
00089 case DEADLINE:
00090
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
00105 break;
00106 case DEADLINE:
00107
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);
00117 double c = (M_PI*2*ROBOT_WHEEL_RADIUS_MM/1000) / (n * 4*500.0);
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
00151 deltaU = (dk0 + dk1) / 2;
00152
00153 deltAlfa = (dk1 - dk0) / (2.0*ROBOT_ROTATION_RADIUS_MM/1000);
00154 ROBOT_LOCK(act_pos);
00155 aktUhel = robot.act_pos.phi;
00156 ROBOT_UNLOCK(act_pos);
00157
00158 aktUhel += deltAlfa;
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))
00177 lastState=1;
00178 robot.start = 0;
00179 if((instance->state==1) && (lastState==1))
00180 {
00181 lastState = 2;
00182 robot.start = 1;
00183
00184 }
00185
00186 break;
00187 case DEADLINE:
00188
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
00203 break;
00204 case DEADLINE:
00205
00206 break;
00207 }
00208 }
00209
00210 void *subscriberJoyCreate(void *arg) {
00211 ORTESubscription *s;
00212 NtpTime deadline,minimumSeparation;
00213
00214 joyData_type_register(d);
00215
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
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
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
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
00268 return arg;
00269 }
00270
00271 void *subscriberSharp2Create(void *arg) {
00272 ORTESubscription *s;
00273 NtpTime deadline,minimumSeparation;
00274
00275 sharpShorts_type_register(d);
00276
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
00287 break;
00288 case CQL:
00289
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:
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 }