Skip to content

Commit

Permalink
Add draft implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
eamars committed Oct 5, 2023
1 parent 95a0db1 commit 79325fe
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 118 deletions.
103 changes: 92 additions & 11 deletions src/charge_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ const eeprom_charge_mode_data_t default_charge_mode_data = {

.set_point_sd_margin = 0.02,
.set_point_mean_margin = 0.02,

// LED related
.neopixel_normal_charge_colour = urgb_u32(0, 0xFF, 0), // green
.neopixel_under_charge_colour = urgb_u32(0xFF, 0xFF, 0), // yellow
.neopixel_over_charge_colour = urgb_u32(0xFF, 0, 0), // red
.neopixel_not_ready_colour = urgb_u32(0, 0, 0xFF), // blue
};

// Configures
Expand Down Expand Up @@ -103,6 +109,14 @@ void scale_measurement_render_task(void *p) {


ChargeModeState_t charge_mode_wait_for_zero(ChargeModeState_t prev_state) {
// Set colour to not ready
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour,
true
);

// Wait for 5 measurements and wait for stable
FloatRingBuffer data_buffer(10);

Expand Down Expand Up @@ -143,6 +157,14 @@ ChargeModeState_t charge_mode_wait_for_zero(ChargeModeState_t prev_state) {
}

ChargeModeState_t charge_mode_wait_for_complete(ChargeModeState_t prev_state) {
// Set colour to under charge
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour,
true
);

// Update current status
snprintf(title_string, sizeof(title_string),
"Target: %.02f %s",
Expand Down Expand Up @@ -219,6 +241,7 @@ ChargeModeState_t charge_mode_wait_for_complete(ChargeModeState_t prev_state) {
last_error = error;
}

vTaskDelay(pdMS_TO_TICKS(20)); // Wait for other tasks to complete

return CHARGE_MODE_WAIT_FOR_CUP_REMOVAL;
}
Expand All @@ -229,8 +252,38 @@ ChargeModeState_t charge_mode_wait_for_cup_removal(ChargeModeState_t prev_state)

FloatRingBuffer data_buffer(5);

// Update LED colour
neopixel_led_set_colour(NEOPIXEL_LED_COLOUR_2, NEOPIXEL_LED_COLOUR_2, true);
// Post charge analysis (while waiting for removal of the cup)
vTaskDelay(pdMS_TO_TICKS(1000)); // Wait for other tasks to complete
float error = charge_mode_config.target_charge_weight - scale_block_wait_for_next_measurement();

// Update LED colour before moving to the next stage
// Over charged
if (error <= -charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold) {
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_over_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_over_charge_colour,
true
);
}
// Under charged
else if (error >= charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold) {
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour,
true
);
}
// Normal
else {
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_normal_charge_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_normal_charge_colour,
true
);
}

// Stop condition: 5 stable measurements in 300ms apart (1.5 seconds minimum)
while (true) {
Expand Down Expand Up @@ -258,13 +311,21 @@ ChargeModeState_t charge_mode_wait_for_cup_removal(ChargeModeState_t prev_state)
vTaskDelayUntil(&last_sample_tick, pdMS_TO_TICKS(300));
}

// Update LED colour
neopixel_led_set_colour(NEOPIXEL_LED_COLOUR_1, NEOPIXEL_LED_COLOUR_1, true);
// Reset LED to default colour
neopixel_led_set_colour(NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, true);

return CHARGE_MODE_WAIT_FOR_CUP_RETURN;
}

