예제 #1
0
EDELIB_NS_BEGIN

// Set 'pathname' of specified menuitem
//    If finditem==NULL, mvalue() is used (the most recently picked menuitem)
//    Returns:
//       0 : OK
//      -1 : item not found (name="")
//      -2 : 'name' not large enough (name="")
//
#define SAFE_STRCAT(s) \
    { len += strlen(s); if ( len >= namelen ) { *name='\0'; return(-2); } else strcat(name,(s)); }
int MenuBase::item_pathname(char *name, int namelen, const MenuItem *finditem) const {
    int len = 0;
    finditem = finditem ? finditem : mvalue();    
    name[0] = '\0';
    for ( int t=0; t<size(); t++ ) {
        const MenuItem *m = &(menu()[t]);
	if ( m->submenu() ) {				// submenu? descend
	    if (*name) SAFE_STRCAT("/");
	    if (m->label()) SAFE_STRCAT(m->label());
	} else {
	    if (m->label()) {				// menu item?
		if ( m == finditem ) {			// found? tack on itemname, done.
		    SAFE_STRCAT("/");
		    SAFE_STRCAT(m->label());
		    return(0);
		}
	    } else {					// end of submenu? pop
	        char *ss = strrchr(name, '/');
		if ( ss ) { *ss = 0; len = strlen(name); }	// "File/Edit" -> "File"
		else { name[0] = '\0'; len = 0; }		// "File" -> ""
		continue;
	    }
	}
    }
    *name = '\0';
    return(-1);						// item not found
}
예제 #2
0
bool TrajectoryJob::toJobString(JointTraj & trajectory, char* str_buffer, size_t buffer_size)
{
  bool rtn = false;
  if (0 < buffer_size)
  {

    // Header begin
    // ----------------------------------------------------------------------------
    strcpy(str_buffer, "");
    APPEND_LINE(str_buffer, buffer_size, "/JOB");

    sprintf(this->line_buffer_, "//NAME %s", this->name_);
    APPEND_LINE(str_buffer, buffer_size, this->line_buffer_);

    APPEND_LINE(str_buffer, buffer_size, "//POS");

    sprintf(this->line_buffer_, "///NPOS %d,0,0,0,0,0", trajectory.size());
    APPEND_LINE(str_buffer, buffer_size, this->line_buffer_);

    APPEND_LINE(str_buffer, buffer_size, "///TOOL 0");
    APPEND_LINE(str_buffer, buffer_size, "///POSTYPE PULSE");
    APPEND_LINE(str_buffer, buffer_size, "///PULSE");

    // Point declaration and initialization
    // ----------------------------------------------------------------------------
    JointTrajPt pt;
    JointData rosData;
    float mpRadians[MAX_PULSE_AXES];
    long mpPulses[MAX_PULSE_AXES];

    for(int i = 0; i < trajectory.size(); i++)
    {
      sprintf(this->line_buffer_, "C%05d=", i);
      SAFE_STRCAT(str_buffer, buffer_size, this->line_buffer_);
      trajectory.getPoint(i, pt);
      pt.getJointPosition(rosData);
      
      // Converting to a motoplus joint (i.e. the correct order and units
      toMpJoint(rosData, mpRadians);
      memset(mpPulses, 0, MAX_PULSE_AXES);  // can't convert radian->pulse on PC-side
      LOG_ERROR("Failed to create Job string: Radian->Pulse scaling is not available for PC-side code.");
      return false;

      for(int j = 0; j < MAX_PULSE_AXES; j++)
      {
        // Don't append comma to last position, instead line-feed.
        if (j < (MAX_PULSE_AXES - 1))
        {
          sprintf(this->line_buffer_, "%d,", mpPulses[j]);
          SAFE_STRCAT(str_buffer, buffer_size, this->line_buffer_);
        }
        else
        {
          sprintf(this->line_buffer_, "%d", mpPulses[j]);
          APPEND_LINE(str_buffer, buffer_size, this->line_buffer_);
        }
      }
    }

    // Header end
    // ----------------------------------------------------------------------------
    APPEND_LINE(str_buffer, buffer_size, "//INST");
    APPEND_LINE(str_buffer, buffer_size, "///DATE 1979/10/01 00:00");
    APPEND_LINE(str_buffer, buffer_size, "///ATTR SC,RW");
    APPEND_LINE(str_buffer, buffer_size, "///GROUP1 RB1");

    // Program
    APPEND_LINE(str_buffer, buffer_size, "NOP");
    for(int i = 0; i < trajectory.size(); i++)
    {
      trajectory.getPoint(i, pt);
      sprintf(this->line_buffer_, "MOVJ C%05d VJ=%.2f", i, pt.getVelocity());
      APPEND_LINE(str_buffer, buffer_size, this->line_buffer_);
    }
    APPEND_LINE(str_buffer, buffer_size, "END");

    rtn = true;
  }
  else
  {
    rtn = false;
    LOG_ERROR("Failed to generate job string");
  }

  return rtn;

}