func Slice(nameTag *data.NameTag, printer *data.Printer, config *config.Config) error {
	if nameTag.Name == "" {
		return errors.New("Name tag has no name set")
	}
	var configFile string
	if printer.ConfigFile == "" {
		configFile = config.DefaultConfig
	} else {
		configFile = printer.ConfigFile
	}

	slic3rArgs := fmt.Sprintf(" %s/%s.stl --output %s/%s.gcode --load %s", config.StlDirectory,
		nameTag.Name, config.GcodeDirectory, nameTag.Name, configFile)

	fmt.Println("Slicing STL...")
	wg := new(sync.WaitGroup)
	wg.Add(1)
	go exe_cmd("slic3r"+slic3rArgs, wg)
	wg.Wait()
	gcode := config.GcodeDirectory + "/" + nameTag.Name + ".gcode"
	if _, err := os.Stat(gcode); os.IsNotExist(err) {
		return errors.New("An Error occured while slicing STL")
	}
	nameTag.Gcode = nameTag.Name + ".gcode"
	fmt.Println("Done slicing STL")
	return nil
}
func addNameTag(writer http.ResponseWriter, request *http.Request) {
	request.ParseForm()
	nameTag := new(data.NameTag)
	decoder := schema.NewDecoder()
	err := decoder.Decode(nameTag, request.Form)
	fmt.Println(request.Form)
	if check(err, 400, &writer) {
		return
	}
	if nameTag.Name == "" {
		log.Println(errors.New("No Name Provided"))
		http.Error(writer, http.StatusText(400), 400)
		return
	}
	nameTag.Id = uuid.NewV1()
	nameTag.State = "Waiting"
	nameTagQueue.Add(*nameTag, &configImpl)
	json, err := json.MarshalIndent(nameTagQueue.Queue, "", "    ")
	if check(err, 500, &writer) {
		return
	}
	writer.Write(json)
}
func Export(nameTag *data.NameTag, config *config.Config) error {
	if nameTag.Name == "" {
		return errors.New("Name tag has no name set")
	}
	stlArgs := fmt.Sprintf(" -o %s/%s.stl -D name=\"%s\" -D chars=%d %s/name.scad", config.StlDirectory,
		nameTag.Name, nameTag.Name, len(nameTag.Name), config.ScadDirectory)

	fmt.Println("Exporting STL...")
	wg := new(sync.WaitGroup)
	wg.Add(1)
	go exe_cmd("openscad"+stlArgs, wg)
	wg.Wait()
	stl := config.StlDirectory + "/" + nameTag.Name + ".stl"
	if _, err := os.Stat(stl); os.IsNotExist(err) {
		return errors.New("An Error occured while exporting STL")
	}
	nameTag.Stl = nameTag.Name + ".stl"
	fmt.Println("Done exporting STL")
	return nil
}
func run(interval time.Duration, nameTagQueue *data.NameTagQueue,
	printerQueue *data.PrinterQueue, config *config.Config) {
	fmt.Println("Print Server Started")
	Timer = time.NewTicker(interval * time.Second)
	for {
		select {
		case <-Timer.C:
			printer := printerQueue.GetNext()
			if printer == nil {
				continue
			}
			var nameTag *data.NameTag
		getNew:
			if printer.NameTag != nil && printer.NameTag.Error == false {
				fmt.Printf("%v\n", printer.NameTag)
				tag, err := nameTagQueue.Find(printer.NameTag.Id, config)
				if err != nil {
					printer.NameTag.Error = true
					goto getNew
				}
				nameTag = tag
			} else {
				nameTag = nameTagQueue.GetNext()
				if nameTag == nil {
					continue
				}
				printer.NameTag = nameTag
			}
			nameTag.State = "Assigned to printer"
			if nameTag.Stl == "" {
				nameTag.State = "Rendering STL"
				err := service.Export(nameTag, config)
				if err != nil {
					fmt.Println(err)
					nameTag.Error = true
					nameTag.State = "Has Error"
					goto save
				}
			}
			if nameTag.Gcode == "" {
				nameTag.State = "Slicing"
				err := service.Slice(nameTag, printer, config)
				if err != nil {
					fmt.Println(err)
					nameTag.Error = true
					nameTag.State = "Has Error"
					goto save
				}
			}
			if nameTag.Printing == false && printer.Printing == false {
				nameTag.State = "Uploading"
				err := service.Upload(nameTag, printer, config)
				if err != nil {
					log.Println(err)
					printer.Active = false
					goto save
				}
				printer.Printing = true
				nameTag.Printing = true
				nameTag.State = "Printing"
			}
		save:
			printerQueue.Save(config)
			nameTagQueue.Save(config)
			config.DebugLog("Finnished Loop")
		case <-Quit:
			Timer.Stop()
			return
		}
	}

}