Skip to content

Commit

Permalink
Merge pull request #641 from Paciente8159/settings-reset-fix-propagation
Browse files Browse the repository at this point in the history
fixed settings reset propagation
  • Loading branch information
Paciente8159 committed Feb 24, 2024
2 parents f36b74a + 37e72cf commit 6a7ce83
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 80 deletions.
39 changes: 22 additions & 17 deletions uCNC/src/interface/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ uint8_t settings_load(uint16_t address, uint8_t *__ptr, uint16_t size)
return STATUS_SETTING_DISABLED;
}
#ifdef ENABLE_SETTINGS_MODULES
bool extended_load __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_load)))) = (!address);
bool extended_load __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_load)))) = (address == SETTINGS_ADDRESS_OFFSET);
settings_args_t args = {.address = address, .data = __ptr, .size = size};
// if handled exit
if (EVENT_INVOKE(settings_load, &args))
Expand Down Expand Up @@ -312,6 +312,7 @@ uint8_t settings_load(uint16_t address, uint8_t *__ptr, uint16_t size)

void settings_reset(bool erase_startup_blocks)
{
settings_erase(SETTINGS_ADDRESS_OFFSET, (uint8_t *)&g_settings, sizeof(settings_t));
rom_memcpy(&g_settings, &default_settings, sizeof(settings_t));

#if !defined(ENABLE_EXTRA_SYSTEM_CMDS) && !defined(RAM_ONLY_SETTINGS)
Expand All @@ -336,7 +337,7 @@ void settings_save(uint16_t address, uint8_t *__ptr, uint16_t size)
}

#ifdef ENABLE_SETTINGS_MODULES
bool extended_save __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_save)))) = (!address);
bool extended_save __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_save)))) = (address == SETTINGS_ADDRESS_OFFSET);
settings_args_t args = {.address = address, .data = __ptr, .size = size};
if (EVENT_INVOKE(settings_save, &args))
{
Expand Down Expand Up @@ -647,37 +648,41 @@ void settings_erase(uint16_t address, uint8_t *__ptr, uint16_t size)
return;
}

if (__ptr)
{
memset(__ptr, 0, size);
}

#ifdef ENABLE_SETTINGS_MODULES
bool extended_erase __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_load)))) = (!address);
bool extended_erase __attribute__((__cleanup__(EVENT_HANDLER_NAME(settings_extended_erase)))) = (address == SETTINGS_ADDRESS_OFFSET);
settings_args_t args = {.address = address, .data = __ptr, .size = size};
if (EVENT_INVOKE(settings_erase, &args))
{
// if the event was handled
return;
}
#endif

if (__ptr)
{
memset(__ptr, 0, size);
}

#ifndef RAM_ONLY_SETTINGS
for (uint16_t i = size; i != 0; i--)
if (address != SETTINGS_ADDRESS_OFFSET)
{
if (cnc_get_exec_state(EXEC_RUN))
for (uint16_t i = size; i != 0; i--)
{
cnc_dotasks(); // updates buffer before cycling
if (cnc_get_exec_state(EXEC_RUN))
{
cnc_dotasks(); // updates buffer before cycling
}
mcu_eeprom_putc(address++, 0);
}
mcu_eeprom_putc(address++, 0);
}

uint8_t crc = settings_size_crc(size, 0);
uint8_t crc = settings_size_crc(size, 0);

// erase crc byte that is next to data
mcu_eeprom_putc(address, crc);
// erase crc byte that is next to data
mcu_eeprom_putc(address, crc);
#if !defined(ENABLE_EXTRA_SYSTEM_CMDS)
mcu_eeprom_flush();
mcu_eeprom_flush();
#endif
}
#endif
}

