| 
					
				 | 
			
			
				@@ -233,6 +233,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M860 - Wait for PINDA thermistor to reach target temperature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// M861 - Set / Read PINDA temperature compensation offsets 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M900 - Set LIN_ADVANCE options, if enabled. See Configuration_adv.h for details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M907 - Set digital trimpot motor current using axis codes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // M908 - Control digital trimpot directly. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -6263,6 +6264,74 @@ Sigma_Exit: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case 861: // M861 - Set/Read PINDA temperature compensation offsets 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (code_seen('?')) { // ? - Print out current EEPRO offset values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			uint8_t cal_status = calibration_status_pinda(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			cal_status ? SERIAL_PROTOCOLLN("PINDA cal status: 1") : SERIAL_PROTOCOLLN("PINDA cal status: 0"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SERIAL_PROTOCOLLN("index, temp, ustep, um"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for (uint8_t i = 0; i < 6; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				uint16_t usteps = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (i > 0) usteps = eeprom_read_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + (i - 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				float mm = ((float)usteps) / axis_steps_per_unit[Z_AXIS]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				i == 0 ? SERIAL_PROTOCOLPGM("n/a") : SERIAL_PROTOCOL(i - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOL(35 + (i * 5)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOL(usteps); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOL(mm * 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SERIAL_PROTOCOLLN(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		else if (code_seen('!')) { // ! - Set factory default values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 0, 8); //40C -  20um -   8usteps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 1, 24); //45C -  60um -  24usteps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 2, 48); //50C - 120um -  48usteps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 3, 80); //55C - 200um -  80usteps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 4, 120); //60C - 300um - 120usteps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SERIAL_PROTOCOLLN("factory restored"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 0, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 1, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 3, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + 4, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SERIAL_PROTOCOLLN("zerorized"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			uint16_t usteps = code_value(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (code_seen('I')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				byte index = code_value(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if ((index >= 0) && (index < 5)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					eeprom_write_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + index, usteps); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					SERIAL_PROTOCOLLN("OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					SERIAL_PROTOCOLLN("index, temp, ustep, um"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					for (uint8_t i = 0; i < 6; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						uint16_t usteps = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if (i > 0) usteps = eeprom_read_word(((uint16_t*)EEPROM_PROBE_TEMP_SHIFT) + (i - 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						float mm = ((float)usteps) / axis_steps_per_unit[Z_AXIS]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						i == 0 ? SERIAL_PROTOCOLPGM("n/a") : SERIAL_PROTOCOL(i - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOL(35 + (i * 5)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOL(usteps); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOLPGM(", "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOL(mm * 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						SERIAL_PROTOCOLLN(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SERIAL_PROTOCOLPGM("no valid command"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif //PINDA_THERMISTOR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef LIN_ADVANCE 
			 |