ChargeModeState_t charge_mode_wait_for_cup_return(ChargeModeState_t prev_state) {
// Set colour to not ready
neopixel_led_set_colour(
NEOPIXEL_LED_DEFAULT_COLOUR,
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour,
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour,
true
);

snprintf(title_string, sizeof(title_string), "Return Cup", charge_mode_config.target_charge_weight);

FloatRingBuffer data_buffer(5);
Expand Down Expand Up @@ -296,8 +357,8 @@ ChargeModeState_t charge_mode_wait_for_cup_return(ChargeModeState_t prev_state)


uint8_t charge_mode_menu() {
// Update LED colour
neopixel_led_set_colour(NEOPIXEL_LED_COLOUR_1, NEOPIXEL_LED_COLOUR_1, true);
// Reset LED to default colour
neopixel_led_set_colour(NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, true);

// Create target weight
charge_mode_config.target_charge_weight = charge_weight_digits[4] * 100 + \
Expand Down Expand Up @@ -354,9 +415,9 @@ uint8_t charge_mode_menu() {
// }
// }

// Update LED colour
neopixel_led_set_colour(NEOPIXEL_LED_COLOUR_1, NEOPIXEL_LED_COLOUR_1, true);
// Reset LED to default colour
neopixel_led_set_colour(NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, NEOPIXEL_LED_DEFAULT_COLOUR, true);

// vTaskDelete(scale_measurement_render_handler);
vTaskSuspend(scale_measurement_render_task_handler);

Expand Down Expand Up @@ -438,12 +499,27 @@ bool http_rest_charge_mode_config(struct fs_file *file, int num_params, char *pa
else if (strcmp(params[idx], "sp_avg") == 0) {
charge_mode_config.eeprom_charge_mode_data.set_point_mean_margin = strtof(values[idx], NULL);
}

// LED related settings
else if (strcmp(params[idx], "c1") == 0) {
charge_mode_config.eeprom_charge_mode_data.neopixel_normal_charge_colour = hex_string_to_decimal(values[idx]);
}
else if (strcmp(params[idx], "c2") == 0) {
charge_mode_config.eeprom_charge_mode_data.neopixel_under_charge_colour = hex_string_to_decimal(values[idx]);
}
else if (strcmp(params[idx], "c3") == 0) {
charge_mode_config.eeprom_charge_mode_data.neopixel_over_charge_colour = hex_string_to_decimal(values[idx]);
}
else if (strcmp(params[idx], "c4") == 0) {
charge_mode_config.eeprom_charge_mode_data.neopixel_not_ready_colour = hex_string_to_decimal(values[idx]);
}
}

// Response
snprintf(charge_mode_json_buffer,
sizeof(charge_mode_json_buffer),
"{\"c_kp\":%.3f,\"c_ki\":%.3f,\"c_kd\":%.3f,\"f_kp\":%.3f,\"f_ki\":%.3f,\"f_kd\":%.3f,\"c_stop\":%.3f,\"f_stop\":%.3f,\"sp_sd\":%.3f,\"sp_avg\":%.3f}",
"{\"c_kp\":%.3f,\"c_ki\":%.3f,\"c_kd\":%.3f,\"f_kp\":%.3f,\"f_ki\":%.3f,\"f_kd\":%.3f,\"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_kp,
charge_mode_config.eeprom_charge_mode_data.coarse_ki,
charge_mode_config.eeprom_charge_mode_data.coarse_kd,
Expand All @@ -453,7 +529,12 @@ bool http_rest_charge_mode_config(struct fs_file *file, int num_params, char *pa
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);
charge_mode_config.eeprom_charge_mode_data.set_point_mean_margin,

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);

size_t data_length = strlen(charge_mode_json_buffer);
file->data = charge_mode_json_buffer;
Expand Down
8 changes: 7 additions & 1 deletion src/charge_mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <stdint.h>
#include "http_rest.h"

#define EEPROM_CHARGE_MODE_DATA_REV 4 // 16 byte
#define EEPROM_CHARGE_MODE_DATA_REV 5 // 16 byte


typedef struct {
Expand All @@ -23,6 +23,12 @@ typedef struct {
float set_point_sd_margin;
float set_point_mean_margin;

// LED related settings
uint32_t neopixel_normal_charge_colour;
uint32_t neopixel_under_charge_colour;
uint32_t neopixel_over_charge_colour;
uint32_t neopixel_not_ready_colour;

} eeprom_charge_mode_data_t;

typedef struct {
Expand Down
42 changes: 26 additions & 16 deletions src/html/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,26 @@ <h1>Control</h1>
<input type="number" class="form-control" id="sp_avg" name="sp_avg" step="0.001">
</div>

<div class="form-group mb-3">
<label for="c1">Neopixel LED Normal Charge Colour</label>
<input type="color" class="form-control form-control-color" id="c1" name="c1">
</div>

<div class="form-group mb-3">
<label for="c2">Neopixel LED Under Charge Colour</label>
<input type="color" class="form-control form-control-color" id="c2" name="c2">
</div>

<div class="form-group mb-3">
<label for="c3">Neopixel LED Over Charge Colour</label>
<input type="color" class="form-control form-control-color" id="c3" name="c3">
</div>

<div class="form-group mb-3">
<label for="c4">Neopixel LED Not Ready Colour</label>
<input type="color" class="form-control form-control-color" id="c4" name="c4">
</div>

<button type="submit" class="btn btn-primary">Apply Charge Mode Settings</button>
</form>
</div>
Expand Down Expand Up @@ -442,28 +462,18 @@ <h1>Control</h1>
<div class="card-body">
<form class="config-form" id="neopixel_led_config" action="/rest/neopixel_led_config">
<div class="form-group mb-3">
<label for="12864bl">Mini 12864 Display Background Colour:</label>
<input type="color" class="form-control form-control-color" id="12864bl" name="12864bl">
</div>

<div class="form-group mb-3">
<label for="led1_c1">LED1 Primary Colour</label>
<input type="color" class="form-control form-control-color" id="led1_c1" name="led1_c1">
</div>

<div class="form-group mb-3">
<label for="led1_c2">LED1 Secondary Colour</label>
<input type="color" class="form-control form-control-color" id="led1_c2" name="led1_c2">
<label for="bl">Mini 12864 Display Background Colour:</label>
<input type="color" class="form-control form-control-color" id="bl" name="bl">
</div>

<div class="form-group mb-3">
<label for="led2_c1">LED2 Primary Colour</label>
<input type="color" class="form-control form-control-color" id="led2_c1" name="led2_c1">
<label for="l1">LED1 Default Colour</label>
<input type="color" class="form-control form-control-color" id="l1" name="l1">
</div>

<div class="form-group mb-3">
<label for="led2_c2">LED2 Secondary Colour</label>
<input type="color" class="form-control form-control-color" id="led2_c2" name="led2_c2">
<label for="l2">LED2 Default Colour</label>
<input type="color" class="form-control form-control-color" id="l2" name="l2">
</div>

<button type="submit" class="btn btn-primary">Apply Neopixel LED Settings</button>
Expand Down
Loading

0 comments on commit 79325fe

Please sign in to comment.