trennfix/sw: Was not as beautiful as expected. Now it's better!
[eisenbahn.git] / trennfix / sw / mm / src / mm_switch.c
index 4be3e3652f2d34afc64a255384eeab691e74f7e0..4bda4730a30e4d57c1a7f9e4e369edb5b7a86917 100644 (file)
 #include <config/hardware.h>
 #include <mm/mm_switch.h>
 
-/*
- *    Private data types
- */
-
 
 /*
  *
@@ -237,7 +233,6 @@ ISR(MM_TIMER_INT_VECT) {
        static uint8_t function_last = 0xff;
        static uint8_t command_last = 0xff;
 #endif
-
        MM_TSTART;
 
        switch(recstate) {
@@ -252,30 +247,27 @@ ISR(MM_TIMER_INT_VECT) {
                recstate = MM_SLOW_WAIT_FOR_CLOCK_DELAY;
                break;
 
+       case MM_SLOW_WAIT_FOR_CLOCK_DELAY:
+               recstate = MM_SLOW_WAIT_FOR_CLOCK;
+               return;
+
        case MM_FAST_SAMPLE:
                recstate = MM_FAST_WAIT_FOR_CLOCK;
                break;
 
        case MM_FAST_WAIT_FOR_CLOCK: /* A timeout! */
-               if (mm_rec_tolerated_timeouts) {
+               if (mm_rec_tolerated_timeouts)
                        mm_rec_tolerated_timeouts--;
-               } else {
+               else
                        recstate = MM_IDLE;
-
-               }
                return;
 
        case MM_SLOW_SAMPLE_DELAY:
                recstate = MM_SLOW_SAMPLE;
                return;
 
-       case MM_SLOW_WAIT_FOR_CLOCK_DELAY:
-               recstate = MM_SLOW_WAIT_FOR_CLOCK;
-               return;
-
        case MM_SLOW_WAIT_FOR_CLOCK:
                if (mm_rec_tolerated_timeouts) {
-                       trigger();
                        mm_rec_tolerated_timeouts--;
                        recstate = MM_SLOW_WAIT_FOR_CLOCK_DELAY;
                        return;
@@ -285,7 +277,7 @@ ISR(MM_TIMER_INT_VECT) {
        case MM_IDLE:
                return;
        }
-       
+
        shift(MM_SENSE);
        bitno++;
 
@@ -294,28 +286,27 @@ ISR(MM_TIMER_INT_VECT) {
                shift_function_first = shift_function;
                shift_command_first  = shift_command;
                mm_rec_tolerated_timeouts = 18;
-               trigger();
+
        } 
 
        if (bitno == 36) {
                if ((shift_command == shift_command_first) &&
                    (shift_address == shift_address_first) &&
                    (shift_function == shift_function_first)) {
+                       
 
 #ifdef MM_FILTER_REPEATED
                        if ((shift_address != address_last) || (shift_command != command_last) ||
                            shift_function != function_last) {
 #endif
                                address = lookup_decoder(shift_address);
-                               
                                if (recstate == MM_SLOW_WAIT_FOR_CLOCK_DELAY) {
-                                       trigger();
                                        mm_switch_drive(address, shift_function, shift_command);
                                } else if (recstate == MM_FAST_WAIT_FOR_CLOCK) {
-                                       trigger();
                                        command = lookup_command(shift_command);
                                        mm_switch_command(address, command);
                                }
+                               recstate = MM_IDLE;
 #ifdef MM_FILTER_REPEATED
                        }
                        address_last   = shift_address;
@@ -357,60 +348,62 @@ ISR(TIM0_OVF_vect)
        
 }
 
+uint8_t register sense_last asm("r9");
+
+
 /* Pin change interrupt vector */
-void mm_pinchange_handler(void)
-{
+ISR(PCINT0_vect){
        static uint8_t sense_last;
-
-       if (MM_SENSE == sense_last)
-               return;
+       if (MM_SENSE && !sense_last) {
+               MM_TSTART;
+               switch(recstate) {
+               case MM_IDLE:
+                       bitno = 0;
+                       recstate = MM_FIRST_FAST_SAMPLE;
+                       break;
+
+               case MM_FIRST_SLOW_SAMPLE:
+                       recstate = MM_FAST_SAMPLE;
+                       break;
+
+               case MM_FAST_WAIT_FOR_CLOCK:
+                       recstate = MM_FAST_SAMPLE;
+                       mm_rec_tolerated_timeouts = 0;
+                       break;
+
+               case MM_SLOW_WAIT_FOR_CLOCK_DELAY: /* If clock comes early */
+                       recstate = MM_SLOW_SAMPLE_DELAY;
+                       break;
+
+               case MM_SLOW_WAIT_FOR_CLOCK:
+                       recstate = MM_SLOW_SAMPLE_DELAY;
+                       mm_rec_tolerated_timeouts = 0;
+                       break;
+                       
+               case MM_SLOW_SAMPLE_DELAY:
+                       recstate = MM_SLOW_SAMPLE;
+                       break;
+                       
+                       /* Not expected */
+               case MM_FIRST_FAST_SAMPLE:
+               case MM_FAST_SAMPLE:
+               case MM_SLOW_SAMPLE:
+                       recstate = MM_IDLE;
+               default:
+                       break;
+               }
+       }
        sense_last = MM_SENSE;
-       if (!sense_last)
-               return;
-
-       MM_TSTART;
-
-       switch(recstate) {
-       case MM_IDLE:
-               bitno = 0;
-               recstate = MM_FIRST_FAST_SAMPLE;
-               break;
-
-       case MM_FIRST_SLOW_SAMPLE:
-               recstate = MM_FAST_SAMPLE;
-               break;
-
-       case MM_FAST_WAIT_FOR_CLOCK:
-               recstate = MM_FAST_SAMPLE;
-               mm_rec_tolerated_timeouts = 0;
-               break;
-
-       case MM_SLOW_WAIT_FOR_CLOCK_DELAY: /* If clock comes early */
-               recstate = MM_SLOW_WAIT_FOR_CLOCK;
-               break;
+       mm_switch_pinchange_callback();
+ }
 
-       case MM_SLOW_WAIT_FOR_CLOCK:
-               recstate = MM_SLOW_SAMPLE_DELAY;
-               mm_rec_tolerated_timeouts = 0;
-               break;
-
-       case MM_SLOW_SAMPLE_DELAY:
-               recstate = MM_SLOW_SAMPLE;
-               break;
-               /* Not expected */
-       case MM_FIRST_FAST_SAMPLE:
-       case MM_FAST_SAMPLE:
-       case MM_SLOW_SAMPLE:
-               recstate = MM_IDLE;
-       default:
-               break;
-       }
+void __attribute__((weak))mm_switch_pinchange_callback(void)
+{
 }
 
 void __attribute__((weak))mm_switch_drive(uint8_t decoder, uint8_t function,
                                          uint8_t command)
 {
-       while(1);
 }
 
 void __attribute__((weak))mm_switch_command(uint8_t address, uint8_t command)