* SUBSCRIBER CALLBACKS - GENERIC
* ---------------------------------------------------------------------- */
+void rcv_odo_data_cb(const ORTERecvInfo *info, void *vinstance,
+ void *recvCallBackParam)
+{
+#if 0
+ struct motion_irc_type *instance = (struct motion_irc_type *)vinstance;
+ double dleft, dright, dtang, dphi;
+ static bool first_run = true;
+ /* spocitat prevodovy pomer */
+ const double n = (double)(28.0 / 1.0);
+
+ /* vzdalenost na pulz IRC */
+ const double c = (M_PI*2*ROBOT_WHEEL_RADIUS_M) / (n * 4*500.0);
+
+ /* TODO: Michal - dodelat */
+ switch (info->status) {
+ case NEW_DATA:
+ if (first_run) {
+ ROBOT_LOCK(motion_irc);
+ robot.motion_irc = *instance;
+ ROBOT_UNLOCK(motion_irc);
+ first_run = false;
+ break;
+ }
+
+ dleft = ((robot.motion_irc.left - instance->left) >> 8) * c;
+ dright = ((instance->right - robot.motion_irc.right) >> 8) * c;
+
+ dtang = (dleft + dright) / 2.0;
+ dphi = (dright - dleft) / (2.0*ROBOT_ROTATION_RADIUS_M);
+
+ ROBOT_LOCK(est_pos_odo);
+ double a = robot.est_pos_odo.phi;
+ robot.est_pos_odo.x += dtang*cos(a);
+ robot.est_pos_odo.y += dtang*sin(a);
+ robot.est_pos_odo.phi += dphi;
+ ROBOT_UNLOCK(est_pos_odo);
+
+ /* locking should not be needed, but... */
+ ROBOT_LOCK(motion_irc);
+ robot.motion_irc = *instance;
+ robot.motion_irc_received = 1;
+ ROBOT_UNLOCK(motion_irc);
+
+ robot.odometry_works = true;
+
+ robot.hw_status[STATUS_MOTION] = HW_STATUS_OK;
+ break;
+ case DEADLINE:
+ robot.odometry_works = false;
+ robot.hw_status[STATUS_MOTION] = HW_STATUS_FAILED;
+ DBG("ORTE deadline occurred - motion_irc receive\n");
+ break;
+ }
+#endif
+}
+
+
+
void rcv_motion_irc_cb(const ORTERecvInfo *info, void *vinstance,
void *recvCallBackParam)
{
robottype_publisher_camera_control_create(&robot.orte, send_dummy_cb, &robot.orte);
/* create generic subscribers */
+ robottype_subscriber_odo_data_create(&robot.orte, rcv_odo_data_cb, &robot.orte);
robottype_subscriber_motion_irc_create(&robot.orte, rcv_motion_irc_cb, &robot.orte);
robottype_subscriber_motion_speed_create(&robot.orte, rcv_motion_speed_cb, &robot.orte);
robottype_subscriber_motion_status_create(&robot.orte, rcv_motion_status_cb, &robot.orte);