diff --git a/main/spincoat-plater-firmware.cpp b/main/spincoat-plater-firmware.cpp index cae0b64..e83eeac 100644 --- a/main/spincoat-plater-firmware.cpp +++ b/main/spincoat-plater-firmware.cpp @@ -29,7 +29,6 @@ extern "C" { #include "motor.h" } - static const char *TAG = "spincoat-plater-firmware"; static double throttle = 0; @@ -52,20 +51,21 @@ extern "C" void app_main(void) { srand((unsigned int)esp_timer_get_time()); esc_telemetry_t telemetry; - double target = 250; + double target = 100; double real_rpm = 0; AutoPID myPID(&real_rpm, &target, &throttle, OUTPUT_MIN, OUTPUT_MAX, KP, KI, KD); - myPID.setTimeStep(100); // don't set too low or you'll blow the DC-DC converter - myPID.setBangBang(400); + myPID.setTimeStep(100); + myPID.setBangBang(400); // if you mess with this, you may melt your circuit init_display(); + vTaskDelay(pdMS_TO_TICKS(100)); build_ui(); - + init_motor(); update_throttle(throttle); - + while(1) { send_dshot_packet(); diff --git a/main/ui.c b/main/ui.c index d292534..3e59339 100644 --- a/main/ui.c +++ b/main/ui.c @@ -9,30 +9,87 @@ #define BTN_INCREMENT 100 +#define MAX_RPM_SETTING 200 +#define MAX_COAT_TIME_SETTING 30 + +#define MIN_RPM_SETTING 50 +#define MIN_COAT_TIME_SETTING 5 + +#define RPM_STEPSIZE 25 +#define COAT_TIME_STEPSIZE 5 + static const char *TAG = "spincoat-plater-firmware/ui"; static lv_obj_t * rpm_label = NULL; static lv_obj_t * coat_time_label = NULL; +static lv_obj_t * run_stop_label = NULL; + +static uint16_t rpm_setting = 100; // rpm +static uint16_t coat_time_setting = 5; // seconds + +static coat_state motor_state = STOPPED; /** - * Callback for pressing the top button + * Callback for pressing the rpm increase button */ -void top_cb(lv_event_t * e) { - update_throttle(get_throttle() + BTN_INCREMENT); - //lv_label_set_text_fmt(rpm_label, "RPM: %d", get_throttle()); -} - -/** - * Callback for pressing the bottom button - */ -void bottom_cb(lv_event_t * e) { - uint16_t throttle = get_throttle(); - if(throttle >= BTN_INCREMENT) { - update_throttle(get_throttle() - BTN_INCREMENT); - //lv_label_set_text_fmt(rpm_label, "RPM: %d", get_throttle()); +void rpm_increase_cb(lv_event_t * e) { + ESP_LOGI(TAG, "RPM increase callback called."); + if(rpm_setting < MAX_RPM_SETTING) { + rpm_setting += RPM_STEPSIZE; + lv_lock(); + lv_label_set_text_fmt(rpm_label, "%d", rpm_setting); + lv_unlock(); } } +/** + * Callback for pressing the rpm decrease button + */ +void rpm_decrease_cb(lv_event_t * e) { + ESP_LOGI(TAG, "RPM decrease callback called."); + if(rpm_setting > MIN_RPM_SETTING) { + rpm_setting -= RPM_STEPSIZE; + lv_lock(); + lv_label_set_text_fmt(rpm_label, "%d", rpm_setting); + lv_unlock(); + } + +} + +/** + * Callback for pressing the coat time increase button + */ + +void coat_increase_cb(lv_event_t * e) { + ESP_LOGI(TAG, "Coat time increase callback called."); + if(coat_time_setting < MAX_COAT_TIME_SETTING) { + coat_time_setting += COAT_TIME_STEPSIZE; + lv_lock(); + lv_label_set_text_fmt(coat_time_label, "%d", coat_time_setting); + lv_unlock(); + } +} + +/** + * Callback for pressing the coat time decrease button + */ +void coat_decrease_cb(lv_event_t * e) { + ESP_LOGI(TAG, "Coat time decrease callback called."); + if(coat_time_setting > MIN_COAT_TIME_SETTING) { + coat_time_setting -= COAT_TIME_STEPSIZE; + lv_lock(); + lv_label_set_text_fmt(coat_time_label, "%d", coat_time_setting); + lv_unlock(); + } +} + +void run_stop_cb(lv_event_t * e) { + ESP_LOGI(TAG, "Run/stop callback called."); + if(run_stop_label == NULL) return; + lv_label_set_text(run_stop_label, "Stop"); +} + + /** * Factory function that creates a "numberstack" widget and returns the label for it */ @@ -40,10 +97,11 @@ lv_obj_t * build_numberstack(lv_obj_t * parent, const char * label_text, lv_obj_t ** label_value, ns_btn_cb_t top_btn_cb, - ns_btn_cb_t bottom_btn_cb) { + ns_btn_cb_t bottom_btn_cb, + uint16_t start_value, + uint16_t stepsize) { lv_obj_t * container = lv_obj_create(parent); - //lv_obj_set_size(container , lv_pct(100), lv_pct(100)); lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(container, LV_FLEX_ALIGN_START, @@ -51,7 +109,6 @@ lv_obj_t * build_numberstack(lv_obj_t * parent, LV_FLEX_ALIGN_CENTER); lv_obj_set_style_pad_all(container, 0, 0); - //lv_obj_set_style_pad_gap(container, 8, 0); /* -------- Top label -------- */ lv_obj_t * label_cont = lv_obj_create(container); @@ -72,8 +129,8 @@ lv_obj_t * build_numberstack(lv_obj_t * parent, /* -------- Top button -------- */ lv_obj_t * btn_top = lv_button_create(container); lv_obj_t * lbl_top = lv_label_create(btn_top); - lv_label_set_text(lbl_top, "+100"); - lv_obj_add_event_cb(btn_top, top_cb, LV_EVENT_CLICKED, (void *) 1); + lv_label_set_text_fmt(lbl_top, "+%d", stepsize); + lv_obj_add_event_cb(btn_top, top_btn_cb, LV_EVENT_CLICKED, (void *) 1); lv_obj_set_flex_grow(btn_top, 1); lv_obj_set_width(btn_top, lv_pct(100)); lv_obj_center(lbl_top); @@ -87,7 +144,7 @@ lv_obj_t * build_numberstack(lv_obj_t * parent, lv_obj_set_width(label2_cont, lv_pct(100)); * label_value = lv_label_create(label2_cont); - lv_label_set_text(*label_value, "nil"); + lv_label_set_text_fmt(*label_value, "%d", start_value); lv_obj_set_style_bg_opa(*label_value, LV_OPA_COVER, 0); @@ -97,8 +154,8 @@ lv_obj_t * build_numberstack(lv_obj_t * parent, /* -------- Bottom button -------- */ lv_obj_t * btn_bottom = lv_button_create(container); lv_obj_t * lbl_bottom = lv_label_create(btn_bottom); - lv_label_set_text(lbl_bottom, "-100"); - lv_obj_add_event_cb(btn_bottom, bottom_cb, LV_EVENT_CLICKED, (void *) 2); + lv_label_set_text_fmt(lbl_bottom, "-%d", stepsize); + lv_obj_add_event_cb(btn_bottom, bottom_btn_cb, LV_EVENT_CLICKED, (void *) 2); lv_obj_set_flex_grow(btn_bottom, 1); lv_obj_set_width(btn_bottom, lv_pct(100)); lv_obj_center(lbl_bottom); @@ -113,9 +170,6 @@ void update_rpm_readout(uint16_t rpm) { }; void build_ui(void) { - rpm_label = NULL; - coat_time_label = NULL; - lv_obj_t * container = lv_obj_create(lv_screen_active()); lv_obj_set_size(container, lv_pct(100), lv_pct(100)); lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN); @@ -132,8 +186,10 @@ void build_ui(void) { LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_t * rpm_container = build_numberstack(numberstacks_container, "RPM", &rpm_label, top_cb, bottom_cb); - lv_obj_t * coat_time_container = build_numberstack(numberstacks_container, "Coat Time", &coat_time_label, top_cb, bottom_cb); + lv_obj_t * rpm_container = build_numberstack(numberstacks_container, "RPM", &rpm_label, + rpm_increase_cb, rpm_decrease_cb, rpm_setting, RPM_STEPSIZE); + lv_obj_t * coat_time_container = build_numberstack(numberstacks_container, "Coat Time", + &coat_time_label, coat_increase_cb, coat_decrease_cb, coat_time_setting, COAT_TIME_STEPSIZE); lv_obj_set_size(rpm_container, lv_pct(48), lv_pct(96)); lv_obj_set_size(coat_time_container, lv_pct(48), lv_pct(96)); @@ -144,8 +200,18 @@ void build_ui(void) { lv_obj_set_style_pad_all(coat_time_container, 0, 0); /* -------- Run/Stop button -------- */ - lv_obj_t * run_stop_cont = lv_button_create(container); - lv_obj_set_size(run_stop_cont, lv_pct(96), lv_pct(18)); - lv_obj_set_style_pad_all(run_stop_cont, 0, 0); + lv_obj_t * btn_run_stop = lv_button_create(container); + lv_obj_t * lbl_run_stop = lv_label_create(btn_run_stop); + + run_stop_label = lbl_run_stop; + + lv_label_set_text(lbl_run_stop, "Run"); + + lv_obj_center(lbl_run_stop); + + lv_obj_add_event_cb(btn_run_stop, run_stop_cb, LV_EVENT_CLICKED, NULL); + + lv_obj_set_size(btn_run_stop, lv_pct(96), lv_pct(18)); + lv_obj_set_style_pad_all(btn_run_stop, 0, 0); } diff --git a/main/ui.h b/main/ui.h index dcd3950..8d01e22 100644 --- a/main/ui.h +++ b/main/ui.h @@ -12,12 +12,22 @@ typedef struct { ns_btn_cb_t bottom_cb; } ns_widget_ctx_t; /** Numberstack widget context type */ +typedef enum { + STOPPED, + SPINUP, + COATING, + SPINDOWN +} coat_state; + lv_obj_t * build_numberstack(lv_obj_t * parent, const char * label_text, lv_obj_t ** label_value, ns_btn_cb_t top_btn_cb, - ns_btn_cb_t bottom_btn_cb); + ns_btn_cb_t bottom_btn_cb, + uint16_t start_value, + uint16_t stepsize); void update_rpm_readout(uint16_t rpm); void build_ui(void); +