trennfix/sw: Temporary
[eisenbahn.git] / trennfix / sw / main.c
index 4ae273a383ca19faac52497c85f4d63eb290d5cc..2437151e190a25b479bbccd84c0b0ffd1086242d 100644 (file)
 
 #define EE_MAGIC 0xab
 
+static void trigger(void)
+{
+       setpin(PIN_DRIVE, 1);
+       _delay_us(10);
+       setpin(PIN_DRIVE, 0);
+}
+
 enum op_mode {
        OM_MOMENTARY,     /* on as long as "key on" pressed   */
        OM_DOUBLE,        /* On off with "on" and "off" keys  */
@@ -73,7 +80,7 @@ struct config {
 
 static struct EEMEM config ee_config;
 static struct config config;
-static volatile enum learn_mode learn_mode = LM_LEARN_ON_KEY;
+static volatile enum learn_mode learn_mode = LM_OFF;
 
 static void load_config(void)
 {
@@ -82,14 +89,14 @@ static void load_config(void)
 
 static void save_config(void)
 {
-       eeprom_write_block(&config, &ee_config, sizeof(config));
+       eeprom_update_block(&config, &ee_config, sizeof(config));
 }
 
 static volatile uint8_t drive_on = 0;
 
-
 ISR(PCINT0_vect){
        static uint8_t btn_last = 0;
+
        mm_pinchange_handler();
 
        if (BTN_PRESSED && !btn_last) {
@@ -99,6 +106,69 @@ ISR(PCINT0_vect){
        btn_last = BTN_PRESSED;
 }
 
+static uint8_t get_speed(uint8_t command)
+{
+       uint8_t b1, b2, b3, b4, b5, b6, b7, b8;
+       b1 = ((command & 0x80) != 0);
+       b2 = ((command & 0x40) != 0);
+       b3 = ((command & 0x20) != 0);
+       b4 = ((command & 0x10) != 0);
+       b5 = ((command & 0x8) != 0);
+       b6 = ((command & 0x4) != 0);
+       b7 = ((command & 0x2) != 0);
+       b8 = ((command & 0x1) != 0);
+       
+       //if ((b1 != b2) || (b2 != b3) || (b3 != b4) || (b5 != b6) || (b7 != b8))
+       //      return 0xff;
+       
+       return (b1 + b3*2 + b5*4 +b7*8);
+}
+
+void mm_switch_drive(uint8_t decoder, uint8_t function, uint8_t command)
+{
+       static uint8_t seen_before = 0;
+       uint8_t speed;
+
+       
+       if (!seen_before) {
+               //              if (decoder == 100)
+               //      
+               
+               if ((decoder == 100) && (function == 0) && (command == 0xc0)) {
+                       config.magic = 0;
+                       save_config();
+               }
+       }
+       seen_before = 1;
+       speed = get_speed(command);
+       static uint8_t itsme = 0;
+       if (decoder == 10) {
+               trigger();
+
+               if (speed == 1) {
+                       itsme = 1;
+                       drive_on = 1;
+               }else {
+                       if (itsme) {
+                               drive_on = 0;
+                               itsme = 0;
+                       }
+               }
+       }
+       if (decoder == 33) {
+               //              trigger();
+
+               speed = get_speed(command);
+               if (speed != 0xff) {
+                       if (speed >= 1) speed -= 1;
+                       if (speed <= 14)
+                               config.on_duty_cycle = speed;
+                       else
+                               config.on_duty_cycle = 14;
+               }
+       }
+}
+
 void mm_switch_command(uint8_t decoder, uint8_t command)
 {
        static uint8_t toggle_lock = 0;
@@ -148,7 +218,6 @@ void mm_switch_command(uint8_t decoder, uint8_t command)
                        case OM_MOMENTARY:
                        default:
                                break;
-                               
                        }
                }
                break;
@@ -165,6 +234,7 @@ void mm_switch_command(uint8_t decoder, uint8_t command)
                }
                break;
 
+#ifdef LEARN_THE_STUFF
        case LM_LEARN_OFF_KEY:
                if (command) {
                        config.decoder_off = decoder;
@@ -248,7 +318,7 @@ void mm_switch_command(uint8_t decoder, uint8_t command)
                        break;
                }
                break;
-               
+#endif         
        }
 }
 
@@ -260,19 +330,19 @@ void mm_switch_command(uint8_t decoder, uint8_t command)
  */
 
 int main(void) {
-       uint8_t learn_mode_off;
+       // uint8_t learn_mode_off;
        uint8_t drive_last = 0;
        uint8_t drive_slope = 0;
        uint8_t i;
 
-       setup_hw();
        load_config();
+       setup_hw();
 
-       if (config.op_mode == OM_ERASED || config.magic != EE_MAGIC) {
+       if ((config.op_mode == OM_ERASED) || (config.magic != EE_MAGIC)) {
                config.magic = EE_MAGIC;
                config.op_mode = OM_MOMENTARY;
-               //         config.decoder_on = 1;
-               //         config.key_on = 1;
+               config.decoder_on = 1;
+               config.key_on = 1;
                config.decoder_off = 1;
                config.key_off = 2;
                config.initial_pulse = 10;
@@ -283,7 +353,7 @@ int main(void) {
        
        while (1) {
                
-       drive_start:
+               //      drive_start:
                
                cli();
                if (!drive_last && drive_on)
@@ -292,29 +362,38 @@ int main(void) {
                        drive_slope = 0;
                drive_last = drive_on;
                sei();
+
                if (drive_on) {
+#ifdef ROOM_FOR_KICK
                        if (drive_slope) {
                                for (i = 0; i < config.initial_pulse; i++) {
                                        setpin(PIN_DRIVE, 1);   
                                        _delay_ms(10);
                                }
                        }
-                       
+#endif                 
+
+#define ROOM_FOR_PWM
+#ifdef ROOM_FOR_PWM
                        for (i = 0; i < config.on_duty_cycle; i++) {
                                setpin(PIN_DRIVE, drive_on);
-                               _delay_us(2);
+                               _delay_us(1);
                        }
-                       
-                       for (i = 0; i < (10 - config.on_duty_cycle); i++) {
+                       for (i = 0; i < (14 - config.on_duty_cycle); i++) {
                                setpin(PIN_DRIVE, 0);
-                               _delay_us(2);
+                               _delay_us(1);
                        }
 
+#else
+                       setpin(PIN_DRIVE, 1);
+#endif                 
+
                } else {
+                       setpin(PIN_DRIVE, 0);
                        if (!learn_mode)
                                continue;
 
-                       learn_mode_off = !learn_mode;
+                       //learn_mode_off = !learn_mode;
                        
                        //if (drive_on || (learn_mode && learn_mode_off))
                        //      goto drive_start;