static void move(struct fsm *fsm, enum event event)
{
static int counter;
+ static bool lift_stopped_on_end = false;
bool finished;
switch (event) {
case EVENT_ENTRY:
fsm->req_pos = fsm->start_pos;
break;
case EVENT_DO:
+ if ((fsm->flags & CAN_LIFT_SWITCH_UP) && (fsm->can_response != fsm->req_target)){
+ if(!lift_stopped_on_end){
+ fsm->can_response = fsm->req_target;
+ fsm->current_state = wait_for_cmd;
+ fsm->req_pos = fsm->act_pos;
+ lift_stopped_on_end=true;
+ }
+ else{
+ lift_stopped_on_end=false;
+ }
+ }
+ if ((fsm->flags & CAN_LIFT_SWITCH_DOWN) && (fsm->can_response != fsm->req_target)) {
+ if(!lift_stopped_on_end){
+ fsm->can_response = fsm->req_target;
+ fsm->current_state = wait_for_cmd;
+ fsm->act_pos=0;
+ fsm->req_pos = fsm->act_pos;
+ lift_stopped_on_end=true;
+ }
+ else{
+ lift_stopped_on_end=false;
+ }
+
+ }
if (fsm->can_req_position != fsm->req_target) {
fsm->flags |= CAN_LIFT_TIMEOUT;
fsm->current_state = wait_for_cmd;