Expand Down
134 changes: 71 additions & 63 deletions uCNC/src/interface/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ typedef uint16_t setting_offset_t;
* These allow custom settings setup of simple settings
*
* **/
#define DECL_EXTENDED_SETTING(ID, var, type, count, print_cb) \
#define __DECL_EXTENDED_SETTING__(ID, var, type, count, print_cb) \
static uint32_t set##ID##_settings_address; \
bool set##ID##_settings_load(void *args) \
{ \
Expand All @@ -204,8 +204,7 @@ typedef uint16_t setting_offset_t;
bool set##ID##_settings_erase(void *args) \
{ \
memset(var, 0, sizeof(type) * count); \
settings_save(set##ID##_settings_address, (uint8_t *)var, sizeof(type) * count); \
return EVENT_HANDLED; \
return EVENT_CONTINUE; \
} \
bool set##ID##_protocol_send_cnc_settings(void *args) \
{ \
Expand All @@ -221,70 +220,77 @@ typedef uint16_t setting_offset_t;
CREATE_EVENT_LISTENER(settings_change, set##ID##_settings_change); \
CREATE_EVENT_LISTENER(settings_extended_erase, set##ID##_settings_erase); \
CREATE_EVENT_LISTENER(protocol_send_cnc_settings, set##ID##_protocol_send_cnc_settings)
#define DECL_EXTENDED_SETTING(ID, var, type, count, print_cb) __DECL_EXTENDED_SETTING__(ID, var, type, count, print_cb)

#define DECL_EXTENDED_STRING_SETTING(ID, var, count) \
static uint32_t set##ID##_settings_address; \
bool set##ID##_settings_load(void *args) \
{ \
settings_load(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_save(void *args) \
{ \
settings_save(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_change(void *args) \
{ \
setting_args_t *set = (setting_args_t *)args; \
if (set->id == ID) \
{ \
for (uint8_t i = 0; i < count; i++) \
{ \
char c = serial_getc(); \
if (c == EOL || c == '\n') \
{ \
var[i] = EOL; \
break; \
} \
var[i] = c; \
} \
return EVENT_HANDLED; \
} \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_erase(void *args) \
{ \
memset(var, 0, sizeof(char) * count); \
settings_save(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_HANDLED; \
} \
bool set##ID##_protocol_send_cnc_settings(void *args) \
{ \
serial_putc('$'); \
serial_print_int(ID); \
serial_putc('='); \
for (uint8_t i = 0; i < count; i++) \
{ \
char c = var[i]; \
if (c < 20 || c > 127) \
{ \
protocol_send_string(MSG_EOL); \
return EVENT_CONTINUE; \
} \
serial_putc(c); \
} \
return EVENT_CONTINUE; \
} \
CREATE_EVENT_LISTENER(settings_extended_load, set##ID##_settings_load); \
CREATE_EVENT_LISTENER(settings_extended_save, set##ID##_settings_save); \
CREATE_EVENT_LISTENER(settings_change, set##ID##_settings_change); \
CREATE_EVENT_LISTENER(settings_extended_erase, set##ID##_settings_erase); \
#define __DECL_EXTENDED_STRING_SETTING__(ID, var, count) \
static uint32_t set##ID##_settings_address; \
bool set##ID##_settings_load(void *args) \
{ \
settings_load(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_save(void *args) \
{ \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_change(void *args) \
{ \
setting_args_t *set = (setting_args_t *)args; \
if (set->id == ID) \
{ \
settings_load(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
for (uint8_t i = 0; i < count; i++) \
{ \
char c = serial_getc(); \
if (c == EOL || c == '\n') \
{ \
var[i] = EOL; \
break; \
} \
var[i] = c; \
} \
settings_save(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_HANDLED; \
} \
return EVENT_CONTINUE; \
} \
bool set##ID##_settings_erase(void *args) \
{ \
memset(var, 0, sizeof(char) * count); \
settings_save(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
return EVENT_CONTINUE; \
} \
bool set##ID##_protocol_send_cnc_settings(void *args) \
{ \
memset(var, 0, sizeof(char) * count); \
settings_load(set##ID##_settings_address, (uint8_t *)var, sizeof(char) * count); \
serial_putc('$'); \
serial_print_int(ID); \
serial_putc('='); \
for (uint8_t i = 0; i < count; i++) \
{ \
char c = var[i]; \
if (c < 20 || c > 127) \
{ \
protocol_send_string(MSG_EOL); \
return EVENT_CONTINUE; \
} \
serial_putc(c); \
} \
return EVENT_CONTINUE; \
} \
CREATE_EVENT_LISTENER(settings_extended_load, set##ID##_settings_load); \
CREATE_EVENT_LISTENER(settings_extended_save, set##ID##_settings_save); \
CREATE_EVENT_LISTENER(settings_change, set##ID##_settings_change); \
CREATE_EVENT_LISTENER(settings_extended_erase, set##ID##_settings_erase); \
CREATE_EVENT_LISTENER(protocol_send_cnc_settings, set##ID##_protocol_send_cnc_settings)

#define EXTENDED_SETTING_ADDRESS(ID) set##ID##_settings_address
#define DECL_EXTENDED_STRING_SETTING(ID, var, count) __DECL_EXTENDED_STRING_SETTING__(ID, var, count)

#define EXTENDED_SETTING_INIT(ID, var) \
#define __EXTENDED_SETTING_ADDRESS__(ID) set##ID##_settings_address
#define EXTENDED_SETTING_ADDRESS(ID) __EXTENDED_SETTING_ADDRESS__(ID)

#define __EXTENDED_SETTING_INIT__(ID, var) \
static bool set##ID##_init = false; \
if (!set##ID##_init) \
{ \
Expand All @@ -297,6 +303,8 @@ typedef uint16_t setting_offset_t;
set##ID##_init = true; \
}

#define EXTENDED_SETTING_INIT(ID, var) __EXTENDED_SETTING_INIT__(ID, var)

#ifdef __cplusplus
}
#endif
Expand Down

0 comments on commit 6a7ce83

Please sign in to comment.