#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "emc.hh"
#include "rcs_print.hh"
#include "emcIniFile.hh"
#include "inijoint.hh"
#include "emcglb.h"
#include "emccfg.h"
#include "inihal.hh"
extern value_inihal_data old_inihal_data;
static int loadJoint(int joint, EmcIniFile *jointIniFile)
{
char jointString[16];
const char *inistring;
EmcJointType jointType;
double units;
double backlash;
double offset;
double limit;
double home;
double search_vel;
double latch_vel;
double final_vel; bool use_index;
bool encoder_does_not_reset;
bool ignore_limits;
bool is_shared;
int sequence;
int volatile_home;
int locking_indexer;
int absolute_encoder;
int comp_file_type; double maxVelocity;
double maxAcceleration;
double ferror;
sprintf(jointString, "JOINT_%d", joint);
jointIniFile->EnableExceptions(EmcIniFile::ERR_CONVERSION);
try {
jointType = EMC_LINEAR; jointIniFile->Find(&jointType, "TYPE", jointString);
if (0 != emcJointSetType(joint, jointType)) {
return -1;
}
if(jointType == EMC_LINEAR){
units = emcTrajGetLinearUnits();
}else{
units = emcTrajGetAngularUnits();
}
if (0 != emcJointSetUnits(joint, units)) {
return -1;
}
backlash = 0; jointIniFile->Find(&backlash, "BACKLASH", jointString);
if (0 != emcJointSetBacklash(joint, backlash)) {
return -1;
}
old_inihal_data.joint_backlash[joint] = backlash;
limit = -1e99; jointIniFile->Find(&limit, "MIN_LIMIT", jointString);
if (0 != emcJointSetMinPositionLimit(joint, limit)) {
return -1;
}
old_inihal_data.joint_min_limit[joint] = limit;
limit = 1e99; jointIniFile->Find(&limit, "MAX_LIMIT", jointString);
if (0 != emcJointSetMaxPositionLimit(joint, limit)) {
return -1;
}
old_inihal_data.joint_max_limit[joint] = limit;
ferror = 1; jointIniFile->Find(&ferror, "FERROR", jointString);
if (0 != emcJointSetFerror(joint, ferror)) {
return -1;
}
old_inihal_data.joint_ferror[joint] = ferror;
jointIniFile->Find(&ferror, "MIN_FERROR", jointString);
if (0 != emcJointSetMinFerror(joint, ferror)) {
return -1;
}
old_inihal_data.joint_min_ferror[joint] = ferror;
home = 0; jointIniFile->Find(&home, "HOME", jointString);
old_inihal_data.joint_home[joint] = home;
offset = 0; jointIniFile->Find(&offset, "HOME_OFFSET", jointString);
old_inihal_data.joint_home_offset[joint] = offset;
search_vel = 0; jointIniFile->Find(&search_vel, "HOME_SEARCH_VEL", jointString);
latch_vel = 0; jointIniFile->Find(&latch_vel, "HOME_LATCH_VEL", jointString);
final_vel = -1; jointIniFile->Find(&final_vel, "HOME_FINAL_VEL", jointString);
is_shared = false; jointIniFile->Find(&is_shared, "HOME_IS_SHARED", jointString);
use_index = false; jointIniFile->Find(&use_index, "HOME_USE_INDEX", jointString);
encoder_does_not_reset = false; jointIniFile->Find(&encoder_does_not_reset, "HOME_INDEX_NO_ENCODER_RESET", jointString);
ignore_limits = false; jointIniFile->Find(&ignore_limits, "HOME_IGNORE_LIMITS", jointString);
sequence = 999; jointIniFile->Find(&sequence, "HOME_SEQUENCE", jointString);
old_inihal_data.joint_home_sequence[joint] = sequence;
volatile_home = 0; jointIniFile->Find(&volatile_home, "VOLATILE_HOME", jointString);
locking_indexer = false;
jointIniFile->Find(&locking_indexer, "LOCKING_INDEXER", jointString);
absolute_encoder = false;
jointIniFile->Find(&absolute_encoder, "HOME_ABSOLUTE_ENCODER", jointString);
if (0 != emcJointSetHomingParams(joint, home, offset
,final_vel, search_vel, latch_vel
,(int)use_index
,(int)encoder_does_not_reset
,(int)ignore_limits
,(int)is_shared
,sequence
,volatile_home
,locking_indexer
,absolute_encoder
)) {
return -1;
}
maxVelocity = DEFAULT_JOINT_MAX_VELOCITY;
jointIniFile->Find(&maxVelocity, "MAX_VELOCITY", jointString);
if (0 != emcJointSetMaxVelocity(joint, maxVelocity)) {
return -1;
}
old_inihal_data.joint_max_velocity[joint] = maxVelocity;
maxAcceleration = DEFAULT_JOINT_MAX_ACCELERATION;
jointIniFile->Find(&maxAcceleration, "MAX_ACCELERATION", jointString);
if (0 != emcJointSetMaxAcceleration(joint, maxAcceleration)) {
return -1;
}
old_inihal_data.joint_max_acceleration[joint] = maxAcceleration;
comp_file_type = 0; jointIniFile->Find(&comp_file_type, "COMP_FILE_TYPE", jointString);
if (NULL != (inistring = jointIniFile->Find("COMP_FILE", jointString))) {
if (0 != emcJointLoadComp(joint, inistring, comp_file_type)) {
return -1;
}
}
}
catch (EmcIniFile::Exception &e) {
e.Print();
return -1;
}
if (0 != emcJointActivate(joint)) {
return -1;
}
return 0;
}
int iniJoint(int joint, const char *filename)
{
EmcIniFile jointIniFile(EmcIniFile::ERR_TAG_NOT_FOUND |
EmcIniFile::ERR_SECTION_NOT_FOUND |
EmcIniFile::ERR_CONVERSION);
if (jointIniFile.Open(filename) == false) {
return -1;
}
if (0 != loadJoint(joint, &jointIniFile)) {
return -1;
}
return 0;
}