Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 57 additions & 55 deletions src/emc/ini/inihal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <stdio.h>
#include <hal.h>
#include <rtapi.h>
#include <rtapi_math.h>
#include "inihal.hh"
#include "iniaxis.hh"
#include "inispindle.hh"
Expand All @@ -36,19 +37,11 @@ static ptr_inihal_data *the_inihal_data;

#define PREFIX "ini."
#define EPSILON .00001
#define CLOSE(a,b,eps) ((a)-(b) < +(eps) && (a)-(b) > -(eps))

#define NEW(NAME) new_inihal_data.NAME

#define CHANGED(NAME) \
((old_inihal_data.NAME) - (new_inihal_data.NAME) > +(EPSILON)) \
|| \
((old_inihal_data.NAME) - (new_inihal_data.NAME) < -(EPSILON))

#define CHANGED_IDX(NAME,IDX) \
((old_inihal_data.NAME[IDX]) - (new_inihal_data.NAME[IDX]) > +(EPSILON)) \
|| \
((old_inihal_data.NAME[IDX]) - (new_inihal_data.NAME[IDX]) < -(EPSILON))
#define CHANGED(NAME) (fabs((old_inihal_data.NAME) - (new_inihal_data.NAME)) > (EPSILON))
#define CHANGED_IDX(NAME,IDX) (fabs((old_inihal_data.NAME[IDX]) - (new_inihal_data.NAME[IDX])) > (EPSILON))

#define UPDATE(NAME) old_inihal_data.NAME = new_inihal_data.NAME

