def spawn(self): vel = self.gobj.getLinearVelocity() vel.magnitude = 0.25 _, pos, _ = self.gobj.ray(vel) if pos: pipe = Pipe() if self.color == "orange": self.flip(pipe) pipe_old = self.color_pipe[self.color] if pipe_old: pipe_old.burrow() pipe.worldPosition = pos pipe.worldPosition.z -= 0.6 pipe.grow() self.color_pipe[self.color] = pipe pipes = list(self.color_pipe.values()) if not None in pipes: self.bind_pipes(pipes) self.gobj.end()
def __init__(self, left, gap_center, velocity, color, gap, group): #Create the two pipes that make up a pipe set self.topPipe = Pipe(left, gap_center - gap / 2, velocity, color, False) self.botPipe = Pipe(left, gap_center + gap / 2, velocity, color, True) group.add(self.topPipe) group.add(self.botPipe)
def main(): b = Bird(230, 350) p = Pipe(550) s = Score() run = True while run: clock.tick(60) win.blit(bg, (0, 0)) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False break pressed = pygame.key.get_pressed() if pressed[pygame.K_SPACE]: b.jump() if p.collision(b): b.dead_bird() print("SCORE : " + str(s.count)) break if p.cleared_pipe(b): p = Pipe(550) s.update_score() s.display_score(win) b.draw(win) p.draw(win) p.move() b.move() pygame.display.update()
def init(self,voice=1): if voice==1: super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 0 self.min = 0 self.timetext = "TIME : 0:00" self.timechange = False self.movechange = False self.mute = -1 self.mode = "play" #self.mode = "solve" self.solvelist = [5,6,7,3,2,6,5,1,2,3,7] self.solvelist += [11,12,8,4,3,7,6,10,9] self.solvelist += [13,14,15,16,12,11,10,9,13,14,15,11] self.solvelist += [10,14,13,9,10,6,5,9,13,14,15] self.solveindex = len(self.solvelist)-1 datastring = "1000\n" datastring += "1000\n" writeFile("game4data.txt",datastring) global curk,k curk,k = 16,16 global pg,pp pg = [2,7,10,11,14] pp = [1,3,4,5,9,13] Gear.init() Tile.init() Pipe.init() self.win = False self.gears = pygame.sprite.Group() self.pipes = pygame.sprite.Group() self.gears.add(Gear(330-65,180+65,-1,0)) self.gears.add(Gear(330+65*4,180,17,0,1)) self.tiles = pygame.sprite.Group() for i in range(4): for j in range(4): x=330+65*j y=180+65*i num=j*4+i+1 if num != curk: self.tiles.add(Tile(x,y,num)) if num in pg: self.gears.add(Gear(x,y,num,0)) if num in pp: if num == 13: self.pipes.add(Pipe(x,y,num,4)) elif num == 5: self.pipes.add(Pipe(x,y,num,5)) else: self.pipes.add(Pipe(x,y,num,1)) self.exit = 20 self.exittype = 1 self.timer = 15
def get_random_pipes(xpos): size = random.randint(100, 300) pipe = Pipe(False, xpos, size, TELA_ALTURA) pipe_inverted = Pipe(True, xpos, TELA_ALTURA - size - ESPACO_GAP, TELA_ALTURA) pipe_gap = PipeGap(xpos, TELA_ALTURA, TELA_ALTURA) return (pipe, pipe_inverted, pipe_gap)
def reset(): pipes.clear() [ pipes.append(i) for i in [Pipe(0), Pipe(x_difference), Pipe(x_difference * 2)] ]
def main(): score = 0 bird = Bird(200, 320) base = Base(730) pipes = [Pipe(700)] win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) pygame.init() clock = pygame.time.Clock() run = True game = True while run: clock.tick(25) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == (pygame.K_TAB or pygame.K_SPACE): bird.jump() if event.type == pygame.QUIT: run = False if game: rem = [] add_pipe = False for pipe in pipes: if pipe.collide(bird, win): game = False if pipe.x + pipe.PIPE_TOP.get_width() < 0: rem.append(pipe) if not pipe.passed and pipe.x < bird.x: pipe.passed = True add_pipe = True pipe.move() if add_pipe: score += 1 pipes.append(Pipe(700)) for r in rem: pipes.remove(r) pipe.move() if bird.y + bird.img.get_height() >= 700: game = False base.move() if game: bird.move() draw_window(win, bird, pipes, base, score) else: game_over(win, base, score) pygame.quit() quit()
def create_pipe(screen, pipes, game_state, SCREEN_WIDTH, SCREEN_HEIGHT): random_height = random.choice([250, 350, 450]) pipes.append( Pipe(screen, SCREEN_WIDTH + 100, 0, 40, random_height, (255, 255, 255))) pipes.append( Pipe(screen, SCREEN_WIDTH + 100, random_height + 150, 40, SCREEN_HEIGHT, (255, 255, 255)))
def main(): run = True while run: bird = Bird(230, 350) base = Base(700) pipes = [Pipe(730)] win = pygame.display.set_mode((winWidth, windHeight)) pygame.display.set_caption("Padmank's Flappy Bird") clock = pygame.time.Clock() score = 0 alive, paused = True, False while alive: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: run, alive = False, False pygame.quit() quit() break if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: run, alive = False, False pygame.quit() quit() break if event.key == pygame.K_SPACE: bird.jump() if event.key == pygame.K_r: main() if not paused: bird.move() addPipe = False removePipes = [] for pipe in pipes: if pipe.collide(bird): paused = True if pipe.x + pipe.topPipe.get_width() < 0: #if pipe is off the screen completely removePipes.append(pipe) if not pipe.passed and pipe.x < bird.x: pipe.passed = True addPipe = True pipe.move() if addPipe: score += 1 pipes.append(Pipe(600)) for r in removePipes: pipes.remove(r) if bird.y + bird.img.get_height() >= 730: paused = True base.move() drawWindow(win, bird, pipes, base, score)
def init(self): super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 3100 self.min = 0 self.timetext = "TIME : 0:30" self.timeup = False self.mute = -1 global curk,k curk,k = 4,4 global p1,p2,p3,p4,p5,p6,p7 p1 = [5,7,10,12,15] p2 = [8,9] p3 = [14] p4 = [] p5 = [3] p6 = [2] p7 = [6,11] Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(330+65*3+5,180-55,-1,0)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p1: self.pipes.add(Pipe(x,y,num,1)) elif num in p2: self.pipes.add(Pipe(x,y,num,2)) elif num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num in p4: self.pipes.add(Pipe(x,y,num,4)) elif num in p5: self.pipes.add(Pipe(x,y,num,5)) elif num in p6: self.pipes.add(Pipe(x,y,num,6)) elif num in p7: self.pipes.add(Pipe(x,y,num,7)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.timer = 15
def init(self,voice=1): if voice==1: super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 0 self.min = 0 self.timetext = "TIME : 0:00" self.timechange = False self.movechange = False self.mute = -1 self.mode = "play" #self.mode = "solve" self.solvelist = [11,10,9,13,14,10,11,7,6,10,11,12,8] self.solvelist += [7,3,2,6,10,11,12,8,7,3] self.solveindex = len(self.solvelist)-1 datastring = "1000\n" datastring += "1000\n" writeFile("game5data.txt",datastring) global curk,k curk,k = 4,4 global p3,p6 p3 = [1,2,3,5,6,9] p6 = [8,11,12,14,15,16] Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(330+65*3+5,180-55,-1,0,1)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num in p6: self.pipes.add(Pipe(x,y,num,6)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.exit = 0 self.exittype = 6 self.timer = 15 self.gassound = pygame.mixer.Sound('sound/gas01.wav') self.gassound.play() self.gassound.set_volume(0.2)
def wilcox(set1,set2): save(set1,"w.1") save(set2,"w.2") pipe=Pipe("/home/bmajoros/1000G/src/wilcox.R w.1 w.2 two.sided") p=None while(True): line=pipe.readline() if(line is None): break if(rex.find("p-value\s*=\s*(\S+)",line)): p=rex[1] elif(rex.find("p-value\s*<\s*(\S+)",line)): p=rex[1] return p
def load(self, flag, generation_number): self.backGround_1 = BackGround(self.screen, 0, 0, 0, 600, False) self.backGround_2 = BackGround(self.screen, 0, 0, 300, 600, False) self.backGround_1_inverted = BackGround(self.screen, 0, 0, 0, 0, True) self.backGround_2_inverted = BackGround(self.screen, 0, 0, 300, 0, True) self.landScape = LandScape(self.screen, 0, 0, 0, 0) self.frame_alive = 0 self.birds_pool = [] self.bird_score = [] self.models_load = [] self.load_nn = [] self.population_size = 20 self.generation_number = generation_number if flag: for idx in range(0, self.population_size): bird = Bird(self.screen, 300, 400, 300, 400) self.birds_pool.append(bird) else: for i in range(0, self.population_size): m = NeuralNetwork() self.load_nn.append(m) self.load_nn[i].get_model().load_weights("models/model" + str(i+1)+ ".keras") bird = Bird(self.screen, 300, 400, 300, 400, self.load_nn[i]) self.birds_pool.append(bird) y1 = random.randint(450, 500) y2 = random.randint(0, 100) self.pipe = Pipe(self.screen, 0, 0, 1200, y1, False) self.pipe_inverted = Pipe(self.screen, 0, 0, 1200, y2, True) self.landScape.load() self.backGround_1.load() self.backGround_2.load() self.backGround_1_inverted.load() self.backGround_2_inverted.load() self.nn = [] for bird in self.birds_pool: bird.load() self.pipe.load() self.pipe_inverted.load() self.game_objects = [self.backGround_1, self.backGround_2, self.pipe, self.pipe_inverted, self.backGround_1_inverted, self.backGround_2_inverted] + self.birds_pool self.collision_handler = Collision(self.game_objects)
class Interpreter(): def __init__(self): self.pipe = Pipe() self.redir = Redir() self.boolean = Boolean() self.cmd = Exec() def visit_BinOp(self, node): if type(node) is Cmd or type(node) is File or type(node) is Eol: return node else: if node.token == 'PIPE': left = self.visit_BinOp(node.left) if type(left) is Cmd and left.pipePlace == 'start': self.pipe.pipe_start(left) right = self.visit_BinOp(node.right) if type(right) is Cmd: if right.pipePlace == 'inter': self.pipe.pipe_inter(right) else: self.pipe.pipe_end(right) #print('pipe') elif node.token in ['GREAT', 'GREATAND', 'DGREAT']: if type(node.left) is Cmd and type(node.right) is File: self.visit_BinOp(node.left) self.redir.exec_only_redir(node.left, node.right) else: self.visit_BinOp(node.left) self.redir.exec_redir(self.pipe, self.visit_BinOp(node.right)) #print('redir') elif node.token in ['OR', 'AND']: self.visit_BinOp(node.left) if type(node.left) is Cmd: self.cmd.exec_cmd(node.left) ret = self.boolean.checkStatus(self.cmd.pid) elif node.left.token in ['GREAT', 'GREATAND', 'DGREAT']: ret = self.boolean.checkStatus(self.redir.pid) else: self.pipe.sequence_end() ret = self.boolean.checkStatus(self.pipe.pid) if (ret == 0 and node.token == 'OR') or (ret != 0 and node.token == 'AND'): return self.visit_BinOp(node.right) if type(node.right) is Cmd: self.cmd.exec_cmd(node.right) #print('and') elif node.token == 'EOL': self.visit_BinOp(node.left) self.visit_BinOp(node.right) if type(node.left) is Cmd: self.cmd.exec_cmd(node.left) elif node.left.token in ['GREAT', 'GREATAND', 'DGREAT']: pass
def betaBinomialVariance2(alpha,beta,n): pipe=Pipe("/home/bmajoros/src/util/beta-binomial -S "+str(VAR_SAMPLE_SIZE)+ " "+str(n)+" "+str(alpha)+" "+str(alpha+beta)) array=[] while(True): line=pipe.readline() if(line is None): break x=int(line.rstrip()) array.append(x) (mean,SD,min,max)=SummaryStats.summaryStats(array) var=SD*SD if(var<0.01): print("VAR",array,"\n",alpha,beta,n,var) exit() return var
def init(self): super().init() self.bgColor = (255,255,255) self.count = 50 self.sec = 0 self.min = 0 self.timetext = "TIME : 0:00" self.moveup = False self.mute = -1 global curk,k curk,k = 16,16 global pg,pp pg = [2,7,10,11,14] pp = [1,3,4,5,9,13] Gear.init() Tile.init() Pipe.init() self.win = False self.gears = pygame.sprite.Group() self.pipes = pygame.sprite.Group() self.gears.add(Gear(330-65,180+65,-1,0)) self.gears.add(Gear(330+65*4,180,17,0)) self.tiles = pygame.sprite.Group() for i in range(4): for j in range(4): x=330+65*j y=180+65*i num=j*4+i+1 if num != curk: self.tiles.add(Tile(x,y,num)) if num in pg: self.gears.add(Gear(x,y,num,0)) if num in pp: if num == 13: self.pipes.add(Pipe(x,y,num,4)) elif num == 5: self.pipes.add(Pipe(x,y,num,5)) else: self.pipes.add(Pipe(x,y,num,1)) self.exit = 20 self.exittype = 1 self.timer = 15
def __init__(self): pygame.init() self.bird = Bird() self.sw = 700 self.sh = 500 #maybe need to make a loop to add all the pipes into a list or someting kewl self.pipes = pygame.sprite.Group() self.birds = pygame.sprite.Group() self.birds.add(self.bird) self.screen = pygame.display.set_mode([self.sw, self.sh]) pygame.display.set_caption("Sappy Bird Nerd") self.clock = pygame.time.Clock() for i in range(8): self.pipe = Pipe() self.pipe.rect.x = i * self.pipe.spacing if i % 2 == 0: #bottom self.pipe.rect.y = 500 - self.pipe.h else: self.pipe.rect.y = 0 self.pipes.add(self.pipe) self.score = 0 self.game_over = False self.start = False
def handle_pipes(pipes, birds, ge, nets): remove_pipes = [] add_pipe = False for pipe in pipes: for index, bird in enumerate(birds): if pipe.collide(bird): ge[index].fitness -= 1 # Remove bird and its net and genome birds.pop(index) ge.pop(index) nets.pop(index) if not pipe.passed and pipe.x < bird.x: pipe.passed = True add_pipe = True if pipe.x + pipe.PIPE_TOP.get_width() < 0: remove_pipes.append(pipe) pipe.move() if add_pipe: for bird in birds: bird.score += 1 for g in ge: g.fitness += 5 pipes.append(Pipe(WIN_WIDTH + 100)) for pipe in remove_pipes: pipes.remove(pipe)
def match(file, difficulty): while True: OBJECTS['bird'] = [] HITMASK['bird'] = [] for bird in range(2): OBJECTS['bird'].append(Bird()) HITMASK['bird'].append(( OBJECTS['bird'][bird].getHitmask(0), OBJECTS['bird'][bird].getHitmask(1), OBJECTS['bird'][bird].getHitmask(2) )) OBJECTS['base'] = Base() OBJECTS['pipe'] = Pipe() HITMASK['pipe'] = ( OBJECTS['pipe'].getHitmaskLowerPipe(), OBJECTS['pipe'].getHitmaskUpperPipe() ) if 'win' in sys.platform: extension = '.wav' else: extension = '.ogg' SOUNDS['wing'] = pygame.mixer.Sound('assets/audio/wing' + extension) SOUNDS['hit'] = pygame.mixer.Sound('assets/audio/hit' + extension) rdmBg = random.randint(0, len(BACKGROUNDS_LIST) - 1) IMAGES['background'] = pygame.image.load(BACKGROUNDS_LIST[rdmBg]).convert() if matchGame(file, difficulty): break
def main(genomes, config): nets = [] ge = [] birds = [] for _, g in genomes: # create net net = neat.nn.FeedForwardNetwork.create(g, config) nets.append(net) #create bitrd birds.append(Bird(230,350)) g.fitness = 0 ge.append(g) base = Base(730) pipes = [Pipe(WIN_WIDTH + 100)] win = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT)) clock = pygame.time.Clock() running = True while running: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False pygame.quit() quit() pipe_index = 0 if len(birds) > 0: if len(pipes) > 1 and birds[0].x > pipes[0].x + pipes[0].PIPE_TOP.get_width(): pipe_index = 1 else: running = False break for index, bird in enumerate(birds): if base.collide(bird): birds.pop(index) ge.pop(index) nets.pop(index) else: bird.move() ge[index].fitness += 0.1 # Active neuro net, with given input values # Here we use birds y position, distance to end of top pipe and distance of bird to end of bottom pipe output = nets[index].activate((bird.y, abs(bird.y) - pipes[pipe_index].height, abs(bird.y) - pipes[pipe_index].bottom)) #output is list of outputs if output[0] > 0.5: bird.jump() handle_pipes(pipes, birds, ge, nets) base.move() if len(birds) > 0: draw_window(win, birds, pipes, base)
def reset(): global sprite_group, pipes_top, pipes_botom, point bird.reset() pipes_top = [] pipes_botom = [] Pipe.top_index = 0 Pipe.bottom_index = 0 point = 0 for i in range(COUNT): center_y = make_center_y() pipes_top.append(Pipe(OFFSET_X, OFFSET_Y, window_size, True, HORIZONTAL_DISTANCE, VERTICAL_DISTANCE, center_y)) pipes_botom.append( Pipe(OFFSET_X, OFFSET_Y, window_size, False, HORIZONTAL_DISTANCE, VERTICAL_DISTANCE, center_y)) sprite_group = [] sprite_group.append(floor) sprite_group.extend(pipes_top) sprite_group.extend(pipes_botom)
def init(self): super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 2100 self.min = 0 self.timetext = "TIME: 0:20" self.timeup = False self.mute = -1 global curk,k curk,k = 3,3 global p1,p2,p3 p1 = [5,8,9,12] p2 = [2,14,15] p3 = [13] Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(330+65*3+5,180-55,-1,0)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p1: self.pipes.add(Pipe(x,y,num,1)) elif num in p2: self.pipes.add(Pipe(x,y,num,2)) elif num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.exit = 0 self.exittype = 1 self.timer = 15
def init(self): super().init() self.bgColor = (255,255,255) self.count = 30 self.sec = 0 self.min = 0 self.timetext = "TIME : 0:00" self.moveup = False self.mute = -1 global curk,k curk,k = 4,4 global p3,p6 p3 = [1,2,3,5,6,9] p6 = [8,11,12,14,15,16] Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(330+65*3+5,180-55,-1,0)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num in p6: self.pipes.add(Pipe(x,y,num,6)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.exit = 0 self.exittype = 6 self.timer = 15
def lose(self): self.bird = Bird(Vars.BIRD_START_X, Vars.BIRD_START_Y) self.pipe = self.pipe = [ Pipe(Vars.PIPE_STARTING_X + i * (Vars.PIPE_DISTANCE + Pipe.WIDTH)) for i in range(0, 3) ] self.background = LoopingImage(Vars.WIN_HEIGHT, Vars.background_img, Vars.BACKGROUND_VEL) self.floor = Floor(Vars.FLOOR_HEIGHT, Vars.Floor_img, Vars.FLOOR_VEL) self.score = 0 self.distance = 0 Vars.lose = False
def betaBinomial(dnaRef, dnaAlt, rnaRef, rnaAlt): OPTIONS = " -t -s 2 " cmd=BETA_BINOMIAL+""+OPTIONS+" "+str(rnaAlt)+" "+str(rnaRef+rnaAlt)+" "+\ str(dnaAlt+1)+" "+str(dnaAlt+dnaRef+2) #cmd=BETA_BINOMIAL+""+OPTIONS+" "+str(rnaAlt)+" "+str(rnaRef+rnaAlt)+" "+\ # str(dnaRef+1)+" "+str(dnaAlt+dnaRef+2) #print(cmd) output = Pipe.run(cmd) #print("OUTPUT:",output) P = float(output) #print(P) return P
def align(self, seq1, seq2): file1 = self.writeFile("query", seq1) file2 = self.writeFile("reference", seq2) cmd=self.alignerDir+"/smith-waterman -q "+self.matrixFile+" "+\ str(self.gapOpen)+" "+str(self.gapExtend)+" "+file1+" "+file2+" DNA" output = Pipe.run(cmd) os.remove(file1) os.remove(file2) if (not rex.find("CIGAR=(\S+)", output)): raise Exception("Can't parse aligner output: " + output) cigar = rex[1] cigar = self.swapInsDel(cigar) # because I define cigars differently return CigarString(cigar)
def run(self): self.events() self.bird.move() self.background.move() self.floor.move() for i in self.pipe: i.move() i.collide(self.bird) self.floor.collide(self.bird) self.add_score() if self.pipe[0].x < 0 - self.pipe[0].IMAGE.get_width(): self.pipe.pop(0) self.pipe.append( Pipe(self.pipe[-1].x + Pipe.WIDTH + Vars.PIPE_DISTANCE)) if Vars.lose: self.lose()
def train(): generation = 0 brain = [] record = 0 bestBird = NeuralNetwork(INPUT, HIDDEN, OUTPUT) velGame = 0 info = {'close': False, 'brain': brain, 'generation': generation, 'record': record, 'bestBird': bestBird, 'velGame': velGame} for i in range(BIRDS): brain.append(NeuralNetwork(INPUT, HIDDEN, OUTPUT)) start = time.time() while True: OBJECTS['bird'] = [] HITMASK['bird'] = [] for bird in range(BIRDS): OBJECTS['bird'].append(Bird()) HITMASK['bird'].append(( OBJECTS['bird'][bird].getHitmask(0), OBJECTS['bird'][bird].getHitmask(1), OBJECTS['bird'][bird].getHitmask(2) )) OBJECTS['base'] = Base() OBJECTS['pipe'] = Pipe() HITMASK['pipe'] = ( OBJECTS['pipe'].getHitmaskLowerPipe(), OBJECTS['pipe'].getHitmaskUpperPipe() ) rdmBg = random.randint(0, len(BACKGROUNDS_LIST) - 1) IMAGES['background'] = pygame.image.load(BACKGROUNDS_LIST[rdmBg]).convert() if not info['close']: info = trainGame(info['brain'], info['generation'], info['record'], info['bestBird'], info['velGame']) else: break end = time.time() t = end - start hour = int(t / 3600) min = int((t % 3600) / 60) sec = int((t % 3600) % 60) stringTime = 'Time:' + str(hour) + 'h ' + str(min) + 'm ' + str(sec) + 's' drawText(10, 35, stringTime, (0, 0, 0), 35) pygame.display.update() time.sleep(3)
def __init__(self): self.bird = Bird(Vars.BIRD_START_X, Vars.BIRD_START_Y) self.pipe = [ Pipe(Vars.PIPE_STARTING_X + i * (Vars.PIPE_DISTANCE + Pipe.WIDTH)) for i in range(0, 3) ] self.background = LoopingImage(Vars.WIN_HEIGHT, Vars.background_img, Vars.BACKGROUND_VEL) self.floor = Floor(Vars.FLOOR_HEIGHT, Vars.Floor_img, Vars.FLOOR_VEL) self.fpsClock = pygame.time.Clock() self.distance = 0 self.score = 0 self.score_number_text = Vars.font1.render(str(self.score), False, (0, 0, 0)) while Vars.running: self.run() self.draw() self.fpsClock.tick(Vars.FPS)
def main(genomes, config): """Run the main process to execute the game.""" global GEN GEN += 1 nets = [] ge = [] birds = [] for _, g in genomes: net = neat.nn.FeedForwardNetwork.create(g, config) nets.append(net) birds.append(Bird(230, 350)) g.fitness = 0 ge.append(g) base = Base(730) pipes = [Pipe(600)] win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) clock = pygame.time.Clock() run = True score = 0 while run: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.quit() quit() pipe_ind = 0 if len(birds) > 0: if len(pipes) > 1 and birds[0].x > pipes[0].x + pipes[0].PIPE_TOP.get_width(): pipe_ind = 1 else: run = False break for x, bird in enumerate(birds): bird.move() ge[x].fitness += 0.1 output = nets[x].activate( (bird.y, abs(bird.y - pipes[pipe_ind].height), abs(bird.y - pipes[pipe_ind].bottom))) if output[0] > 0.5: bird.jump() add_pipe = False rem = [] for pipe in pipes: for x, bird in enumerate(birds): if pipe.collide(bird): ge[x].fitness -= 1 birds.pop(x) nets.pop(x) ge.pop(x) if not pipe.passed and pipe.x < bird.x: pipe.passed = True add_pipe = True if pipe.x + pipe.PIPE_TOP.get_width() < 0: rem.append(pipe) pipe.move() if add_pipe: score += 1 for g in ge: g.fitness += 5 pipes.append(Pipe(600)) for r in rem: pipes.remove(r) for x, bird in enumerate(birds): if bird.y + bird.img.get_height() >= 730 or bird.y < 0: birds.pop(x) nets.pop(x) ge.pop(x) base.move() draw_window(win, birds, pipes, base, score, GEN)
def game(generation, high_score): birds = ga.get_population() # for bird in birds: # print(bird.neural_network) # input() pipe_level = 1 pipes = [] done = False pygame.time.set_timer(USEREVENT + 1, pipe_interval) BackGround = Background('large.jpg', [0, 0]) while not done: screen.fill([255, 255, 255]) screen.blit(BackGround.image, BackGround.rect) for event in pygame.event.get(): if event.type == pygame.QUIT: done = True pygame.quit() exit() if event.type == USEREVENT + 1: pipes.append(Pipe(pipe_level)) pipe_level += 1 if event.type == pygame.MOUSEBUTTONDOWN: for bird in birds: bird.up() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: for bird in birds: bird.up() if event.key == pygame.K_ESCAPE: done = True pygame.quit() exit() for pipe in pipes: pipe.update() pipes = [pipe for pipe in pipes if not pipe.offscreen()] for bird in birds: if pipe.hit(bird): # print("Score of this bird was", bird.score) birds.remove(bird) pass # Drawing pipes for pipe in pipes: pipe.show() pipes_to_right_of_bird = [ pipe for pipe in pipes if pipe.distance_from_bird_to_end_of_gap > 0 ] closest_pipe_to_right_of_bird = 0 if len(pipes_to_right_of_bird) > 0: closest_pipe_to_right_of_bird = min( pipes_to_right_of_bird, key=lambda pipe_lambda: pipe_lambda. distance_from_bird_to_end_of_gap) # draw target point target_point = [ 100 + closest_pipe_to_right_of_bird.distance_from_bird_to_end_of_gap if isinstance(closest_pipe_to_right_of_bird, Pipe) else width, closest_pipe_to_right_of_bird.top + int(closest_pipe_to_right_of_bird.gap / 2) if closest_pipe_to_right_of_bird else int(height / 2) ] pygame.draw.circle(screen, blue, target_point, 5) pygame.draw.line(screen, blue, [0, target_point[1]], [width, target_point[1]]) pygame.draw.line(screen, blue, [target_point[0], 0], [target_point[0], height]) curr_score = ga.get_best_unit().score if curr_score > high_score: high_score = curr_score screen.blit( pygame.font.Font('C://windows//fonts//arial.ttf', 20).render("Generation:{}".format(generation), True, blue), (10, 570)) screen.blit( pygame.font.Font('C://windows//fonts//arial.ttf', 20).render("High Score:{}".format(high_score), True, blue), (150, 570)) screen.blit( pygame.font.Font('C://windows//fonts//arial.ttf', 20).render("alive:{}".format(len(birds)), True, blue), (300, 570)) for bird in birds: if bird.hit_walls(): birds.remove(bird) continue bird.update() bird.horizontal_distance = target_point[0] - bird.x bird.height_difference = target_point[1] - bird.y bird.target_point = target_point if (generation < 3): sim = True else: sim = False if bird.neural_network_make_decision(bird.horizontal_distance, bird.height_difference, bird.velocity, simulated=sim): bird.up() else: pass # Draw birds for bird in birds: bird.show() if not len(birds): pass done = True pygame.display.flip() clock.tick(fps)
def __init__(self): logging.info("Replicape initializing " + version) self.config = ConfigParser.ConfigParser() self.config.readfp(open('config/default.cfg')) # Make a list of steppers self.steppers = {} # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) self.steppers["X"] = SMD("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X") self.steppers["Y"] = SMD("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y") self.steppers["Z"] = SMD("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") self.steppers["H"] = SMD("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1") self.steppers["E"] = SMD("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2") # Enable the steppers and set the current, steps pr mm and microstepping for name, stepper in self.steppers.iteritems(): stepper.setCurrentValue( self.config.getfloat('Steppers', 'current_' + name)) stepper.setEnabled( self.config.getboolean('Steppers', 'enabled_' + name)) stepper.set_steps_pr_mm( self.config.getfloat('Steppers', 'steps_pr_mm_' + name)) stepper.set_microstepping( self.config.getint('Steppers', 'microstepping_' + name)) stepper.set_decay(0) # Commit changes for the Steppers SMD.commit() # Find the path of the thermostors path = "/sys/bus/iio/devices/iio:device0/in_voltage" # init the 3 thermistors self.therm_ext1 = Thermistor(path + "4_raw", "MOSFET Ext 1", "B57561G0103F000") # Epcos 10K self.therm_hbp = Thermistor(path + "6_raw", "MOSFET HBP", "B57560G104F") # Epcos 100K self.therm_ext2 = Thermistor(path + "5_raw", "MOSFET Ext 2", "B57561G0103F000") # Epcos 10K if os.path.exists("/sys/bus/w1/devices/28-000002e34b73/w1_slave"): self.cold_end_1 = W1( "/sys/bus/w1/devices/28-000002e34b73/w1_slave", "Cold End 1") # init the 3 heaters self.mosfet_ext1 = Mosfet(3) self.mosfet_ext2 = Mosfet(4) self.mosfet_hbp = Mosfet(5) # Make extruder 1 self.ext1 = Extruder(self.steppers["E"], self.therm_ext1, self.mosfet_ext1, "Ext1") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) # Make Heated Build platform self.hbp = HBP(self.therm_hbp, self.mosfet_hbp) # Make extruder 2. self.ext2 = Extruder(self.steppers["H"], self.therm_ext2, self.mosfet_ext2, "Ext2") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) self.current_tool = "E" # Init the three fans self.fan_1 = Fan(1) self.fan_2 = Fan(2) self.fan_3 = Fan(0) self.fans = {0: self.fan_1, 1: self.fan_2, 2: self.fan_3} self.fan_1.setPWMFrequency(100) # Init the end stops self.end_stops = {} self.end_stops["Y1"] = EndStop("GPIO2_2", self.steppers, 1, "Y1") self.end_stops["X1"] = EndStop("GPIO0_14", self.steppers, 2, "X1") self.end_stops["Z1"] = EndStop("GPIO0_30", self.steppers, 3, "Z1") self.end_stops["Y2"] = EndStop("GPIO3_21", self.steppers, 4, "Y2") self.end_stops["X2"] = EndStop("GPIO0_31", self.steppers, 5, "X2") self.end_stops["Z2"] = EndStop("GPIO0_4", self.steppers, 6, "Z2") # Make a queue of commands self.commands = Queue.Queue(10) # Set up USB, this receives messages and pushes them on the queue #self.usb = USB(self.commands) self.pipe = Pipe(self.commands) self.ethernet = Ethernet(self.commands) # Init the path planner self.movement = "RELATIVE" self.feed_rate = 3000.0 self.current_pos = {"X": 0.0, "Y": 0.0, "Z": 0.0, "E": 0.0, "H": 0.0} self.acceleration = 0.3 Path.axis_config = int(self.config.get('Geometry', 'axis_config')) Path.max_speed_x = float(self.config.get('Steppers', 'max_speed_x')) Path.max_speed_y = float(self.config.get('Steppers', 'max_speed_y')) Path.max_speed_z = float(self.config.get('Steppers', 'max_speed_z')) Path.max_speed_e = float(self.config.get('Steppers', 'max_speed_e')) Path.max_speed_h = float(self.config.get('Steppers', 'max_speed_h')) self.path_planner = Path_planner(self.steppers, self.current_pos) self.path_planner.set_acceleration(self.acceleration) # Signal everything ready logging.info("Replicape ready") print "Replicape ready"
def __init__(self): logging.info("Redeem initializing "+version) self.printer = Printer() # Parse the config self.printer.config = CascadingConfigParser(['/etc/redeem/default.cfg', '/etc/redeem/local.cfg']) # Get the revision from the Config file self.revision = self.printer.config.get('System', 'revision', "A4") logging.info("Replicape revision "+self.revision) # Init the end stops EndStop.callback = self.end_stop_hit EndStop.inputdev = self.printer.config.get("Endstops","inputdev"); if self.revision == "A4": self.printer.end_stops["X1"] = EndStop("GPIO3_21", 112, "X1", self.printer.config.getboolean("Endstops", "invert_X1")) self.printer.end_stops["X2"] = EndStop("GPIO0_30", 113, "X2", self.printer.config.getboolean("Endstops", "invert_X2")) self.printer.end_stops["Y1"] = EndStop("GPIO1_17", 114, "Y1", self.printer.config.getboolean("Endstops", "invert_Y1")) self.printer.end_stops["Y2"] = EndStop("GPIO1_19", 115, "Y2", self.printer.config.getboolean("Endstops", "invert_Y2")) self.printer.end_stops["Z1"] = EndStop("GPIO0_31", 116, "Z1", self.printer.config.getboolean("Endstops", "invert_Z1")) self.printer.end_stops["Z2"] = EndStop("GPIO0_4" , 117, "Z2", self.printer.config.getboolean("Endstops", "invert_Z2")) else: self.printer.end_stops["X1"] = EndStop("GPIO0_14", 112, "X1", self.printer.config.getboolean("Endstops", "invert_X1")) self.printer.end_stops["X2"] = EndStop("GPIO3_21", 113, "X2", self.printer.config.getboolean("Endstops", "invert_X2")) self.printer.end_stops["Y1"] = EndStop("GPIO2_2", 114, "Y1", self.printer.config.getboolean("Endstops", "invert_Y1")) self.printer.end_stops["Y2"] = EndStop("GPIO0_31", 115, "Y2", self.printer.config.getboolean("Endstops", "invert_Y2")) self.printer.end_stops["Z1"] = EndStop("GPIO0_30", 116, "Z1", self.printer.config.getboolean("Endstops", "invert_Z1")) self.printer.end_stops["Z2"] = EndStop("GPIO0_4", 117, "Z2", self.printer.config.getboolean("Endstops", "invert_Z2")) if self.revision == "A3": Stepper.revision = "A3" Stepper.ENABLED = 6 Stepper.SLEEP = 5 Stepper.RESET = 4 Stepper.DECAY = 0 # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) self.printer.steppers["X"] = Stepper("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X", self.printer.end_stops["X1"], 0,0) self.printer.steppers["Y"] = Stepper("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y", self.printer.end_stops["Y1"], 1,1) self.printer.steppers["Z"] = Stepper("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z", self.printer.end_stops["Z1"], 2,2) self.printer.steppers["E"] = Stepper("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1", None,3,3) self.printer.steppers["H"] = Stepper("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2", None,4,4) # Enable the steppers and set the current, steps pr mm and microstepping for name, stepper in self.printer.steppers.iteritems(): stepper.set_current_value(self.printer.config.getfloat('Steppers', 'current_'+name)) if self.printer.config.getboolean('Steppers', 'enabled_'+name): stepper.set_enabled() else: stepper.set_disabled() stepper.set_steps_pr_mm(self.printer.config.getfloat('Steppers', 'steps_pr_mm_'+name)) stepper.set_microstepping(self.printer.config.getint('Steppers', 'microstepping_'+name)) stepper.direction = self.printer.config.getint('Steppers', 'direction_'+name) stepper.set_decay(self.printer.config.getboolean("Steppers", "slow_decay_"+name)) # Commit changes for the Steppers Stepper.commit() # Find the path of the thermistors path = "/sys/bus/iio/devices/iio:device0/in_voltage" # init the 3 thermistors therm_ext1 = Thermistor(path+"4_raw", "MOSFET Ext 1", self.printer.config.get('Heaters', "ext1_temp_chart")) therm_hbp = Thermistor(path+"6_raw", "MOSFET HBP", self.printer.config.get('Heaters', "hbp_temp_chart")) therm_ext2 = Thermistor(path+"5_raw", "MOSFET Ext 2", self.printer.config.get('Heaters', "ext2_temp_chart")) path = self.printer.config.get('Cold-ends', 'path', 0) if os.path.exists(path): self.printer.cold_ends.append(ColdEnd(path, "Cold End 1")) logging.info("Found Cold end on "+path) else: logging.info("No cold end present in path: "+path) # Init the 3 heaters. Argument is channel number if self.revision == "A3": mosfet_ext1 = Mosfet(3) mosfet_ext2 = Mosfet(4) mosfet_hbp = Mosfet(5) else: mosfet_ext1 = Mosfet(5) mosfet_ext2 = Mosfet(3) mosfet_hbp = Mosfet(4) # Make extruder 1 self.printer.heaters['E'] = Extruder(self.printer.steppers["E"], therm_ext1, mosfet_ext1, "Ext1", self.printer.config.getboolean('Heaters', 'ext1_onoff_control')) self.printer.heaters['E'].set_p_value(self.printer.config.getfloat('Heaters', "ext1_pid_p")) self.printer.heaters['E'].set_d_value(self.printer.config.getfloat('Heaters', "ext1_pid_d")) self.printer.heaters['E'].set_i_value(self.printer.config.getfloat('Heaters', "ext1_pid_i")) self.printer.heaters['E'].ok_range = self.printer.config.getfloat('Heaters', "ext1_ok_range") # Make Heated Build platform self.printer.heaters['HBP'] = HBP( therm_hbp, mosfet_hbp, self.printer.config.getboolean('Heaters', 'hbp_onoff_control')) self.printer.heaters['HBP'].set_p_value(self.printer.config.getfloat('Heaters', "hbp_pid_p")) self.printer.heaters['HBP'].set_d_value(self.printer.config.getfloat('Heaters', "hbp_pid_i")) self.printer.heaters['HBP'].set_i_value(self.printer.config.getfloat('Heaters', "hbp_pid_d")) self.printer.heaters['HBP'].ok_range = self.printer.config.getfloat('Heaters', "hbp_ok_range") # Make extruder 2. self.printer.heaters['H'] = Extruder(self.printer.steppers["H"], therm_ext2, mosfet_ext2, "Ext2", self.printer.config.getboolean('Heaters', 'ext2_onoff_control')) self.printer.heaters['H'].set_p_value(self.printer.config.getfloat('Heaters', "ext2_pid_p")) self.printer.heaters['H'].set_d_value(self.printer.config.getfloat('Heaters', "ext2_pid_i")) self.printer.heaters['H'].set_i_value(self.printer.config.getfloat('Heaters', "ext2_pid_d")) self.printer.heaters['H'].ok_range = self.printer.config.getfloat('Heaters', "ext2_ok_range") # Init the three fans. Argument is PWM channel number self.printer.fans=[] if self.revision == "A3": self.printer.fans.append(Fan(1)) self.printer.fans.append(Fan(2)) self.printer.fans.append(Fan(0)) else: self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) Fan.set_PWM_frequency(100) for f in self.printer.fans: f.set_value(0) # Make a queue of commands self.commands = Queue.Queue(10) # Set up USB, this receives messages and pushes them on the queue self.usb = USB(self.commands) # Virtual TTY self.pipe = Pipe(self.commands) #self.pipe.set_send_reponse(False) self.ethernet = Ethernet(self.commands) # Init the path planner Path.axis_config = int(self.printer.config.get('Geometry', 'axis_config')) Path.max_speed_x = float(self.printer.config.get('Steppers', 'max_speed_x')) Path.max_speed_y = float(self.printer.config.get('Steppers', 'max_speed_y')) Path.max_speed_z = float(self.printer.config.get('Steppers', 'max_speed_z')) Path.max_speed_e = float(self.printer.config.get('Steppers', 'max_speed_e')) Path.max_speed_h = float(self.printer.config.get('Steppers', 'max_speed_h')) Path.home_speed_x = float(self.printer.config.get('Steppers', 'home_speed_x')) Path.home_speed_y = float(self.printer.config.get('Steppers', 'home_speed_y')) Path.home_speed_z = float(self.printer.config.get('Steppers', 'home_speed_z')) Path.home_speed_e = float(self.printer.config.get('Steppers', 'home_speed_e')) Path.home_speed_h = float(self.printer.config.get('Steppers', 'home_speed_h')) dirname = os.path.dirname(os.path.realpath(__file__)) # Create the firmware compiler pru_firmware = PruFirmware(dirname+"/../firmware/firmware_runtime.p",dirname+"/../firmware/firmware_runtime.bin",dirname+"/../firmware/firmware_endstops.p",dirname+"/../firmware/firmware_endstops.bin",self.revision,self.printer.config,"/usr/bin/pasm") self.printer.path_planner = PathPlanner(self.printer.steppers, pru_firmware) self.printer.path_planner.set_acceleration(float(self.printer.config.get('Steppers', 'acceleration'))) travel={} offset={} for axis in ['X','Y','Z']: travel[axis] = self.printer.config.getfloat('Geometry', 'travel_'+axis.lower()) offset[axis] = self.printer.config.getfloat('Geometry', 'offset_'+axis.lower()) self.printer.path_planner.set_travel_length(travel) self.printer.path_planner.set_center_offset(offset) self.printer.processor = GCodeProcessor(self.printer); # After the firmwares are loaded, the endstop states can be updated. for k, endstop in self.printer.end_stops.iteritems(): logging.debug("Endstop "+endstop.name+" hit? : "+ str(endstop.read_value())) self.running = True # Signal everything ready logging.info("Redeem ready")
def init(self,voice=1): if voice==1: super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 0 self.min = 0 self.timetext = "TIME: 0:00" self.timechange = False self.movechange = False self.mute = -1 self.mode = "play" #self.mode = "solve" self.solvelist = [10,6,7,3,2,1,5,9] self.solvelist += [10,6,5,9,10,6,2,3] self.solvelist += [4,8,12,11,7,8] self.solvelist += [12,11,10,6,2,3] self.solvelist += [7,8,4,3,7,8,12,11,10] self.solvelist += [6,7,8,12,11,10,9,5,6,7] self.solveindex = len(self.solvelist)-1 datastring = "1000\n" datastring += "1000\n" writeFile("game6data.txt",datastring) global curk,k curk,k = 8,8 global p1,p2,p3,p4,p5,p6 p1 = [] p2 = [1,6,9] p3 = [4] p4 = [3] p5 = [10] p6 = [5] Pipe.init() Tile.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() for i in range(4): for j in range(3): x=332+65*j y=180+65*i num = j*4+i+1 if num in p1: self.pipes.add(Pipe(x,y,num,1)) elif num in p2: self.pipes.add(Pipe(x,y,num,2)) elif num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num in p4: self.pipes.add(Pipe(x,y,num,4)) elif num in p5: self.pipes.add(Pipe(x,y,num,5)) elif num in p6: self.pipes.add(Pipe(x,y,num,6)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.exit = 8 self.exittype = "init" self.timer = 15 self.gassound = pygame.mixer.Sound('sound/gas01.wav') self.gassound.play() self.gassound.set_volume(0.2)
class Replicape: ''' Init ''' def __init__(self): logging.info("Replicape initializing " + version) self.config = ConfigParser.ConfigParser() self.config.readfp(open('config/default.cfg')) # Make a list of steppers self.steppers = {} # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) self.steppers["X"] = SMD("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X") self.steppers["Y"] = SMD("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y") self.steppers["Z"] = SMD("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") self.steppers["H"] = SMD("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1") self.steppers["E"] = SMD("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2") # Enable the steppers and set the current, steps pr mm and microstepping for name, stepper in self.steppers.iteritems(): stepper.setCurrentValue( self.config.getfloat('Steppers', 'current_' + name)) stepper.setEnabled( self.config.getboolean('Steppers', 'enabled_' + name)) stepper.set_steps_pr_mm( self.config.getfloat('Steppers', 'steps_pr_mm_' + name)) stepper.set_microstepping( self.config.getint('Steppers', 'microstepping_' + name)) stepper.set_decay(0) # Commit changes for the Steppers SMD.commit() # Find the path of the thermostors path = "/sys/bus/iio/devices/iio:device0/in_voltage" # init the 3 thermistors self.therm_ext1 = Thermistor(path + "4_raw", "MOSFET Ext 1", "B57561G0103F000") # Epcos 10K self.therm_hbp = Thermistor(path + "6_raw", "MOSFET HBP", "B57560G104F") # Epcos 100K self.therm_ext2 = Thermistor(path + "5_raw", "MOSFET Ext 2", "B57561G0103F000") # Epcos 10K if os.path.exists("/sys/bus/w1/devices/28-000002e34b73/w1_slave"): self.cold_end_1 = W1( "/sys/bus/w1/devices/28-000002e34b73/w1_slave", "Cold End 1") # init the 3 heaters self.mosfet_ext1 = Mosfet(3) self.mosfet_ext2 = Mosfet(4) self.mosfet_hbp = Mosfet(5) # Make extruder 1 self.ext1 = Extruder(self.steppers["E"], self.therm_ext1, self.mosfet_ext1, "Ext1") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) # Make Heated Build platform self.hbp = HBP(self.therm_hbp, self.mosfet_hbp) # Make extruder 2. self.ext2 = Extruder(self.steppers["H"], self.therm_ext2, self.mosfet_ext2, "Ext2") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) self.current_tool = "E" # Init the three fans self.fan_1 = Fan(1) self.fan_2 = Fan(2) self.fan_3 = Fan(0) self.fans = {0: self.fan_1, 1: self.fan_2, 2: self.fan_3} self.fan_1.setPWMFrequency(100) # Init the end stops self.end_stops = {} self.end_stops["Y1"] = EndStop("GPIO2_2", self.steppers, 1, "Y1") self.end_stops["X1"] = EndStop("GPIO0_14", self.steppers, 2, "X1") self.end_stops["Z1"] = EndStop("GPIO0_30", self.steppers, 3, "Z1") self.end_stops["Y2"] = EndStop("GPIO3_21", self.steppers, 4, "Y2") self.end_stops["X2"] = EndStop("GPIO0_31", self.steppers, 5, "X2") self.end_stops["Z2"] = EndStop("GPIO0_4", self.steppers, 6, "Z2") # Make a queue of commands self.commands = Queue.Queue(10) # Set up USB, this receives messages and pushes them on the queue #self.usb = USB(self.commands) self.pipe = Pipe(self.commands) self.ethernet = Ethernet(self.commands) # Init the path planner self.movement = "RELATIVE" self.feed_rate = 3000.0 self.current_pos = {"X": 0.0, "Y": 0.0, "Z": 0.0, "E": 0.0, "H": 0.0} self.acceleration = 0.3 Path.axis_config = int(self.config.get('Geometry', 'axis_config')) Path.max_speed_x = float(self.config.get('Steppers', 'max_speed_x')) Path.max_speed_y = float(self.config.get('Steppers', 'max_speed_y')) Path.max_speed_z = float(self.config.get('Steppers', 'max_speed_z')) Path.max_speed_e = float(self.config.get('Steppers', 'max_speed_e')) Path.max_speed_h = float(self.config.get('Steppers', 'max_speed_h')) self.path_planner = Path_planner(self.steppers, self.current_pos) self.path_planner.set_acceleration(self.acceleration) # Signal everything ready logging.info("Replicape ready") print "Replicape ready" ''' When a new gcode comes in, excute it ''' def loop(self): print "Replicape starting main" try: while True: gcode = Gcode(self.commands.get(), self) self._execute(gcode) if gcode.prot == "USB": self.usb.send_message(gcode.getAnswer()) elif gcode.prot == "PIPE": self.pipe.send_message(gcode.getAnswer()) else: self.ethernet.send_message(gcode.getAnswer()) self.commands.task_done() except Exception as e: logging.exception("Ooops: ") ''' Execute a G-code ''' def _execute(self, g): if g.code() == "G1": # Move (G1 X0.1 Y40.2 F3000) if g.hasLetter("F"): # Get the feed rate self.feed_rate = float(g.getValueByLetter( "F")) / 60000.0 # Convert from mm/min to SI unit m/s g.removeTokenByLetter("F") smds = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E smds[axis] = float(g.tokenValue( i)) / 1000.0 # Get the value, new position or vector if g.hasLetter( "E" ) and self.current_tool != "E": # We are using a different tool, switch.. smds[self.current_tool] = smds["E"] del smds["E"] path = Path(smds, self.feed_rate, self.movement, g.is_crc()) # Make a path segment from the axes self.path_planner.add_path( path ) # Add the path. This blocks until the path planner has capacity #logging.debug("Moving to: "+' '.join('%s:%s' % i for i in smds.iteritems())) elif g.code() == "G21": # Set units to mm self.factor = 1.0 elif g.code() == "G28": # Home the steppers if g.numTokens() == 0: # If no token is given, home all g.setTokens(["X0", "Y0", "Z0"]) smds = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E smds[axis] = float( g.tokenValue(i)) # Get tha value, new position or vector path = Path(smds, self.feed_rate, "ABSOLUTE", False) # Make a path segment from the axes #logging.debug("moving to "+str(smds)) self.path_planner.add_path( path ) # Add the path. This blocks until the path planner has capacity elif g.code() == "G90": # Absolute positioning self.movement = "ABSOLUTE" elif g.code() == "G91": # Relative positioning self.movement = "RELATIVE" elif g.code( ) == "G92": # Set the current position of the following steppers #self.path_planner.wait_until_done() if g.numTokens() == 0: logging.debug("Adding all to G92") g.setTokens(["X0", "Y0", "Z0", "E0", "H0"]) # If no token is present, do this for all #for i in range(g.numTokens()): # axis = g.tokenLetter(i) # val = float(g.tokenValue(i)) # self.path_planner.set_pos(axis, val) pos = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E pos[axis] = float(g.tokenValue( i)) / 1000.0 # Get the value, new position or vector logging.debug(pos) path = Path(pos, self.feed_rate, "G92") # Make a path segment from the axes self.path_planner.add_path(path) elif g.code() == "M17": # Enable all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.setEnabled() SMD.commit() elif g.code() == "M19": # Reset all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.reset() elif g.code() == "M30": # Set microstepping (Propietary to Replicape) for i in range(g.numTokens()): self.steppers[g.tokenLetter(i)].set_microstepping( int(g.tokenValue(i))) SMD.commit() elif g.code( ) == "M31": # Set stepper current limit (Propietery to Replicape) for i in range(g.numTokens()): self.steppers[g.tokenLetter(i)].setCurrentValue( float(g.tokenValue(i))) SMD.commit() elif g.code() == "M84": # Disable all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.setDisabled() SMD.commit() elif g.code() == "M92": # M92: Set axis_steps_per_unit for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E self.steppers[axis].set_steps_pr_mm(float(g.tokenValue(i))) SMD.commit() elif g.code() == "M101": # Deprecated pass elif g.code() == "M103": # Deprecated pass elif g.code() == "M104": # Set extruder temperature if g.hasLetter("P"): if int(g.getValueByLetter("P")) == 0: self.ext1.setTargetTemperature( float(g.getValueByLetter("S"))) elif int(g.getValueByLetter("P")) == 1: logging.debug("setting ext 2 temp to " + str(g.getValueByLetter("S"))) self.ext2.setTargetTemperature( float(g.getValueByLetter("S"))) else: logging.debug("setting ext 1 temp to " + str(g.tokenValue(0))) self.ext1.setTargetTemperature(float(g.tokenValue(0))) elif g.code() == "M105": # Get Temperature answer = "ok T:" + str(self.ext1.getTemperature()) if hasattr(self, "hbp"): answer += " B:" + str(int(self.hbp.getTemperature())) if hasattr(self, "ext2"): answer += " T1:" + str(int(self.ext2.getTemperature())) if hasattr(self, "cold_end_1"): answer += " T2:" + str(int(self.cold_end_1.getTemperature())) g.setAnswer(answer) elif g.code() == "M106": # Fan on if g.hasLetter("P"): fan = self.fans[int(g.getValueByLetter("P"))] fan.set_value( float(g.getValueByLetter("S")) / 255.0) # According to reprap wiki, the number is 0..255 else: # if there is no fan-number present, do it for the first fan self.fan_1.set_value(float(g.tokenValue(0)) / 255.0) elif g.code() == "M108": # Deprecated pass elif g.code() == "M110": # Reset the line number counter Gcode.line_number = 0 elif g.code() == "M114": g.setAnswer("ok C: " + ' '.join('%s:%s' % i for i in self.current_pos.iteritems())) elif g.code() == "M130": # Set PID P-value, Format (M130 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M131": # Set PID I-value, Format (M131 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.p.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M132": # Set PID D-value, Format (M132 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.p.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M140": # Set bed temperature self.hbp.setTargetTemperature(float(g.tokenValue(0))) elif g.code() == "M141": fan = self.fans[int(g.getValueByLetter("P"))] fan.setPWMFrequency(int(g.getValueByLetter("F"))) fan.set_value(float(g.getValueByLetter("S"))) elif g.code() == "M142": self.stat = True elif g.code() == "M143": self.stat = False elif g.code() == "T0": # Select tool 0 self.current_tool = "E" elif g.code() == "T1": # select tool 1 self.current_tool = "H" else: logging.warning("Unknown command: " + g.message)
def __init__(self): firmware_version = "1.1.8~Raw Deal" logging.info("Redeem initializing "+firmware_version) printer = Printer() self.printer = printer Path.printer = printer printer.firmware_version = firmware_version # check for config files if not os.path.exists("/etc/redeem/default.cfg"): logging.error("/etc/redeem/default.cfg does not exist, this file is required for operation") sys.exit() # maybe use something more graceful? if not os.path.exists("/etc/redeem/local.cfg"): logging.info("/etc/redeem/local.cfg does not exist, Creating one") os.mknod("/etc/redeem/local.cfg") # Parse the config files. printer.config = CascadingConfigParser( ['/etc/redeem/default.cfg', '/etc/redeem/printer.cfg', '/etc/redeem/local.cfg']) # Get the revision and loglevel from the Config file level = self.printer.config.getint('System', 'loglevel') if level > 0: logging.getLogger().setLevel(level) # Set up additional logging, if present: if self.printer.config.getboolean('System', 'log_to_file'): logfile = self.printer.config.get('System', 'logfile') formatter = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s' printer.redeem_logging_handler = logging.handlers.RotatingFileHandler(logfile, maxBytes=2*1024*1024) printer.redeem_logging_handler.setFormatter(logging.Formatter(formatter)) printer.redeem_logging_handler.setLevel(level) logging.getLogger().addHandler(printer.redeem_logging_handler) logging.info("-- Logfile configured --") # Find out which capes are connected self.printer.config.parse_capes() self.revision = self.printer.config.replicape_revision if self.revision: logging.info("Found Replicape rev. " + self.revision) else: logging.warning("Oh no! No Replicape present!") self.revision = "00B3" # We set it to 5 axis by default Path.NUM_AXES = 5 if self.printer.config.reach_revision: logging.info("Found Reach rev. "+self.printer.config.reach_revision) if self.printer.config.reach_revision == "00A0": Path.NUM_AXES = 8 elif self.printer.config.reach_revision == "00B0": Path.NUM_AXES = 7 if self.revision in ["00A4", "0A4A", "00A3"]: PWM.set_frequency(100) elif self.revision in ["00B1", "00B2", "00B3"]: PWM.set_frequency(1000) # Test the alarm framework Alarm.printer = self.printer Alarm.executor = AlarmExecutor() alarm = Alarm(Alarm.ALARM_TEST, "Alarm framework operational") # Init the Watchdog timer printer.watchdog = Watchdog() # Enable PWM and steppers printer.enable = Enable("P9_41") printer.enable.set_disabled() # Init the Paths Path.axis_config = printer.config.getint('Geometry', 'axis_config') # Init the end stops EndStop.inputdev = self.printer.config.get("Endstops", "inputdev") # Set up key listener Key_pin.listener = Key_pin_listener(EndStop.inputdev) for es in ["Z2", "Y2", "X2", "Z1", "Y1", "X1"]: # Order matches end stop inversion mask in Firmware pin = self.printer.config.get("Endstops", "pin_"+es) keycode = self.printer.config.getint("Endstops", "keycode_"+es) invert = self.printer.config.getboolean("Endstops", "invert_"+es) self.printer.end_stops[es] = EndStop(printer, pin, keycode, es, invert) self.printer.end_stops[es].stops = self.printer.config.get('Endstops', 'end_stop_'+es+'_stops') # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) if self.revision == "00A3": printer.steppers["X"] = Stepper_00A3("GPIO0_27", "GPIO1_29", "GPIO2_4" , 0, "X") printer.steppers["Y"] = Stepper_00A3("GPIO1_12", "GPIO0_22", "GPIO2_5" , 1, "Y") printer.steppers["Z"] = Stepper_00A3("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") printer.steppers["E"] = Stepper_00A3("GPIO1_28", "GPIO1_15", "GPIO2_1" , 3, "E") printer.steppers["H"] = Stepper_00A3("GPIO1_13", "GPIO1_14", "GPIO2_3" , 4, "H") elif self.revision == "00B1": printer.steppers["X"] = Stepper_00B1("GPIO0_27", "GPIO1_29", "GPIO2_4" , 11, 0, "X") printer.steppers["Y"] = Stepper_00B1("GPIO1_12", "GPIO0_22", "GPIO2_5" , 12, 1, "Y") printer.steppers["Z"] = Stepper_00B1("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z") printer.steppers["E"] = Stepper_00B1("GPIO1_28", "GPIO1_15", "GPIO2_1" , 14, 3, "E") printer.steppers["H"] = Stepper_00B1("GPIO1_13", "GPIO1_14", "GPIO2_3" , 15, 4, "H") elif self.revision == "00B2": printer.steppers["X"] = Stepper_00B2("GPIO0_27", "GPIO1_29", "GPIO2_4" , 11, 0, "X") printer.steppers["Y"] = Stepper_00B2("GPIO1_12", "GPIO0_22", "GPIO2_5" , 12, 1, "Y") printer.steppers["Z"] = Stepper_00B2("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z") printer.steppers["E"] = Stepper_00B2("GPIO1_28", "GPIO1_15", "GPIO2_1" , 14, 3, "E") printer.steppers["H"] = Stepper_00B2("GPIO1_13", "GPIO1_14", "GPIO2_3" , 15, 4, "H") elif self.revision == "00B3": printer.steppers["X"] = Stepper_00B3("GPIO0_27", "GPIO1_29", 90, 11, 0, "X") printer.steppers["Y"] = Stepper_00B3("GPIO1_12", "GPIO0_22", 91, 12, 1, "Y") printer.steppers["Z"] = Stepper_00B3("GPIO0_23", "GPIO0_26", 92, 13, 2, "Z") printer.steppers["E"] = Stepper_00B3("GPIO1_28", "GPIO1_15", 93, 14, 3, "E") printer.steppers["H"] = Stepper_00B3("GPIO1_13", "GPIO1_14", 94, 15, 4, "H") elif self.revision in ["00A4", "0A4A"]: printer.steppers["X"] = Stepper_00A4("GPIO0_27", "GPIO1_29", "GPIO2_4" , 0, 0, "X") printer.steppers["Y"] = Stepper_00A4("GPIO1_12", "GPIO0_22", "GPIO2_5" , 1, 1, "Y") printer.steppers["Z"] = Stepper_00A4("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, 2, "Z") printer.steppers["E"] = Stepper_00A4("GPIO1_28", "GPIO1_15", "GPIO2_1" , 3, 3, "E") printer.steppers["H"] = Stepper_00A4("GPIO1_13", "GPIO1_14", "GPIO2_3" , 4, 4, "H") # Init Reach steppers, if present. if printer.config.reach_revision == "00A0": printer.steppers["A"] = Stepper_reach_00A4("GPIO2_2" , "GPIO1_18", "GPIO0_14", 5, 5, "A") printer.steppers["B"] = Stepper_reach_00A4("GPIO1_16", "GPIO0_5" , "GPIO0_14", 6, 6, "B") printer.steppers["C"] = Stepper_reach_00A4("GPIO0_3" , "GPIO3_19", "GPIO0_14", 7, 7, "C") elif printer.config.reach_revision == "00B0": printer.steppers["A"] = Stepper_reach_00B0("GPIO1_16", "GPIO0_5", "GPIO0_3", 5, 5, "A") printer.steppers["B"] = Stepper_reach_00B0("GPIO2_2" , "GPIO0_14", "GPIO0_3", 6, 6, "B") # Enable the steppers and set the current, steps pr mm and # microstepping for name, stepper in self.printer.steppers.iteritems(): stepper.in_use = printer.config.getboolean('Steppers', 'in_use_' + name) stepper.direction = printer.config.getint('Steppers', 'direction_' + name) stepper.has_endstop = printer.config.getboolean('Endstops', 'has_' + name) stepper.set_current_value(printer.config.getfloat('Steppers', 'current_' + name)) stepper.set_steps_pr_mm(printer.config.getfloat('Steppers', 'steps_pr_mm_' + name)) stepper.set_microstepping(printer.config.getint('Steppers', 'microstepping_' + name)) stepper.set_decay(printer.config.getint("Steppers", "slow_decay_" + name)) # Add soft end stops Path.soft_min[Path.axis_to_index(name)] = printer.config.getfloat('Endstops', 'soft_end_stop_min_' + name) Path.soft_max[Path.axis_to_index(name)] = printer.config.getfloat('Endstops', 'soft_end_stop_max_' + name) slave = printer.config.get('Steppers', 'slave_' + name) if slave: Path.add_slave(name, slave) logging.debug("Axis "+name+" has slave "+slave) # Commit changes for the Steppers #Stepper.commit() Stepper.printer = printer # Delta printer setup if Path.axis_config == Path.AXIS_CONFIG_DELTA: opts = ["Hez", "L", "r", "Ae", "Be", "Ce", "A_radial", "B_radial", "C_radial", "A_tangential", "B_tangential", "C_tangential" ] for opt in opts: Delta.__dict__[opt] = printer.config.getfloat('Delta', opt) Delta.recalculate() # Discover and add all DS18B20 cold ends. import glob paths = glob.glob("/sys/bus/w1/devices/28-*/w1_slave") logging.debug("Found cold ends: "+str(paths)) for i, path in enumerate(paths): self.printer.cold_ends.append(ColdEnd(path, "ds18b20-"+str(i))) logging.info("Found Cold end "+str(i)+" on " + path) # Make Mosfets, thermistors and extruders heaters = ["E", "H", "HBP"] if self.printer.config.reach_revision: heaters.extend(["A", "B", "C"]) for e in heaters: # Mosfets channel = self.printer.config.getint("Heaters", "mosfet_"+e) self.printer.mosfets[e] = Mosfet(channel) # Thermistors adc = self.printer.config.get("Heaters", "path_adc_"+e) chart = self.printer.config.get("Heaters", "temp_chart_"+e) resistance = self.printer.config.getfloat("Heaters", "resistance_"+e) self.printer.thermistors[e] = Thermistor(adc, "MOSFET "+e, chart, resistance) self.printer.thermistors[e].printer = printer # Extruders onoff = self.printer.config.getboolean('Heaters', 'onoff_'+e) prefix = self.printer.config.get('Heaters', 'prefix_'+e) if e != "HBP": self.printer.heaters[e] = Extruder( self.printer.steppers[e], self.printer.thermistors[e], self.printer.mosfets[e], e, onoff) else: self.printer.heaters[e] = HBP( self.printer.thermistors[e], self.printer.mosfets[e], onoff) self.printer.heaters[e].prefix = prefix self.printer.heaters[e].P = self.printer.config.getfloat('Heaters', 'pid_p_'+e) self.printer.heaters[e].I = self.printer.config.getfloat('Heaters', 'pid_i_'+e) self.printer.heaters[e].D = self.printer.config.getfloat('Heaters', 'pid_d_'+e) # Min/max settings self.printer.heaters[e].min_temp = self.printer.config.getfloat('Heaters', 'min_temp_'+e) self.printer.heaters[e].max_temp = self.printer.config.getfloat('Heaters', 'max_temp_'+e) self.printer.heaters[e].max_temp_rise = self.printer.config.getfloat('Heaters', 'max_rise_temp_'+e) self.printer.heaters[e].max_temp_fall = self.printer.config.getfloat('Heaters', 'max_fall_temp_'+e) # Init the three fans. Argument is PWM channel number self.printer.fans = [] if self.revision == "00A3": self.printer.fans.append(Fan(0)) self.printer.fans.append(Fan(1)) self.printer.fans.append(Fan(2)) elif self.revision == "0A4A": self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) elif self.revision in ["00B1", "00B2", "00B3"]: self.printer.fans.append(Fan(7)) self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) if printer.config.reach_revision == "00A0": self.printer.fans.append(Fan(14)) self.printer.fans.append(Fan(15)) self.printer.fans.append(Fan(7)) # Disable all fans for f in self.printer.fans: f.set_value(0) # Init the servos printer.servos = [] servo_nr = 0 while(printer.config.has_option("Servos", "servo_"+str(servo_nr)+"_enable")): if printer.config.getboolean("Servos", "servo_"+str(servo_nr)+"_enable"): channel = printer.config.get("Servos", "servo_"+str(servo_nr)+"_channel") pulse_min = printer.config.getfloat("Servos", "servo_"+str(servo_nr)+"_pulse_min") pulse_max = printer.config.getfloat("Servos", "servo_"+str(servo_nr)+"_pulse_max") angle_min = printer.config.getfloat("Servos", "servo_"+str(servo_nr)+"_angle_min") angle_max = printer.config.getfloat("Servos", "servo_"+str(servo_nr)+"_angle_max") angle_init = printer.config.getfloat("Servos", "servo_"+str(servo_nr)+"_angle_init") s = Servo(channel, pulse_min, pulse_max, angle_min, angle_max, angle_init) printer.servos.append(s) logging.info("Added servo "+str(servo_nr)) servo_nr += 1 # Connect thermitors to fans for t, therm in self.printer.heaters.iteritems(): for f, fan in enumerate(self.printer.fans): if not self.printer.config.has_option('Cold-ends', "connect-therm-{}-fan-{}".format(t, f)): continue if printer.config.getboolean('Cold-ends', "connect-therm-{}-fan-{}".format(t, f)): c = Cooler(therm, fan, "Cooler-{}-{}".format(t, f), True) # Use ON/OFF on these. c.ok_range = 4 opt_temp = "therm-{}-fan-{}-target_temp".format(t, f) if printer.config.has_option('Cold-ends', opt_temp): target_temp = printer.config.getfloat('Cold-ends', opt_temp) else: target_temp = 60 c.set_target_temperature(target_temp) c.enable() printer.coolers.append(c) logging.info("Cooler connects therm {} with fan {}".format(t, f)) # Connect fans to M106 printer.controlled_fans = [] for i, fan in enumerate(self.printer.fans): if not self.printer.config.has_option('Cold-ends', "add-fan-{}-to-M106".format(i)): continue if self.printer.config.getboolean('Cold-ends', "add-fan-{}-to-M106".format(i)): printer.controlled_fans.append(self.printer.fans[i]) logging.info("Added fan {} to M106/M107".format(i)) # Connect the colds to fans for ce, cold_end in enumerate(self.printer.cold_ends): for f, fan in enumerate(self.printer.fans): option = "connect-ds18b20-{}-fan-{}".format(ce, f) if self.printer.config.has_option('Cold-ends', option): if self.printer.config.getboolean('Cold-ends', option): c = Cooler(cold_end, fan, "Cooler-ds18b20-{}-{}".format(ce, f), False) c.ok_range = 4 opt_temp = "cooler_{}_target_temp".format(ce) if printer.config.has_option('Cold-ends', opt_temp): target_temp = printer.config.getfloat('Cold-ends', opt_temp) else: target_temp = 60 c.set_target_temperature(target_temp) c.enable() printer.coolers.append(c) logging.info("Cooler connects temp sensor ds18b20 {} with fan {}".format(ce, f)) # Init roatray encs. printer.filament_sensors = [] # Init rotary encoders printer.rotary_encoders = [] for ex in ["E", "H", "A", "B", "C"]: if not printer.config.has_option('Rotary-encoders', "enable-{}".format(ex)): continue if printer.config.getboolean("Rotary-encoders", "enable-{}".format(ex)): logging.debug("Rotary encoder {} enabled".format(ex)) event = printer.config.get("Rotary-encoders", "event-{}".format(ex)) cpr = printer.config.getint("Rotary-encoders", "cpr-{}".format(ex)) diameter = printer.config.getfloat("Rotary-encoders", "diameter-{}".format(ex)) r = RotaryEncoder(event, cpr, diameter) printer.rotary_encoders.append(r) # Append as Filament Sensor ext_nr = Path.axis_to_index(ex)-3 sensor = FilamentSensor(ex, r, ext_nr, printer) alarm_level = printer.config.getfloat("Filament-sensors", "alarm-level-{}".format(ex)) logging.debug("Alarm level"+str(alarm_level)) sensor.alarm_level = alarm_level printer.filament_sensors.append(sensor) # Make a queue of commands self.printer.commands = JoinableQueue(10) # Make a queue of commands that should not be buffered self.printer.sync_commands = JoinableQueue() self.printer.unbuffered_commands = JoinableQueue(10) # Bed compensation matrix Path.matrix_bed_comp = printer.load_bed_compensation_matrix() Path.matrix_bed_comp_inv = np.linalg.inv(Path.matrix_bed_comp) logging.debug("Loaded bed compensation matrix: \n"+str(Path.matrix_bed_comp)) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) Path.max_speeds[i] = printer.config.getfloat('Planner', 'max_speed_'+axis.lower()) Path.min_speeds[i] = printer.config.getfloat('Planner', 'min_speed_'+axis.lower()) Path.jerks[i] = printer.config.getfloat('Planner', 'max_jerk_'+axis.lower()) Path.home_speed[i] = printer.config.getfloat('Homing', 'home_speed_'+axis.lower()) Path.home_backoff_speed[i] = printer.config.getfloat('Homing', 'home_backoff_speed_'+axis.lower()) Path.home_backoff_offset[i] = printer.config.getfloat('Homing', 'home_backoff_offset_'+axis.lower()) Path.steps_pr_meter[i] = printer.steppers[axis].get_steps_pr_meter() Path.backlash_compensation[i] = printer.config.getfloat('Steppers', 'backlash_'+axis.lower()) dirname = os.path.dirname(os.path.realpath(__file__)) # Create the firmware compiler pru_firmware = PruFirmware( dirname + "/firmware/firmware_runtime.p", dirname + "/firmware/firmware_runtime.bin", dirname + "/firmware/firmware_endstops.p", dirname + "/firmware/firmware_endstops.bin", self.printer, "/usr/bin/pasm") printer.move_cache_size = printer.config.getfloat('Planner', 'move_cache_size') printer.print_move_buffer_wait = printer.config.getfloat('Planner', 'print_move_buffer_wait') printer.min_buffered_move_time = printer.config.getfloat('Planner', 'min_buffered_move_time') printer.max_buffered_move_time = printer.config.getfloat('Planner', 'max_buffered_move_time') self.printer.processor = GCodeProcessor(self.printer) self.printer.plugins = PluginsController(self.printer) # Path planner travel_default = False center_default = False home_default = False # Setting acceleration before PathPlanner init for axis in printer.steppers.keys(): Path.acceleration[Path.axis_to_index(axis)] = printer.config.getfloat( 'Planner', 'acceleration_' + axis.lower()) self.printer.path_planner = PathPlanner(self.printer, pru_firmware) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) # Sometimes soft_end_stop aren't defined to be at the exact hardware boundary. # Adding 100mm for searching buffer. if printer.config.has_option('Geometry', 'travel_' + axis.lower()): printer.path_planner.travel_length[axis] = printer.config.getfloat('Geometry', 'travel_' + axis.lower()) else: printer.path_planner.travel_length[axis] = (Path.soft_max[i] - Path.soft_min[i]) + .1 if axis in ['X','Y','Z']: travel_default = True if printer.config.has_option('Geometry', 'offset_' + axis.lower()): printer.path_planner.center_offset[axis] = printer.config.getfloat('Geometry', 'offset_' + axis.lower()) else: printer.path_planner.center_offset[axis] =(Path.soft_min[i] if Path.home_speed[i] > 0 else Path.soft_max[i]) if axis in ['X','Y','Z']: center_default = True if printer.config.has_option('Homing', 'home_' + axis.lower()): printer.path_planner.home_pos[axis] = printer.config.getfloat('Homing', 'home_' + axis.lower()) else: printer.path_planner.home_pos[axis] = printer.path_planner.center_offset[axis] if axis in ['X','Y','Z']: home_default = True if Path.axis_config == Path.AXIS_CONFIG_DELTA: if travel_default: logging.warning("Axis travel (travel_*) set by soft limits, manual setup is recommended for a delta") if center_default: logging.warning("Axis offsets (offset_*) set by soft limits, manual setup is recommended for a delta") if home_default: logging.warning("Home position (home_*) set by soft limits or offset_*") logging.info("Home position will be recalculated...") # convert home_pos to effector space Az = printer.path_planner.home_pos['X'] Bz = printer.path_planner.home_pos['Y'] Cz = printer.path_planner.home_pos['Z'] z_offset = Delta.vertical_offset(Az,Bz,Cz) # vertical offset xyz = Delta.forward_kinematics2(Az, Bz, Cz) # effector position # The default home_pos, provided above, is based on effector space # coordinates for carriage positions. We need to transform these to # get where the effector actually is. xyz[2] += z_offset for i, a in enumerate(['X','Y','Z']): printer.path_planner.home_pos[a] = xyz[i] logging.info("Home position = %s"%str(printer.path_planner.home_pos)) # Enable Stepper timeout timeout = printer.config.getint('Steppers', 'timeout_seconds') printer.swd = StepperWatchdog(printer, timeout) if printer.config.getboolean('Steppers', 'use_timeout'): printer.swd.start() # Set up communication channels printer.comms["USB"] = USB(self.printer) printer.comms["Eth"] = Ethernet(self.printer) if Pipe.check_tty0tty() or Pipe.check_socat(): printer.comms["octoprint"] = Pipe(printer, "octoprint") printer.comms["toggle"] = Pipe(printer, "toggle") printer.comms["testing"] = Pipe(printer, "testing") printer.comms["testing_noret"] = Pipe(printer, "testing_noret") # Does not send "ok" printer.comms["testing_noret"].send_response = False else: logging.warning("Neither tty0tty or socat is installed! No virtual tty pipes enabled")
def __init__(self): """ Init """ logging.info("Redeem initializing " + version) printer = Printer() self.printer = printer # check for config files if not os.path.exists("/etc/redeem/default.cfg"): logging.error("/etc/redeem/default.cfg does not exist, this file is required for operation") sys.exit() # maybe use something more graceful? # Parse the config files. printer.config = CascadingConfigParser( ['/etc/redeem/default.cfg', '/etc/redeem/printer.cfg', '/etc/redeem/local.cfg']) # Find out which capes are connected self.printer.config.parse_capes() self.revision = self.printer.config.replicape_revision if self.revision: logging.info("Found Replicape rev. " + self.revision) Path.set_axes(5) else: logging.warning("Oh no! No Replicape present!") self.revision = "0A4A" # We set it to 5 axis by default Path.set_axes(5) if self.printer.config.reach_revision: Path.set_axes(8) logging.info("Found Reach rev. "+self.printer.config.reach_revision) # Get the revision and loglevel from the Config file level = self.printer.config.getint('System', 'loglevel') if level > 0: logging.getLogger().setLevel(level) if self.revision in ["00A4", "0A4A", "00A3"]: PWM.set_frequency(100) elif self.revision in ["00B1"]: PWM.set_frequency(1000) # Init the Paths Path.axis_config = printer.config.getint('Geometry', 'axis_config') # Init the end stops EndStop.callback = self.end_stop_hit EndStop.inputdev = self.printer.config.get("Endstops", "inputdev") for es in ["X1", "X2", "Y1", "Y2", "Z1", "Z2"]: pin = self.printer.config.get("Endstops", "pin_"+es) keycode = self.printer.config.getint("Endstops", "keycode_"+es) invert = self.printer.config.getboolean("Endstops", "invert_"+es) self.printer.end_stops[es] = EndStop(pin, keycode, es, invert) # Backwards compatibility with A3 if self.revision == "00A3": # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) printer.steppers["X"] = Stepper_00A3("GPIO0_27", "GPIO1_29", "GPIO2_4" , 0, "X", 0, 0) printer.steppers["Y"] = Stepper_00A3("GPIO1_12", "GPIO0_22", "GPIO2_5" , 1, "Y", 1, 1) printer.steppers["Z"] = Stepper_00A3("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z", 2, 2) printer.steppers["E"] = Stepper_00A3("GPIO1_28", "GPIO1_15", "GPIO2_1" , 3, "E", 3, 3) printer.steppers["H"] = Stepper_00A3("GPIO1_13", "GPIO1_14", "GPIO2_3" , 4, "H", 4, 4) elif self.revision == "00B1": # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) printer.steppers["X"] = Stepper_00B1("GPIO0_27", "GPIO1_29", "GPIO2_4" , 11, 0, "X", 0, 0) printer.steppers["Y"] = Stepper_00B1("GPIO1_12", "GPIO0_22", "GPIO2_5" , 12, 1, "Y", 1, 1) printer.steppers["Z"] = Stepper_00B1("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z", 2, 2) printer.steppers["E"] = Stepper_00B1("GPIO1_28", "GPIO1_15", "GPIO2_1" , 14, 3, "E", 3, 3) printer.steppers["H"] = Stepper_00B1("GPIO1_13", "GPIO1_14", "GPIO2_3" , 15, 4, "H", 4, 4) else: # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) printer.steppers["X"] = Stepper_00A4("GPIO0_27", "GPIO1_29", "GPIO2_4" , 0, 0, "X", 0, 0) printer.steppers["Y"] = Stepper_00A4("GPIO1_12", "GPIO0_22", "GPIO2_5" , 1, 1, "Y", 1, 1) printer.steppers["Z"] = Stepper_00A4("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, 2, "Z", 2, 2) printer.steppers["E"] = Stepper_00A4("GPIO1_28", "GPIO1_15", "GPIO2_1" , 3, 3, "E", 3, 3) printer.steppers["H"] = Stepper_00A4("GPIO1_13", "GPIO1_14", "GPIO2_3" , 4, 4, "H", 4, 4) if printer.config.reach_revision: printer.steppers["A"] = Stepper_00A4("GPIO2_2" , "GPIO1_18", "GPIO0_14", 5, 5, "A", 5, 5) printer.steppers["B"] = Stepper_00A4("GPIO1_14", "GPIO0_5" , "GPIO0_14", 6, 6, "B", 6, 6) printer.steppers["C"] = Stepper_00A4("GPIO0_3" , "GPIO3_19", "GPIO0_14", 7, 7, "C", 7, 7) # Enable the steppers and set the current, steps pr mm and # microstepping for name, stepper in self.printer.steppers.iteritems(): stepper.in_use = printer.config.getboolean('Steppers', 'in_use_' + name) stepper.direction = printer.config.getint('Steppers', 'direction_' + name) stepper.has_endstop = printer.config.getboolean('Endstops', 'has_' + name) stepper.set_current_value(printer.config.getfloat('Steppers', 'current_' + name)) stepper.set_steps_pr_mm(printer.config.getfloat('Steppers', 'steps_pr_mm_' + name)) stepper.set_microstepping(printer.config.getint('Steppers', 'microstepping_' + name)) stepper.set_decay(printer.config.getboolean("Steppers", "slow_decay_" + name)) # Add soft end stops Path.soft_min[Path.axis_to_index(name)] = printer.config.getfloat('Endstops', 'soft_end_stop_min_' + name) Path.soft_max[Path.axis_to_index(name)] = printer.config.getfloat('Endstops', 'soft_end_stop_max_' + name) # Commit changes for the Steppers #Stepper.commit() # Delta printer setup if Path.axis_config == Path.AXIS_CONFIG_DELTA: opts = ["Hez", "L", "r", "Ae", "Be", "Ce", "A_radial", "B_radial", "C_radial", "A_tangential", "B_tangential", "C_tangential" ] for opt in opts: Delta.__dict__[opt] = printer.config.getfloat('Delta', opt) Delta.recalculate() # Set up cold ends path = self.printer.config.get('Cold-ends', 'path', 0) if os.path.exists(path): self.printer.cold_ends.append(ColdEnd(path, "Cold End 0")) logging.info("Found Cold end on " + path) else: logging.info("No cold end present in path: " + path) # Make Mosfets, thermistors and extruders heaters = ["E", "H", "HBP"] if self.printer.config.reach_revision: heaters.extend(["A", "B", "C"]) for e in heaters: # Mosfets channel = self.printer.config.getint("Heaters", "mosfet_"+e) self.printer.mosfets[e] = Mosfet(channel) # Thermistors adc = self.printer.config.get("Heaters", "path_adc_"+e) chart = self.printer.config.get("Heaters", "temp_chart_"+e) self.printer.thermistors[e] = Thermistor(adc, "MOSFET "+e, chart) # Extruders onoff = self.printer.config.getboolean('Heaters', 'onoff_'+e) prefix = self.printer.config.get('Heaters', 'prefix_'+e) if e != "HBP": self.printer.heaters[e] = Extruder( self.printer.steppers[e], self.printer.thermistors[e], self.printer.mosfets[e], e, onoff) else: self.printer.heaters[e] = HBP( self.printer.thermistors[e], self.printer.mosfets[e], onoff) self.printer.heaters[e].prefix = prefix self.printer.heaters[e].P = self.printer.config.getfloat('Heaters', 'pid_p_'+e) self.printer.heaters[e].I = self.printer.config.getfloat('Heaters', 'pid_i_'+e) self.printer.heaters[e].D = self.printer.config.getfloat('Heaters', 'pid_d_'+e) # Init the three fans. Argument is PWM channel number self.printer.fans = [] if self.revision == "00A3": self.printer.fans.append(Fan(0)) self.printer.fans.append(Fan(1)) self.printer.fans.append(Fan(2)) elif self.revision == "0A4A": self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) elif self.revision == "00B1": self.printer.fans.append(Fan(7)) self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) for f in self.printer.fans: f.set_value(0) # Init the servos printer.servos = [] servo_nr = 0 while(printer.config.has_option("Servos", "servo_"+str(servo_nr)+"_enable")): if printer.config.getboolean("Servos", "servo_"+str(servo_nr)+"_enable"): channel = printer.config.getint("Servos", "servo_"+str(servo_nr)+"_channel") angle_off = printer.config.getint("Servos", "servo_"+str(servo_nr)+"_angle_off") s = Servo(channel, 500, 750, angle_off) s.angle_on = printer.config.getint("Servos", "servo_"+str(servo_nr)+"_angle_on") s.angle_off = angle_off printer.servos.append(s) logging.info("Added servo "+str(servo_nr)) servo_nr += 1 # Connect thermitors to fans for t, therm in self.printer.heaters.iteritems(): for f, fan in enumerate(self.printer.fans): if self.printer.config.getboolean('Cold-ends', "connect-therm-{}-fan-{}".format(t, f)): c = Cooler(therm, fan, "Cooler-{}-{}".format(t, f), False) c.ok_range = 4 c.set_target_temperature(60) c.enable() self.printer.coolers.append(c) logging.info("Cooler connects therm {} with fan {}".format(t, f)) # Connect fans to M106 printer.controlled_fans = [] for i, fan in enumerate(self.printer.fans): if self.printer.config.getboolean('Cold-ends', "add-fan-{}-to-M106".format(i)): printer.controlled_fans.append(self.printer.fans[i]) logging.info("Added fan {} to M106/M107".format(i)) # Connect the cold end 0 to fan 2 # This is very "Thing" specific, should be configurable somehow. if len(self.printer.cold_ends): self.printer.coolers.append( Cooler(self.printer.cold_ends[0], self.printer.fans[2], "Cooler0", False)) self.printer.coolers[0].ok_range = 4 self.printer.coolers[0].set_target_temperature(60) self.printer.coolers[0].enable() # Make a queue of commands self.printer.commands = JoinableQueue(10) # Make a queue of commands that should not be buffered self.printer.sync_commands = JoinableQueue() self.printer.unbuffered_commands = JoinableQueue(10) # Bed compensation matrix Path.matrix_bed_comp = printer.load_bed_compensation_matrix() Path.matrix_bed_comp_inv = np.linalg.inv(Path.matrix_bed_comp) logging.debug("Loaded bed compensation matrix: \n"+str(Path.matrix_bed_comp)) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) Path.max_speeds[i] = printer.config.getfloat('Planner', 'max_speed_'+axis.lower()) Path.home_speed[i] = printer.config.getfloat('Homing', 'home_speed_'+axis.lower()) Path.home_backoff_speed[i] = printer.config.getfloat('Homing', 'home_backoff_speed_'+axis.lower()) Path.home_backoff_offset[i] = printer.config.getfloat('Homing', 'home_backoff_offset_'+axis.lower()) Path.steps_pr_meter[i] = printer.steppers[axis].get_steps_pr_meter() Path.backlash_compensation[i] = printer.config.getfloat('Steppers', 'backlash_'+axis.lower()) dirname = os.path.dirname(os.path.realpath(__file__)) # Create the firmware compiler pru_firmware = PruFirmware( dirname + "/firmware/firmware_runtime.p", dirname + "/firmware/firmware_runtime.bin", dirname + "/firmware/firmware_endstops.p", dirname + "/firmware/firmware_endstops.bin", self.revision, self.printer.config, "/usr/bin/pasm") printer.maxJerkXY = printer.config.getfloat('Planner', 'maxJerk_xy') printer.maxJerkZ = printer.config.getfloat('Planner', 'maxJerk_z') printer.maxJerkEH = printer.config.getfloat('Planner', 'maxJerk_eh') printer.move_cache_size = printer.config.getfloat('Planner', 'move_cache_size') printer.print_move_buffer_wait = printer.config.getfloat('Planner', 'print_move_buffer_wait') printer.min_buffered_move_time = printer.config.getfloat('Planner', 'min_buffered_move_time') printer.max_buffered_move_time = printer.config.getfloat('Planner', 'max_buffered_move_time') self.printer.processor = GCodeProcessor(self.printer) self.printer.plugins = PluginsController(self.printer) # Path planner travel_default = False center_default = False home_default = False self.printer.path_planner = PathPlanner(self.printer, pru_firmware) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) printer.acceleration[Path.axis_to_index(axis)] = printer.config.getfloat( 'Planner', 'acceleration_' + axis.lower()) # Sometimes soft_end_stop aren't defined to be at the exact hardware boundary. # Adding 100mm for searching buffer. if printer.config.has_option('Geometry', 'travel_' + axis.lower()): printer.path_planner.travel_length[axis] = printer.config.getfloat('Geometry', 'travel_' + axis.lower()) else: printer.path_planner.travel_length[axis] = (Path.soft_max[i] - Path.soft_min[i]) + .1 if axis in ['X','Y','Z']: travel_default = True if printer.config.has_option('Geometry', 'offset_' + axis.lower()): printer.path_planner.center_offset[axis] = printer.config.getfloat('Geometry', 'offset_' + axis.lower()) else: printer.path_planner.center_offset[axis] =(Path.soft_min[i] if Path.home_speed[i] > 0 else Path.soft_max[i]) if axis in ['X','Y','Z']: center_default = True if printer.config.has_option('Homing', 'home_' + axis.lower()): printer.path_planner.home_pos[axis] = printer.config.getfloat('Homing', 'home_' + axis.lower()) else: printer.path_planner.home_pos[axis] = printer.path_planner.center_offset[axis] if axis in ['X','Y','Z']: home_default = True if Path.axis_config == Path.AXIS_CONFIG_DELTA: if travel_default: logging.warning("Axis travel (travel_*) set by soft limits, manual setup is recommended for a delta") if center_default: logging.warning("Axis offsets (offset_*) set by soft limits, manual setup is recommended for a delta") if home_default: logging.warning("Home position (home_*) set by soft limits or offset_*") logging.info("Home position will be recalculated...") # convert home_pos to effector space Az = printer.path_planner.home_pos['X'] Bz = printer.path_planner.home_pos['Y'] Cz = printer.path_planner.home_pos['Z'] z_offset = Delta.vertical_offset(Az,Bz,Cz) # vertical offset xyz = Delta.forward_kinematics2(Az, Bz, Cz) # effector position # The default home_pos, provided above, is based on effector space # coordinates for carriage positions. We need to transform these to # get where the effector actually is. xyz[2] += z_offset for i, a in enumerate(['X','Y','Z']): printer.path_planner.home_pos[a] = xyz[i] logging.info("Home position = %s"%str(printer.path_planner.home_pos)) # Enable PWM and steppers printer.enable = Enable("P9_41") printer.enable.set_enabled() # Set up communication channels printer.comms["USB"] = USB(self.printer) printer.comms["Eth"] = Ethernet(self.printer) if Pipe.check_tty0tty() or Pipe.check_socat(): printer.comms["octoprint"] = Pipe(printer, "octoprint") printer.comms["toggle"] = Pipe(printer, "toggle") printer.comms["testing"] = Pipe(printer, "testing") printer.comms["testing_noret"] = Pipe(printer, "testing_noret") # Does not send "ok" printer.comms["testing_noret"].send_response = False else: logging.warning("Neither tty0tty or socat is installed! No virtual tty pipes enabled")
def __init__(self): firmware_version = "1.1.8~Raw Deal" logging.info("Redeem initializing " + firmware_version) printer = Printer() self.printer = printer Path.printer = printer printer.firmware_version = firmware_version # check for config files if not os.path.exists("/etc/redeem/default.cfg"): logging.error( "/etc/redeem/default.cfg does not exist, this file is required for operation" ) sys.exit() # maybe use something more graceful? if not os.path.exists("/etc/redeem/local.cfg"): logging.info("/etc/redeem/local.cfg does not exist, Creating one") os.mknod("/etc/redeem/local.cfg") # Parse the config files. printer.config = CascadingConfigParser([ '/etc/redeem/default.cfg', '/etc/redeem/printer.cfg', '/etc/redeem/local.cfg' ]) # Get the revision and loglevel from the Config file level = self.printer.config.getint('System', 'loglevel') if level > 0: logging.getLogger().setLevel(level) # Set up additional logging, if present: if self.printer.config.getboolean('System', 'log_to_file'): logfile = self.printer.config.get('System', 'logfile') formatter = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s' printer.redeem_logging_handler = logging.handlers.RotatingFileHandler( logfile, maxBytes=2 * 1024 * 1024) printer.redeem_logging_handler.setFormatter( logging.Formatter(formatter)) printer.redeem_logging_handler.setLevel(level) logging.getLogger().addHandler(printer.redeem_logging_handler) logging.info("-- Logfile configured --") # Find out which capes are connected self.printer.config.parse_capes() self.revision = self.printer.config.replicape_revision if self.revision: logging.info("Found Replicape rev. " + self.revision) else: logging.warning("Oh no! No Replicape present!") self.revision = "00B3" # We set it to 5 axis by default Path.NUM_AXES = 5 if self.printer.config.reach_revision: logging.info("Found Reach rev. " + self.printer.config.reach_revision) if self.printer.config.reach_revision == "00A0": Path.NUM_AXES = 8 elif self.printer.config.reach_revision == "00B0": Path.NUM_AXES = 7 if self.revision in ["00A4", "0A4A", "00A3"]: PWM.set_frequency(100) elif self.revision in ["00B1", "00B2", "00B3"]: PWM.set_frequency(1000) # Test the alarm framework Alarm.printer = self.printer Alarm.executor = AlarmExecutor() alarm = Alarm(Alarm.ALARM_TEST, "Alarm framework operational") # Init the Watchdog timer printer.watchdog = Watchdog() # Enable PWM and steppers printer.enable = Enable("P9_41") printer.enable.set_disabled() # Init the Paths Path.axis_config = printer.config.getint('Geometry', 'axis_config') # Init the end stops EndStop.inputdev = self.printer.config.get("Endstops", "inputdev") # Set up key listener Key_pin.listener = Key_pin_listener(EndStop.inputdev) for es in ["Z2", "Y2", "X2", "Z1", "Y1", "X1"]: # Order matches end stop inversion mask in Firmware pin = self.printer.config.get("Endstops", "pin_" + es) keycode = self.printer.config.getint("Endstops", "keycode_" + es) invert = self.printer.config.getboolean("Endstops", "invert_" + es) self.printer.end_stops[es] = EndStop(printer, pin, keycode, es, invert) self.printer.end_stops[es].stops = self.printer.config.get( 'Endstops', 'end_stop_' + es + '_stops') # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) if self.revision == "00A3": printer.steppers["X"] = Stepper_00A3("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X") printer.steppers["Y"] = Stepper_00A3("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y") printer.steppers["Z"] = Stepper_00A3("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") printer.steppers["E"] = Stepper_00A3("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "E") printer.steppers["H"] = Stepper_00A3("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "H") elif self.revision == "00B1": printer.steppers["X"] = Stepper_00B1("GPIO0_27", "GPIO1_29", "GPIO2_4", 11, 0, "X") printer.steppers["Y"] = Stepper_00B1("GPIO1_12", "GPIO0_22", "GPIO2_5", 12, 1, "Y") printer.steppers["Z"] = Stepper_00B1("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z") printer.steppers["E"] = Stepper_00B1("GPIO1_28", "GPIO1_15", "GPIO2_1", 14, 3, "E") printer.steppers["H"] = Stepper_00B1("GPIO1_13", "GPIO1_14", "GPIO2_3", 15, 4, "H") elif self.revision == "00B2": printer.steppers["X"] = Stepper_00B2("GPIO0_27", "GPIO1_29", "GPIO2_4", 11, 0, "X") printer.steppers["Y"] = Stepper_00B2("GPIO1_12", "GPIO0_22", "GPIO2_5", 12, 1, "Y") printer.steppers["Z"] = Stepper_00B2("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z") printer.steppers["E"] = Stepper_00B2("GPIO1_28", "GPIO1_15", "GPIO2_1", 14, 3, "E") printer.steppers["H"] = Stepper_00B2("GPIO1_13", "GPIO1_14", "GPIO2_3", 15, 4, "H") elif self.revision == "00B3": printer.steppers["X"] = Stepper_00B3("GPIO0_27", "GPIO1_29", 90, 11, 0, "X") printer.steppers["Y"] = Stepper_00B3("GPIO1_12", "GPIO0_22", 91, 12, 1, "Y") printer.steppers["Z"] = Stepper_00B3("GPIO0_23", "GPIO0_26", 92, 13, 2, "Z") printer.steppers["E"] = Stepper_00B3("GPIO1_28", "GPIO1_15", 93, 14, 3, "E") printer.steppers["H"] = Stepper_00B3("GPIO1_13", "GPIO1_14", 94, 15, 4, "H") elif self.revision in ["00A4", "0A4A"]: printer.steppers["X"] = Stepper_00A4("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, 0, "X") printer.steppers["Y"] = Stepper_00A4("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, 1, "Y") printer.steppers["Z"] = Stepper_00A4("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, 2, "Z") printer.steppers["E"] = Stepper_00A4("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, 3, "E") printer.steppers["H"] = Stepper_00A4("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, 4, "H") # Init Reach steppers, if present. if printer.config.reach_revision == "00A0": printer.steppers["A"] = Stepper_reach_00A4("GPIO2_2", "GPIO1_18", "GPIO0_14", 5, 5, "A") printer.steppers["B"] = Stepper_reach_00A4("GPIO1_16", "GPIO0_5", "GPIO0_14", 6, 6, "B") printer.steppers["C"] = Stepper_reach_00A4("GPIO0_3", "GPIO3_19", "GPIO0_14", 7, 7, "C") elif printer.config.reach_revision == "00B0": printer.steppers["A"] = Stepper_reach_00B0("GPIO1_16", "GPIO0_5", "GPIO0_3", 5, 5, "A") printer.steppers["B"] = Stepper_reach_00B0("GPIO2_2", "GPIO0_14", "GPIO0_3", 6, 6, "B") # Enable the steppers and set the current, steps pr mm and # microstepping for name, stepper in self.printer.steppers.iteritems(): stepper.in_use = printer.config.getboolean('Steppers', 'in_use_' + name) stepper.direction = printer.config.getint('Steppers', 'direction_' + name) stepper.has_endstop = printer.config.getboolean( 'Endstops', 'has_' + name) stepper.set_current_value( printer.config.getfloat('Steppers', 'current_' + name)) stepper.set_steps_pr_mm( printer.config.getfloat('Steppers', 'steps_pr_mm_' + name)) stepper.set_microstepping( printer.config.getint('Steppers', 'microstepping_' + name)) stepper.set_decay( printer.config.getint("Steppers", "slow_decay_" + name)) # Add soft end stops Path.soft_min[Path.axis_to_index(name)] = printer.config.getfloat( 'Endstops', 'soft_end_stop_min_' + name) Path.soft_max[Path.axis_to_index(name)] = printer.config.getfloat( 'Endstops', 'soft_end_stop_max_' + name) slave = printer.config.get('Steppers', 'slave_' + name) if slave: Path.add_slave(name, slave) logging.debug("Axis " + name + " has slave " + slave) # Commit changes for the Steppers #Stepper.commit() Stepper.printer = printer # Delta printer setup if Path.axis_config == Path.AXIS_CONFIG_DELTA: opts = [ "Hez", "L", "r", "Ae", "Be", "Ce", "A_radial", "B_radial", "C_radial", "A_tangential", "B_tangential", "C_tangential" ] for opt in opts: Delta.__dict__[opt] = printer.config.getfloat('Delta', opt) Delta.recalculate() # Discover and add all DS18B20 cold ends. import glob paths = glob.glob("/sys/bus/w1/devices/28-*/w1_slave") logging.debug("Found cold ends: " + str(paths)) for i, path in enumerate(paths): self.printer.cold_ends.append(ColdEnd(path, "ds18b20-" + str(i))) logging.info("Found Cold end " + str(i) + " on " + path) # Make Mosfets, thermistors and extruders heaters = ["E", "H", "HBP"] if self.printer.config.reach_revision: heaters.extend(["A", "B", "C"]) for e in heaters: # Mosfets channel = self.printer.config.getint("Heaters", "mosfet_" + e) self.printer.mosfets[e] = Mosfet(channel) # Thermistors adc = self.printer.config.get("Heaters", "path_adc_" + e) chart = self.printer.config.get("Heaters", "temp_chart_" + e) resistance = self.printer.config.getfloat("Heaters", "resistance_" + e) self.printer.thermistors[e] = Thermistor(adc, "MOSFET " + e, chart, resistance) self.printer.thermistors[e].printer = printer # Extruders onoff = self.printer.config.getboolean('Heaters', 'onoff_' + e) prefix = self.printer.config.get('Heaters', 'prefix_' + e) if e != "HBP": self.printer.heaters[e] = Extruder(self.printer.steppers[e], self.printer.thermistors[e], self.printer.mosfets[e], e, onoff) else: self.printer.heaters[e] = HBP(self.printer.thermistors[e], self.printer.mosfets[e], onoff) self.printer.heaters[e].prefix = prefix self.printer.heaters[e].P = self.printer.config.getfloat( 'Heaters', 'pid_p_' + e) self.printer.heaters[e].I = self.printer.config.getfloat( 'Heaters', 'pid_i_' + e) self.printer.heaters[e].D = self.printer.config.getfloat( 'Heaters', 'pid_d_' + e) # Min/max settings self.printer.heaters[e].min_temp = self.printer.config.getfloat( 'Heaters', 'min_temp_' + e) self.printer.heaters[e].max_temp = self.printer.config.getfloat( 'Heaters', 'max_temp_' + e) self.printer.heaters[ e].max_temp_rise = self.printer.config.getfloat( 'Heaters', 'max_rise_temp_' + e) self.printer.heaters[ e].max_temp_fall = self.printer.config.getfloat( 'Heaters', 'max_fall_temp_' + e) # Init the three fans. Argument is PWM channel number self.printer.fans = [] if self.revision == "00A3": self.printer.fans.append(Fan(0)) self.printer.fans.append(Fan(1)) self.printer.fans.append(Fan(2)) elif self.revision == "0A4A": self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) elif self.revision in ["00B1", "00B2", "00B3"]: self.printer.fans.append(Fan(7)) self.printer.fans.append(Fan(8)) self.printer.fans.append(Fan(9)) self.printer.fans.append(Fan(10)) if printer.config.reach_revision == "00A0": self.printer.fans.append(Fan(14)) self.printer.fans.append(Fan(15)) self.printer.fans.append(Fan(7)) # Disable all fans for f in self.printer.fans: f.set_value(0) # Init the servos printer.servos = [] servo_nr = 0 while (printer.config.has_option("Servos", "servo_" + str(servo_nr) + "_enable")): if printer.config.getboolean("Servos", "servo_" + str(servo_nr) + "_enable"): channel = printer.config.get( "Servos", "servo_" + str(servo_nr) + "_channel") pulse_min = printer.config.getfloat( "Servos", "servo_" + str(servo_nr) + "_pulse_min") pulse_max = printer.config.getfloat( "Servos", "servo_" + str(servo_nr) + "_pulse_max") angle_min = printer.config.getfloat( "Servos", "servo_" + str(servo_nr) + "_angle_min") angle_max = printer.config.getfloat( "Servos", "servo_" + str(servo_nr) + "_angle_max") angle_init = printer.config.getfloat( "Servos", "servo_" + str(servo_nr) + "_angle_init") s = Servo(channel, pulse_min, pulse_max, angle_min, angle_max, angle_init) printer.servos.append(s) logging.info("Added servo " + str(servo_nr)) servo_nr += 1 # Connect thermitors to fans for t, therm in self.printer.heaters.iteritems(): for f, fan in enumerate(self.printer.fans): if not self.printer.config.has_option( 'Cold-ends', "connect-therm-{}-fan-{}".format(t, f)): continue if printer.config.getboolean( 'Cold-ends', "connect-therm-{}-fan-{}".format(t, f)): c = Cooler(therm, fan, "Cooler-{}-{}".format(t, f), True) # Use ON/OFF on these. c.ok_range = 4 opt_temp = "therm-{}-fan-{}-target_temp".format(t, f) if printer.config.has_option('Cold-ends', opt_temp): target_temp = printer.config.getfloat( 'Cold-ends', opt_temp) else: target_temp = 60 c.set_target_temperature(target_temp) c.enable() printer.coolers.append(c) logging.info("Cooler connects therm {} with fan {}".format( t, f)) # Connect fans to M106 printer.controlled_fans = [] for i, fan in enumerate(self.printer.fans): if not self.printer.config.has_option( 'Cold-ends', "add-fan-{}-to-M106".format(i)): continue if self.printer.config.getboolean('Cold-ends', "add-fan-{}-to-M106".format(i)): printer.controlled_fans.append(self.printer.fans[i]) logging.info("Added fan {} to M106/M107".format(i)) # Connect the colds to fans for ce, cold_end in enumerate(self.printer.cold_ends): for f, fan in enumerate(self.printer.fans): option = "connect-ds18b20-{}-fan-{}".format(ce, f) if self.printer.config.has_option('Cold-ends', option): if self.printer.config.getboolean('Cold-ends', option): c = Cooler(cold_end, fan, "Cooler-ds18b20-{}-{}".format(ce, f), False) c.ok_range = 4 opt_temp = "cooler_{}_target_temp".format(ce) if printer.config.has_option('Cold-ends', opt_temp): target_temp = printer.config.getfloat( 'Cold-ends', opt_temp) else: target_temp = 60 c.set_target_temperature(target_temp) c.enable() printer.coolers.append(c) logging.info( "Cooler connects temp sensor ds18b20 {} with fan {}" .format(ce, f)) # Init roatray encs. printer.filament_sensors = [] # Init rotary encoders printer.rotary_encoders = [] for ex in ["E", "H", "A", "B", "C"]: if not printer.config.has_option('Rotary-encoders', "enable-{}".format(ex)): continue if printer.config.getboolean("Rotary-encoders", "enable-{}".format(ex)): logging.debug("Rotary encoder {} enabled".format(ex)) event = printer.config.get("Rotary-encoders", "event-{}".format(ex)) cpr = printer.config.getint("Rotary-encoders", "cpr-{}".format(ex)) diameter = printer.config.getfloat("Rotary-encoders", "diameter-{}".format(ex)) r = RotaryEncoder(event, cpr, diameter) printer.rotary_encoders.append(r) # Append as Filament Sensor ext_nr = Path.axis_to_index(ex) - 3 sensor = FilamentSensor(ex, r, ext_nr, printer) alarm_level = printer.config.getfloat( "Filament-sensors", "alarm-level-{}".format(ex)) logging.debug("Alarm level" + str(alarm_level)) sensor.alarm_level = alarm_level printer.filament_sensors.append(sensor) # Make a queue of commands self.printer.commands = JoinableQueue(10) # Make a queue of commands that should not be buffered self.printer.sync_commands = JoinableQueue() self.printer.unbuffered_commands = JoinableQueue(10) # Bed compensation matrix Path.matrix_bed_comp = printer.load_bed_compensation_matrix() Path.matrix_bed_comp_inv = np.linalg.inv(Path.matrix_bed_comp) logging.debug("Loaded bed compensation matrix: \n" + str(Path.matrix_bed_comp)) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) Path.max_speeds[i] = printer.config.getfloat( 'Planner', 'max_speed_' + axis.lower()) Path.min_speeds[i] = printer.config.getfloat( 'Planner', 'min_speed_' + axis.lower()) Path.jerks[i] = printer.config.getfloat('Planner', 'max_jerk_' + axis.lower()) Path.home_speed[i] = printer.config.getfloat( 'Homing', 'home_speed_' + axis.lower()) Path.home_backoff_speed[i] = printer.config.getfloat( 'Homing', 'home_backoff_speed_' + axis.lower()) Path.home_backoff_offset[i] = printer.config.getfloat( 'Homing', 'home_backoff_offset_' + axis.lower()) Path.steps_pr_meter[i] = printer.steppers[axis].get_steps_pr_meter( ) Path.backlash_compensation[i] = printer.config.getfloat( 'Steppers', 'backlash_' + axis.lower()) dirname = os.path.dirname(os.path.realpath(__file__)) # Create the firmware compiler pru_firmware = PruFirmware(dirname + "/firmware/firmware_runtime.p", dirname + "/firmware/firmware_runtime.bin", dirname + "/firmware/firmware_endstops.p", dirname + "/firmware/firmware_endstops.bin", self.printer, "/usr/bin/pasm") printer.move_cache_size = printer.config.getfloat( 'Planner', 'move_cache_size') printer.print_move_buffer_wait = printer.config.getfloat( 'Planner', 'print_move_buffer_wait') printer.min_buffered_move_time = printer.config.getfloat( 'Planner', 'min_buffered_move_time') printer.max_buffered_move_time = printer.config.getfloat( 'Planner', 'max_buffered_move_time') self.printer.processor = GCodeProcessor(self.printer) self.printer.plugins = PluginsController(self.printer) # Path planner travel_default = False center_default = False home_default = False # Setting acceleration before PathPlanner init for axis in printer.steppers.keys(): Path.acceleration[Path.axis_to_index( axis)] = printer.config.getfloat( 'Planner', 'acceleration_' + axis.lower()) self.printer.path_planner = PathPlanner(self.printer, pru_firmware) for axis in printer.steppers.keys(): i = Path.axis_to_index(axis) # Sometimes soft_end_stop aren't defined to be at the exact hardware boundary. # Adding 100mm for searching buffer. if printer.config.has_option('Geometry', 'travel_' + axis.lower()): printer.path_planner.travel_length[ axis] = printer.config.getfloat('Geometry', 'travel_' + axis.lower()) else: printer.path_planner.travel_length[axis] = ( Path.soft_max[i] - Path.soft_min[i]) + .1 if axis in ['X', 'Y', 'Z']: travel_default = True if printer.config.has_option('Geometry', 'offset_' + axis.lower()): printer.path_planner.center_offset[ axis] = printer.config.getfloat('Geometry', 'offset_' + axis.lower()) else: printer.path_planner.center_offset[axis] = ( Path.soft_min[i] if Path.home_speed[i] > 0 else Path.soft_max[i]) if axis in ['X', 'Y', 'Z']: center_default = True if printer.config.has_option('Homing', 'home_' + axis.lower()): printer.path_planner.home_pos[axis] = printer.config.getfloat( 'Homing', 'home_' + axis.lower()) else: printer.path_planner.home_pos[ axis] = printer.path_planner.center_offset[axis] if axis in ['X', 'Y', 'Z']: home_default = True if Path.axis_config == Path.AXIS_CONFIG_DELTA: if travel_default: logging.warning( "Axis travel (travel_*) set by soft limits, manual setup is recommended for a delta" ) if center_default: logging.warning( "Axis offsets (offset_*) set by soft limits, manual setup is recommended for a delta" ) if home_default: logging.warning( "Home position (home_*) set by soft limits or offset_*") logging.info("Home position will be recalculated...") # convert home_pos to effector space Az = printer.path_planner.home_pos['X'] Bz = printer.path_planner.home_pos['Y'] Cz = printer.path_planner.home_pos['Z'] z_offset = Delta.vertical_offset(Az, Bz, Cz) # vertical offset xyz = Delta.forward_kinematics2(Az, Bz, Cz) # effector position # The default home_pos, provided above, is based on effector space # coordinates for carriage positions. We need to transform these to # get where the effector actually is. xyz[2] += z_offset for i, a in enumerate(['X', 'Y', 'Z']): printer.path_planner.home_pos[a] = xyz[i] logging.info("Home position = %s" % str(printer.path_planner.home_pos)) # Enable Stepper timeout timeout = printer.config.getint('Steppers', 'timeout_seconds') printer.swd = StepperWatchdog(printer, timeout) if printer.config.getboolean('Steppers', 'use_timeout'): printer.swd.start() # Set up communication channels printer.comms["USB"] = USB(self.printer) printer.comms["Eth"] = Ethernet(self.printer) if Pipe.check_tty0tty() or Pipe.check_socat(): printer.comms["octoprint"] = Pipe(printer, "octoprint") printer.comms["toggle"] = Pipe(printer, "toggle") printer.comms["testing"] = Pipe(printer, "testing") printer.comms["testing_noret"] = Pipe(printer, "testing_noret") # Does not send "ok" printer.comms["testing_noret"].send_response = False else: logging.warning( "Neither tty0tty or socat is installed! No virtual tty pipes enabled" )
class Replicape: ''' Init ''' def __init__(self): logging.info("Replicape initializing "+version) self.config = ConfigParser.ConfigParser() self.config.readfp(open('config/default.cfg')) # Make a list of steppers self.steppers = {} # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) self.steppers["X"] = SMD("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X") self.steppers["Y"] = SMD("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y") self.steppers["Z"] = SMD("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") self.steppers["H"] = SMD("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1") self.steppers["E"] = SMD("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2") # Enable the steppers and set the current, steps pr mm and microstepping for name, stepper in self.steppers.iteritems(): stepper.setCurrentValue(self.config.getfloat('Steppers', 'current_'+name)) stepper.setEnabled(self.config.getboolean('Steppers', 'enabled_'+name)) stepper.set_steps_pr_mm(self.config.getfloat('Steppers', 'steps_pr_mm_'+name)) stepper.set_microstepping(self.config.getint('Steppers', 'microstepping_'+name)) stepper.set_decay(0) # Commit changes for the Steppers SMD.commit() # Find the path of the thermostors path = "/sys/bus/iio/devices/iio:device0/in_voltage" # init the 3 thermistors self.therm_ext1 = Thermistor(path+"4_raw", "MOSFET Ext 1", "B57561G0103F000") # Epcos 10K self.therm_hbp = Thermistor(path+"6_raw", "MOSFET HBP", "B57560G104F") # Epcos 100K self.therm_ext2 = Thermistor(path+"5_raw", "MOSFET Ext 2", "B57561G0103F000") # Epcos 10K if os.path.exists("/sys/bus/w1/devices/28-000002e34b73/w1_slave"): self.cold_end_1 = W1("/sys/bus/w1/devices/28-000002e34b73/w1_slave", "Cold End 1") # init the 3 heaters self.mosfet_ext1 = Mosfet(3) self.mosfet_ext2 = Mosfet(4) self.mosfet_hbp = Mosfet(5) # Make extruder 1 self.ext1 = Extruder(self.steppers["E"], self.therm_ext1, self.mosfet_ext1, "Ext1") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) # Make Heated Build platform self.hbp = HBP( self.therm_hbp, self.mosfet_hbp) # Make extruder 2. self.ext2 = Extruder(self.steppers["H"], self.therm_ext2, self.mosfet_ext2, "Ext2") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) self.current_tool = "E" # Init the three fans self.fan_1 = Fan(1) self.fan_2 = Fan(2) self.fan_3 = Fan(0) self.fans = {0: self.fan_1, 1:self.fan_2, 2:self.fan_3 } self.fan_1.setPWMFrequency(100) # Init the end stops self.end_stops = {} self.end_stops["Y1"] = EndStop("GPIO2_2", self.steppers, 1, "Y1") self.end_stops["X1"] = EndStop("GPIO0_14", self.steppers, 2, "X1") self.end_stops["Z1"] = EndStop("GPIO0_30", self.steppers, 3, "Z1") self.end_stops["Y2"] = EndStop("GPIO3_21", self.steppers, 4, "Y2") self.end_stops["X2"] = EndStop("GPIO0_31", self.steppers, 5, "X2") self.end_stops["Z2"] = EndStop("GPIO0_4", self.steppers, 6, "Z2") # Make a queue of commands self.commands = Queue.Queue(10) # Set up USB, this receives messages and pushes them on the queue #self.usb = USB(self.commands) self.pipe = Pipe(self.commands) self.ethernet = Ethernet(self.commands) # Init the path planner self.movement = "RELATIVE" self.feed_rate = 3000.0 self.current_pos = {"X":0.0, "Y":0.0, "Z":0.0, "E":0.0,"H":0.0} self.acceleration = 0.3 Path.axis_config = int(self.config.get('Geometry', 'axis_config')) Path.max_speed_x = float(self.config.get('Steppers', 'max_speed_x')) Path.max_speed_y = float(self.config.get('Steppers', 'max_speed_y')) Path.max_speed_z = float(self.config.get('Steppers', 'max_speed_z')) Path.max_speed_e = float(self.config.get('Steppers', 'max_speed_e')) Path.max_speed_h = float(self.config.get('Steppers', 'max_speed_h')) self.path_planner = Path_planner(self.steppers, self.current_pos) self.path_planner.set_acceleration(self.acceleration) # Signal everything ready logging.info("Replicape ready") print "Replicape ready" ''' When a new gcode comes in, excute it ''' def loop(self): print "Replicape starting main" try: while True: gcode = Gcode(self.commands.get(), self) self._execute(gcode) if gcode.prot == "USB": self.usb.send_message(gcode.getAnswer()) elif gcode.prot == "PIPE": self.pipe.send_message(gcode.getAnswer()) else: self.ethernet.send_message(gcode.getAnswer()) self.commands.task_done() except Exception as e: logging.exception("Ooops: ") ''' Execute a G-code ''' def _execute(self, g): if g.code() == "G1": # Move (G1 X0.1 Y40.2 F3000) if g.hasLetter("F"): # Get the feed rate self.feed_rate = float(g.getValueByLetter("F"))/60000.0 # Convert from mm/min to SI unit m/s g.removeTokenByLetter("F") smds = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E smds[axis] = float(g.tokenValue(i))/1000.0 # Get the value, new position or vector if g.hasLetter("E") and self.current_tool != "E": # We are using a different tool, switch.. smds[self.current_tool] = smds["E"] del smds["E"] path = Path(smds, self.feed_rate, self.movement, g.is_crc())# Make a path segment from the axes self.path_planner.add_path(path) # Add the path. This blocks until the path planner has capacity #logging.debug("Moving to: "+' '.join('%s:%s' % i for i in smds.iteritems())) elif g.code() == "G21": # Set units to mm self.factor = 1.0 elif g.code() == "G28": # Home the steppers if g.numTokens() == 0: # If no token is given, home all g.setTokens(["X0", "Y0", "Z0"]) smds = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E smds[axis] = float(g.tokenValue(i)) # Get tha value, new position or vector path = Path(smds, self.feed_rate, "ABSOLUTE", False) # Make a path segment from the axes #logging.debug("moving to "+str(smds)) self.path_planner.add_path(path) # Add the path. This blocks until the path planner has capacity elif g.code() == "G90": # Absolute positioning self.movement = "ABSOLUTE" elif g.code() == "G91": # Relative positioning self.movement = "RELATIVE" elif g.code() == "G92": # Set the current position of the following steppers #self.path_planner.wait_until_done() if g.numTokens() == 0: logging.debug("Adding all to G92") g.setTokens(["X0", "Y0", "Z0", "E0", "H0"]) # If no token is present, do this for all #for i in range(g.numTokens()): # axis = g.tokenLetter(i) # val = float(g.tokenValue(i)) # self.path_planner.set_pos(axis, val) pos = {} # All steppers for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E pos[axis] = float(g.tokenValue(i))/1000.0 # Get the value, new position or vector logging.debug(pos) path = Path(pos, self.feed_rate, "G92") # Make a path segment from the axes self.path_planner.add_path(path) elif g.code() == "M17": # Enable all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.setEnabled() SMD.commit() elif g.code() == "M19": # Reset all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.reset() elif g.code() == "M30": # Set microstepping (Propietary to Replicape) for i in range(g.numTokens()): self.steppers[g.tokenLetter(i)].set_microstepping(int(g.tokenValue(i))) SMD.commit() elif g.code() == "M31": # Set stepper current limit (Propietery to Replicape) for i in range(g.numTokens()): self.steppers[g.tokenLetter(i)].setCurrentValue(float(g.tokenValue(i))) SMD.commit() elif g.code() == "M84": # Disable all steppers self.path_planner.wait_until_done() for name, stepper in self.steppers.iteritems(): stepper.setDisabled() SMD.commit() elif g.code() == "M92": # M92: Set axis_steps_per_unit for i in range(g.numTokens()): # Run through all tokens axis = g.tokenLetter(i) # Get the axis, X, Y, Z or E self.steppers[axis].set_steps_pr_mm(float(g.tokenValue(i))) SMD.commit() elif g.code() == "M101": # Deprecated pass elif g.code() == "M103": # Deprecated pass elif g.code() == "M104": # Set extruder temperature if g.hasLetter("P"): if int(g.getValueByLetter("P")) == 0: self.ext1.setTargetTemperature(float(g.getValueByLetter("S"))) elif int(g.getValueByLetter("P")) == 1: logging.debug("setting ext 2 temp to "+str(g.getValueByLetter("S"))) self.ext2.setTargetTemperature(float(g.getValueByLetter("S"))) else: logging.debug("setting ext 1 temp to "+str(g.tokenValue(0))) self.ext1.setTargetTemperature(float(g.tokenValue(0))) elif g.code() == "M105": # Get Temperature answer = "ok T:"+str(self.ext1.getTemperature()) if hasattr(self, "hbp"): answer += " B:"+str(int(self.hbp.getTemperature())) if hasattr(self, "ext2"): answer += " T1:"+str(int(self.ext2.getTemperature())) if hasattr(self, "cold_end_1"): answer += " T2:"+str(int(self.cold_end_1.getTemperature())) g.setAnswer(answer) elif g.code() == "M106": # Fan on if g.hasLetter("P"): fan = self.fans[int(g.getValueByLetter("P"))] fan.set_value(float(g.getValueByLetter("S"))/255.0) # According to reprap wiki, the number is 0..255 else: # if there is no fan-number present, do it for the first fan self.fan_1.set_value(float(g.tokenValue(0))/255.0) elif g.code() == "M108": # Deprecated pass elif g.code() == "M110": # Reset the line number counter Gcode.line_number = 0 elif g.code() == "M114": g.setAnswer("ok C: "+' '.join('%s:%s' % i for i in self.current_pos.iteritems())) elif g.code() == "M130": # Set PID P-value, Format (M130 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M131": # Set PID I-value, Format (M131 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.p.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M132": # Set PID D-value, Format (M132 P0 S8.0) pass #if int(self.tokens[0][1]) == 0: # self.p.ext1.setPvalue(float(self.tokens[1][1::])) elif g.code() == "M140": # Set bed temperature self.hbp.setTargetTemperature(float(g.tokenValue(0))) elif g.code() == "M141": fan = self.fans[int(g.getValueByLetter("P"))] fan.setPWMFrequency(int(g.getValueByLetter("F"))) fan.set_value(float(g.getValueByLetter("S"))) elif g.code() == "M142": self.stat = True elif g.code() == "M143": self.stat = False elif g.code() == "T0": # Select tool 0 self.current_tool = "E" elif g.code() == "T1": # select tool 1 self.current_tool = "H" else: logging.warning("Unknown command: "+g.message)
def init(self,voice=1): if voice==1: super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 0 self.flysec = 0 self.min = 0 self.timetext = "TIME: 0:00" self.timechange = False self.movechange = False self.mute = -1 self.mode = "play" #self.mode = "solve" self.solvelist = [7,8,4,3,7,11,15,14,10,11,7,6,5] self.solvelist += [9,13,14,10,9,5,6,10,9,5,1] self.solvelist += [2,6,10,11,15,14,10,6] self.solvelist += [7,11,15,16,12,11,10,14,15,16,12,11] self.solveindex = len(self.solvelist)-1 datastring = "1000\n" datastring += "1000\n" writeFile("game8data.txt",datastring) global curk1,curk2 curk1,curk2 = 7,11 global p1,p2 p1 = [2,3,5,8,9,12,14,15] p2 = [2,4,7,14] self.flip = 1 Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.backpipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.backtiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(265,118,-1,0,1)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p1: self.pipes.add(Pipe(x,y,num,1)) elif num!= curk1: self.tiles.add(Tile(x,y,num)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p2: self.backpipes.add(Pipe(x,y,num,2)) elif num!= curk2: self.backtiles.add(Tile(x,y,num)) self.exit1 = 0 self.exittype1 = "left" self.exit2 = 0 self.exittype2 = "none" self.timer = 15 self.gassound = pygame.mixer.Sound('sound/gas01.wav') self.gassound.play() self.gassound.set_volume(0.2)
def __init__(self): logging.info("Replicape initializing "+version) self.config = ConfigParser.ConfigParser() self.config.readfp(open('config/default.cfg')) # Make a list of steppers self.steppers = {} # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) self.steppers["X"] = SMD("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, "X") self.steppers["Y"] = SMD("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, "Y") self.steppers["Z"] = SMD("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z") self.steppers["H"] = SMD("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1") self.steppers["E"] = SMD("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2") # Enable the steppers and set the current, steps pr mm and microstepping for name, stepper in self.steppers.iteritems(): stepper.setCurrentValue(self.config.getfloat('Steppers', 'current_'+name)) stepper.setEnabled(self.config.getboolean('Steppers', 'enabled_'+name)) stepper.set_steps_pr_mm(self.config.getfloat('Steppers', 'steps_pr_mm_'+name)) stepper.set_microstepping(self.config.getint('Steppers', 'microstepping_'+name)) stepper.set_decay(0) # Commit changes for the Steppers SMD.commit() # Find the path of the thermostors path = "/sys/bus/iio/devices/iio:device0/in_voltage" # init the 3 thermistors self.therm_ext1 = Thermistor(path+"4_raw", "MOSFET Ext 1", "B57561G0103F000") # Epcos 10K self.therm_hbp = Thermistor(path+"6_raw", "MOSFET HBP", "B57560G104F") # Epcos 100K self.therm_ext2 = Thermistor(path+"5_raw", "MOSFET Ext 2", "B57561G0103F000") # Epcos 10K if os.path.exists("/sys/bus/w1/devices/28-000002e34b73/w1_slave"): self.cold_end_1 = W1("/sys/bus/w1/devices/28-000002e34b73/w1_slave", "Cold End 1") # init the 3 heaters self.mosfet_ext1 = Mosfet(3) self.mosfet_ext2 = Mosfet(4) self.mosfet_hbp = Mosfet(5) # Make extruder 1 self.ext1 = Extruder(self.steppers["E"], self.therm_ext1, self.mosfet_ext1, "Ext1") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) # Make Heated Build platform self.hbp = HBP( self.therm_hbp, self.mosfet_hbp) # Make extruder 2. self.ext2 = Extruder(self.steppers["H"], self.therm_ext2, self.mosfet_ext2, "Ext2") self.ext1.setPvalue(0.1) self.ext1.setDvalue(0.3) self.ext1.setIvalue(0.0) self.current_tool = "E" # Init the three fans self.fan_1 = Fan(1) self.fan_2 = Fan(2) self.fan_3 = Fan(0) self.fans = {0: self.fan_1, 1:self.fan_2, 2:self.fan_3 } self.fan_1.setPWMFrequency(100) # Init the end stops self.end_stops = {} self.end_stops["Y1"] = EndStop("GPIO2_2", self.steppers, 1, "Y1") self.end_stops["X1"] = EndStop("GPIO0_14", self.steppers, 2, "X1") self.end_stops["Z1"] = EndStop("GPIO0_30", self.steppers, 3, "Z1") self.end_stops["Y2"] = EndStop("GPIO3_21", self.steppers, 4, "Y2") self.end_stops["X2"] = EndStop("GPIO0_31", self.steppers, 5, "X2") self.end_stops["Z2"] = EndStop("GPIO0_4", self.steppers, 6, "Z2") # Make a queue of commands self.commands = Queue.Queue(10) # Set up USB, this receives messages and pushes them on the queue #self.usb = USB(self.commands) self.pipe = Pipe(self.commands) self.ethernet = Ethernet(self.commands) # Init the path planner self.movement = "RELATIVE" self.feed_rate = 3000.0 self.current_pos = {"X":0.0, "Y":0.0, "Z":0.0, "E":0.0,"H":0.0} self.acceleration = 0.3 Path.axis_config = int(self.config.get('Geometry', 'axis_config')) Path.max_speed_x = float(self.config.get('Steppers', 'max_speed_x')) Path.max_speed_y = float(self.config.get('Steppers', 'max_speed_y')) Path.max_speed_z = float(self.config.get('Steppers', 'max_speed_z')) Path.max_speed_e = float(self.config.get('Steppers', 'max_speed_e')) Path.max_speed_h = float(self.config.get('Steppers', 'max_speed_h')) self.path_planner = Path_planner(self.steppers, self.current_pos) self.path_planner.set_acceleration(self.acceleration) # Signal everything ready logging.info("Replicape ready") print "Replicape ready"
# Copyright (C)2016 William H. Majoros ([email protected]). #========================================================================= from __future__ import (absolute_import, division, print_function, unicode_literals, generators, nested_scopes, with_statement) from builtins import (bytes, dict, int, list, object, range, str, ascii, chr, hex, input, next, oct, open, pow, round, super, filter, map, zip) # The above imports should allow this program to run in both Python 2 and # Python 3. You might need to update your version of module "future". from Pipe import Pipe #import subprocess #import sys #def run_command(command): # command=command.split() # p = subprocess.Popen(command, # stdout=subprocess.PIPE, # stderr=subprocess.STDOUT) # return iter(p.stdout.readline, b'') #for line in run_command("ls -la"): # line=line.decode(sys.stdout.encoding).rstrip() # #line=line.decode("utf-8").rstrip() # print("line=",line) pipe=Pipe("ls -la | sort -g | sort -r | uniq -c") while(True): line=pipe.readline() if(not line): break print(line)
def getPvalue(self): executable = Pipe.run("which fisher-exact-test.R") cmd=executable+" "+str(self.x00)+" "+str(self.x01)+" "+\ str(self.x10)+" "+str(self.x11) P = float(Pipe.run(cmd)) return P
def main(): pygame.init() window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT), 0, 32) draw_window(window) TOTAL = 500 birds = [] savedBirds = [] generations = 0 for i in range(0, TOTAL): birds.append(Bird(WIN_WIDTH, WIN_HEIGHT, None)) clock = pygame.time.Clock() run = True pipes = [] pipes.append(Pipe(WIN_HEIGHT, WIN_WIDTH + 100)) tickCount = 0 while run: clock.tick(60) tickCount += 1 draw_window(window) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if tickCount == 75: pipes.append(Pipe(WIN_HEIGHT, WIN_WIDTH + 100)) tickCount = 0 for pipe in pipes: if -100 >= pipe.x: pipes.remove(pipe) pipe.update() pipe.draw(window) for bird in birds: if detect_collision(bird, pipes): savedBirds.append(bird) birds.remove(bird) continue if bird.y < 0 or bird.y > bird.maxHeight: savedBirds.append(bird) birds.remove(bird) continue bird.think(pipes) bird.update() bird.draw(window) if birds.__len__() == 0: pipes.clear() tickCount = 74 birds = nextGeneration(WIN_WIDTH, WIN_HEIGHT, TOTAL, savedBirds) savedBirds = [] generations += 1 print("Generations: ", generations) pygame.display.update()
# main() #========================================================================= if (len(sys.argv) != 4): exit( ProgramName.get() + " in.mtx.gz column out.mtx.gz\n where column = 1-based field index\n" ) (infile, index, outfile) = sys.argv[1:] OUT = open(HEADERFILE, "wt") numHeader = 1 with gzip.open(infile, "rt") as IN: for line in IN: if (len(line) == 0): raise Exception("unexpected empty line") if (line[0] == "%"): numHeader += 1 print(line, file=OUT, end="") else: print(line, file=OUT, end="") break IN.close() OUT.close() cmd="cat "+infile+" | gunzip | tail -n +"+str(numHeader+1)+\ " | sort -g -k "+index+" > "+SORTEDFILE Pipe.run(cmd) cmd = "cat " + HEADERFILE + " " + SORTEDFILE + " | gzip > " + outfile Pipe.run(cmd) Pipe.run("rm " + SORTEDFILE) Pipe.run("rm " + HEADERFILE)
def init(self,voice=1): if voice==1: super().init() self.bgColor = (255,255,255) self.count = 0 self.sec = 0 self.min = 0 self.timetext = "TIME : 0:00" self.timechange = False self.movechange = False self.mute = -1 self.mode = "play" #self.mode = "solve" self.solvelist = [2,6,7,8,4,3,2,6,5,1,2,6] self.solvelist += [10,9,13,14,10,9,5,6,10] self.solvelist += [9,13,14,15,11,10,9,13,14,15,16] self.solvelist += [12,11,10,9,13,14,15,16,12,8] self.solveindex = len(self.solvelist)-1 datastring = "1000\n" datastring += "1000\n" writeFile("game7data.txt",datastring) global curk,k curk,k = 4,4 global p1,p2,p3,p4,p5,p6,p7 p1 = [5,7,10,12,15] p2 = [8,9] p3 = [14] p4 = [] p5 = [3] p6 = [2] p7 = [6,11] Pipe.init() Tile.init() Gear.init() self.win = False self.pipes = pygame.sprite.Group() self.tiles = pygame.sprite.Group() self.gears = pygame.sprite.Group() self.gears.add(Gear(330+65*3+5,180-55,-1,0,1)) for i in range(4): for j in range(4): x=332+65*j y=180+65*i num = j*4+i+1 if num in p1: self.pipes.add(Pipe(x,y,num,1)) elif num in p2: self.pipes.add(Pipe(x,y,num,2)) elif num in p3: self.pipes.add(Pipe(x,y,num,3)) elif num in p4: self.pipes.add(Pipe(x,y,num,4)) elif num in p5: self.pipes.add(Pipe(x,y,num,5)) elif num in p6: self.pipes.add(Pipe(x,y,num,6)) elif num in p7: self.pipes.add(Pipe(x,y,num,7)) elif num!= curk: self.tiles.add(Tile(x,y,num)) self.timer = 15 self.gassound = pygame.mixer.Sound('sound/gas01.wav') self.gassound.play() self.gassound.set_volume(0.2)