From 4511c70c38408a8a566e44f94cdacbdd16aa777c Mon Sep 17 00:00:00 2001 From: Paciente8159 Date: Sun, 22 Sep 2024 22:57:04 +0100 Subject: [PATCH] refactored settings using lookup table --- uCNC/src/interface/grbl_protocol.c | 36 ++++++++++ uCNC/src/interface/settings.c | 109 ++++++++++++++++++++++++++++- uCNC/src/interface/settings.h | 14 ++++ 3 files changed, 158 insertions(+), 1 deletion(-) diff --git a/uCNC/src/interface/grbl_protocol.c b/uCNC/src/interface/grbl_protocol.c index 981f7137..dd0cc30b 100644 --- a/uCNC/src/interface/grbl_protocol.c +++ b/uCNC/src/interface/grbl_protocol.c @@ -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 @@ -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); diff --git a/uCNC/src/interface/settings.c b/uCNC/src/interface/settings.c index 44de7502..e631d51b 100644 --- a/uCNC/src/interface/settings.c +++ b/uCNC/src/interface/settings.c @@ -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) @@ -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: @@ -625,6 +726,7 @@ uint8_t settings_change(setting_offset_t id, float value) return STATUS_INVALID_STATEMENT; } } +*/ #ifdef ENABLE_SETTINGS_MODULES } else @@ -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); +} diff --git a/uCNC/src/interface/settings.h b/uCNC/src/interface/settings.h index 22f7f571..dfb6b9ff 100644 --- a/uCNC/src/interface/settings.h +++ b/uCNC/src/interface/settings.h @@ -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 @@ -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