Expand Down Expand Up @@ -86,44 +79,46 @@ static ptr_inihal_data *the_inihal_data;
new_inihal_data.NAME[IDX]);
#define MAKE_BIT_PIN(NAME,DIR) \
do { \
retval = hal_pin_bit_newf(DIR,&(the_inihal_data->NAME),comp_id,PREFIX#NAME); \
int retval = hal_pin_new_bool(comp_id, DIR, &(the_inihal_data->NAME), 0, PREFIX#NAME); \
if (retval < 0) return retval; \
} while (0)

#define MAKE_S32_PIN(NAME,DIR) \
do { \
retval = hal_pin_s32_newf(DIR,&(the_inihal_data->NAME),comp_id,PREFIX#NAME); \
int retval = hal_pin_new_si32(comp_id, DIR, &(the_inihal_data->NAME), 0, PREFIX#NAME); \
if (retval < 0) return retval; \
} while (0)

#define MAKE_S32_PIN_IDX(NAME,HALPIN_NAME,DIR,IDX) \
do { \
retval = hal_pin_s32_newf(DIR,&(the_inihal_data->NAME[IDX]),\
comp_id,PREFIX"%d."#HALPIN_NAME,IDX); \
int retval = hal_pin_new_si32(comp_id, DIR, &(the_inihal_data->NAME[IDX]),\
0, PREFIX"%d."#HALPIN_NAME, IDX); \
if (retval < 0) return retval; \
} while (0)

#define MAKE_FLOAT_PIN(NAME,DIR) \
do { \
retval = hal_pin_float_newf(DIR,&(the_inihal_data->NAME),comp_id,PREFIX#NAME); \
int retval = hal_pin_new_real(comp_id, DIR, &(the_inihal_data->NAME), 0,PREFIX#NAME); \
if (retval < 0) return retval; \
} while (0)

#define MAKE_FLOAT_PIN_IDX(NAME,HALPIN_NAME,DIR,IDX) \
do { \
retval = hal_pin_float_newf(DIR,&(the_inihal_data->NAME[IDX]),\
comp_id,PREFIX"%d."#HALPIN_NAME,IDX); \
int retval = hal_pin_new_real(comp_id, DIR, &(the_inihal_data->NAME[IDX]),\
0.0, PREFIX"%d."#HALPIN_NAME, IDX); \
if (retval < 0) return retval; \
} while (0)

#define MAKE_FLOAT_PIN_LETTER(NAME,HALPIN_NAME,DIR,IDX,LETTER) \
do { \
retval = hal_pin_float_newf(DIR,&(the_inihal_data->NAME[IDX]),\
comp_id,PREFIX"%c."#HALPIN_NAME,LETTER); \
int retval = hal_pin_new_real(comp_id, DIR, &(the_inihal_data->NAME[IDX]),\
0.0, PREFIX"%c."#HALPIN_NAME, LETTER); \
if (retval < 0) return retval; \
} while (0)

#define INIT_PIN(NAME) *(the_inihal_data->NAME) = old_inihal_data.NAME;
#define INIT_PIN_R(NAME) hal_set_real(the_inihal_data->NAME, old_inihal_data.NAME);
#define INIT_PIN_S(NAME) hal_set_si32(the_inihal_data->NAME, old_inihal_data.NAME);
#define INIT_PIN_B(NAME) hal_set_bool(the_inihal_data->NAME, old_inihal_data.NAME);

int ini_hal_exit(void)
{
Expand All @@ -134,8 +129,6 @@ int ini_hal_exit(void)

int ini_hal_init(int numjoints)
{
int retval;

comp_id = hal_init("inihal");
if (comp_id < 0) {
rtapi_print_msg(RTAPI_MSG_ERR,
Expand Down Expand Up @@ -193,57 +186,66 @@ int ini_hal_init(int numjoints)

int ini_hal_init_pins(int numjoints)
{
INIT_PIN(traj_default_velocity);
INIT_PIN(traj_max_velocity);
INIT_PIN(traj_default_acceleration);
INIT_PIN(traj_max_acceleration);
INIT_PIN(traj_max_jerk);
INIT_PIN(traj_planner_type);

INIT_PIN(traj_arc_blend_enable);
INIT_PIN(traj_arc_blend_fallback_enable);
INIT_PIN(traj_arc_blend_optimization_depth);
INIT_PIN(traj_arc_blend_gap_cycles);
INIT_PIN(traj_arc_blend_ramp_freq);
INIT_PIN(traj_arc_blend_tangent_kink_ratio);
INIT_PIN_R(traj_default_velocity);
INIT_PIN_R(traj_max_velocity);
INIT_PIN_R(traj_default_acceleration);
INIT_PIN_R(traj_max_acceleration);
INIT_PIN_R(traj_max_jerk);
INIT_PIN_S(traj_planner_type);

INIT_PIN_B(traj_arc_blend_enable);
INIT_PIN_B(traj_arc_blend_fallback_enable);
INIT_PIN_S(traj_arc_blend_optimization_depth);
INIT_PIN_R(traj_arc_blend_gap_cycles);
INIT_PIN_R(traj_arc_blend_ramp_freq);
INIT_PIN_R(traj_arc_blend_tangent_kink_ratio);

for (int idx = 0; idx < numjoints; idx++) {
INIT_PIN(joint_backlash[idx]);
INIT_PIN(joint_ferror[idx]);
INIT_PIN(joint_min_ferror[idx]);
INIT_PIN(joint_min_limit[idx]);
INIT_PIN(joint_max_limit[idx]);
INIT_PIN(joint_max_velocity[idx]);
INIT_PIN(joint_max_acceleration[idx]);
INIT_PIN(joint_jerk[idx]);
INIT_PIN(joint_home[idx]);
INIT_PIN(joint_home_offset[idx]);
INIT_PIN(joint_home_sequence[idx]);
INIT_PIN_R(joint_backlash[idx]);
INIT_PIN_R(joint_ferror[idx]);
INIT_PIN_R(joint_min_ferror[idx]);
INIT_PIN_R(joint_min_limit[idx]);
INIT_PIN_R(joint_max_limit[idx]);
INIT_PIN_R(joint_max_velocity[idx]);
INIT_PIN_R(joint_max_acceleration[idx]);
INIT_PIN_R(joint_jerk[idx]);
INIT_PIN_R(joint_home[idx]);
INIT_PIN_R(joint_home_offset[idx]);
INIT_PIN_S(joint_home_sequence[idx]);
}
for (int idx = 0; idx < EMCMOT_MAX_AXIS; idx++) {
INIT_PIN(axis_min_limit[idx]);
INIT_PIN(axis_max_limit[idx]);
INIT_PIN(axis_max_velocity[idx]);
INIT_PIN(axis_max_acceleration[idx]);
INIT_PIN(axis_jerk[idx]);
INIT_PIN_R(axis_min_limit[idx]);
INIT_PIN_R(axis_max_limit[idx]);
INIT_PIN_R(axis_max_velocity[idx]);
INIT_PIN_R(axis_max_acceleration[idx]);
INIT_PIN_R(axis_jerk[idx]);
}

return 0;
} // ini_hal_init_pins()

static void copy_hal_data(const ptr_inihal_data &i, value_inihal_data &j)
{
int x;
#define FIELD(t,f) j.f = (i.f)?*i.f:0;
#define ARRAY(t,f,n) do { for (x = 0; x < n; x++) j.f[x] = (i.f[x])?*i.f[x]:0; } while (0);
#define FIELD(t,f) do { \
if(i.f) { \
j.f = hal_get_##t(i.f); \
} \
} while(0);
#define ARRAY(t,f,n) do { \
for (int x = 0; x < n; x++) { \
if(i.f[x]) { \
j.f[x] = hal_get_##t(i.f[x]); \
} \
} \
} while (0);
HAL_FIELDS
#undef FIELD
#undef ARRAY
} // copy_hal_data()

int check_ini_hal_items(int numjoints)
{
value_inihal_data new_inihal_data_mutable;
value_inihal_data new_inihal_data_mutable = {};
copy_hal_data(*the_inihal_data, new_inihal_data_mutable);
const value_inihal_data &new_inihal_data = new_inihal_data_mutable;

Expand Down
82 changes: 47 additions & 35 deletions src/emc/ini/inihal.hh
Original file line number Diff line number Diff line change
Expand Up @@ -47,62 +47,74 @@ int ini_hal_init_pins(int numjoints);
[JOINT_n]COMP_FILE_TYPE
[JOINT_n]COMP
*/
// FIXME: This will have to go again when we do proper 64-bit
// The typedefs are necessary to map to hal_[gs]et_[su]i32() in the expansion
// of below macros because they are selected based on text-concatenation in the
// preprocessor. Even the 32-bit version use sint/uint, but the expansion would
// then select the 64-bit versions.
typedef hal_sint_t hal_si32_t;
typedef hal_uint_t hal_ui32_t;

#define HAL_FIELDS \
FIELD(hal_float_t,traj_default_velocity) \
FIELD(hal_float_t,traj_max_velocity) \
FIELD(hal_float_t,traj_default_acceleration) \
FIELD(hal_float_t,traj_max_acceleration) \
FIELD(hal_float_t,traj_max_jerk) \
FIELD(hal_s32_t,traj_planner_type) \
FIELD(real,traj_default_velocity) \
FIELD(real,traj_max_velocity) \
FIELD(real,traj_default_acceleration) \
FIELD(real,traj_max_acceleration) \
FIELD(real,traj_max_jerk) \
FIELD(si32,traj_planner_type) \
\
FIELD(hal_bit_t,traj_arc_blend_enable) \
FIELD(hal_bit_t,traj_arc_blend_fallback_enable) \
FIELD(hal_s32_t,traj_arc_blend_optimization_depth) \
FIELD(hal_float_t,traj_arc_blend_gap_cycles) \
FIELD(hal_float_t,traj_arc_blend_ramp_freq) \
FIELD(hal_float_t,traj_arc_blend_tangent_kink_ratio) \
FIELD(bool,traj_arc_blend_enable) \
FIELD(bool,traj_arc_blend_fallback_enable) \
FIELD(si32,traj_arc_blend_optimization_depth) \
FIELD(real,traj_arc_blend_gap_cycles) \
FIELD(real,traj_arc_blend_ramp_freq) \
FIELD(real,traj_arc_blend_tangent_kink_ratio) \
\
ARRAY(hal_float_t,joint_backlash,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_ferror,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_min_ferror,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_min_limit,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_max_limit,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_max_velocity,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_max_acceleration,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_jerk,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_home,EMCMOT_MAX_JOINTS) \
ARRAY(hal_float_t,joint_home_offset,EMCMOT_MAX_JOINTS) \
ARRAY(hal_s32_t, joint_home_sequence,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_backlash,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_ferror,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_min_ferror,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_min_limit,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_max_limit,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_max_velocity,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_max_acceleration,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_jerk,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_home,EMCMOT_MAX_JOINTS) \
ARRAY(real,joint_home_offset,EMCMOT_MAX_JOINTS) \
ARRAY(si32,joint_home_sequence,EMCMOT_MAX_JOINTS) \
\
ARRAY(hal_float_t,axis_min_limit,EMCMOT_MAX_AXIS) \
ARRAY(hal_float_t,axis_max_limit,EMCMOT_MAX_AXIS) \
ARRAY(hal_float_t,axis_max_velocity,EMCMOT_MAX_AXIS) \
ARRAY(hal_float_t,axis_max_acceleration,EMCMOT_MAX_AXIS) \
ARRAY(hal_float_t,axis_jerk,EMCMOT_MAX_AXIS) \
ARRAY(real,axis_min_limit,EMCMOT_MAX_AXIS) \
ARRAY(real,axis_max_limit,EMCMOT_MAX_AXIS) \
ARRAY(real,axis_max_velocity,EMCMOT_MAX_AXIS) \
ARRAY(real,axis_max_acceleration,EMCMOT_MAX_AXIS) \
ARRAY(real,axis_jerk,EMCMOT_MAX_AXIS) \

struct PTR {
template<class T>
struct field { typedef T *type; };
struct field { typedef T type; };
};

#pragma GCC diagnostic push
#if defined(__GNUC__) && (__GNUC__ > 4)
#pragma GCC diagnostic ignored "-Wignored-attributes"
#endif
template<class T> struct NATIVE {};
template<> struct NATIVE<hal_bit_t> { typedef bool type; };
template<> struct NATIVE<hal_s32_t> { typedef rtapi_s32 type; };
template<> struct NATIVE<hal_u32_t> { typedef rtapi_u32 type; };
template<> struct NATIVE<hal_float_t> { typedef double type; };
template<> struct NATIVE<hal_bool_t> { typedef rtapi_bool type; };
template<> struct NATIVE<hal_si32_t> { typedef rtapi_s32 type; };
template<> struct NATIVE<hal_ui32_t> { typedef rtapi_u32 type; };
// FIXME: These need to be 64-bit. Can't set them now because the compiler sees
// the typedef mapped overlap.
//template<> struct NATIVE<hal_sint_t> { typedef rtapi_sint type; };
//template<> struct NATIVE<hal_uint_t> { typedef rtapi_uint type; };
template<> struct NATIVE<hal_real_t> { typedef rtapi_real type; };
struct VALUE {
template<class T> struct field { typedef typename NATIVE<T>::type type; };
};

template<class T>
struct inihal_base
{
#define FIELD(t,f) typename T::template field<t>::type f;
#define ARRAY(t,f,n) typename T::template field<t>::type f[n];
#define FIELD(t,f) typename T::template field<hal_##t##_t>::type f;
#define ARRAY(t,f,n) typename T::template field<hal_##t##_t>::type f[n];
HAL_FIELDS
#undef FIELD
#undef ARRAY
Expand Down
11 changes: 5 additions & 6 deletions src/emc/motion-logger/motion-logger.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
#include "motion/axis.h"

static struct motion_logger_data_t {
hal_bit_t *reopen;
hal_bool_t reopen;
} *motion_logger_data;

FILE *logfile = NULL;
Expand Down Expand Up @@ -234,12 +234,12 @@ static void mark_joint_homed(int joint_num) {
}

void maybe_reopen_logfile() {
if(*motion_logger_data->reopen) {
if(hal_get_bool(motion_logger_data->reopen)) {
if(logfile != stdout) {
fclose(logfile);
logfile = NULL;
}
*motion_logger_data->reopen = 0;
hal_set_bool(motion_logger_data->reopen, 0);
}
}

Expand Down Expand Up @@ -296,13 +296,12 @@ int main(int argc, char* argv[]) {
exit(EXIT_FAILURE);
}
int r;
if((r = hal_pin_bit_new("motion-logger.reopen-log", HAL_IO, &motion_logger_data->reopen, mot_comp_id)) < 0) {
if((r = hal_pin_new_bool(mot_comp_id, HAL_IO, &motion_logger_data->reopen, 0, "motion-logger.reopen-log")) < 0) {
hal_exit(mot_comp_id);
errno = -r;
perror("hal_pin_bit_new");
perror("hal_pin_new_bool");
exit(EXIT_FAILURE);
}
*motion_logger_data->reopen = 0;
if((r = hal_ready(mot_comp_id)) < 0) {
hal_exit(mot_comp_id);
errno = -r;
Expand Down
Loading
Loading