diff options
| author | David Lamparter <equinox@diac24.net> | 2012-01-15 19:42:35 +0100 |
|---|---|---|
| committer | David Lamparter <equinox@diac24.net> | 2012-01-15 19:42:35 +0100 |
| commit | 79c414c4cfebf56edff8fdc4e4b234bbe0d623e5 (patch) | |
| tree | 58ca05a0914558e72fc49790534df79528275ad9 /kbc.c | |
| parent | 73d3b9faf1d0ac88c52f4c7c2853da8d870f2581 (diff) | |
metal sensor feedback + proper timeout handling
Diffstat (limited to 'kbc.c')
| -rw-r--r-- | kbc.c | 128 |
1 files changed, 81 insertions, 47 deletions
@@ -18,4 +18,4 @@ * 2 SS up:8 - * 3 MOSI up:2 - * 4 MISO up:4 + * 3 MOSI up:2 LOCK + * 4 MISO up:4 UNLOCK * 5 SCK up:7 @@ -40,6 +40,10 @@ #define B_BEEP (1 << 1) -#define B_OPEN 0 -#define B_CLOSE 0 +#define B_FEEDBACK (1 << 2) +#define B_CLOSE (1 << 3) +#define B_OPEN (1 << 4) + #define B_MISO (1 << 4) +#define MAXTRIES 3 + enum state { @@ -55,2 +59,4 @@ enum state { STATE_REJECT, + STATE_KEYMATIC_RECHECK, + STATE_KEYMATIC_RECLOSE, #ifdef KILLSWITCH @@ -59,3 +65,3 @@ enum state { }; -static volatile enum state state, nextstate; +static volatile enum state state, nextstate, toutstate; @@ -328,9 +334,15 @@ static uint8_t wait_byte(void) #define CNTR_ERROR 61 +#define CNTR_BEEP 10 +#define CNTR_BEEP_REJ 92 -#define WAIT_INPUT 5 -#define WAIT_ACCEPT 5 -#define WAIT_REJECT 10 +#define WAIT_INPUT 6 +#define WAIT_ACCEPT 8 +#define WAIT_REJECT 8 +#define WAIT_KEYMATIC_RETRY 9 -static uint8_t cntr = 0; +#define CNTR_KEYMATIC 30 +/* CNTR_BEEP_ACC == CNTR_KEYMATIC */ +static uint8_t cntr = 0; +static uint8_t close_try = 0; #ifdef KILLSWITCH @@ -347,2 +359,3 @@ static void state_enter(void) case STATE_FAILURE: + toutstate = STATE_POWERUP; statecntr = WAIT_FAIL; @@ -352,2 +365,3 @@ static void state_enter(void) case STATE_POWERUP: + toutstate = STATE_INITRESET; statecntr = WAIT_POWERUP; @@ -357,2 +371,3 @@ static void state_enter(void) case STATE_INITRESET: + toutstate = STATE_FAILURE; statecntr = WAIT_INIT; @@ -362,2 +377,3 @@ static void state_enter(void) /* statecntr not used */ + toutstate = STATE_FAILURE; nextstate = STATE_FAILURE; @@ -387,2 +403,4 @@ static void state_enter(void) case STATE_IDLE: + memset(&code, 0, sizeof(code)); + toutstate = STATE_IDLEBLINK; statecntr = WAIT_IDLE; @@ -396,2 +414,3 @@ static void state_enter(void) case STATE_IDLEBLINK: + toutstate = STATE_IDLE; statecntr = WAIT_IDLEBLINK; @@ -406,2 +425,3 @@ static void state_enter(void) case STATE_INPUT: + toutstate = STATE_IDLE; statecntr = WAIT_INPUT; @@ -413,2 +433,3 @@ static void state_enter(void) case STATE_ACCEPT: + toutstate = close_try ? STATE_KEYMATIC_RECHECK : STATE_IDLE; statecntr = WAIT_ACCEPT; @@ -420,2 +441,3 @@ static void state_enter(void) case STATE_REJECT: + toutstate = STATE_IDLE; statecntr = WAIT_REJECT; @@ -426,4 +448,31 @@ static void state_enter(void) break; + case STATE_KEYMATIC_RECHECK: + if (!close_try || !(PINB & B_FEEDBACK)) { + close_try = 0; + nextstate = STATE_IDLE; + return; + } + if (send_byte(0xed) != 0xfa) + break; + if (send_byte(KBLED_OK | KBLED_ERROR) != 0xfa) + break; + + close_try--; + + cntr = CNTR_KEYMATIC; + statecntr = WAIT_KEYMATIC_RETRY; + toutstate = STATE_KEYMATIC_RECLOSE; + + PORTB &= ~(B_OPEN | B_BEEP); + break; + case STATE_KEYMATIC_RECLOSE: + cntr = CNTR_KEYMATIC; + statecntr = WAIT_KEYMATIC_RETRY; + toutstate = STATE_KEYMATIC_RECHECK; + + PORTB &= ~(B_CLOSE | B_BEEP); + break; #ifdef KILLSWITCH case STATE_ERROR: + toutstate = STATE_ERROR; statecntr = 1; @@ -440,35 +489,2 @@ static void state_enter(void) -static void state_timeout(void) -{ - switch (state) { - case STATE_NONE: - case STATE_FAILURE: - state = STATE_POWERUP; - break; - case STATE_POWERUP: - state = STATE_INITRESET; - break; - case STATE_INITRESET: - case STATE_CONFIG: - state = STATE_FAILURE; - break; - case STATE_IDLE: - state = STATE_IDLEBLINK; - break; - case STATE_INPUT: - memset(&code, 0, sizeof(code)); - case STATE_IDLEBLINK: - case STATE_ACCEPT: - case STATE_REJECT: - state = STATE_IDLE; - break; -#ifdef KILLSWITCH - case STATE_ERROR: - state = STATE_ERROR; - break; -#endif - } - state_enter(); -} - ISR(SIG_OVERFLOW0) @@ -477,2 +493,5 @@ ISR(SIG_OVERFLOW0) cntr = CNTRTOP; + + PORTB = B_OPEN | B_CLOSE | B_BEEP; + if (statecntr) @@ -551,3 +570,3 @@ static void handle_keypress(uint8_t data) if (lock || unlock) { - uint8_t eebyte, pos, ok = 1; + uint8_t pos, ok = 1; @@ -571,6 +590,15 @@ static void handle_keypress(uint8_t data) if (!ok) { - dbg_wr(0x20); + PORTB &= ~B_BEEP; + + cntr = CNTR_BEEP_REJ; nextstate = STATE_REJECT; } else { - dbg_wr(lock ? 0x21 : 0x22); + if (lock) { + PORTB &= ~(B_CLOSE | B_BEEP); + close_try = MAXTRIES; + } else { + PORTB &= ~(B_OPEN | B_BEEP); + } + + cntr = CNTR_KEYMATIC; nextstate = STATE_ACCEPT; @@ -585,3 +613,4 @@ static void handle_keypress(uint8_t data) - statecntr = WAIT_INPUT; + PORTB &= ~B_BEEP; + cntr = CNTR_BEEP; nextstate = STATE_INPUT; @@ -615,2 +644,5 @@ int main() + PORTB = B_OPEN | B_CLOSE | B_BEEP; + DDRB = B_OPEN | B_CLOSE | B_BEEP; + /* /256 = 31'250 Hz = 32 µs per 1 unit @@ -642,3 +674,5 @@ int main() } else if (!statecntr) { - state_timeout(); + state = toutstate; + nextstate = STATE_NONE; + state_enter(); } |
