diff --git a/Core/Inc/PSE_unit.h b/Core/Inc/PSE_unit.h index 82cd8ab..df9f277 100644 --- a/Core/Inc/PSE_unit.h +++ b/Core/Inc/PSE_unit.h @@ -54,6 +54,7 @@ typedef struct{ // unit definition typedef struct{ uint8_t enabled; + uint8_t reversed; // is the unit reversed (syringue pointing to the motor or away from it) pse_ports port; // physical port on which this unit is connected uint32_t flow; // flow (in µL.min-1) int32_t volume; // current volume dispensed (in µL) diff --git a/Core/Inc/pse_stepper_planer.h b/Core/Inc/pse_stepper_planer.h index 392e12d..3c875f0 100644 --- a/Core/Inc/pse_stepper_planer.h +++ b/Core/Inc/pse_stepper_planer.h @@ -19,8 +19,8 @@ void pse_sp_start_axis(pse_stepper_conf* conf, pse_stepper_status* status); void pse_sp_stop_axis(pse_stepper_conf* conf); -void pse_sp_set_dir(pse_stepper_conf* conf, int dir); -int pse_sp_get_dir(pse_stepper_conf* conf); +void pse_sp_set_dir(pse_unit* unit, int dir); +int pse_sp_get_dir(pse_unit* unit); void pse_stepper_planer_tick(pse_unit* unit); void pse_sp_jog_speed(pse_stepper_conf* conf, pse_stepper_status* sta, int status); diff --git a/Core/Src/PSE_unit_edit_screen.c b/Core/Src/PSE_unit_edit_screen.c index f6357d4..0c129b6 100644 --- a/Core/Src/PSE_unit_edit_screen.c +++ b/Core/Src/PSE_unit_edit_screen.c @@ -23,6 +23,17 @@ static pse_unit* c_pse_unit; static uint8_t c_pse_units_num; static uint16_t ws_index; +static void reverse_button_handler(lv_event_t * e){ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t* button = lv_event_get_current_target(e); + lv_obj_t* label = lv_obj_get_child(button, 0); + + c_pse_unit->reversed = !c_pse_unit->reversed; + lv_label_set_text(label, c_pse_unit->reversed?LV_SYMBOL_PREV:LV_SYMBOL_NEXT); + + save_units(c_pse_units, c_pse_units_num, ws_index); +} + static void back_button_handler(lv_event_t * e){ lv_event_code_t code = lv_event_get_code(e); @@ -192,7 +203,7 @@ static void jog_forward_button_handler(lv_event_t* e){ if(code == LV_EVENT_PRESSED) { pse_sp_jog_speed(unit->stepper_conf, unit->stepper_status, 1); - pse_sp_set_dir(unit->stepper_conf, 1); + pse_sp_set_dir(unit, 1); pse_sp_start_axis(unit->stepper_conf, unit->stepper_status); } else if(code == LV_EVENT_RELEASED){ @@ -207,7 +218,7 @@ static void jog_backward_button_handler(lv_event_t* e){ if(code == LV_EVENT_PRESSED) { pse_sp_jog_speed(unit->stepper_conf, unit->stepper_status, 1); - pse_sp_set_dir(unit->stepper_conf, 0); + pse_sp_set_dir(unit, 0); pse_sp_start_axis(unit->stepper_conf, unit->stepper_status); } else if(code == LV_EVENT_RELEASED){ @@ -287,6 +298,16 @@ void PSE_unit_edit_screen_Gen(pse_unit* units, pse_unit* c_unit, uint8_t units_n lv_label_set_text(back_label, LV_SYMBOL_LEFT); lv_obj_center(back_label); + // add a reverse button + lv_obj_t* reverse_button = lv_btn_create(top_menu); + lv_obj_set_size(reverse_button, lv_pct(10), lv_pct(100)); + lv_obj_set_align(reverse_button, LV_ALIGN_TOP_RIGHT); + lv_obj_add_event_cb(reverse_button, reverse_button_handler, LV_EVENT_CLICKED, NULL); + // and it's button + lv_obj_t* reverse_label = lv_label_create(reverse_button); + lv_label_set_text(reverse_label, c_unit->reversed?LV_SYMBOL_PREV:LV_SYMBOL_NEXT); + lv_obj_center(reverse_label); + // grid layout for the widgets lv_obj_t* units_grid = lv_obj_create(scr); lv_obj_align_to(units_grid, top_menu, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); diff --git a/Core/Src/pse_stepper_planer.c b/Core/Src/pse_stepper_planer.c index a84e972..60c868f 100644 --- a/Core/Src/pse_stepper_planer.c +++ b/Core/Src/pse_stepper_planer.c @@ -18,7 +18,7 @@ void pse_stepper_planer_tick(pse_unit* unit){ pse_stepper_status* s = unit->stepper_status; HAL_GPIO_TogglePin(c->STEP_GPIO_Port, c->STEP_GPIO_Pin); - s->steps_counter += (pse_sp_get_dir(c)?1:-1) * HAL_GPIO_ReadPin(c->STEP_GPIO_Port, c->STEP_GPIO_Pin); + s->steps_counter += (pse_sp_get_dir(unit)?1:-1) * HAL_GPIO_ReadPin(c->STEP_GPIO_Port, c->STEP_GPIO_Pin); if(s->stop_at_limit && s->steps_counter == s->stop_steps){ pse_sp_jog_speed(c, s, 0); pse_sp_stop_axis(c); @@ -36,12 +36,15 @@ void pse_sp_stop_axis(pse_stepper_conf* conf){ HAL_GPIO_WritePin(conf->EN_GPIO_Port, conf->EN_GPIO_Pin, GPIO_PIN_SET); } -void pse_sp_set_dir(pse_stepper_conf* conf, int dir){ - HAL_GPIO_WritePin(conf->DIR_GPIO_Port, conf->DIR_GPIO_Pin, dir); +void pse_sp_set_dir(pse_unit* unit, int dir){ + pse_stepper_conf* conf = unit->stepper_conf; + HAL_GPIO_WritePin(conf->DIR_GPIO_Port, conf->DIR_GPIO_Pin, unit->reversed?-dir:dir); } -int pse_sp_get_dir(pse_stepper_conf* conf){ - return HAL_GPIO_ReadPin(conf->DIR_GPIO_Port, conf->DIR_GPIO_Pin); +int pse_sp_get_dir(pse_unit* unit){ + pse_stepper_conf* conf = unit->stepper_conf; + int val = HAL_GPIO_ReadPin(conf->DIR_GPIO_Port, conf->DIR_GPIO_Pin); + return (unit->reversed?-val:val); } // https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division @@ -100,7 +103,7 @@ void pse_stepper_planer_compute_sps(pse_unit* unit){ void pse_sp_set_dir_all(pse_unit* units, int units_num, int dir){ for(int i = 0; i < units_num; i++){ - pse_sp_set_dir(units[i].stepper_conf, dir); + pse_sp_set_dir(&units[i], dir); } }