Skip to content

Commit

Permalink
Merge pull request #32 from eamars/save_to_eeprom_refactor
Browse files Browse the repository at this point in the history
Add save to eeprom option to every REST API
  • Loading branch information
eamars authored Dec 6, 2023
2 parents b64e5f4 + 05cab68 commit 85427fc
Show file tree
Hide file tree
Showing 15 changed files with 471 additions and 251 deletions.
50 changes: 38 additions & 12 deletions src/charge_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "eeprom.h"
#include "neopixel_led.h"
#include "profile.h"
#include "common.h"


uint8_t charge_weight_digits[] = {0, 0, 0, 0, 0};
Expand Down Expand Up @@ -476,6 +477,9 @@ bool charge_mode_config_init(void) {
}
}

// Register to eeprom save all
eeprom_register_handler(charge_mode_config_save);

return true;
}

Expand All @@ -488,20 +492,34 @@ bool charge_mode_config_save(void) {


bool http_rest_charge_mode_config(struct fs_file *file, int num_params, char *params[], char *values[]) {
// Mappings
// c1 (str): neopixel_normal_charge_colour
// c2 (str): neopixel_under_charge_colour
// c3 (str): neopixel_over_charge_colour
// c4 (str): neopixel_not_ready_colour

// c5 (float): coarse_stop_threshold
// c6 (float): fine_stop_threshold
// c7 (float): set_point_sd_margin
// c8 (float): set_point_mean_margin

// ee (bool): save to eeprom

static char charge_mode_json_buffer[256];
bool save_to_eeprom = false;

// Control
for (int idx = 0; idx < num_params; idx += 1) {
if (strcmp(params[idx], "c_stop") == 0) {
if (strcmp(params[idx], "c5") == 0) {
charge_mode_config.eeprom_charge_mode_data.coarse_stop_threshold = strtof(values[idx], NULL);
}
else if (strcmp(params[idx], "f_stop") == 0) {
else if (strcmp(params[idx], "c6") == 0) {
charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold = strtof(values[idx], NULL);
}
else if (strcmp(params[idx], "sp_sd") == 0) {
else if (strcmp(params[idx], "c7") == 0) {
charge_mode_config.eeprom_charge_mode_data.set_point_sd_margin = strtof(values[idx], NULL);
}
else if (strcmp(params[idx], "sp_avg") == 0) {
else if (strcmp(params[idx], "c8") == 0) {
charge_mode_config.eeprom_charge_mode_data.set_point_mean_margin = strtof(values[idx], NULL);
}

Expand All @@ -518,22 +536,30 @@ bool http_rest_charge_mode_config(struct fs_file *file, int num_params, char *pa
else if (strcmp(params[idx], "c4") == 0) {
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour = hex_string_to_decimal(values[idx]);
}
else if (strcmp(params[idx], "ee") == 0) {
save_to_eeprom = string_to_boolean(values[idx]);
}
}

// Perform action
if (save_to_eeprom) {
charge_mode_config_save();
}

// Response
snprintf(charge_mode_json_buffer,
sizeof(charge_mode_json_buffer),
"{\"c_stop\":%.3f,\"f_stop\":%.3f,\"sp_sd\":%.3f,\"sp_avg\":%.3f,"
"\"c1\":\"#%06x\",\"c2\":\"#%06x\",\"c3\":\"#%06x\",\"c4\":\"#%06x\"}",
charge_mode_config.eeprom_charge_mode_data.coarse_stop_threshold,
charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold,
charge_mode_config.eeprom_charge_mode_data.set_point_sd_margin,
charge_mode_config.eeprom_charge_mode_data.set_point_mean_margin,

"{\"c1\":\"#%06x\",\"c2\":\"#%06x\",\"c3\":\"#%06x\",\"c4\":\"#%06x\","
"\"c5\":%.3f,\"c6\":%.3f,\"c7\":%.3f,\"c8\":%.3f}",
charge_mode_config.eeprom_charge_mode_data.neopixel_normal_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_over_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour);
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour,

charge_mode_config.eeprom_charge_mode_data.coarse_stop_threshold,
charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold,
charge_mode_config.eeprom_charge_mode_data.set_point_sd_margin,
charge_mode_config.eeprom_charge_mode_data.set_point_mean_margin);

size_t data_length = strlen(charge_mode_json_buffer);
file->data = charge_mode_json_buffer;
Expand Down
13 changes: 12 additions & 1 deletion src/common.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <FreeRTOS.h>
#include <task.h>
#include <string.h>
#include "common.h"
#include "pico/time.h"

Expand All @@ -16,6 +17,16 @@ void delay_ms(uint32_t ms, BaseType_t scheduler_state) {

const char * true_string = "true";
const char * false_string = "false";
const char * boolean_string(bool var) {
const char * boolean_to_string(bool var) {
return var ? true_string : false_string;
}

bool string_to_boolean(char * s) {
bool var = false;

if (strcmp(s, true_string) == 0) {
var = true;
}

return var;
}
3 changes: 2 additions & 1 deletion src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ extern "C" {
*/
void delay_ms(uint32_t ms, BaseType_t scheduler_state);

const char * boolean_string(bool var);
const char * boolean_to_string(bool var);
bool string_to_boolean(char * s);


#ifdef __cplusplus
Expand Down
81 changes: 47 additions & 34 deletions src/eeprom.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,16 @@ extern void cat24c256_eeprom_init();
extern bool cat24c256_write(uint16_t data_addr, uint8_t * data, size_t len);
extern bool cat24c256_read(uint16_t data_addr, uint8_t * data, size_t len);

// Linked list implementation
typedef struct _eeprom_save_handler_node {
eeprom_save_handler_t function_handler;
struct _eeprom_save_handler_node * next;
} _eeprom_save_handler_node_t;

// Singleton variables
SemaphoreHandle_t eeprom_access_mutex = NULL;
eeprom_metadata_t metadata;
static _eeprom_save_handler_node_t * eeprom_save_handler_head = NULL;


uint32_t rnd(void){
Expand All @@ -39,23 +47,29 @@ uint32_t rnd(void){
for(k=0;k<32;k++){

random = random << 1;
random=random + (0x00000001 & (*rnd_reg));
random = random + (0x00000001 & (*rnd_reg));

}
return random;
}


void eeprom_register_handler(eeprom_save_handler_t handler) {
_eeprom_save_handler_node_t * new_node = malloc(sizeof(_eeprom_save_handler_node_t));
new_node->function_handler = handler;

// Append to the head
new_node->next = eeprom_save_handler_head;
eeprom_save_handler_head = new_node;
}


uint8_t eeprom_save_all() {
eeprom_config_save();
scale_config_save();
motor_config_save();
charge_mode_config_save();
wireless_config_save();
neopixel_led_config_save();
button_config_save();
profile_data_save();
// Iterate over all registered handlers and run the save functions
for (_eeprom_save_handler_node_t * node = eeprom_save_handler_head; node != NULL; node = node->next) {
// Run the save handler
node->function_handler();
}
return 37; // Configuration Menu ID
}

Expand Down Expand Up @@ -107,6 +121,9 @@ bool eeprom_init(void) {
}
}

// Register to eeprom save all
eeprom_register_handler(eeprom_config_save);

return is_ok;
}

Expand Down Expand Up @@ -169,59 +186,55 @@ bool eeprom_get_board_id(char ** board_id_buffer, size_t bytes_to_copy) {


bool http_rest_system_control(struct fs_file *file, int num_params, char *params[], char *values[]) {
// Mappings
// s0 (str): unique_id
// s1 (str): version_string
// s2 (str): vcs_hash
// s3 (str): build_type
// s4 (bool): save_to_eeprom
// s5 (bool): software_reset
// s6 (bool): erase_eeprom
static char eeprom_config_json_buffer[256];

const char * save_to_eeprom_string;
const char * software_reset_string;
const char * erase_eeprom_string;

bool save_to_eeprom_flag = false;
bool software_reset_flag = false;
bool erase_eeprom_flag = false;

// Control
for (int idx = 0; idx < num_params; idx += 1) {
if (strcmp(params[idx], "save_to_eeprom") == 0 && strcmp(values[idx], "true") == 0) {
save_to_eeprom_flag = true;
if (strcmp(params[idx], "s4") == 0) {
save_to_eeprom_flag = string_to_boolean(values[idx]);
}
else if (strcmp(params[idx], "software_reset") == 0 && strcmp(values[idx], "true") == 0) {
software_reset_flag = true;
else if (strcmp(params[idx], "s5") == 0) {
software_reset_flag = string_to_boolean(values[idx]);
}
else if (strcmp(params[idx], "erase_eeprom") == 0 && strcmp(values[idx], "true") == 0) {
erase_eeprom_flag = true;
else if (strcmp(params[idx], "s6") == 0) {
erase_eeprom_flag = string_to_boolean(values[idx]);
}
}

if (save_to_eeprom_flag) {
eeprom_save_all();
save_to_eeprom_string = "true";
}
else {
save_to_eeprom_string = "false";
}

if (erase_eeprom_flag) {
eeprom_erase(software_reset_flag);
erase_eeprom_string = "true";
}
else {
erase_eeprom_string = "false";
}

if (software_reset_flag) {
software_reboot();
software_reset_string = "true";
}
else {
software_reset_string = "false";
}



// Response
snprintf(eeprom_config_json_buffer,
sizeof(eeprom_config_json_buffer),
"{\"unique_id\":\"%s\",\"save_to_eeprom\":%s,\"software_reset\":%s,\"erase_eeprom\":%s,\"ver\":\"%s\",\"hash\":\"%s\",\"build_type\":\"%s\"}",
metadata.unique_id, save_to_eeprom_string, software_reset_string, erase_eeprom_string,
version_string, vcs_hash, build_type);
"{\"s0\":\"%s\",\"s1\":\"%s\",\"s2\":\"%s\",\"s3\":\"%s\",\"s4\":%s,\"s5\":%s,\"s6\":%s}",
metadata.unique_id, version_string, vcs_hash, build_type,
boolean_to_string(save_to_eeprom_flag),
boolean_to_string(erase_eeprom_flag),
boolean_to_string(software_reset_flag));

size_t data_length = strlen(eeprom_config_json_buffer);
file->data = eeprom_config_json_buffer;
Expand Down
4 changes: 4 additions & 0 deletions src/eeprom.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ typedef struct {
char unique_id[8];
} __attribute__((packed)) eeprom_metadata_t;

// EEPROM save handler function
typedef bool (*eeprom_save_handler_t)(void);


#ifdef __cplusplus
extern "C" {
Expand All @@ -41,6 +44,7 @@ bool eeprom_get_board_id(char ** board_id_buffer, size_t bytes_to_copy);
*/
uint8_t eeprom_erase(bool);
uint8_t eeprom_save_all(void);
void eeprom_register_handler(eeprom_save_handler_t handler);

bool http_rest_system_control(struct fs_file *file, int num_params, char *params[], char *values[]);

Expand Down
Loading

0 comments on commit 85427fc

Please sign in to comment.