From 048e16a12bf926cc122899dd96f1ba34fb5d7912 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 7 Feb 2013 00:51:15 +0000 Subject: fixed state machine git-svn-id: https://svn.spreadspace.org/avr/trunk@163 aa12f405-d877-488e-9caf-2d797e2a1cc7 --- usb-i2c-sl018/eventqueue.h | 2 +- usb-i2c-sl018/statemachine.c | 22 +++++++++++++++------- usb-i2c-sl018/statemachine.dot | 4 ++-- usb-i2c-sl018/stepper.c | 8 +++++++- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/usb-i2c-sl018/eventqueue.h b/usb-i2c-sl018/eventqueue.h index bfa2c62..fa2929b 100644 --- a/usb-i2c-sl018/eventqueue.h +++ b/usb-i2c-sl018/eventqueue.h @@ -24,7 +24,7 @@ #ifndef R3TUER_eventqueue_h_INCLUDED #define R3TUER_eventqueue_h_INCLUDED -typedef enum { none, cmd_open, cmd_close, cmd_toggle, btn_toggle, card, move_timeout } event_t; +typedef enum { none, cmd_open, cmd_close, cmd_toggle, btn_toggle, card, close_fin, open_fin, move_timeout } event_t; void init_eventqueue(void); event_t eventqueue_pop(void); diff --git a/usb-i2c-sl018/statemachine.c b/usb-i2c-sl018/statemachine.c index 9a43385..77fb9cd 100644 --- a/usb-i2c-sl018/statemachine.c +++ b/usb-i2c-sl018/statemachine.c @@ -98,12 +98,8 @@ void statemachine_task_limits(void) return; } case closing: - if(limits == close) - return change_state(closed); break; case opening: - if(limits == open) - return change_state(opened); break; } } @@ -117,9 +113,16 @@ void statemachine_task_event(void) switch(state) { case closing: case opening: - if(event==move_timeout) - { - return change_state(state==opening?timeout_after_open:timeout_after_close); + switch(event) { + case open_fin: + return change_state(opened); + case close_fin: + return change_state(closed); + case move_timeout: + return change_state(state==opening?timeout_after_open:timeout_after_close); + default: + printf("Error: event %d not allowed in state %d\n\r", event, state); + return; } case reset: case error: @@ -144,6 +147,11 @@ void statemachine_task_event(void) (state==closed || state == timeout_after_close) ? opening: closing); + case open_fin: + case close_fin: + case move_timeout: + printf("Error: event %d not allowed in state %d\n\r", event, state); + return; } } diff --git a/usb-i2c-sl018/statemachine.dot b/usb-i2c-sl018/statemachine.dot index cff0df1..d581de8 100644 --- a/usb-i2c-sl018/statemachine.dot +++ b/usb-i2c-sl018/statemachine.dot @@ -29,8 +29,8 @@ digraph G { opened -> closing [label="toggle"]; closed -> opening [label="cmd_open"]; closed -> opening [label="toggle"]; - opening -> opened [label="limit_open"]; - closing -> closed [label="limit_close"]; + opening -> opened [label="open_fin"]; + closing -> closed [label="close_fin"]; closing -> timeout_after_close [label="timeout"]; opening -> timeout_after_open [label="timeout"]; timeout_after_open -> closing [label="cmd_close"]; diff --git a/usb-i2c-sl018/stepper.c b/usb-i2c-sl018/stepper.c index 7501feb..d555889 100644 --- a/usb-i2c-sl018/stepper.c +++ b/usb-i2c-sl018/stepper.c @@ -77,8 +77,14 @@ inline uint8_t handle_step(void) STEPPER_PORT = (STEPPER_PORT & STEPPER_OUTPUT_BITMASK ) | stepper_output; step_cnt++; - if(step_cnt >= STEP_CNT_OFF) + if(step_cnt >= STEP_CNT_OFF) { + if(step_direction == dir_open) + eventqueue_push(open_fin); + else + eventqueue_push(close_fin); + return 0; + } return 1; } -- cgit v1.2.3