Skip to content

Commit

Permalink
refactored settings using lookup table
Browse files Browse the repository at this point in the history
  • Loading branch information
Paciente8159 committed Sep 22, 2024
1 parent 0caa36f commit 4511c70
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 1 deletion.
36 changes: 36 additions & 0 deletions uCNC/src/interface/grbl_protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,41 @@ void grbl_protocol_start_blocks(void)
void grbl_protocol_cnc_settings(void)
{
protocol_busy = true;
uint8_t count = settings_count();
for (uint8_t i = 0; i < count; i++)
{
setting_id_t s = {0};
uint8_t max = 1;
rom_memcpy(&s, &g_settings_id_table[i], sizeof(setting_id_t));
if (s.type & SETTING_ARRAY)
{
max = SETTING_ARRCNT(s.type);
}

for (uint8_t j = 0; j < max; j++)
{
uint32_t val = 0;
switch (SETTING_TYPE_MASK(s.type))
{
case 1:
val = (uint32_t) * ((bool *)s.memptr);
grbl_protocol_gcode_setting_line_int(s.id, val);
break;
case 2:
val = (uint32_t) * ((uint8_t *)s.memptr);
grbl_protocol_gcode_setting_line_int(s.id, val);
break;
case 3:
val = (uint32_t) * ((uint16_t *)s.memptr);
grbl_protocol_gcode_setting_line_int(s.id, val);
break;
default:
grbl_protocol_gcode_setting_line_flt(s.id, *((float *)s.memptr));
break;
}
}
}
/*
grbl_protocol_gcode_setting_line_flt(0, (1000000.0f / g_settings.max_step_rate));
#if EMULATE_GRBL_STARTUP > 0 || defined(ENABLE_STEPPERS_DISABLE_TIMEOUT)
// just adds this for compatibility
Expand Down Expand Up @@ -808,6 +843,7 @@ void grbl_protocol_cnc_settings(void)
grbl_protocol_gcode_setting_line_int(140 + i, g_settings.backlash_steps[i]);
}
#endif
*/

#ifdef ENABLE_SETTINGS_MODULES
EVENT_INVOKE(grbl_protocol_cnc_settings, NULL);
Expand Down
109 changes: 108 additions & 1 deletion uCNC/src/interface/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,78 @@ const settings_t __rom__ default_settings =
#endif
};

