From 032f2637a793b5258911e288aea5d0e99743f680 Mon Sep 17 00:00:00 2001
From: PavelSindler <sindlerpa@gmail.com>
Date: Sun, 30 Apr 2017 17:08:00 +0200
Subject: [PATCH] adding edits made by akukan

---
 Firmware/Marlin_main.cpp | 33 ++++++++++++++++++++++++++++----
 Firmware/stepper.cpp     | 41 ++++++++++++++++++++++++++++++++--------
 Firmware/ultralcd.cpp    |  9 +++++++++
 Firmware/ultralcd.h      |  4 ++++
 4 files changed, 75 insertions(+), 12 deletions(-)

diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 2c1a6bf0..0f8d9fd0 100644
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -5109,11 +5109,35 @@ case 404:  //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
         }
         else
         {
-          #ifdef FILAMENTCHANGE_FINALRETRACT
-            target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ;
-          #endif
+			#ifdef SNMM
+
+			#else
+				#ifdef FILAMENTCHANGE_FINALRETRACT
+							target[E_AXIS] += FILAMENTCHANGE_FINALRETRACT;
+				#endif
+			#endif // SNMM
         }
-        plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder);
+
+#ifdef SNMM
+		target[E_AXIS] += 12;
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 3500, active_extruder);
+		target[E_AXIS] += 6;
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 5000, active_extruder);
+		target[E_AXIS] += (FIL_LOAD_LENGTH * -1);
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 5000, active_extruder);
+		st_synchronize();
+		target[E_AXIS] += (FIL_COOLING);
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 50, active_extruder);
+		target[E_AXIS] += (FIL_COOLING*-1);
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 50, active_extruder);
+		target[E_AXIS] += (BOWDEN_LENGTH*-1);
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 3000, active_extruder);
+		st_synchronize();
+
+#else
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder);
+#endif // SNMM
+		     
 
         //finish moves
         st_synchronize();
@@ -5389,6 +5413,7 @@ case 404:  //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
 	  else {
 		  tmp_extruder = code_value();
 #ifdef SNMM
+		  snmm_extruder = tmp_extruder;
 
 		  st_synchronize();
 		  delay(100);
diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp
index 919c5591..b92f54ee 100644
--- a/Firmware/stepper.cpp
+++ b/Firmware/stepper.cpp
@@ -515,14 +515,39 @@ ISR(TIMER1_COMPA_vect)
     }
     #endif
 
-    if ((out_bits & (1<<E_AXIS)) != 0) {  // -direction
-      REV_E_DIR();
-      count_direction[E_AXIS]=-1;
-    }
-    else { // +direction
-      NORM_E_DIR();
-      count_direction[E_AXIS]=1;
-    }
+	if ((out_bits & (1 << E_AXIS)) != 0)
+	{	// -direction
+		//AKU
+#ifdef SNMM
+		if (snmm_extruder == 0 || snmm_extruder == 2)
+		{
+			NORM_E_DIR();
+		}
+		else
+		{
+			REV_E_DIR();
+		}
+#else
+		REV_E_DIR();
+#endif // SNMM
+		count_direction[E_AXIS] = -1;
+	}
+	else
+	{	// +direction
+#ifdef SNMM
+		if (snmm_extruder == 0 || snmm_extruder == 2)
+		{
+			REV_E_DIR();
+		}
+		else
+		{
+			NORM_E_DIR();
+		}
+#else
+		NORM_E_DIR();
+#endif // SNMM
+		count_direction[E_AXIS] = 1;
+	}
 
     for(uint8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves)
       #ifndef AT90USB
diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp
index 94c3ad76..5a9461f3 100644
--- a/Firmware/ultralcd.cpp
+++ b/Firmware/ultralcd.cpp
@@ -96,6 +96,10 @@ int8_t SDscrool = 0;
 
 int8_t SilentModeMenu = 0;
 
+#ifdef SNMM
+uint8_t snmm_extruder = 0;
+#endif
+
 int lcd_commands_type=LCD_COMMAND_IDLE;
 int lcd_commands_step=0;
 bool isPrintPaused = false;
@@ -2949,9 +2953,14 @@ void change_extr(int extr) { //switches multiplexer for extruders
 	disable_e1();
 	disable_e2();
 
+#ifdef SNMM
+	snmm_extruder = extr;
+#endif
+
 	pinMode(E_MUX0_PIN, OUTPUT);
 	pinMode(E_MUX1_PIN, OUTPUT);
 	pinMode(E_MUX2_PIN, OUTPUT);
+
 	switch (extr) {
 	case 1:
 		WRITE(E_MUX0_PIN, HIGH);
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index cd7e1842..865be3f1 100644
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -103,6 +103,10 @@ void lcd_mylang();
   extern int farm_timer;
   extern int farm_status;
 
+#ifdef SNMM
+  extern uint8_t snmm_extruder;
+#endif // SNMM
+
   extern bool cancel_heatup;
   extern bool isPrintPaused;