void Node::jointStateCB (sm::JointState::ConstPtr m)
{
  // The first time round, figure out which joints to ignore
  if (joint_ignored_.size()==0)
  {
    updateIgnoredJoints(*m);
    writeJointNames(*m);
  }
  
  // Only save every so often
  if (ros::Time::now() <= last_processed_ + processing_interval_)
    return;

  RobotState rs(m, getBasePose(m->header.stamp));
  
  Diffs diffs = getDiffs(last_saved_state_, rs);
  saveToDB(diffs);
  last_saved_state_ = rs;
}
::Ice::DispatchStatus
RoboCompGenericBase::GenericBase::___getBasePose(::IceInternal::Incoming& __inS, const ::Ice::Current& __current)
{
    __checkMode(::Ice::Normal, __current.mode);
    __inS.readEmptyParams();
    ::Ice::Int x;
    ::Ice::Int z;
    ::Ice::Float alpha;
    try
    {
        getBasePose(x, z, alpha, __current);
        ::IceInternal::BasicStream* __os = __inS.__startWriteParams(::Ice::DefaultFormat);
        __os->write(x);
        __os->write(z);
        __os->write(alpha);
        __inS.__endWriteParams(true);
        return ::Ice::DispatchOK;
    }
    catch(const ::RoboCompGenericBase::HardwareFailedException& __ex)
    {
        __inS.__writeUserException(__ex, ::Ice::DefaultFormat);
    }
    return ::Ice::DispatchUserException;
}