const setting_id_t __rom__ g_settings_id_table[] = {
{.id = 0, .memptr = &g_settings.max_step_rate, .type = SETTING_TYPE(0)},
#ifdef ENABLE_STEPPERS_DISABLE_TIMEOUT
{.id = 1, .memptr = &g_settings.step_disable_timeout, .type = SETTING_TYPE(3)},
#endif
{.id = 2, .memptr = &g_settings.step_invert_mask, .type = SETTING_TYPE(2)},
{.id = 3, .memptr = &g_settings.dir_invert_mask, .type = SETTING_TYPE(2)},
{.id = 4, .memptr = &g_settings.step_enable_invert, .type = SETTING_TYPE(1)},
{.id = 5, .memptr = &g_settings.limits_invert_mask, .type = SETTING_TYPE(2)},
{.id = 6, .memptr = &g_settings.probe_invert_mask, .type = SETTING_TYPE(2)},
{.id = 7, .memptr = &g_settings.control_invert_mask, .type = SETTING_TYPE(2)},
#if ENCODERS > 0
{.id = 8, .memptr = &g_settings.encoders_pulse_invert_mask, .type = SETTING_TYPE(2)},
{.id = 9, .memptr = &g_settings.encoders_dir_invert_mask, .type = SETTING_TYPE(2)},
#endif
{.id = 10, .memptr = &g_settings.status_report_mask, .type = SETTING_TYPE(2)},
{.id = 11, .memptr = &g_settings.g64_angle_factor, .type = SETTING_TYPE(0)},
{.id = 12, .memptr = &g_settings.arc_tolerance, .type = SETTING_TYPE(0)},
{.id = 13, .memptr = &g_settings.report_inches, .type = SETTING_TYPE(1)},
#if S_CURVE_ACCELERATION_LEVEL == -1
{.id = 14, .memptr = &g_settings.s_curve_profile, .type = SETTING_TYPE(2)},
#endif
{.id = 20, .memptr = &g_settings.soft_limits_enabled, .type = SETTING_TYPE(1)},
{.id = 21, .memptr = &g_settings.hard_limits_enabled, .type = SETTING_TYPE(1)},
{.id = 22, .memptr = &g_settings.homing_enabled, .type = SETTING_TYPE(1)},
{.id = 23, .memptr = &g_settings.homing_dir_invert_mask, .type = SETTING_TYPE(3)},
{.id = 24, .memptr = &g_settings.homing_slow_feed_rate, .type = SETTING_TYPE(3)},
{.id = 25, .memptr = &g_settings.homing_fast_feed_rate, .type = SETTING_TYPE(3)},
{.id = 26, .memptr = &g_settings.debounce_ms, .type = SETTING_TYPE(3)},
{.id = 27, .memptr = &g_settings.homing_offset, .type = SETTING_TYPE(0)},
{.id = 30, .memptr = &g_settings.spindle_max_rpm, .type = SETTING_TYPE(3)},
{.id = 31, .memptr = &g_settings.spindle_min_rpm, .type = SETTING_TYPE(3)},
{.id = 32, .memptr = &g_settings.laser_mode, .type = SETTING_TYPE(2)},
#ifdef ENABLE_LASER_PPI
{.id = 33, .memptr = &g_settings.step_per_mm[0], .type = SETTING_TYPE(0)},
{.id = 34, .memptr = &g_settings.laser_ppi_uswidth, .type = SETTING_TYPE(3)},
{.id = 35, .memptr = &g_settings.laser_ppi_mixmode_ppi, .type = SETTING_TYPE(0)},
{.id = 36, .memptr = &g_settings.laser_ppi_mixmode_uswidth, .type = SETTING_TYPE(0)},
#endif
#ifdef ENABLE_SKEW_COMPENSATION
{.id = 37, .memptr = &g_settings.skew_xy_factor, .type = SETTING_TYPE(0)},
#ifndef SKEW_COMPENSATION_XY_ONLY
{.id = 38, .memptr = &g_settings.skew_xz_factor, .type = SETTING_TYPE(0)},
{.id = 39, .memptr = &g_settings.skew_yz_factor, .type = SETTING_TYPE(0)},
#endif
#endif
#if TOOL_COUNT > 1
{.id = 80, .memptr = &g_settings.default_tool, .type = SETTING_TYPE(2)},
#endif
#if TOOL_COUNT > 0
{.id = 81, .memptr = &g_settings.tool_length_offset, .type = SETTING_TYPE(0) | SETTING_ARRAY | SETTING_ARRCNT(TOOL_COUNT)},
#endif
#if (KINEMATIC == KINEMATIC_LINEAR_DELTA)
{.id = 106, .memptr = &g_settings.delta_arm_length, .type = SETTING_TYPE(0)},
{.id = 107, .memptr = &g_settings.delta_armbase_radius, .type = SETTING_TYPE(0)},
{.id = 28, .memptr = &g_settings.delta_bicep_homing_angle, .type = SETTING_TYPE(0)},
{.id = 109, .memptr = &g_settings.delta_forearm_length, .type = SETTING_TYPE(0)},
#elif (KINEMATIC == KINEMATIC_SCARA)
{.id = 106, .memptr = &g_settings.scara_arm_length, .type = SETTING_TYPE(0)},
{.id = 107, .memptr = &g_settings.scara_forearm_length, .type = SETTING_TYPE(0)},
{.id = 28, .memptr = &g_settings.scara_arm_homing_angle, .type = SETTING_TYPE(0)},
{.id = 29, .memptr = &g_settings.scara_forearm_homing_angle, .type = SETTING_TYPE(0)},
#endif
{.id = 100, .memptr = &g_settings.step_per_mm, .type = SETTING_TYPE(0) | SETTING_ARRAY | SETTING_ARRCNT(STEPPER_COUNT)},
{.id = 110, .memptr = &g_settings.max_feed_rate, .type = SETTING_TYPE(0) | SETTING_ARRAY | SETTING_ARRCNT(STEPPER_COUNT)},
{.id = 120, .memptr = &g_settings.acceleration, .type = SETTING_TYPE(0) | SETTING_ARRAY | SETTING_ARRCNT(STEPPER_COUNT)},
{.id = 130, .memptr = &g_settings.max_distance, .type = SETTING_TYPE(0) | SETTING_ARRAY | SETTING_ARRCNT(AXIS_COUNT)},
#ifdef ENABLE_BACKLASH_COMPENSATION
{.id = 140, .memptr = &g_settings.backlash_steps, .type = SETTING_TYPE(3) | SETTING_ARRAY | SETTING_ARRCNT(AXIS_TO_STEPPERS)},
#endif
};

#ifdef ENABLE_SETTINGS_MODULES
// event_settings_change_handler
WEAK_EVENT_HANDLER(settings_change)
Expand Down Expand Up @@ -412,7 +484,36 @@ uint8_t settings_change(setting_offset_t id, float value)
return STATUS_NEGATIVE_VALUE;
}

uint8_t setting = (uint8_t)id;
uint8_t count = settings_count();
for (uint8_t i = 0; i < count; i++)
{
setting_id_t s = {0};
uint8_t max = 1;
rom_memcpy(&s, &g_settings_id_table[i], sizeof(setting_id_t));
if (s.type & SETTING_ARRAY)
{
max = SETTING_ARRCNT(s.type);
}
if ((uint8_t)id >= s.id && (uint8_t)id < (s.id + max))
{
switch (SETTING_TYPE_MASK(s.type))
{
case 1:
((bool *)s.memptr)[s.id - (uint8_t)id] = value1;
break;
case 2:
((uint8_t *)s.memptr)[s.id - (uint8_t)id] = value8;
break;
case 3:
((uint16_t *)s.memptr)[s.id - (uint8_t)id] = value16;
break;
default:
((float *)s.memptr)[s.id - (uint8_t)id] = value;
break;
}
}
}
/*
switch (setting)
{
case 0:
Expand Down Expand Up @@ -625,6 +726,7 @@ uint8_t settings_change(setting_offset_t id, float value)
return STATUS_INVALID_STATEMENT;
}
}
*/
#ifdef ENABLE_SETTINGS_MODULES
}
else
Expand Down Expand Up @@ -726,3 +828,8 @@ uint16_t settings_register_external_setting(uint16_t size)
return UINT16_MAX;
#endif
}

uint8_t settings_count(void)
{
return sizeof(g_settings_id_table) / sizeof(setting_id_t);
}
14 changes: 14 additions & 0 deletions uCNC/src/interface/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,20 @@ extern "C"
typedef uint16_t setting_offset_t;
#endif

#define SETTING_TYPE(T) (T << 5)
#define SETTING_TYPE_MASK(T) ((T >> 5) & 0x3)
#define SETTING_ARRAY 0x80
#define SETTING_ARRCNT(X) (X & 0x1F)

typedef struct setting_id_
{
setting_offset_t id;
void *memptr;
uint8_t type;
} setting_id_t;

extern settings_t g_settings;
extern const setting_id_t g_settings_id_table[];

void settings_init(void);
// Assumes that no structure being saved is bigger than 255 bytes
Expand All @@ -150,6 +163,7 @@ typedef uint16_t setting_offset_t;
void settings_erase(uint16_t address, uint8_t *__ptr, uint16_t size);
bool settings_check_startup_gcode(uint16_t address);
uint16_t settings_register_external_setting(uint16_t size);
uint8_t settings_count(void);

#if (defined(ENABLE_SETTINGS_MODULES) || defined(BOARD_HAS_CUSTOM_SYSTEM_COMMANDS))
// event_settings_change_handler
Expand Down

0 comments on commit 4511c70

Please sign in to comment.