def __init_path_planner(self): self.native_planner = PathPlannerNative(int(self.printer.move_cache_size)) fw0 = self.pru_firmware.get_firmware(0) fw1 = self.pru_firmware.get_firmware(1) if fw0 is None or fw1 is None: return self.native_planner.initPRU(fw0, fw1) self.native_planner.setAxisStepsPerMeter(tuple(self.printer.steps_pr_meter)) self.native_planner.setMaxSpeeds(tuple(self.printer.max_speeds)) self.native_planner.setMinSpeeds(tuple(self.printer.min_speeds)) self.native_planner.setAcceleration(tuple(self.printer.acceleration)) self.native_planner.setJerks(tuple(self.printer.jerks)) self.native_planner.setPrintMoveBufferWait(int(self.printer.print_move_buffer_wait)) self.native_planner.setMinBufferedMoveTime(int(self.printer.min_buffered_move_time)) self.native_planner.setMaxBufferedMoveTime(int(self.printer.max_buffered_move_time)) self.native_planner.setSoftEndstopsMin(tuple(self.printer.soft_min)) self.native_planner.setSoftEndstopsMax(tuple(self.printer.soft_max)) self.native_planner.setBedCompensationMatrix(tuple(self.printer.matrix_bed_comp.ravel())) self.native_planner.setMaxPathLength(self.printer.max_length) self.native_planner.setAxisConfig(self.printer.axis_config) self.native_planner.delta_bot.setMainDimensions(Delta.Hez, Delta.L, Delta.r) self.native_planner.delta_bot.setEffectorOffset(Delta.Ae, Delta.Be, Delta.Ce) self.native_planner.delta_bot.setRadialError(Delta.A_radial, Delta.B_radial, Delta.C_radial); self.native_planner.delta_bot.setTangentError(Delta.A_tangential, Delta.B_tangential, Delta.C_tangential) self.native_planner.delta_bot.recalculate() self.native_planner.enableSlaves(self.printer.has_slaves) if self.printer.has_slaves: for master in Printer.AXES: slave = self.printer.slaves[master] if slave: master_index = Printer.axis_to_index(master) slave_index = Printer.axis_to_index(slave) self.native_planner.addSlave(int(master_index), int(slave_index)) logging.debug("Axis " + str(slave_index) + " is slaved to axis " + str(master_index)) self.native_planner.setBacklashCompensation(tuple(self.printer.backlash_compensation)); self.native_planner.setState(self.prev.end_pos) self.printer.plugins.path_planner_initialized(self) self.native_planner.runThread()
def run(self): data = "" if not self.outputBuffer == None: if self.outputBuffer.Type == "OP": data = ReadCard(self.outputBuffer.UnloadBuffer()) Printer.enterLog("Data: " + data) self.outputBuffer.Type = "Empty" SystemQueue.EmptyBufferQueue.put(self.outputBuffer) if not SystemQueue.OutBufferQueue.empty(): self.outputBuffer = SystemQueue.OutBufferQueue.get() size = SystemQueue.OutBufferQueue.qsize()
def PutData(location,CPU,progPCB,Memory): progPCB.TLC += 1 if(progPCB.TLC > progPCB.TLL): CPU.Abort(ProgFile,3) else: index = roundOff(location) data = ReadCard(index,Memory) if data == '0': print ' ' else: print 'Data', data Printer.enterLog(str(progPCB.PID) + '-->' +'Data: ' + data)
def __init__(self): ''' Start input choice. ''' self.mPrinter = Printer() self.mFormatter = Formatter() inputType = self.chooseInputType() if(inputType is None): print("Invalid input type.") return if(inputType == self.TYPE_TEXT): print("Text input type selected.") #Handle text type input. self.chooseTextInput() return if(inputType == self.TYPE_ASCII): print("Ascii art input type selected.") #TODO: Handle ascii art type input. return if(inputType == self.TYPE_IMAGE): print("Image input type selected.") #TODO: Handle image type input. return if(inputType == self.TYPE_STREAM): print("Stream input type selected.") #TODO: Hande stream type input. return print("Unknown input type.") return
def _go_to_home(self, axis): """ go to the designated home position do this as a separate call from _home_internal due to delta platforms performing home in cartesian mode """ path_home = {} speed = self.printer.home_speed[0] accel = self.printer.acceleration[0] for a in axis: path_home[a] = self.home_pos[a] speed = min(abs(speed), abs(self.printer.home_speed[Printer.axis_to_index(a)])) logging.debug("Home: %s" % path_home) # Move to home position p = AbsolutePath(path_home, speed, accel, True, False, False, False) self.add_path(p) self.wait_until_done() # Due to rounding errors, we explicitly set the found # position to the right value. # Reset (final) position to offset p = G92Path(path_home) self.add_path(p) return
def add_path(self, new): """ Add a path segment to the path planner """ """ This code, and the native planner, needs to be updated for reach. """ # Link to the previous segment in the chain new.set_prev(self.prev) # NOTE: printing the added path slows things down SIGNIFICANTLY #logging.debug("path added: "+ str(new)) if new.is_G92(): self.native_planner.setState(tuple(new.end_pos)) elif new.needs_splitting(): #TODO: move this to C++ # this branch splits up any G2 or G3 movements (arcs) # should be moved to C++ as it is math heavy # need to convert it to linear segments before feeding to the queue # as we want to keep the queue only dealing with linear stuff for simplicity for seg in new.get_segments(): self.add_path(seg) else: self.printer.ensure_steppers_enabled() optimize = new.movement != Path.RELATIVE tool_axis = Printer.axis_to_index(self.printer.current_tool) self.native_planner.setAxisConfig(int(self.printer.axis_config)) self.native_planner.queueMove(tuple(new.start_pos), tuple(new.end_pos), new.speed, new.accel, bool(new.cancelable), bool(optimize), bool(new.enable_soft_endstops), bool(new.use_bed_matrix), bool(new.use_backlash_compensation), int(tool_axis), True) self.prev = new self.prev.unlink() # We don't want to store the entire print
def simulation(seconds, ppm): printQueue = Queue() waitingtimes = [] printer = Printer(ppm) for currentSecond in range(seconds): if newPrintTask(): printQueue.enqueue(Task("Task"+str(currentSecond), currentSecond)) if (not printer.busy()) and (not printQueue.isEmpty()): nexttask = printQueue.dequeue() waitingtimes.append(nexttask.getWaitTime(currentSecond)) printer.nextTask(nexttask) printer.tick() lenWaitTime = len(waitingtimes) averageWait=sum(waitingtimes)/lenWaitTime print("Average Wait %6.2f secs %3d tasks remaining."%(averageWait,printQueue.size()))
def __init__(self): ''' Constructor ''' # logging.basicConfig(level=logging.DEBUG, disable_existing_loggers=False) # self.logger = logging.getLogger(__name__) self.gameOver= False self.printer=Printer(self) self.WI= WorldItems() self.player = self.__initPlayer() # Enemies self.EG = EnemyGenerator(self.WI) self.currentEnemy= "" self.story = Story( self) self.printer.intro(self.player) self.player.listInventory() raw_input() self.nbTurn = 0 print("##################################################") print(" THE GAME BEGINS") print("##################################################") self.nextEvent = self.story.goToEvent("intro")
def simulation(numSeconds, pagePerMin): labPrinter = Printer(pagePerMin) printQ = Queue() waitTime = [] for currentSecond in range(numSeconds): if newPrintTask(): task = Task(currentSecond) printQ.enqueue(task) if (not labPrinter.busy()) and (not printQ.is_empty()): nextTask = printQ.dequeue() waitTime.append(nextTask.waitTime(currentSecond)) labPrinter.startNext(nextTask) labPrinter.tick() avgWait = sum(waitTime)/len(waitTime) print ("Avg wait: %6.2f secs, Tasks remaining: %3d" % (avgWait, printQ.size()))
# Add end stop delay to the config file end_stop_delay = self.config.getint('Endstops', 'end_stop_delay_cycles') configFile.write("#define END_STOP_DELAY " + str(end_stop_delay) + "\n") return configFile_0 if __name__ == '__main__': from Printer import Printer from EndStop import EndStop from Stepper import Stepper, Stepper_00A3, Stepper_00A4, Stepper_00B1, Stepper_00B2, Stepper_00B3 from CascadingConfigParser import CascadingConfigParser printer = Printer() # Parse the config files. printer.config = CascadingConfigParser(['/etc/redeem/default.cfg']) # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) printer.steppers["X"] = Stepper("GPIO0_27", "GPIO1_29", "GPIO2_4", 0, 0, "X") printer.steppers["Y"] = Stepper("GPIO1_12", "GPIO0_22", "GPIO2_5", 1, 1, "Y") printer.steppers["Z"] = Stepper("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, 2, "Z") printer.steppers["E"] = Stepper("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, 3, "E") printer.steppers["H"] = Stepper("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, 4, "H")
from Memory import Memory from globalHelp import * from SystemQueue import SystemQueue from CPU import CPU from Printer import Printer from Logger import Logger #---------------------------- Global Variables ---------------------------------------------- CPU = CPU() Memory.initialise() SystemBuffer.initialise() Printer.initialize() Logger.initialize() def main(): channel.channel1.ChannelBusy = True channel.channel3.ChannelBusy = True channel.channel2.ChannelBusy = True while(not channel.ChannelIdle()): simulate() CPU.Process() CPU.IOInterrupt() def simulate(): busyList = [] for ch in channel.channelList: if ch.ChannelBusy:
def __init__(self, parent, id, title): # --- a basic window frame/form wx.Frame.__init__(self, parent=None, id=-1, title=APP_NAME + " - Developed in wxPython/AHK", pos=wx.Point(0, 0), size=wx.Size(640, 480), name='', style=wx.DEFAULT_FRAME_STYLE) if (len(sys.argv)) == 2: self.Bind(wx.EVT_ACTIVATE, self.OnFileOpenDirect) # wx.EVT_ACTIVATE(self, self.OnFileOpenDirect) # same self.printer = Printer(self) self.SetMinSize((640, 480)) # --- real windows programs have icons, so here's ours! try: # - don't sweat it if it doesn't load self.SetIcon(wx.Icon("SmallEditor.ico", wx.BITMAP_TYPE_ICO)) finally: pass self.codePage = None self.finddlg = None # --- add a menu, first build the menus (with accelerators) self.BuildMenuBar() self.finddata = wx.FindReplaceData() self.finddata.SetFlags(wx.FR_DOWN) # Not needed!, just put them in text form after tab in menu item! # --- add accelerators to the menus #self.SetAcceleratorTable(wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('O'), ID_OPEN), # (wx.ACCEL_ALT, ord('Q'), ID_EXIT)])) # --- add a statusBar (with date/time panel) sb = self.CreateStatusBar(3) sb.SetStatusWidths([-1, 65, 160]) sb.PushStatusText("Ready", SB_INFO) # --- set up a timer to update the date/time (every 5 seconds) self.timer = wx.PyTimer(self.Notify) self.timer.Start(5000) self.Notify() # - call it once right away # --- add a control (a RichTextBox) & trap KEY_DOWN event self.rtb = wx.TextCtrl(self, ID_RTB, size=wx.Size(400 * 2, 200 * 2), style=wx.TE_MULTILINE | wx.TE_RICH2) ### - NOTE: binds to the control itself! wx.EVT_KEY_UP(self.rtb, self.OnRtbKeyUp) # --- need to add a sizer for the control - yuck! self.sizer = wx.BoxSizer(wx.VERTICAL) # self.sizer.SetMinSize(200,400) self.sizer.Add(self.rtb, 1, wx.EXPAND) # --- now add it to the frame (at least this auto-sizes the control!) self.SetSizer(self.sizer) self.SetAutoLayout(True) self.sizer.SetSizeHints(self) # Add some Unicode (Chinese!) if not wx.USE_UNICODE: self.AddLine(self.sizer) self.AddText( self.sizer, "Sorry, this wxPython was not built with Unicode support.", font=wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD)) self.AddLine(self.sizer) else: f = self.GetFont() font = wx.Font(14, f.GetFamily(), f.GetStyle(), wx.BOLD, False, f.GetFaceName(), f.GetEncoding()) self.AddLine(self.sizer) self.AddText(self.sizer, chi_uni[0], chi_uni[1], 'Chinese:', font) self.AddLine(self.sizer) # --- initialize other settings self.dirName = "" self.fileName = "" # - this is ugly, but there's no static available # once we build a class for RTB, move this there self.oldPos = -1 self.ShowPos() # --- finally - show it! self.Show(True)
class Game: ''' This class represents the whole game. ''' def __init__(self): ''' Constructor ''' # logging.basicConfig(level=logging.DEBUG, disable_existing_loggers=False) # self.logger = logging.getLogger(__name__) self.gameOver = False self.printer = Printer(self) self.WI = WorldItems() self.player = self.__initPlayer() # Enemies self.EG = EnemyGenerator(self.WI) self.currentEnemy = "" self.story = Story(self) self.printer.intro(self.player) self.player.listInventory() raw_input() self.nbTurn = 0 print("##################################################") print(" THE GAME BEGINS") print("##################################################") self.nextEvent = self.story.goToEvent("intro") ''' void onTurn() ''' def onTurn(self): self.nbTurn = self.nbTurn + 1 self.nextEvent = self.story.goToEvent(self.nextEvent) ''' boolean onGame() Return true while the player isn't dead. ''' def onGame(self): return self.player.isAlive() and self.nbTurn < 20 def endGame(self): print("##################################################") print(" THE GAME ENDS") print("##################################################") self.gameOver = True def isGameOver(self): return self.gameOver ''' Return a player object. ''' def __initPlayer(self): dictMode = {} #will contains all information about each game mode file = minidom.parse("./XML_Files/InitPlayer.xml") modes = file.getElementsByTagName("DifficultyMode") for mode in modes: data = xmlp.parseAttributes(mode) dictMode[data.get('id')] = data #Ask the player which mode does he wants to play ToPrint = "Difficulty Modes: " for mode in dictMode.keys(): ToPrint = ToPrint + ' ' + mode print(ToPrint) #Parse the user input userMode = ui.userIput("Which mode do you want to play? ", dictMode.keys()) SelectedMode = dictMode[userMode] ## Parse the mode's parameters player = Player(SelectedMode.get('hp')) armorName = SelectedMode.get('armor') if armorName is None: player.equipArmor(self.WI.getArmorByCategory("basic")) else: player.equipArmor(self.WI.getArmor(armorName)) weaponName = SelectedMode.get('weapon') if weaponName is None: player.equipWeapon(self.WI.getWeaponByCategory("basic")) else: player.equipWeapon(self.WI.getWeapon(weaponName)) potion = self.WI.getPotionByCategory("HP") if SelectedMode.get('potion') is not None: if cast.strToBool(SelectedMode.get('potion')): potion.fill() player.addToBag(potion) return player
configFile.write("#define GPIO"+name+"_DIR_MASK\t\t" +bin(bank)+ "\n"); configFile.write("\n"); # Add end stop delay to the config file end_stop_delay = self.config.getint('Endstops', 'end_stop_delay_cycles') configFile.write("#define END_STOP_DELAY " +str(end_stop_delay)+ "\n"); return configFile_0 if __name__ == '__main__': from Printer import Printer from EndStop import EndStop from Stepper import Stepper, Stepper_00A3, Stepper_00A4, Stepper_00B1, Stepper_00B2, Stepper_00B3 from CascadingConfigParser import CascadingConfigParser printer = Printer() # Parse the config files. printer.config = CascadingConfigParser( ['/etc/redeem/default.cfg']) # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) printer.steppers["X"] = Stepper("GPIO0_27", "GPIO1_29", "GPIO2_4" , 0, 0, "X") printer.steppers["Y"] = Stepper("GPIO1_12", "GPIO0_22", "GPIO2_5" , 1, 1, "Y") printer.steppers["Z"] = Stepper("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, 2, "Z") printer.steppers["E"] = Stepper("GPIO1_28", "GPIO1_15", "GPIO2_1" , 3, 3, "E") printer.steppers["H"] = Stepper("GPIO1_13", "GPIO1_14", "GPIO2_3" , 4, 4, "H") printer.steppers["A"] = Stepper("GPIO2_2" , "GPIO1_18", "GPIO0_14", 5, 5, "A") printer.steppers["B"] = Stepper("GPIO1_16", "GPIO0_5" , "GPIO0_14", 6, 6, "B") printer.steppers["C"] = Stepper("GPIO0_3" , "GPIO3_19", "GPIO0_14", 7, 7, "C")
def _home_internal(self, axis): """ Private method for homing a set or a single axis """ logging.debug("homing internal " + str(axis)) path_search = {} path_backoff = {} path_fine_search = {} path_center = {} path_zero = {} speed = self.printer.home_speed[0] # TODO: speed for each axis accel = self.printer.acceleration[0] # TODO: accel for each axis for a in axis: if not self.printer.steppers[a].has_endstop: logging.debug("Skipping homing for " + str(a)) continue logging.debug("Doing homing for " + str(a)) if self.printer.home_speed[Printer.axis_to_index(a)] < 0: # Search to positive ends path_search[a] = self.travel_length[a] path_center[a] = self.center_offset[a] else: # Search to negative ends path_search[a] = -self.travel_length[a] path_center[a] = -self.center_offset[a] backoff_length = -np.sign(path_search[a]) * self.printer.home_backoff_offset[Printer.axis_to_index(a)] path_backoff[a] = backoff_length; path_fine_search[a] = -backoff_length * 1.2; speed = min(abs(speed), abs(self.printer.home_speed[Printer.axis_to_index(a)])) accel = min(accel, self.printer.acceleration[Printer.axis_to_index(a)]) fine_search_speed = min(abs(speed), abs(self.printer.home_backoff_speed[Printer.axis_to_index(a)])) logging.debug("Search: %s at %s m/s, %s m/s^2" % (path_search, speed, accel)) logging.debug("Backoff to: %s" % path_backoff) logging.debug("Fine search: %s" % path_fine_search) logging.debug("Center: %s" % path_center) # Move until endstop is hit p = RelativePath(path_search, speed, accel, True, False, True, False) self.add_path(p) self.wait_until_done() logging.debug("Coarse search done!") # Reset position to offset p = G92Path(path_center) self.add_path(p) self.wait_until_done() # Back off a bit p = RelativePath(path_backoff, speed, accel, True, False, True, False) self.add_path(p) # Hit the endstop slowly p = RelativePath(path_fine_search, fine_search_speed, accel, True, False, True, False) self.add_path(p) self.wait_until_done() # Reset (final) position to offset p = G92Path(path_center) self.add_path(p) return path_center, speed
class DisplayProtocol(lib.DisplayInterface): def __init__(self): super().__init__() self.ticket_printer = Printer() self.ticket_generator = None self.network = False self.connected = False self.test_network_connection() self.connect() self.print_tickets() self.get_time() # deprecate self.show_num_tickets = NUM_TICKETS def get_time(self): if not lib.DEBUG: async def get_time(): while True: if self.connected: break await asyncio.sleep(1/30) async with websockets.connect(lib.address) as ws: await ws.send(json.dumps({"client_id":"Display", "request":"get_time", "data":None})) result = json.loads(await ws.recv())["result"] self.set_time(int(result)) return self.loop.create_task(get_time()) def tickets(self): if self.order_queue is None: return [] return [ticket for ticket in self.flat_order_queue if not ticket.is_complete()] def loads(self, string): result = super().loads(string) self.flat_order_queue = [ OrderIndex(ticket, int(ticket_no), i) for ticket_no in result["order_queue"] for i, ticket in enumerate(result["order_queue"][ticket_no]["items"])] self.ticket_generator = ((ticket, result["order_queue"][str(ticket.ticket_no)]["print"], len(result["order_queue"][str(ticket.ticket_no)]["items"]), result["order_queue"][str(ticket.ticket_no)]["name"]) for ticket in self.flat_order_queue if result["order_queue"][str(ticket.ticket_no)]["print"]) def set_ticket_status(self, index, value): """set status of one ticket status to value""" data = index[0], index[1], value return self.loop.create_task( self.server_message("set_ticket_status", data)) def set_order_status(self, ticket_no, value): """set status of entire order to value""" data = ticket_no, value return self.loop.create_task(self.server_message("set_order_status", data)) def print_tickets(self): async def not_none(): while True: if self.ticket_generator is not None: return await asyncio.sleep(1/30) async def _print_tickets(): while True: processed = set() for ticket in self.ticket_generator: ticket, status, cnt, name = ticket if ticket.ticket_no not in processed: await self.server_message("set_ticket_printed", ticket.ticket_no) processed.add(ticket.ticket_no) line_opt = ticket.ticket_receipt(status, cnt, name) if line_opt: for line, opt in line_opt: self.ticket_printer.writeline(line, **opt) # make sure everything is above cutoff line self.ticket_printer.writeline("\n\n\n", **NULL_OPT) if lib.DEBUG: print("\n".join(line[0] for line in line_opt)) await asyncio.sleep(1/30) def print_tickets(task): self.loop.create_task(_print_tickets()) # wait for server update task = self.loop.create_task(not_none()) # start print_ticket loop task.add_done_callback(print_tickets)
def __init__(self, config_location="/etc/redeem"): """ config_location: provide the location to look for config files. - default is installed directory - allows for running in a local directory when debugging """ firmware_version = "1.2.8~Predator" logging.info("Redeem initializing " + firmware_version) printer = Printer() self.printer = printer Path.printer = printer printer.firmware_version = firmware_version printer.config_location = config_location # Set up and Test the alarm framework Alarm.printer = self.printer Alarm.executor = AlarmExecutor() alarm = Alarm(Alarm.ALARM_TEST, "Alarm framework operational") # check for config files file_path = os.path.join(config_location, "default.cfg") if not os.path.exists(file_path): logging.error( file_path + " does not exist, this file is required for operation") sys.exit() # maybe use something more graceful? local_path = os.path.join(config_location, "local.cfg") if not os.path.exists(local_path): logging.info(local_path + " does not exist, Creating one") os.mknod(local_path) os.chmod(local_path, 0o777) # Parse the config files. printer.config = CascadingConfigParser([ os.path.join(config_location, 'default.cfg'), os.path.join(config_location, 'printer.cfg'), os.path.join(config_location, 'local.cfg') ]) # Check the local and printer files printer_path = os.path.join(config_location, "printer.cfg") if os.path.exists(printer_path): printer.config.check(printer_path) printer.config.check(os.path.join(config_location, '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) printer.replicape_key = printer.config.get_key() else: logging.warning("Oh no! No Replicape present!") self.revision = "0B3A" # We set it to 5 axis by default Printer.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": Printer.NUM_AXES = 8 elif self.printer.config.reach_revision == "00B0": Printer.NUM_AXES = 7 if self.revision in ["00A4", "0A4A", "00A3"]: PWM.set_frequency(100) elif self.revision in ["00B1", "00B2", "00B3", "0B3A"]: PWM.set_frequency(printer.config.getint('Cold-ends', 'pwm_freq')) # Init the Watchdog timer printer.watchdog = Watchdog() # Enable PWM and steppers printer.enable = Enable("P9_41") printer.enable.set_disabled() # Init the Paths printer.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) homing_only_endstops = self.printer.config.get('Endstops', 'homing_only_endstops') 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') # activate all the endstops self.printer.set_active_endstops() # Init the 5 Stepper motors (step, dir, fault, DAC channel, name) Stepper.printer = printer 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 in ["00B3", "0B3A"]: 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 printer.soft_min[Printer.axis_to_index( name)] = printer.config.getfloat('Endstops', 'soft_end_stop_min_' + name) printer.soft_max[Printer.axis_to_index( name)] = printer.config.getfloat('Endstops', 'soft_end_stop_max_' + name) slave = printer.config.get('Steppers', 'slave_' + name) if slave: printer.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 printer.axis_config == Printer.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) # Discover and add all DS18B20 cold ends. 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, temperature sensors 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) if not self.printer.config.has_option("Heaters", "sensor_" + e): sensor = self.printer.config.get("Heaters", "temp_chart_" + e) logging.warning("Deprecated config option temp_chart_" + e + " use sensor_" + e + " instead.") else: sensor = self.printer.config.get("Heaters", "sensor_" + e) self.printer.thermistors[e] = TemperatureSensor( adc, 'MOSFET ' + e, sensor) self.printer.thermistors[e].printer = printer # Extruders onoff = self.printer.config.getboolean('Heaters', 'onoff_' + e) prefix = self.printer.config.get('Heaters', 'prefix_' + e) max_power = self.printer.config.getfloat('Heaters', 'max_power_' + 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].Kp = self.printer.config.getfloat( 'Heaters', 'pid_Kp_' + e) self.printer.heaters[e].Ti = self.printer.config.getfloat( 'Heaters', 'pid_Ti_' + e) self.printer.heaters[e].Td = self.printer.config.getfloat( 'Heaters', 'pid_Td_' + 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", "0B3A"]: 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)) # Set default value for all fans for i, f in enumerate(self.printer.fans): f.set_value( self.printer.config.getfloat('Fans', "default-fan-{}-value".format(i))) # 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 = Printer.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 printer.matrix_bed_comp = printer.load_bed_compensation_matrix() logging.debug("Loaded bed compensation matrix: \n" + str(printer.matrix_bed_comp)) for axis in printer.steppers.keys(): i = Printer.axis_to_index(axis) printer.max_speeds[i] = printer.config.getfloat( 'Planner', 'max_speed_' + axis.lower()) printer.min_speeds[i] = printer.config.getfloat( 'Planner', 'min_speed_' + axis.lower()) printer.jerks[i] = printer.config.getfloat( 'Planner', 'max_jerk_' + axis.lower()) printer.home_speed[i] = printer.config.getfloat( 'Homing', 'home_speed_' + axis.lower()) printer.home_backoff_speed[i] = printer.config.getfloat( 'Homing', 'home_backoff_speed_' + axis.lower()) printer.home_backoff_offset[i] = printer.config.getfloat( 'Homing', 'home_backoff_offset_' + axis.lower()) printer.steps_pr_meter[i] = printer.steppers[ axis].get_steps_pr_meter() printer.backlash_compensation[i] = printer.config.getfloat( 'Steppers', 'backlash_' + axis.lower()) printer.e_axis_active = printer.config.getboolean( 'Planner', 'e_axis_active') 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') printer.max_length = printer.config.getfloat('Planner', 'max_length') 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(): printer.acceleration[Printer.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 = Printer.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] = ( printer.soft_max[i] - printer.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] = ( printer.soft_min[i] if printer.home_speed[i] > 0 else printer.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 printer.axis_config == Printer.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'] delta_bot = self.printer.path_planner.native_planner.delta_bot z_offset = delta_bot.vertical_offset(Az, Bz, Cz) # vertical offset xyz = delta_bot.forward_kinematics(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)) # Read end stop value again now that PRU is running for _, es in self.printer.end_stops.iteritems(): es.read_value() # 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" )
from Memory import Memory from globalHelp import * from SystemQueue import SystemQueue from CPU import CPU from Printer import Printer from Logger import Logger #---------------------------- Global Variables ---------------------------------------------- CPU = CPU() Memory.initialise() SystemBuffer.initialise() Printer.initialize() Logger.initialize() def main(): channel.channel1.ChannelBusy = True channel.channel3.ChannelBusy = True channel.channel2.ChannelBusy = True while (not channel.ChannelIdle()): simulate() CPU.Process() CPU.IOInterrupt() def simulate(): busyList = [] for ch in channel.channelList: if ch.ChannelBusy:
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")
print("Area: {} mm\n".format(Hb * Wb)) print("Points: {} \n".format(N_W * N_H)) return points_list if __name__ == "__main__": """The following example shows how a provided csv file of test points can be used to traverse a printer. """ points_filename = "../test_points.csv" Ender3 = Printer( printerName="USB-SERIAL CH340" ) # This is the name that the computer sees the printer as. with open(points_filename) as points_file: # Required file format: # x(mm),y(mm),z(mm) {Header is not read. Can be anything, but is required.) # 0.0,0.0,0.0 points_lines = points_file.readlines() points_lines = [line.strip().split(',') for line in points_lines] points = [(float(line[0]), float(line[1]), float(line[2])) for line in points_lines] run_points(Ender3, points)
class VM201RelayCard(object): def __init__(self, host, port=9760, username=None, password=None, verbose=True): self.host = host self.port = int(port) self.username = username self.password = password # Socket to communicatie over with the vm201 firmware. self.socket = None # Pre-defined commands stated in the protocol. self.commands = { 'STX': '\x02', 'ETX': '\x03', 'CMD_AUTH': 'A', 'LEN_CMD_AUTH': 5, 'CMD_USERNAME': '******', 'LEN_CMD_USERNAME': 14, 'CMD_PASSWORD': '******', 'LEN_CMD_PASSWORD': 14, 'CMD_LOGGED_IN': 'L', 'LEN_CMD_LOGGED_IN': 5, 'CMD_ACCESS_DENIED': 'X', 'LEN_CMD_ACCESS_DENIED': 5, 'CMD_CLOSED': 'C', 'LEN_CMD_CLOSED': 5, 'CMD_NAME': 'N', 'LEN_CMD_NAME': 22, 'CMD_STATUS_REQ': 'R', 'LEN_CMD_STATUS_REQ': 5, 'CMD_STATUS': 'S', 'LEN_CMD_STATUS': 8, 'CMD_ON': 'O', 'LEN_CMD_ON': 6, 'CMD_OFF': 'F', 'LEN_CMD_OFF': 6, 'CMD_TOGGLE': 'T', 'LEN_CMD_TOGGLE': 6, 'CMD_PULSE': 'P', 'LEN_CMD_PULSE': 8, 'CMD_UPDATE': 'V', 'LEN_CMD_UPDATE': 6, 'CMD_TMR_ENA': 'E', 'LEN_CMD_TMR_ENA': 6, 'CMD_TMR_DIS': 'D', 'LEN_CMD_TMR_DIS': 6, 'CMD_TMR_TOGGLE': 'G', 'LEN_CMD_TMR_TOGGLE': 6 } # Relay channels (8 output; 1 input) self.channels = dict() self.channel_string = str() self.timer_string = str() for i in range(1, 10): self.channels[i] = Channel() # TCP packet handler to decode and encode packets. self.tcp_handler = TCPPacketHandler() # Custum print handler self.display = Printer(verbose) def __str__(self): header = ['Name', 'Output', 'Timer'] table = list() for i in range(1, 10): table.append(self.channels[i].as_list()) # table.append(['', '', '']) state = '\n' + str(tabulate(table, header, "rst")) + '\n' return state def lookup(self, cmd_byte): ''' Lookup key in self.commands dict given its value cmd_byte ''' try: return [ key for key in self.commands if self.commands[key] == cmd_byte ][0] except KeyError as e: msg = 'Error: value \'{0}\' not found'\ .format(cmd_byte) + ' in VM201.commands dict!\n', e self.display.add_tcp_msg(msg) return None def connect(self): ''' Connect to vm201 via TCP protocol ''' # 'LEN_CMD_AUTH' is equal to 'LEN_CMD_LOGGED_IN'. length = self.commands['LEN_CMD_AUTH'] # create an INET, STREAMing socket try: self.socket = socket(AF_INET, SOCK_STREAM) except socket.error: msg = 'Failed to create socket' self.display.add_tcp_msg(msg) exit() else: self.display.add_tcp_msg('Socket Created.') try: remote_ip = gethostbyname(self.host) self.socket.connect((self.host, self.port)) except gaierror: msg = 'Error in {0}: Hostname could not be resolved.'\ .format('connect_to_vm201') self.display.add_tcp_msg(msg) exit() except error as e: msg = 'Error in {0}: {1}'\ .format('connect_to_vm201', e) msg += '\nPerhaps hostname or port incorrect? Please double check.' self.display.add_tcp_msg(msg) exit() else: self.display.add_tcp_msg('Socket Connected to ' + self.host + ' on ip ' + remote_ip) try: packet = self.socket.recv(length) except Exception as e: # I have no idea whatsoever what could go wrong =)... raise msg = 'Error: something went wrong in recv function in {0}!'\ .format('connect_to_vm201') self.display.add_tcp_msg(msg) exit() response = self.tcp_handler.decode(self, packet) login_status = self.lookup(chr(response[2])) if login_status == 'CMD_LOGGED_IN': # No auth required; no further steps needed. pass elif login_status == 'CMD_AUTH': self.login() else: msg = 'Error: unexpected server return {0}'.format(login_status) self.display.add_tcp_msg(msg) exit() def login(self): ''' Expected client answer to received CMD_AUTH:: <STX><14><CMD_USERNAME><char1 of username>...<char9 of username><CHECKSUM><ETX> <STX><14><CMD_PASSWORD><char1 of password>...<char9 of password><CHECKSUM><ETX> Expected server response: invalid -> <STX><5><CMD_ACCESS_DENIED><CHECKSUM><ETX> -> <STX><5><CMD_CLOSED><CHECKSUM><ETX> succes -> <STX><5><CMD_LOGGED_IN><CHECKSUM><ETX> ''' if self.username is None or self.password is None: msg = 'Error: no username and/or password specified!' self.display.add_tcp_msg(msg) exit() packet = self.tcp_handler.encode(self, 'CMD_USERNAME', self.username) self.socket.send(packet) packet = self.tcp_handler.encode(self, 'CMD_PASSWORD', self.password) self.socket.send(packet) # 'LEN_CMD_LOGGED_IN' = 'LEN_CMD_ACCESS_DENIED' = 'LEN_CMD_CLOSED' length = self.commands['LEN_CMD_LOGGED_IN'] packet = self.socket.recv(length) response = self.tcp_handler.decode(self, packet) login_status = self.lookup(chr(response[2])) if login_status == 'CMD_LOGGED_IN': self.display.add_tcp_msg('Authentication succeeded.') elif login_status == 'CMD_ACCESS_DENIED': self.display.add_tcp_msg('Authentication failed.') packet = self.socket.recv(length) response = self.tcp_handler.decode(self, packet) exit() def receive_names_of_channels(self): ''' Expected server response: <STX><22><CMD_NAME><Channelnr><char1 name>...<char16 of name><CHECKSUM><ETX> ''' length = self.commands['LEN_CMD_NAME'] # First 8 output channels, then 1 input channel. for i in range(1, 10): try: packet = self.socket.recv(length) except Exception as e: # I have no idea whatsoever what could go wrong =)... raise msg = 'Error: something went wrong in recv function in {0}!'\ .format('receive_names_of_channels') self.display.add_tcp_msg(msg) exit() response = self.tcp_handler.decode(self, packet) name = '' for char in response[4:20]: # There appears to be buggy behaviour in the VM201 firmware. # The channel names might have seemingly random chars added. lowercase = (chr(char) >= 'a' and chr(char) <= 'z') uppercase = (chr(char) >= 'A' and chr(char) <= 'Z') # digit = (chr(char) >= 0 and chr(char) <= '9') # space = (chr(char) == 32) if uppercase or lowercase: name += chr(char) self.channels[i].name = name def receive_status_of_channels(self): ''' Expected server response: <STX><8><CMD_STATUS><output status><output timer status><input status><CHECKSUM><ETX> ''' length = self.commands['LEN_CMD_STATUS'] try: packet = self.socket.recv(length) except Exception as e: # I have no idea whatsoever what could go wrong =)... raise msg = 'Error: something went wrong in recv function in {0}!'\ .format('receive_status_of_channels') self.display.add_tcp_msg(msg) exit() response = self.tcp_handler.decode(self, packet) self.channel_string = bin(response[3]) self.timer_string = bin(response[4]) self.input_status = response[5] # The string is now channel 8...1, but we want 1...8 channel_string = self.channel_string[::-1] timer_string = self.timer_string[::-1] for i in range(8): self.channels[i + 1].status = channel_string[i] self.channels[i + 1].timer = timer_string[i] self.channels[9].status = self.input_status self.channels[9].timer = '-' def status(self): self.receive_names_of_channels() self.receive_status_of_channels() self.display.update_state(str(self)) def string_of_change(self, channel_id): ''' Return zero for all channels but channel_id ''' byte_string = '0' * (8 - channel_id) + '1' + '0' * (channel_id - 1) return (pack('B', int(byte_string, 2))) def string_of_change_list(self, channel_id): ''' Return zero for all channels but channel_id ''' byte_string = '' for i in range(0, 8): set = False for j in range(0, len(channel_id)): if ((8 - channel_id[j]) == i) and (set == False): byte_string = byte_string + '1' set = True if set == False: byte_string = byte_string + '0' return (pack('B', int(byte_string, 2))) def on_off_toggle(self, cmd, channel_id): ''' Expected by the server <STX><6><CMD_...><channels><CHECKSUM><ETX> channel bits 7...0 = channels 8...1 ; bit=0 no change ; bit=1 switch channel @param cmd: works both with the output status and the timer. ''' if isinstance(channel_id, list): change = self.string_of_change_list(channel_id) else: change = self.string_of_change(channel_id) packet = self.tcp_handler.encode(self, cmd, change, channel_id) self.socket.send(packet) # If and only if the status has changed, a CMD_STATUS is send by the # server. But this we do not know, so we set a timeout and wait... self.socket.settimeout(3.0) try: #self.display.add_tcp_msg('Waiting for CMD_STATUS') #self.receive_status_of_channels() self.display.add_tcp_msg('Waiting for CMD_NAME') self.receive_names_of_channels() except timeout as e: self.display.add_tcp_msg('Timeout -> channel unchanged') except Exception as e: self.display.add_tcp_msg('Error: unknown') raise e # else: # self.display.add_tcp_msg(packet.split()) def pulse(self, channel_id): ''' Expected by the server <STX><8><CMD_PULSE><channels><pulsetime><units><CHECKSUM><ETX> channel bits 7...0 = channels 8...1 ; bit=0 no change ; bit=1 pulse channel pulse time: 1...99 units: 's'= seconds; 'm' = minutes; 'h' = hours ''' return None def timer_on_off_toggle(self, cmd, channel_id): ''' Expected by the server <STX><6><CMD_TMR_ENA><channels><CHECKSUM><ETX> channel bits 7...0 = channels 8...1 ; bit=0 no change ; bit=1 switch channel ON ''' return None def disconnect(self): ''' Expected by the server <STX><5><CMD_CLOSED><CHECKSUM><ETX> ''' packet = self.tcp_handler.encode(self, 'CMD_CLOSED') self.socket.send(packet) length = self.commands['LEN_CMD_CLOSED'] packet = self.socket.recv(length) self.tcp_handler.decode(self, packet) self.socket.close() self.display.add_tcp_msg('Socket Closed.') exit()
def __activate(self): from Printer import Printer Printer(self.__manager, self.__editor).show() return False
# -*- coding: utf-8 -*- """ - author: Lkeme - contact: [email protected] - file: RestrictRequests - time: 2019/9/18 12:46 - desc: 多任务协程下的请求限流(基础模型-理论数据) """ import traceback import aiohttp import asyncio import time from Printer import Printer from uuid import uuid4 printer = Printer() # 生成获取令牌 def generate_verify_token(): return str(uuid4()).replace('-', '') class RestrictRequests: def __init__(self): self.proxy_api = "8.8.8.8" # 全局session self.ssion = {} # 工作队列 self.req_work_list = [] self.req_done_dict = {}
class Graph(QtOpenGL.QGLWidget): ''' *********************************************************** The options for the screen showing *********************************************************** ''' GRAPH_ONE = 0 GRAPH_TWO = 1 BADGE_SCREEN = 2 def __init__(self, width, height): # Base constructor QtOpenGL.QGLWidget.__init__(self) self.setMouseTracking(True) # Load the printer self.printer = Printer() # Load the other OpenGL screens ''' *********************************************************** New Class *********************************************************** ''' self.badgeScreen = BadgeScreen(width, height, self.printer) # Set the attributes self.showing = 2 self.width = width self.height = height self.rectSize = 33.5 # self.rectSize = 28.00 self.gridCols = 0 self.gridRows = 0 self.grid = None # Create the buttons self.btnGraph1 = Button(u"\u25c4", 10, 15, 100, 50) self.btnGraph2 = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.btnGraph3 = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.btnGraph4 = Button(u"\u25c4", 10, 15, 100, 50) self.btnGraph1.disable() self.btnGraph3.disable() self.btnGraph4.disable() # The labels self.ube = 0 self.ld = 0 self.high = 0 self.medium = 0 self.low = 0 self.timeEvent =[] # Calculate the proportions self.heightFivePercent = self.height * 0.05 self.graphPadding = 5; self.rectPadding = 2; self.titleHeight = self.height * 0.1 self.graphX = self.width * 0.02 self.graphY = self.titleHeight * 2 self.graphWidth = self.width * 0.60 self.graphHeight = self.height * 0.7 self.dsmX = self.width * 0.64 self.dsmY = self.height * 0.5 self.dsmWidth = self.width * 0.35 self.dsmHeight = self.height * 0.4 self.lowRiskX = self.dsmX self.lowRiskY = self.graphY self.mediumRiskX = self.dsmX self.mediumRiskY = self.graphY + self.rectSize + 30 self.highRiskX = self.dsmX self.highRiskY = self.graphY + (self.rectSize * 2) + 60 self.pastNumbers = [22, 16, 52] self.currentNumbers = [12, 18, 30] # self.pastNumbersSum = self.pastNumbers[0] + self.pastNumbers[1] + self.pastNumbers[2] # self.currentNumbersSum = self.currentNumbers[0] + self.currentNumbers[1] + self.currentNumbers[2] # self.glancesGridMaxNum = self.pastNumbersSum if self.pastNumbersSum > self.currentNumbersSum else self.currentNumbersSum # self.glancesGridMaxNum = self.glancesGridMaxNum + 10 self.graph2HorPadding = 100 self.glancesGridPadding = 50 self.glancesGridTitleX = self.graph2HorPadding self.glancesGridTitleY = self.titleHeight + 10 self.glancesGridTitleWidth = (self.width - (self.graph2HorPadding * 3)) * 0.5 self.glancesGridTitleHeight = 70 self.glancesGridX = self.graph2HorPadding + 30 self.glancesGridY = self.glancesGridTitleY + self.glancesGridTitleHeight self.glancesGridWidth = self.glancesGridTitleWidth self.glancesGridHeight = (self.height - self.glancesGridY) - 70 self.glancesGridBarPaddingTop = 20 self.glancesGridBarWidth = (self.glancesGridWidth - (self.glancesGridPadding * 3)) / 2 self.glancesGridBarHeight = self.glancesGridHeight - self.glancesGridBarPaddingTop self.tripsTitleX = (self.graph2HorPadding*2) + self.glancesGridWidth self.tripsTitleY = self.glancesGridTitleY self.tripsTitleWidth = self.glancesGridTitleWidth self.tripsTitleHeight = self.glancesGridTitleHeight self.glanceNumTitleX = self.tripsTitleX self.glanceNumTitleY = self.tripsTitleY + self.tripsTitleHeight + 10 self.glanceNumTitleWidth = self.tripsTitleWidth self.glanceNumTitleHeight = self.tripsTitleHeight self.glanceNumPadding = 75 #53 self.glanceNumRadius = 18 self.glanceNumPaddingVer = 40 self.highIconX = self.glanceNumTitleX + self.glanceNumRadius + 90 self.highIconY = self.glanceNumTitleY + self.glanceNumTitleHeight + 50 self.highPastTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 4) + self.glanceNumRadius self.highPastTitleY = self.highIconY - self.glanceNumRadius self.highCurrentTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 7) + self.glanceNumRadius self.highCurrentTitleY = self.highPastTitleY self.mediumIconX = self.highIconX self.mediumIconY = self.highIconY + self.glanceNumRadius + self.glanceNumPaddingVer self.mediumPastTitleX = self.highPastTitleX self.mediumPastTitleY = self.highPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer self.mediumCurrentTitleX = self.highCurrentTitleX self.mediumCurrentTitleY = self.mediumPastTitleY self.lowIconX = self.highIconX self.lowIconY = self.mediumIconY + self.glanceNumRadius + self.glanceNumPaddingVer self.lowPastTitleX = self.mediumPastTitleX self.lowPastTitleY = self.mediumPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer self.lowCurrentTitleX = self.highCurrentTitleX self.lowCurrentTitleY = self.lowPastTitleY self.totalTitleX = self.glanceNumTitleX + 70 self.totalTitleY = self.lowIconY + 40 self.totalPastTitleX = self.mediumPastTitleX self.totalPastTitleY = self.totalTitleY self.totalCurrentTitleX = self.mediumCurrentTitleX self.totalCurrentTitleY = self.totalTitleY self.safetyMetricsTitleX = self.glanceNumTitleX self.safetyMetricsTitleY = self.glanceNumTitleY + 450 #330 self.safetyMetricsTitleWidth = self.glanceNumTitleWidth self.safetyMetricsTitleHeight = self.glanceNumTitleHeight self.safeEventTitleX = self.safetyMetricsTitleX + 30 self.safeEventTitleY = self.safetyMetricsTitleY + self.safetyMetricsTitleHeight + 10 self.safeEventPastNumTitleX = self.mediumPastTitleX self.safeEventPastNumTitleY = self.safeEventTitleY self.safeEventCurrentNumTitleX = self.mediumCurrentTitleX self.safeEventCurrentNumTitleY = self.safeEventTitleY self.unsafeEventTitleX = self.safeEventTitleX self.unsafeEventTitleY = self.safeEventTitleY + 50 self.unsafeEventPastNumTitleX = self.mediumPastTitleX self.unsafeEventPastNumTitleY = self.unsafeEventTitleY self.unsafeEventCurrentNumTitleX = self.mediumCurrentTitleX self.unsafeEventCurrentNumTitleY = self.unsafeEventTitleY self.deviationsEventTitleX = self.safeEventTitleX self.deviationsEventTitleY = self.unsafeEventTitleY + 50 self.deviationsEventPastNumTitleX = self.mediumPastTitleX self.deviationsEventPastNumTitleY = self.deviationsEventTitleY self.deviationsEventCurrentNumTitleX = self.mediumCurrentTitleX self.deviationsEventCurrentNumTitleY = self.deviationsEventTitleY def initializeGL(self): # Initialize the context gl.glClearColor(1.0, 1.0, 1.0, 1) gl.glEnable(gl.GL_LINE_STIPPLE) #glEnable (GL_BLEND); #glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ''' *********************************************************** Enable textures *********************************************************** ''' gl.glEnable(gl.GL_TEXTURE_2D) self.badgeScreen.init(self.parID,self.gender) # Use the fixed pipeline # Resize the window self.resizeGL(self.width, self.height) def resizeGL(self, width, height): # Update the attributes self.width = width self.height = height # Set up the viewport gl.glViewport(0, 0, width, height) # Set up an orthographic view gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() gl.glOrtho(0, self.width, self.height, 0, -1, 1) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadIdentity() def mouseMoveEvent(self, event): self.btnGraph1.update(event.x(), event.y()) self.btnGraph2.update(event.x(), event.y()) self.btnGraph3.update(event.x(), event.y()) self.btnGraph4.update(event.x(), event.y()) self.repaint() def mousePressEvent(self, event): if self.btnGraph4.isMouseOver() == True: self.showing = self.GRAPH_ONE self.btnGraph1.enable() self.btnGraph2.disable() self.btnGraph3.enable() self.btnGraph4.disable() self.repaint() if self.btnGraph3.isMouseOver() == True: self.showing = self.GRAPH_TWO self.btnGraph1.disable() self.btnGraph2.disable() self.btnGraph3.disable() self.btnGraph4.enable() self.repaint() if self.btnGraph2.isMouseOver() == True: self.showing = self.GRAPH_ONE self.btnGraph1.enable() self.btnGraph2.disable() if self.enableButton == True: self.btnGraph3.enable() else: self.btnGraph3.disable() self.btnGraph4.disable() self.repaint() if self.btnGraph1.isMouseOver() == True: self.showing = self.BADGE_SCREEN self.btnGraph1.disable() self.btnGraph2.enable() self.btnGraph3.disable() self.btnGraph4.disable() self.repaint() def createGraph(self, parID, rows, cols): self.parID = parID.split("_")[0]+"_"+parID.split("_")[1] self.gridRows = rows self.gridCols = cols self.grid = [[0 for x in range(cols)] for x in range(rows)] self.ube = 0 self.ld = 0 self.high = 0 self.medium = 0 self.low = 0 numRows = 900 # Variables: Counters to keep track of values listValues = [] gridValues = [] lowCount = 0 warnCount = 0 dangerCount = 0 unsafEvent = 0 bbTime = 0 # <1.2s timeCollision = 0 # <1.5s laneDepart = 0 # <-5 numCollision = 0 # >1 accelCount = 0 # < -19.3 ft/s**2 lineCount = 0 timeUBE = [] # keeps track of where unsafe breaking events timeLOG = [] # keeps track of where log events happen logEvent = [] # keeps track of where log events and unsave event happen ldEvent = [] isLaneDepart = False isAccel = False isCollisiton = False receiverData = np.genfromtxt('../../participantData/Gamification/%s_data.csv'%self.parID, delimiter=',') netclientData = np.genfromtxt('../../participantData/Gamification/%s_net.csv'%self.parID, delimiter=',') # Reading Receiver Data for i in range(len(receiverData)): # Counting for Number of Collisions if float(receiverData[i,2]) > 1: numCollision += 1 # Counting for Lane Deviation if float(receiverData[i,4]) < -2.7 or float(receiverData[i,4]) > 5.0: isLaneDepart = True if isLaneDepart == True and (float(receiverData[i,4]) >= -2.7 and float(receiverData[i,4]) <= 5.0): isLaneDepart = False laneDepart += 1 ldEvent.append(receiverData[i,0]) # # Code to include the acceleration based on the LogStream for k in range(int(np.max(receiverData[:,1])+1)): a = receiverData[receiverData[:,1]==k] a = a[0:900,:] if k != 0: timeLOG.append(a[0,0]) for l in range(len(a)): # Counting for Acceleration if float(a[l,10]) < -19.3 or (float(a[l,8]) <1.5 and float(a[l,8]) !=0): timeUBE.append(a[l,0]) logEvent.append(int(a[l,1])) unsafEvent += 1 break # timeLOG.append(receiverData[len(receiverData)-1,0]) self.ube = unsafEvent self.ld += laneDepart # This will take when the log stream happens self.timeEvent = (timeLOG-receiverData[0,0])/(receiverData[len(receiverData)-1,0] - receiverData[0,0]) self.logStreamEvent = logEvent self.deviationEvent = (ldEvent-receiverData[0,0])/(receiverData[len(receiverData)-1,0] - receiverData[0,0]) # Reading Netclient Data for j in range(len(netclientData)): lineCount += 1 # Counting for Warning, Danger, and Low Glances if float(netclientData[j,5]) == 1: warnCount += 1 if float(netclientData[j,6]) == 1: dangerCount += 1 if float(netclientData[j,8]) == 1: lowCount += 1 if lineCount == numRows or j == range(len(netclientData))[-1]: column = [3 for x in range(dangerCount)] + [2 for x in range(warnCount)] + [1 for x in range(lowCount)] if len(column) > self.gridRows: column = column[0:self.gridRows] elif len(column) < self.gridRows: column = column + [0 for x in range(self.gridRows-len(column))] gridValues.append(column) self.high += dangerCount self.medium += warnCount self.low += lowCount # Reset all variables lineCount = 0 lowCount = 0 warnCount = 0 dangerCount = 0 self.grid = np.zeros((self.gridRows, self.gridCols)) minLength = len(gridValues) if self.gridCols > len(gridValues) else self.gridCols for i in range(minLength): gridValues[i].reverse() self.grid[:,i] = np.array(gridValues[i]) # Saving drives to a file driver = parID.split("_") if os.path.exists('../../participantData/Gamification/%s_drives.csv'%driver[0]): driverData = np.genfromtxt('../../participantData/Gamification/%s_drives.csv'%driver[0], delimiter=',') if len(driverData.shape) == 1: if str(driver[2]) == "m" or str(driver[2]) == "M": self.gender = 0 else: self.gender = 1 # else: self.gender = driverData[1,-1] with open('../../participantData/Gamification/%s_drives.csv'%driver[0],'ab') as csvfile: toFile = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_MINIMAL) toFile.writerow(['%d'%self.high,'%d'%self.medium,'%d'%self.low,'%d'%self.ld,'%s'%self.ube,'%d'%(8-self.ube),'%d'%self.gender]) # Using file to determine comparison screen driverData = np.genfromtxt('../../participantData/Gamification/%s_drives.csv'%driver[0], delimiter=',') if len(driverData.shape) == 1: self.enableButton = False driverData = np.array([driverData]) else: self.enableButton = True self.pastNumbers = map(int,driverData[-2,0:3].tolist()) self.currentNumbers = map(int,driverData[-1,0:3].tolist()) self.compLane = map(int,driverData[-2:,3].tolist()) self.compUnsafe = map(int,driverData[-2:,4].tolist()) self.compSafe = map(int,driverData[-2:,5].tolist()) self.pastNumbersSum = self.pastNumbers[0] + self.pastNumbers[1] + self.pastNumbers[2] self.currentNumbersSum = self.currentNumbers[0] + self.currentNumbers[1] + self.currentNumbers[2] self.glancesGridMaxNum = self.pastNumbersSum if self.pastNumbersSum > self.currentNumbersSum else self.currentNumbersSum self.glancesGridMaxNum = int(math.ceil(self.glancesGridMaxNum/10.0) * 10) def paintLine(self, x1, y1, x2, y2, width, red = 0, green = 0, blue = 0): gl.glColor3f(red, green, blue) gl.glBegin(gl.GL_QUADS) gl.glVertex2f(x1, y1)#+70 gl.glVertex2f(x1 + width+2, y1) gl.glVertex2f(x2 + width+2, y2-10) gl.glVertex2f(x2, y2-10) gl.glEnd() ''' *********************************************************** New Function *********************************************************** ''' def paintLineHorizontal(self, x1, y1, x2, y2, width = 1, red = 0, green = 0, blue = 0): top = math.ceil(width/2.0) bottom = math.floor(width/2.0) gl.glColor3f(red, green, blue) gl.glBegin(gl.GL_QUADS) gl.glVertex2f(x1, y1 - top) gl.glVertex2f(x2, y2 - top) gl.glVertex2f(x2, y2 + bottom) gl.glVertex2f(x1, y1 + bottom) gl.glEnd(); def paintRect(self, x, y, red, green, blue): # Draw the background of the rectangle gl.glColor3f(red, green, blue) gl.glBegin(gl.GL_QUADS) gl.glVertex2f(x, y) gl.glVertex2f(x + self.rectSize, y) gl.glVertex2f(x + self.rectSize, y + self.rectSize) gl.glVertex2f(x, y + self.rectSize) gl.glEnd() # Revert the drawing mode gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL) def paintGrid(self): # Draw the border of the grid gl.glColor3f(0.9, 0.9, 0.9) gl.glLineWidth(2.0) # gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE) gl.glBegin(gl.GL_QUADS); gl.glVertex2f(self.graphX, self.graphY) gl.glVertex2f(self.graphX + self.graphWidth, self.graphY) gl.glVertex2f(self.graphX + self.graphWidth, self.graphY + self.graphHeight) gl.glVertex2f(self.graphX, self.graphY + self.graphHeight) gl.glEnd() gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL) moveX = self.graphWidth - (self.graphPadding * 2) - ((self.gridCols * self.rectSize) + (self.rectPadding * (self.gridCols))) moveY = self.graphHeight - (self.graphPadding * 2) - ((self.gridRows * self.rectSize) + (self.rectPadding * (self.gridRows))) # Draw the background lines numLines = int(self.gridRows/5) gl.glBegin(gl.GL_LINES) baseY = ((self.graphY + self.graphHeight) - self.graphPadding) fiveRects = (5 * self.rectSize) + (5 * self.rectPadding) for i in range(numLines): gl.glVertex2f(self.graphX, baseY - ((i+1) * fiveRects) - 1) gl.glVertex2f(self.graphX + self.graphWidth, baseY - ((i+1) * fiveRects) - 1) gl.glEnd() # Draw the event lines for i in range(len(self.timeEvent)): xposition = self.graphX + (self.timeEvent[i] * (((self.gridCols * self.rectSize) + (2 * self.graphPadding)) - ((self.gridCols + 1) * self.rectPadding))) if xposition < (self.graphX + self.graphWidth): if int(i+1) in self.logStreamEvent: self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 1.0, 0.0, 0.0) # Red else: self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 0.16, 0.76, 0.13) # Green # Drawing lane deviation lines for i in range(len(self.deviationEvent)): xposition = self.graphX + (self.deviationEvent[i] * (((self.gridCols * self.rectSize) + (2 * self.graphPadding)) - ((self.gridCols + 1) * self.rectPadding))) if xposition < (self.graphX + self.graphWidth): # self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 1.0, 0.6, 1.0) self.paintLine(xposition, self.graphY, xposition, self.graphY + self.graphHeight, 2, 0.0, 0.0, 0.0) # Fill the grid gl.glLineWidth(2.0) for r, i in enumerate(self.grid): for c, v in enumerate(i): if v > 0: rectx = self.graphX + self.graphPadding + (self.rectPadding * c) + (c * self.rectSize) recty = self.graphY + self.graphPadding + moveY + (self.rectPadding * r) + (r * self.rectSize) if v == 1: self.paintRect(rectx, recty, 0.7, 0.7, 0.7) elif v == 2: self.paintRect(rectx, recty, 0.9412, 0.6784, 0.3059) elif v == 3: self.paintRect(rectx, recty, 0.851, 0.3255, 0.3099) def paintDSM(self): # Draw the border gl.glColor3f(0.9, 0.9, 0.9) gl.glLineWidth(2.0) # gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE) gl.glBegin(gl.GL_QUADS); gl.glVertex2f(self.dsmX, self.dsmY) gl.glVertex2f(self.dsmX + self.dsmWidth, self.dsmY) gl.glVertex2f(self.dsmX + self.dsmWidth, self.dsmY + self.dsmHeight) gl.glVertex2f(self.dsmX, self.dsmY + self.dsmHeight) gl.glEnd() gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL) # Adding legend self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 100, self.dsmX + 50, self.dsmY + 100, 10, 0.16, 0.76, 0.13) self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 230, self.dsmX + 50, self.dsmY + 230, 10, 1.00, 0.00, 0.00) self.paintLineHorizontal(self.dsmX + 5, self.dsmY + 350, self.dsmX + 50, self.dsmY + 350, 10, 0.00, 0.00, 0.00) def paintCircle(self, x, y, radius, red = 0, green = 0, blue = 0): gl.glColor3f(red, green, blue) gl.glBegin(gl.GL_POLYGON) for i in range(360): gl.glVertex2f(x + (radius * math.sin(math.radians(i))), y + (radius * math.cos(math.radians(i)))) gl.glEnd() def paintEvent(self, event): gl.glClear(gl.GL_COLOR_BUFFER_BIT) gl.glLoadIdentity(); # Initialize the painter painter = QtGui.QPainter() painter.begin(self) ''' *********************************************************** Changed the if statement Bind the texture to nothing *********************************************************** ''' gl.glBindTexture(gl.GL_TEXTURE_2D, 0) if self.showing == self.GRAPH_ONE: # Get the bounding rectangles tripEndBR = self.printer.getTextBox(painter, "Trip End", self.printer.fontNormal) # Draw OpenGL stuff self.paintGrid() self.paintDSM() self.paintRect(self.highRiskX, self.highRiskY, 0.851, 0.3255, 0.3099) self.paintRect(self.mediumRiskX, self.mediumRiskY, 0.9412, 0.6784, 0.3059) self.paintRect(self.lowRiskX, self.lowRiskY, 0.7, 0.7, 0.7) self.btnGraph1.drawBackground() self.btnGraph3.drawBackground() # Draw painter stuff self.printer.printCentered(painter, "Trip Summary", self.printer.fontXLarge, 0, 0, self.width, self.titleHeight, 50, 50, 50) self.printer.printCentered(painter, "Glance Patterns to the Display", self.printer.fontLarge, self.graphX, self.graphY - 60, self.graphWidth, self.heightFivePercent, 50, 50, 50) self.printer.printText(painter, "Trip Start", self.printer.fontNormal, self.graphX, self.graphY + self.graphHeight, self.width, self.height, 50, 50, 50) self.printer.printText(painter, "Trip End", self.printer.fontNormal, self.graphX + self.graphWidth - tripEndBR.right(), self.graphY + self.graphHeight, self.width, self.height, 50, 50, 50) self.printer.printCentered(painter, "Driving Safety Metrics", self.printer.fontLarge, self.dsmX, self.dsmY, self.dsmWidth, self.heightFivePercent, 50, 50, 50) # self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 70, self.dsmWidth - 60, self.dsmHeight, 50, 50, 50) self.printer.printTextWrap(painter, " %i"%(8-self.ube), self.printer.fontNormal, self.dsmX + 50, self.dsmY + 70, self.dsmWidth - 30, self.dsmHeight, 40, 193, 34) self.printer.printTextWrap(painter, " out of 8 safe responses to lead vehicle braking", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 70, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50) # self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50) self.printer.printTextWrap(painter, " %i"%self.ube, self.printer.fontNormal, self.dsmX + 50, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 255, 0, 0) self.printer.printTextWrap(painter, " out of 8 unsafe responses to lead vehicle braking", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 200, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50) # self.printer.printTextWrap(painter, u"\u2022", self.printer.fontSmall, self.dsmX + 10, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50) self.printer.printTextWrap(painter, " %i"%self.ld, self.printer.fontNormal, self.dsmX + 50, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 255, 0, 0)#255, 153, 255) self.printer.printTextWrap(painter, " lane departures", self.printer.fontNormal, self.dsmX + 50, self.dsmY + 330, self.dsmWidth - 30, self.dsmHeight, 50, 50, 50) self.printer.printText(painter, str(int(self.low)), self.printer.fontNormal, self.lowRiskX + self.rectSize + 16, self.lowRiskY, self.width, self.height) self.printer.printText(painter, str(int(self.medium)), self.printer.fontNormal, self.mediumRiskX + self.rectSize + 16, self.mediumRiskY, self.width, self.height) self.printer.printText(painter, str(int(self.high)), self.printer.fontNormal, self.highRiskX + self.rectSize + 16, self.highRiskY, self.width, self.height) self.printer.printText(painter, "Low Risk Glances", self.printer.fontNormal, self.lowRiskX + self.rectSize + 150, self.lowRiskY, self.width, self.height) self.printer.printText(painter, "Medium Risk Glances", self.printer.fontNormal, self.mediumRiskX + self.rectSize + 150, self.mediumRiskY, self.width, self.height) self.printer.printText(painter, "High Risk Glances", self.printer.fontNormal, self.highRiskX + self.rectSize + 150, self.highRiskY, self.width, self.height) self.btnGraph1.drawText(painter, self.printer, self.printer.fontLarge) self.btnGraph3.drawText(painter, self.printer, self.printer.fontLarge) elif self.showing == self.GRAPH_TWO: self.paintCircle(self.lowIconX, self.lowIconY, self.glanceNumRadius, 0.851, 0.325, 0.31) self.paintCircle(self.mediumIconX, self.mediumIconY, self.glanceNumRadius, 0.941, 0.678, 0.305) self.paintCircle(self.highIconX, self.highIconY, self.glanceNumRadius, 0.5, 0.5, 0.5) self.btnGraph4.drawBackground() ''' *********************************************************** Removed the gl.GL_LINES block Added the paintLineHorizontal functions *********************************************************** ''' self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridBarPaddingTop, self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridBarPaddingTop, 2, 0.3, 0.3, 0.3) self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridBarPaddingTop + (self.glancesGridBarHeight/2.0), self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridBarPaddingTop + (self.glancesGridBarHeight/2.0), 2, 0.3, 0.3, 0.3) self.paintLineHorizontal(self.glancesGridX, self.glancesGridY + self.glancesGridHeight, self.glancesGridX + self.glancesGridWidth, self.glancesGridY + self.glancesGridHeight, 2, 0.3, 0.3, 0.3) gl.glBegin(gl.GL_QUADS) gl.glColor3f(0.5, 0.5, 0.5) gl.glVertex2f(self.glancesGridX, self.glancesGridTitleY) gl.glVertex2f(self.glancesGridX + self.glancesGridWidth, self.glancesGridTitleY) gl.glVertex2f(self.glancesGridX + self.glancesGridWidth, self.glancesGridTitleY + self.glancesGridTitleHeight) gl.glVertex2f(self.glancesGridX, self.glancesGridTitleY + self.glancesGridTitleHeight) gl.glVertex2f(self.tripsTitleX, self.tripsTitleY) gl.glVertex2f(self.tripsTitleX + self.tripsTitleWidth, self.tripsTitleY) gl.glVertex2f(self.tripsTitleX + self.tripsTitleWidth, self.tripsTitleY + self.tripsTitleHeight) gl.glVertex2f(self.tripsTitleX, self.tripsTitleY + self.tripsTitleHeight) # Safety metric text block gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY-60) gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY-60) gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight-60) gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight-60) # Comparison Bars -- COLOR # gl.glColor3f(0.67, 0.78, 0.82) gl.glColor3f(0.576, 0.72, 0.85) barOffset = self.glancesGridBarHeight - ((float(self.pastNumbersSum) / float(self.glancesGridMaxNum)) * self.glancesGridBarHeight) gl.glVertex2f(self.glancesGridX + self.glancesGridPadding, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop) gl.glVertex2f(self.glancesGridX + self.glancesGridPadding + self.glancesGridBarWidth, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop) gl.glVertex2f(self.glancesGridX + self.glancesGridPadding + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight) gl.glVertex2f(self.glancesGridX + self.glancesGridPadding, self.glancesGridY + self.glancesGridHeight) # gl.glColor3f(0.576, 0.65, 0.9) barOffset = self.glancesGridBarHeight - ((float(self.currentNumbersSum) / float(self.glancesGridMaxNum)) * self.glancesGridBarHeight) gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + barOffset + self.glancesGridBarPaddingTop) gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + (self.glancesGridBarWidth*2), self.glancesGridY + barOffset + self.glancesGridBarPaddingTop) gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + (self.glancesGridBarWidth*2), self.glancesGridY + self.glancesGridHeight) gl.glVertex2f(self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight) gl.glColor3f(0.7, 0.7, 0.7) gl.glVertex2f(self.glanceNumTitleX, self.glanceNumTitleY) gl.glVertex2f(self.glanceNumTitleX + self.glanceNumTitleWidth, self.glanceNumTitleY) gl.glVertex2f(self.glanceNumTitleX + self.glanceNumTitleWidth, self.glanceNumTitleY + self.glanceNumTitleHeight) gl.glVertex2f(self.glanceNumTitleX, self.glanceNumTitleY + self.glanceNumTitleHeight) gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY+20) gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY+20) gl.glVertex2f(self.safetyMetricsTitleX + self.safetyMetricsTitleWidth, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight+20) gl.glVertex2f(self.safetyMetricsTitleX, self.safetyMetricsTitleY + self.safetyMetricsTitleHeight+20) gl.glEnd() bottomBar = self.glancesGridY + self.glancesGridHeight self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.5, 0.5, 0.5) self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.941, 0.678, 0.305) self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.851, 0.325, 0.31) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.5, 0.5, 0.5) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.941, 0.678, 0.305) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 18, 0.851, 0.325, 0.31) self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.5, 0.5, 0.5) self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.941, 0.678, 0.305) self.paintLineHorizontal(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 10, 0.851, 0.325, 0.31) self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.paintCircle(self.glancesGridX + self.glancesGridPadding + (self.glancesGridBarWidth/2.0), bottomBar - ((self.pastNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[2]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[1]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.paintCircle(self.glancesGridX + self.glancesGridBarWidth + (self.glancesGridPadding*2) + (self.glancesGridBarWidth/2.0), bottomBar - ((self.currentNumbers[0]/float(self.glancesGridMaxNum))*self.glancesGridBarHeight), 8, 1.0, 1.0, 1.0) self.printer.printCentered(painter, "Compare Recent Trips", self.printer.fontXLarge, 0, 0, self.width, self.titleHeight, 50, 50, 50) self.printer.printCentered(painter, "Glances to Display", self.printer.fontLarge, self.glancesGridTitleX, self.glancesGridTitleY, self.glancesGridTitleWidth, self.glancesGridTitleHeight, 240, 240, 240) self.printer.printCentered(painter, "Number of Glances", self.printer.fontLarge, self.tripsTitleX, self.tripsTitleY, self.tripsTitleWidth, self.tripsTitleHeight, 240, 240, 240) self.printer.printCentered(painter, "Trips:\t\t\t\tPrevious\t\t\t\tCurrent", self.printer.fontLarge, self.glanceNumTitleX, self.glanceNumTitleY, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240) self.printer.printCentered(painter, "Safety Metrics", self.printer.fontLarge, self.safetyMetricsTitleX, self.safetyMetricsTitleY-60, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240) self.printer.printCentered(painter, "Trips:\t\t\t\tPrevious\t\t\t\tCurrent", self.printer.fontLarge, self.safetyMetricsTitleX, self.safetyMetricsTitleY+20, self.glanceNumTitleWidth, self.glanceNumTitleHeight, 240, 240, 240) self.printer.printCenteredHor(painter, str(self.glancesGridMaxNum), self.printer.fontNormal, 0, self.glancesGridY + 3, self.glancesGridX, 100, 40, 40, 40) self.printer.printCenteredHor(painter, str(int(self.glancesGridMaxNum/2.0)), self.printer.fontNormal, 0, self.glancesGridY + 3 + (self.glancesGridBarHeight/2.0), self.glancesGridX, 100, 40, 40, 40) self.printer.printCenteredHor(painter, "0", self.printer.fontNormal, 0, self.glancesGridY + self.glancesGridHeight - 20, self.glancesGridX, 100, 40, 40, 40) self.printer.printCenteredHor(painter, "Previous", self.printer.fontNormal, self.glancesGridX + self.glancesGridPadding, self.glancesGridY + self.glancesGridHeight, self.glancesGridBarWidth, 100, 40, 40, 40) self.printer.printCenteredHor(painter, "Current", self.printer.fontNormal, self.glancesGridX + (self.glancesGridPadding*2) + self.glancesGridBarWidth, self.glancesGridY + self.glancesGridHeight, self.glancesGridBarWidth, 100, 40, 40, 40) self.printer.printText(painter, str(self.pastNumbers[2]), self.printer.fontNormal, self.highPastTitleX+40, self.highPastTitleY, self.width, self.height) self.printer.printText(painter, str(self.currentNumbers[2]), self.printer.fontNormal, self.highCurrentTitleX+45, self.highCurrentTitleY, self.width, self.height) self.printer.printText(painter, str(self.pastNumbers[1]), self.printer.fontNormal, self.mediumPastTitleX+40, self.mediumPastTitleY, self.width, self.height) self.printer.printText(painter, str(self.currentNumbers[1]), self.printer.fontNormal, self.mediumCurrentTitleX+45, self.mediumCurrentTitleY, self.width, self.height) self.printer.printText(painter, str(self.pastNumbers[0]), self.printer.fontNormal, self.lowPastTitleX+40, self.lowPastTitleY, self.width, self.height) self.printer.printText(painter, str(self.currentNumbers[0]), self.printer.fontNormal, self.lowCurrentTitleX+45, self.lowCurrentTitleY, self.width, self.height) self.printer.printText(painter, "Total", self.printer.fontNormal, self.totalTitleX, self.totalTitleY+20, self.width, self.height) self.printer.printText(painter, str(self.pastNumbersSum), self.printer.fontNormal, self.totalPastTitleX+40, self.totalPastTitleY+20, self.width, self.height) self.printer.printText(painter, str(self.currentNumbersSum), self.printer.fontNormal, self.totalCurrentTitleX+45, self.totalCurrentTitleY+20, self.width, self.height) self.printer.printText(painter, "Safe Braking", self.printer.fontNormal, self.safeEventTitleX, self.safeEventTitleY+40, self.width, self.height, 40, 193, 34) self.printer.printText(painter, "%s"%str(self.compSafe[0]), self.printer.fontNormal, self.safeEventPastNumTitleX+40, self.safeEventPastNumTitleY+40, self.width, self.height) self.printer.printText(painter, "%s"%str(self.compSafe[1]), self.printer.fontNormal, self.safeEventCurrentNumTitleX+45, self.safeEventCurrentNumTitleY+40, self.width, self.height) self.printer.printText(painter, "Unsafe Braking", self.printer.fontNormal, self.unsafeEventTitleX, self.unsafeEventTitleY+55, self.width, self.height, 217, 83, 79) self.printer.printText(painter, "%s"%str(self.compUnsafe[0]), self.printer.fontNormal, self.unsafeEventPastNumTitleX+40, self.unsafeEventPastNumTitleY+55, self.width, self.height) self.printer.printText(painter, "%s"%str(self.compUnsafe[1]), self.printer.fontNormal, self.unsafeEventCurrentNumTitleX+45, self.unsafeEventCurrentNumTitleY+55, self.width, self.height) self.printer.printText(painter, "Lane Departures", self.printer.fontNormal, self.deviationsEventTitleX, self.deviationsEventTitleY+70, self.width, self.height, 217, 83, 79) self.printer.printText(painter, "%s"%str(self.compLane[0]), self.printer.fontNormal, self.deviationsEventPastNumTitleX+40, self.deviationsEventPastNumTitleY+70, self.width, self.height) self.printer.printText(painter, "%s"%str(self.compLane[1]), self.printer.fontNormal, self.deviationsEventCurrentNumTitleX+45, self.deviationsEventCurrentNumTitleY+70, self.width, self.height) self.btnGraph4.drawText(painter, self.printer, self.printer.fontLarge) elif self.showing == self.BADGE_SCREEN: self.btnGraph2.drawBackground() self.badgeScreen.draw(painter) self.btnGraph2.drawText(painter, self.printer, self.printer.fontLarge) # End the painter painter.end()
def on_gumbNatisni_clicked(self, p): if self.tiskalnik == None: self.tiskalnik = win32print.GetDefaultPrinter() p = win32print.OpenPrinter(self.tiskalnik) t = (win32print.GetPrinter(p, 2)["pDevMode"]) dpi = int(t.PrintQuality) if VERBOSE_NACIN: print "Pripravljam sliko za tiskalnik : " + self.tiskalnik nastavitve = ET.ElementTree(file=self._nastavitve).getroot() odmik_desni = int(nastavitve.find("odmiki/odmik_od_desnega_roba").text) odmik_levi = int(nastavitve.find("odmiki/odmik_od_levega_roba").text) visina = int(nastavitve.find("kuverte/visina").text) sirina = int(nastavitve.find("kuverte/sirina").text) velikost_mm = (sirina, visina) pisava_x = nastavitve.find("pisava").text spl = pisava_x.split(" ") pisava_size = font_size_to_pixel(int(spl[len(spl) - 1]), dpi) if pisava_x.rfind(",") != -1: pisava = pisava_x[0:pisava_x.rfind(",")] else: pisava = pisava_x[0:pisava_x.rfind(" ")] velikost_pix = (mm_to_pixel(velikost_mm[0], dpi), mm_to_pixel(velikost_mm[1], dpi)) odmik_desno = mm_to_pixel(odmik_desni, dpi) odmik_spodaj = mm_to_pixel(odmik_levi, dpi) razmik_vrstice = mm_to_pixel(2, dpi) # Priprava besedila p = Printer() u_datalist = [] if self.tiskanje_izbora: print "Tiskanje izbora..." inc = 0 for px in self.seznamUporabnikov: if px[5] == True: pom = {} for inc in range(0, len(self._kljuci)): if self._kljuci[inc] != None: po = self._kljuci[inc] pom[po] = px[inc] pom["pot"] = self.nakljucna_pot() u_datalist.append(pom) if not self.tiskanje_izbora: bes = self.u_data["m_naziv"] + " " + self.u_data[ "m_ime"] + "\n" + self.u_data[ "m_naslov"] + "\n" + "\n" + self.u_data["m_posta"] if self.u_data["m_drzava"] != "": bes + "\n" + self.u_data["m_drzava"] ims = p.narediPNGKuverto(besedilo=bes, pisava=pisava, velikost_pisave=pisava_size, visina=velikost_pix[1], sirina=velikost_pix[0], odmik_desno=odmik_desno, odmik_spodaj=odmik_spodaj, razmik_vrstice=razmik_vrstice, show_crte=self.kuv_show_crte) file_name = self.nakljucna_pot() if VERBOSE_NACIN: print "Shranjujem sliko na lokacijo : " + file_name ims.write_to_png(file_name) else: #tiskanje izobra for pa in u_datalist: bes = pa["m_naziv"] + " " + pa["m_ime"] + "\n" + pa[ "m_naslov"] + "\n" + "\n" + pa["m_posta"] if pa["m_drzava"] != "": bes + "\n" + pa["m_drzava"] ims = p.narediPNGKuverto(besedilo=bes, pisava=pisava, velikost_pisave=pisava_size, visina=velikost_pix[1], sirina=velikost_pix[0], odmik_desno=odmik_desno, odmik_spodaj=odmik_spodaj, razmik_vrstice=razmik_vrstice, show_crte=self.kuv_show_crte) if VERBOSE_NACIN: print "Pisem sliko : " + pa["pot"] ims.write_to_png(pa["pot"]) hDC = win32ui.CreateDC() hDC.CreatePrinterDC(self.tiskalnik) PHYSICALWIDTH = 110 PHYSICALHEIGHT = 111 PHYSICALOFFSETX = PHYSICALWIDTH + 2 PHYSICALOFFSETY = PHYSICALHEIGHT + 2 LOGPIXELSX = 88 LOGPIXELSY = 90 HORZRES = 8 VERTRES = 10 printable_area = hDC.GetDeviceCaps(HORZRES), hDC.GetDeviceCaps(VERTRES) printer_size = hDC.GetDeviceCaps(PHYSICALWIDTH), hDC.GetDeviceCaps( PHYSICALHEIGHT) printer_margins = hDC.GetDeviceCaps( PHYSICALOFFSETX), hDC.GetDeviceCaps(PHYSICALOFFSETY) hDC.StartDoc("Tiskanje nabora slik") if not self.tiskanje_izbora: bmp = Image.open(file_name) if self.rotacija != 0: bmp = bmp.rotate(self.rotacija) hDC.StartPage() dib = ImageWin.Dib(bmp) desna_poravnava = not False negativni_odmik = False odm_levo = 0 if desna_poravnava: odm_levo = (printer_size[0] - bmp.size[0]) x1 = (-1) * int(printer_margins[0]) + odm_levo y1 = (-1) * int((printer_size[1] - printable_area[1]) / 2) x2 = bmp.size[0] + (-1) * int( (printer_size[0] - printable_area[0]) / 2) + odm_levo y2 = bmp.size[1] + (-1) * int( (printer_size[1] - printable_area[1]) / 2) dib.draw(hDC.GetHandleOutput(), (x1, y1, x2, y2)) hDC.EndPage() else: for slika in u_datalist: bmp = Image.open(slika["pot"]) if self.rotacija != 0: bmp = bmp.rotate(self.rotacija) hDC.StartPage() dib = ImageWin.Dib(bmp) desna_poravnava = not False negativni_odmik = False odm_levo = 0 if desna_poravnava: odm_levo = (printer_size[0] - bmp.size[0]) x1 = (-1) * int(printer_margins[0]) + odm_levo y1 = (-1) * int((printer_size[1] - printable_area[1]) / 2) x2 = bmp.size[0] + (-1) * int( (printer_size[0] - printable_area[0]) / 2) + odm_levo y2 = bmp.size[1] + (-1) * int( (printer_size[1] - printable_area[1]) / 2) dib.draw(hDC.GetHandleOutput(), (x1, y1, x2, y2)) hDC.EndPage() hDC.EndDoc() hDC.DeleteDC() if VERBOSE_NACIN: print "Konec posiljanja slike v tiskalnik... " if VERBOSE_NACIN: print "Brisanje slik iz temp!" # Brisanje slik iz temp! if self.tiskanje_izbora: for slike in u_datalist: print "Brisem : " + slike["pot"] os.unlink(slike["pot"]) else: print "Brisem : " + file_name os.unlink(file_name)
def __init__(self, width, height): # Base constructor QtOpenGL.QGLWidget.__init__(self) self.setMouseTracking(True) # Load the printer self.printer = Printer() # Load the other OpenGL screens ''' *********************************************************** New Class *********************************************************** ''' self.badgeScreen = BadgeScreen(width, height, self.printer) # Set the attributes self.showing = 2 self.width = width self.height = height self.rectSize = 33.5 # self.rectSize = 28.00 self.gridCols = 0 self.gridRows = 0 self.grid = None # Create the buttons self.btnGraph1 = Button(u"\u25c4", 10, 15, 100, 50) self.btnGraph2 = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.btnGraph3 = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.btnGraph4 = Button(u"\u25c4", 10, 15, 100, 50) self.btnGraph1.disable() self.btnGraph3.disable() self.btnGraph4.disable() # The labels self.ube = 0 self.ld = 0 self.high = 0 self.medium = 0 self.low = 0 self.timeEvent =[] # Calculate the proportions self.heightFivePercent = self.height * 0.05 self.graphPadding = 5; self.rectPadding = 2; self.titleHeight = self.height * 0.1 self.graphX = self.width * 0.02 self.graphY = self.titleHeight * 2 self.graphWidth = self.width * 0.60 self.graphHeight = self.height * 0.7 self.dsmX = self.width * 0.64 self.dsmY = self.height * 0.5 self.dsmWidth = self.width * 0.35 self.dsmHeight = self.height * 0.4 self.lowRiskX = self.dsmX self.lowRiskY = self.graphY self.mediumRiskX = self.dsmX self.mediumRiskY = self.graphY + self.rectSize + 30 self.highRiskX = self.dsmX self.highRiskY = self.graphY + (self.rectSize * 2) + 60 self.pastNumbers = [22, 16, 52] self.currentNumbers = [12, 18, 30] # self.pastNumbersSum = self.pastNumbers[0] + self.pastNumbers[1] + self.pastNumbers[2] # self.currentNumbersSum = self.currentNumbers[0] + self.currentNumbers[1] + self.currentNumbers[2] # self.glancesGridMaxNum = self.pastNumbersSum if self.pastNumbersSum > self.currentNumbersSum else self.currentNumbersSum # self.glancesGridMaxNum = self.glancesGridMaxNum + 10 self.graph2HorPadding = 100 self.glancesGridPadding = 50 self.glancesGridTitleX = self.graph2HorPadding self.glancesGridTitleY = self.titleHeight + 10 self.glancesGridTitleWidth = (self.width - (self.graph2HorPadding * 3)) * 0.5 self.glancesGridTitleHeight = 70 self.glancesGridX = self.graph2HorPadding + 30 self.glancesGridY = self.glancesGridTitleY + self.glancesGridTitleHeight self.glancesGridWidth = self.glancesGridTitleWidth self.glancesGridHeight = (self.height - self.glancesGridY) - 70 self.glancesGridBarPaddingTop = 20 self.glancesGridBarWidth = (self.glancesGridWidth - (self.glancesGridPadding * 3)) / 2 self.glancesGridBarHeight = self.glancesGridHeight - self.glancesGridBarPaddingTop self.tripsTitleX = (self.graph2HorPadding*2) + self.glancesGridWidth self.tripsTitleY = self.glancesGridTitleY self.tripsTitleWidth = self.glancesGridTitleWidth self.tripsTitleHeight = self.glancesGridTitleHeight self.glanceNumTitleX = self.tripsTitleX self.glanceNumTitleY = self.tripsTitleY + self.tripsTitleHeight + 10 self.glanceNumTitleWidth = self.tripsTitleWidth self.glanceNumTitleHeight = self.tripsTitleHeight self.glanceNumPadding = 75 #53 self.glanceNumRadius = 18 self.glanceNumPaddingVer = 40 self.highIconX = self.glanceNumTitleX + self.glanceNumRadius + 90 self.highIconY = self.glanceNumTitleY + self.glanceNumTitleHeight + 50 self.highPastTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 4) + self.glanceNumRadius self.highPastTitleY = self.highIconY - self.glanceNumRadius self.highCurrentTitleX = self.glanceNumTitleX + (self.glanceNumPadding * 7) + self.glanceNumRadius self.highCurrentTitleY = self.highPastTitleY self.mediumIconX = self.highIconX self.mediumIconY = self.highIconY + self.glanceNumRadius + self.glanceNumPaddingVer self.mediumPastTitleX = self.highPastTitleX self.mediumPastTitleY = self.highPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer self.mediumCurrentTitleX = self.highCurrentTitleX self.mediumCurrentTitleY = self.mediumPastTitleY self.lowIconX = self.highIconX self.lowIconY = self.mediumIconY + self.glanceNumRadius + self.glanceNumPaddingVer self.lowPastTitleX = self.mediumPastTitleX self.lowPastTitleY = self.mediumPastTitleY + self.glanceNumRadius + self.glanceNumPaddingVer self.lowCurrentTitleX = self.highCurrentTitleX self.lowCurrentTitleY = self.lowPastTitleY self.totalTitleX = self.glanceNumTitleX + 70 self.totalTitleY = self.lowIconY + 40 self.totalPastTitleX = self.mediumPastTitleX self.totalPastTitleY = self.totalTitleY self.totalCurrentTitleX = self.mediumCurrentTitleX self.totalCurrentTitleY = self.totalTitleY self.safetyMetricsTitleX = self.glanceNumTitleX self.safetyMetricsTitleY = self.glanceNumTitleY + 450 #330 self.safetyMetricsTitleWidth = self.glanceNumTitleWidth self.safetyMetricsTitleHeight = self.glanceNumTitleHeight self.safeEventTitleX = self.safetyMetricsTitleX + 30 self.safeEventTitleY = self.safetyMetricsTitleY + self.safetyMetricsTitleHeight + 10 self.safeEventPastNumTitleX = self.mediumPastTitleX self.safeEventPastNumTitleY = self.safeEventTitleY self.safeEventCurrentNumTitleX = self.mediumCurrentTitleX self.safeEventCurrentNumTitleY = self.safeEventTitleY self.unsafeEventTitleX = self.safeEventTitleX self.unsafeEventTitleY = self.safeEventTitleY + 50 self.unsafeEventPastNumTitleX = self.mediumPastTitleX self.unsafeEventPastNumTitleY = self.unsafeEventTitleY self.unsafeEventCurrentNumTitleX = self.mediumCurrentTitleX self.unsafeEventCurrentNumTitleY = self.unsafeEventTitleY self.deviationsEventTitleX = self.safeEventTitleX self.deviationsEventTitleY = self.unsafeEventTitleY + 50 self.deviationsEventPastNumTitleX = self.mediumPastTitleX self.deviationsEventPastNumTitleY = self.deviationsEventTitleY self.deviationsEventCurrentNumTitleX = self.mediumCurrentTitleX self.deviationsEventCurrentNumTitleY = self.deviationsEventTitleY
steppers["Y"].set_microstepping(2) steppers["Y"].set_steps_pr_mm(6.0) steppers["Z"] = Stepper("GPIO0_23", "GPIO0_26", "GPIO0_15", 2, "Z", None, 2, 2) steppers["Z"].set_microstepping(2) steppers["Z"].set_steps_pr_mm(160.0) steppers["E"] = Stepper("GPIO1_28", "GPIO1_15", "GPIO2_1", 3, "Ext1", None, 3, 3) steppers["E"].set_microstepping(2) steppers["E"].set_steps_pr_mm(5.0) steppers["H"] = Stepper("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "Ext2", None, 4, 4) steppers["H"].set_microstepping(2) steppers["H"].set_steps_pr_mm(5.0) printer = Printer() printer.steppers = steppers # Parse the config printer.config = CascadingConfigParser( ['/etc/redeem/default.cfg', '/etc/redeem/local.cfg']) # Get the revision from the Config file revision = printer.config.get('System', 'revision', "A4") dirname = os.path.dirname(os.path.realpath(__file__)) pru_firmware = PruFirmware(dirname + "/../firmware/firmware_runtime.p", dirname + "/../firmware/firmware_runtime.bin", dirname + "/../firmware/firmware_endstops.p",
def make_config_file(self): # Create a config file configFile_0 = os.path.join("/tmp", 'config.h') with open(configFile_0, 'w') as configFile: # GPIO banks banks = {"0": 0, "1": 0, "2": 0, "3": 0} step_banks = {"0": 0, "1": 0, "2": 0, "3": 0} dir_banks = {"0": 0, "1": 0, "2": 0, "3": 0} direction_mask = 0 # Define step and dir pins for name, stepper in self.printer.steppers.iteritems(): step_pin = str(stepper.get_step_pin()) step_bank = str(stepper.get_step_bank()) dir_pin = str(stepper.get_dir_pin()) dir_bank = str(stepper.get_dir_bank()) configFile.write('#define STEPPER_' + name + '_STEP_BANK\t\t' + "STEPPER_GPIO_"+step_bank+'\n') configFile.write('#define STEPPER_' + name + '_STEP_PIN\t\t' + step_pin+'\n') configFile.write('#define STEPPER_' + name + '_DIR_BANK\t\t' + "STEPPER_GPIO_"+dir_bank+'\n') configFile.write('#define STEPPER_' + name + '_DIR_PIN\t\t' + dir_pin+'\n') # Define direction direction = "0" if self.config.getint('Steppers', 'direction_' + name) > 0 else "1" configFile.write('#define STEPPER_'+ name +'_DIRECTION\t\t'+ direction +'\n') index = Printer.axis_to_index(name) direction_mask |= (int(direction) << index) # Generate the GPIO bank masks banks[step_bank] |= (1<<int(step_pin)) banks[dir_bank] |= (1<<int(dir_pin)) step_banks[step_bank] |= (1<<int(step_pin)) dir_banks[dir_bank] |= (1<<int(dir_pin)) configFile.write('#define DIRECTION_MASK '+bin(direction_mask)+'\n') configFile.write('\n') # Define end stop pins and banks for name, endstop in self.printer.end_stops.iteritems(): bank, pin = endstop.get_gpio_bank_and_pin() configFile.write('#define STEPPER_'+ name +'_END_PIN\t\t'+ str(pin) +'\n') configFile.write('#define STEPPER_'+ name +'_END_BANK\t\t'+ "GPIO_"+str(bank) +'_IN\n') configFile.write('\n') # Construct the end stop inversion mask inversion_mask = "#define INVERSION_MASK\t\t0b00" for name in ["Z2", "Y2", "X2", "Z1", "Y1", "X1"]: inversion_mask += "1" if self.config.getboolean('Endstops', 'invert_' + name) else "0" configFile.write(inversion_mask + "\n"); # Construct the endstop lookup table. for name, endstop in self.printer.end_stops.iteritems(): mask = 0 # stepper name is x_cw or x_ccw option = 'end_stop_' + name + '_stops' for stepper in self.config.get('Endstops', option).split(","): stepper = stepper.strip() if stepper == "": continue m = re.search('^([xyzehabc])_(ccw|cw|pos|neg)$', stepper) if (m == None): raise RuntimeError("'" + stepper + "' is invalid for " + option) # direction should be 1 for normal operation and -1 to invert the stepper. if (m.group(2) == "pos"): direction = -1 elif (m.group(2) == "neg"): direction = 1 else: direction = 1 if self.config.getint('Steppers', 'direction_' + stepper[0]) > 0 else -1 if (m.group(2) == "ccw"): direction *= -1 cur = 1 << ("xyzehabc".index(m.group(1))) if (direction == -1): cur <<= 8 mask += cur logging.debug("Endstop {0} mask = {1}".format(name, bin(mask))) bin_mask = "0b"+(bin(mask)[2:]).zfill(16) configFile.write("#define STEPPER_MASK_" + name + "\t\t" + bin_mask + "\n") configFile.write("\n"); # Put each dir and step pin in the proper buck if they are for GPIO0 or GPIO1 bank. # This is a restriction due to the limited capabilities of the pasm preprocessor. for name, bank in banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) configFile.write("#define GPIO"+name+"_MASK\t\t" +bin(bank)+ "\n"); #for name, bank in step_banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) # configFile.write("#define GPIO"+name+"_STEP_MASK\t\t" +bin(bank)+ "\n"); for name, bank in dir_banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) configFile.write("#define GPIO"+name+"_DIR_MASK\t\t" +bin(bank)+ "\n"); configFile.write("\n"); # Add end stop delay to the config file end_stop_delay = self.config.getint('Endstops', 'end_stop_delay_cycles') configFile.write("#define END_STOP_DELAY " +str(end_stop_delay)+ "\n"); return configFile_0
def setUp(self): self.printer = Printer(pages_per_second=2.0, capacity=300)
class Game: ''' This class represents the whole game. ''' def __init__(self): ''' Constructor ''' # logging.basicConfig(level=logging.DEBUG, disable_existing_loggers=False) # self.logger = logging.getLogger(__name__) self.gameOver= False self.printer=Printer(self) self.WI= WorldItems() self.player = self.__initPlayer() # Enemies self.EG = EnemyGenerator(self.WI) self.currentEnemy= "" self.story = Story( self) self.printer.intro(self.player) self.player.listInventory() raw_input() self.nbTurn = 0 print("##################################################") print(" THE GAME BEGINS") print("##################################################") self.nextEvent = self.story.goToEvent("intro") ''' void onTurn() ''' def onTurn(self): self.nbTurn = self.nbTurn +1 self.nextEvent = self.story.goToEvent(self.nextEvent) ''' boolean onGame() Return true while the player isn't dead. ''' def onGame(self): return self.player.isAlive() and self.nbTurn<20 def endGame(self): print("##################################################") print(" THE GAME ENDS") print("##################################################") self.gameOver= True def isGameOver(self): return self.gameOver ''' Return a player object. ''' def __initPlayer(self): dictMode={} #will contains all information about each game mode file = minidom.parse("./XML_Files/InitPlayer.xml") modes = file.getElementsByTagName("DifficultyMode") for mode in modes: data= xmlp.parseAttributes(mode) dictMode[data.get('id')]= data #Ask the player which mode does he wants to play ToPrint="Difficulty Modes: " for mode in dictMode.keys(): ToPrint= ToPrint + ' ' + mode print(ToPrint) #Parse the user input userMode = ui.userIput("Which mode do you want to play? ", dictMode.keys()) SelectedMode = dictMode[userMode] ## Parse the mode's parameters player = Player(SelectedMode.get('hp')) armorName =SelectedMode.get('armor') if armorName is None: player.equipArmor(self.WI.getArmorByCategory("basic")) else: player.equipArmor(self.WI.getArmor(armorName)) weaponName = SelectedMode.get('weapon') if weaponName is None: player.equipWeapon(self.WI.getWeaponByCategory("basic")) else: player.equipWeapon(self.WI.getWeapon(weaponName)) potion = self.WI.getPotionByCategory("HP") if SelectedMode.get('potion') is not None: if cast.strToBool(SelectedMode.get('potion')): potion.fill() player.addToBag(potion) return player
# -*- coding: utf-8 -*- import atexit import time import gdax import telepot from telepot.loop import MessageLoop from Printer import Printer version = '0.1' console = Printer(version) res_info = '*Bitcoin-mzbot*\nI am Matteo Zoia, Computer Sci student at University in Milan.' res_list = '/list showing command\n/btcusd BTC-USD exchange\n/etheur ETH-EUR exchange\n/etheurstats ETH-EUR full stats' def handle(msg): chat_id = msg['chat']['id'] command = msg['text'] res = (public_client.get_product_ticker(product_id='ETH-EUR')) etheur_price = float(res[u'price']) res = (public_client.get_product_ticker(product_id='BTC-USD')) btcusd_price = float(res[u'price']) res = public_client.get_product_24hr_stats('ETH-EUR') etheur_24high = float(res[u'high']) etheur_24low = float(res[u'low']) hl_gap = 100 - (etheur_24low / etheur_24high * 100) price_gap = 100 - (etheur_price / etheur_24high * 100) etheur_full = '*ETH-EUR*\nExchange: {0:.2f}\nHighest 24h: {1:.2f}\nLowest 24h: {2:.2f}\nH/L gap: {3:.2f}\n_mzbot (data from: gdax)_'.format( etheur_price, etheur_24high, etheur_24low, hl_gap)
class smallAppFrame(wx.Frame): """ Derive a new class of wx.Frame. """ overviewText = "wxPython Overview" def __init__(self, parent, id, title): # --- a basic window frame/form wx.Frame.__init__(self, parent=None, id=-1, title=APP_NAME + " - Developed in wxPython/AHK", pos=wx.Point(0, 0), size=wx.Size(640, 480), name='', style=wx.DEFAULT_FRAME_STYLE) if (len(sys.argv)) == 2: self.Bind(wx.EVT_ACTIVATE, self.OnFileOpenDirect) # wx.EVT_ACTIVATE(self, self.OnFileOpenDirect) # same self.printer = Printer(self) self.SetMinSize((640, 480)) # --- real windows programs have icons, so here's ours! try: # - don't sweat it if it doesn't load self.SetIcon(wx.Icon("SmallEditor.ico", wx.BITMAP_TYPE_ICO)) finally: pass self.codePage = None self.finddlg = None # --- add a menu, first build the menus (with accelerators) self.BuildMenuBar() self.finddata = wx.FindReplaceData() self.finddata.SetFlags(wx.FR_DOWN) # Not needed!, just put them in text form after tab in menu item! # --- add accelerators to the menus #self.SetAcceleratorTable(wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('O'), ID_OPEN), # (wx.ACCEL_ALT, ord('Q'), ID_EXIT)])) # --- add a statusBar (with date/time panel) sb = self.CreateStatusBar(3) sb.SetStatusWidths([-1, 65, 160]) sb.PushStatusText("Ready", SB_INFO) # --- set up a timer to update the date/time (every 5 seconds) self.timer = wx.PyTimer(self.Notify) self.timer.Start(5000) self.Notify() # - call it once right away # --- add a control (a RichTextBox) & trap KEY_DOWN event self.rtb = wx.TextCtrl(self, ID_RTB, size=wx.Size(400 * 2, 200 * 2), style=wx.TE_MULTILINE | wx.TE_RICH2) ### - NOTE: binds to the control itself! wx.EVT_KEY_UP(self.rtb, self.OnRtbKeyUp) # --- need to add a sizer for the control - yuck! self.sizer = wx.BoxSizer(wx.VERTICAL) # self.sizer.SetMinSize(200,400) self.sizer.Add(self.rtb, 1, wx.EXPAND) # --- now add it to the frame (at least this auto-sizes the control!) self.SetSizer(self.sizer) self.SetAutoLayout(True) self.sizer.SetSizeHints(self) # Add some Unicode (Chinese!) if not wx.USE_UNICODE: self.AddLine(self.sizer) self.AddText( self.sizer, "Sorry, this wxPython was not built with Unicode support.", font=wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD)) self.AddLine(self.sizer) else: f = self.GetFont() font = wx.Font(14, f.GetFamily(), f.GetStyle(), wx.BOLD, False, f.GetFaceName(), f.GetEncoding()) self.AddLine(self.sizer) self.AddText(self.sizer, chi_uni[0], chi_uni[1], 'Chinese:', font) self.AddLine(self.sizer) # --- initialize other settings self.dirName = "" self.fileName = "" # - this is ugly, but there's no static available # once we build a class for RTB, move this there self.oldPos = -1 self.ShowPos() # --- finally - show it! self.Show(True) def BuildMenuBar(self): self.mainmenu = wx.MenuBar() # file menu fileMenu = wx.Menu() fileNew = fileMenu.Append(-1, "&New\tCtrl+N", "Create a new file") #wx.EVT_MENU(self, ID_NEW, self.OnFileNew) ## same as following self.Bind(wx.EVT_MENU, self.OnFileNew, fileNew) # check if the application opens with an argument fileOpen = fileMenu.Append(-1, "&Open\tCtrl+O", "Open an existing file") self.Bind(wx.EVT_MENU, self.OnFileOpen, fileOpen) fileSave = fileMenu.Append(-1, "&Save\tCtrl+S", "Save the active file") self.Bind(wx.EVT_MENU, self.OnFileSave, fileSave) fileSaveAs = fileMenu.Append(-1, "&Save As...", "Save the active file with a new name") self.Bind(wx.EVT_MENU, self.OnFileSaveAs, fileSaveAs) filePrint = fileMenu.Append(-1, "&Print\tCtrl+P", "Print the active file") self.Bind(wx.EVT_MENU, self.OnFilePrint, filePrint) """ pnl = wx.Panel(self) self.pnl = pnl # Set up a log window self.log = wx.TextCtrl(pnl, -1, style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) """ fileExit = fileMenu.Append(-1, "E&xit\tAlt+Q", "Exit the program") self.Bind(wx.EVT_MENU, self.OnFileExit, fileExit) # edit menu editMenu = wx.Menu() """ # so ben ik Find icoontje kwijt! findItem = editMenu.Append(-1, '&Find\tCtrl-F', 'Find in opened text') findItem.SetBitmap(images.catalog['find'].GetBitmap()) if 'wxMac' not in wx.PlatformInfo: findNextItem = editMenu.Append(-1, 'Find &Next\tF3', 'Find Next') else: findNextItem = editMenu.Append(-1, 'Find &Next\tCtrl-G', 'Find Next') findNextItem.SetBitmap(images.catalog['findnext'].GetBitmap()) """ findItem = wx.MenuItem(editMenu, -1, '&Find\tCtrl+F', 'Find in the opened text') findItem.SetBitmap(images.catalog['find'].GetBitmap()) if 'wxMac' not in wx.PlatformInfo: findNextItem = wx.MenuItem(editMenu, -1, 'Find &Next\tF3', 'Find Next') else: findNextItem = wx.MenuItem(editMenu, -1, 'Find &Next\tCtrl+G', 'Find Next') findNextItem.SetBitmap(images.catalog['findnext'].GetBitmap()) # GetBitmap = wx.lib.editor.images.GetBitmap # in wxPython\lib\editor\images.py editMenu.AppendItem(findItem) editMenu.AppendItem(findNextItem) editMenu.AppendSeparator() # self.Bind(wx.EVT_MENU, self.OnHelpFind, findItem) self.Bind(wx.EVT_MENU, self.OnFindNext, findNextItem) self.Bind(wx.EVT_FIND, self.OnFind) self.Bind(wx.EVT_FIND_NEXT, self.OnFind) self.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose) self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findItem) self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findNextItem) # Tool menu toolMenu = wx.Menu() easyMemo = toolMenu.Append(-1, "&Easy Memo\tCtrl+M", "Easy Memo") self.Bind(wx.EVT_MENU, self.OnEasyMemo, easyMemo) easyMemoP = toolMenu.Append(-1, "&Open Easy Memo\tCtrl+E", "Open Easy Memo") self.Bind(wx.EVT_MENU, self.OnEasyMemoOpen, easyMemoP) # Help bar helpMenu = wx.Menu() # helpMenu.Append(ID_ABOUT, "&About SmallEditor", "Display information about the program") # wx.EVT_MENU(self, ID_ABOUT, self.OnHelpAbout) # the following does the same! helpItem = helpMenu.Append(-1, '&About SmallEditor', 'wxPython RULES!!!') self.Bind(wx.EVT_MENU, self.OnHelpAbout, helpItem) # --- now add them to a menubar & attach it to the frame menuBar = wx.MenuBar() menuBar.Append(fileMenu, "&File") menuBar.Append(editMenu, "&Edit") menuBar.Append(toolMenu, "&Tool") menuBar.Append(helpMenu, "&Help") self.SetMenuBar(menuBar) #--------------------------------------- def __del__(self): """ Class delete event: don't leave timer hanging around! """ self.timer.stop() del self.timer #--------------------------------------- def Notify(self): """ Timer event """ t = time.localtime(time.time()) st = time.strftime(" %b-%d-%Y %I:%M %p", t) # --- could also use self.sb.SetStatusText self.SetStatusText(st, SB_DATETIME) #-------------------------------------- def OnFilePrint(self, e): """ File|FilePrint event """ docTitle = os.path.join(self.dirName, self.fileName) self.printer.Print(self.rtb.GetValue(), docTitle) #-------------------------------------- def OnEasyMemo(self, e): """ Tool/EasyMemo event """ # os.system("Diary.exe &") subprocess.Popen(["Diary.exe"]) #-------------------------------------- def OnEasyMemoOpen(self, e): """ Tool/EasyMemo event Open """ self.OnFileOpenDirect(e, "diary.txt") #--------------------------------------- def OnFileExit(self, e): """ File|Exit event """ if (self.rtb.IsModified()): dlg = wx.MessageDialog( self, "would like to save the file?", "Save file confirmation", wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION) result = dlg.ShowModal() if (result == wx.ID_YES): ### - Use the OnFileSave to save the file if self.OnFileSave(e): self.SetTitle(APP_NAME + " - [" + self.fileName + "]") dlg.Destroy() self.Close(True) elif (result == wx.ID_NO): # NO dlg.Destroy() self.Close(True) elif (result == wx.ID_CANCEL): # Cancel dlg.Destroy() else: print "Never should be here!!!" else: # nothing changed self.Close(True) #--------------------------------------- def OnFileNew(self, e): """ File|New event - Clear rtb. """ self.fileName = "" self.dirName = "" self.rtb.SetValue("") self.PushStatusText("Starting new file", SB_INFO) self.ShowPos() #--------------------------------------- def OnFileOpen(self, e): """ File|Open event - Open dialog box. """ dlg = wx.FileDialog(self, "Open", self.dirName, self.fileName, "Text Files (*.txt)|*.txt|All Files|*.*", wx.OPEN) if (dlg.ShowModal() == wx.ID_OK): self.fileName = dlg.GetFilename() self.dirName = dlg.GetDirectory() ## - this will read in Unicode files (since I'm using Unicode wx.Python) ## - if NO-BREAK spaces (hex A0) in the text encounterd, it will only show blank! ## how to solve??? if self.rtb.LoadFile(os.path.join(self.dirName, self.fileName)): # print "self.rtb", self.rtb self.SetStatusText( "Opened file: " + str(self.rtb.GetLastPosition()) + " characters.", SB_INFO) self.ShowPos() else: self.SetStatusText("Error in opening file.", SB_INFO) ### - but we want just plain ASCII files, so: """ try: f = file(os.path.join(self.dirName, self.fileName), 'r') self.rtb.SetValue(f.read()) self.SetTitle(APP_NAME + " - [" + self.fileName + "]") self.SetStatusText("Opened file: " + str(self.rtb.GetLastPosition()) + " characters.", SB_INFO) self.ShowPos() f.close() except: self.PushStatusText("Error in opening file.", SB_INFO) """ dlg.Destroy() #--------------------------------------- def OnFileOpenDirect(self, e, fileName=None): """ File|Open event Direct from arg. is not Unicode compatible """ if fileName == None: #self.fileName = sys.argv[1].decode('utf-8') #not yet working for chinese #self.fileName = sys.argv[1].decode(sys.getfilesystemencoding()) #not yet working for chinese self.fileName = sys.argv[1] else: self.fileName = fileName if self.rtb.LoadFile(self.fileName): self.SetStatusText( "Opened file: " + str(self.rtb.GetLastPosition()) + " characters.", SB_INFO) self.ShowPos() else: self.SetStatusText("Error in opening file.", SB_INFO) self.rtb.SetFocus() # necessary!!! # e.Skip() #--------------------------------------- def OnFileSave(self, e): """ File|Save event - Just Save it if it's got a name. """ if (len(sys.argv)) == 2: #for direct open file self.fileName = sys.argv[1] #if (self.fileName != "") and (self.dirName != ""): # dirName is not necessary to check (for direct open is not easy) if (self.fileName != ""): # try to save with Unicode text in the file if self.rtb.SaveFile(os.path.join(self.dirName, self.fileName)): self.SetStatusText( "Saved file: " + str(self.rtb.GetLastPosition()) + " characters.", SB_INFO) else: self.SetStatusText("Error in saving file (Unicode).", SB_INFO) """ try: # only valid for Ascii # The following does not work for Unicode # f = file(os.path.join(self.dirName, self.fileName), 'w','utf-8') f = file(os.path.join(self.dirName, self.fileName), 'w') f.write(self.rtb.GetValue()) self.PushStatusText("Saved file: " + str(self.rtb.GetLastPosition()) + " characters.", SB_INFO) f.close() return True except: self.PushStatusText("Error in saving file: file will be empty! Please remove the last changes and save it again!", SB_INFO) # file is empty due to the error! return False """ else: ### - If no name yet, then use the OnFileSaveAs to get name/directory return self.OnFileSaveAs(e) #-------------------------------------- def OnFileSaveAs(self, e): """ File|SaveAs event - Prompt for File Name. """ ret = False dlg = wx.FileDialog(self, "Save As", self.dirName, self.fileName, "Text Files (*.txt)|*.txt|All Files|*.*", wx.SAVE) if (dlg.ShowModal() == wx.ID_OK): self.fileName = dlg.GetFilename() self.dirName = dlg.GetDirectory() ## should check if the file exists if os.path.exists(os.path.join(self.dirName, self.fileName)): dlg = wx.MessageDialog( self, "File already exists! Do you want to replace it?", "Save as file confirmation", wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION) result = dlg.ShowModal() if (result == wx.ID_YES): ### - Use the OnFileSave to save the file if self.OnFileSave(e): self.SetTitle(APP_NAME + " - [" + self.fileName + "]") ret = True else: # file not exists ### - Use the OnFileSave to save the file if self.OnFileSave(e): self.SetTitle(APP_NAME + " - [" + self.fileName + "]") ret = True dlg.Destroy() return ret #-------------------------------------- def OnHelpFind(self, event): if self.finddlg != None: return self.finddlg = wx.FindReplaceDialog( self, self.finddata, "Find", wx.FR_NOMATCHCASE | wx.FR_NOWHOLEWORD) self.finddlg.Show(True) def OnUpdateFindItems(self, evt): evt.Enable(self.finddlg == None) #--------------------------------------------- def OnFind(self, event): # these are original # editor = self.codePage.editor # end = editor.GetLastPosition() end = self.rtb.GetLastPosition() textstring = self.rtb.GetRange(0, end).lower() findstring = self.finddata.GetFindString().lower() backward = not (self.finddata.GetFlags() & wx.FR_DOWN) if backward: start = self.rtb.GetSelection()[0] loc = textstring.rfind(findstring, 0, start) else: start = self.rtb.GetSelection()[1] loc = textstring.find(findstring, start) if loc == -1 and start != 0: # string not found, start at beginning if backward: start = end loc = textstring.rfind(findstring, 0, start) else: start = 0 loc = textstring.find(findstring, start) if loc == -1: dlg = wx.MessageDialog(self, 'Find String Not Found', 'Find String Not Found in Demo File', wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() if self.finddlg: if loc == -1: self.finddlg.SetFocus() return else: self.finddlg.Destroy() self.finddlg = None self.rtb.SetFocus() # Needed for OpenFileDirect! self.rtb.ShowPosition(loc) self.rtb.SetSelection(loc, loc + len(findstring)) def OnFindNext(self, event): if self.finddata.GetFindString(): self.OnFind(event) else: self.OnHelpFind(event) def OnFindClose(self, event): event.GetDialog().Destroy() self.finddlg = None #--------------------------------------- def OnShowFind(self, e): """ Find|Something event """ data = wx.FindReplaceData() data.SetFlags(wx.FR_DOWN) # search down by default # # #data.SetReplaceString(self._replaceString) dlg = wx.FindReplaceDialog(self, data, "Find") dlg.data = data # save a reference to it... dlg.Show(True) #--------------------------------------- def OnHelpAbout(self, e): """ Help|About event """ title = self.GetTitle() title1 = title + "\nBugs found? Please contact: [email protected]" d = wx.MessageDialog(self, "About " + title1, title, wx.ICON_INFORMATION | wx.OK) d.ShowModal() d.Destroy() #--------------------------------------- def OnRtbKeyUp(self, e): """ Update Row/Col indicator based on position """ self.ShowPos() e.Skip() #--------------------------------------- def ShowPos(self): """ Update Row/Col indicator """ (bPos, ePos) = self.rtb.GetSelection() if (self.oldPos != ePos): (c, r) = self.rtb.PositionToXY(ePos) self.SetStatusText(" " + str((r + 1, c + 1)), SB_ROWCOL) self.oldPos = ePos #--------------------------------------- def AddLine(self, sizer): sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND) def AddText(self, sizer, text1, text2='', lang='', font=None): # create some controls lang = wx.StaticText(self, -1, lang) text1 = wx.StaticText(self, -1, text1) text2 = wx.StaticText(self, -1, text2, style=wx.ALIGN_RIGHT) if font is not None: text1.SetFont(font) # put them in a sizer row = wx.BoxSizer(wx.HORIZONTAL) row.Add(lang) row.Add((15, 10)) row.Add(text1, 1, wx.EXPAND) row.Add(text2) # put the row in the main sizer sizer.Add(row, 0, wx.EXPAND | wx.ALL, 5)
def __init__(self, host, port=9760, username=None, password=None,verbose=True): self.host = host self.port = int(port) self.username = username self.password = password # Socket to communicatie over with the vm201 firmware. self.socket = None # Pre-defined commands stated in the protocol. self.commands = {'STX': '\x02', 'ETX': '\x03', 'CMD_AUTH': 'A', 'LEN_CMD_AUTH': 5, 'CMD_USERNAME': '******', 'LEN_CMD_USERNAME': 14, 'CMD_PASSWORD': '******', 'LEN_CMD_PASSWORD': 14, 'CMD_LOGGED_IN': 'L', 'LEN_CMD_LOGGED_IN': 5, 'CMD_ACCESS_DENIED': 'X', 'LEN_CMD_ACCESS_DENIED': 5, 'CMD_CLOSED': 'C', 'LEN_CMD_CLOSED': 5, 'CMD_NAME': 'N', 'LEN_CMD_NAME': 22, 'CMD_STATUS_REQ': 'R', 'LEN_CMD_STATUS_REQ': 5, 'CMD_STATUS': 'S', 'LEN_CMD_STATUS': 8, 'CMD_ON': 'O', 'LEN_CMD_ON': 6, 'CMD_OFF': 'F', 'LEN_CMD_OFF': 6, 'CMD_TOGGLE': 'T', 'LEN_CMD_TOGGLE': 6, 'CMD_PULSE': 'P', 'LEN_CMD_PULSE': 8, 'CMD_UPDATE': 'V', 'LEN_CMD_UPDATE': 6, 'CMD_TMR_ENA': 'E', 'LEN_CMD_TMR_ENA': 6, 'CMD_TMR_DIS': 'D', 'LEN_CMD_TMR_DIS': 6, 'CMD_TMR_TOGGLE': 'G', 'LEN_CMD_TMR_TOGGLE': 6 } # Relay channels (8 output; 1 input) self.channels = dict() self.channel_string = str() self.timer_string = str() for i in range(1, 10): self.channels[i] = Channel() # TCP packet handler to decode and encode packets. self.tcp_handler = TCPPacketHandler() # Custum print handler self.display = Printer(verbose)
class LineDisplayProtocolBase(lib.ClientInterface, metaclass=abc.ABCMeta): def __init__(self, client_id, _class=TicketData, _print=True): super().__init__(client_id) self.connect() self.test_network_connection() self.data = list() assert issubclass(_class, TicketData) self.ticket_type = _class self.printer = Printer() self.print = _print self.start_printer() def set_print(self, value): self.print = bool(value) def tickets(self): return tuple(self.data)\ + tuple( TicketData.buffer() for _ in range(ScrollingUpdate().show)) def loads(self, string): result = super().loads(string) self.data = list() for ticket_no in self.order_queue: order_dct = self.order_queue[ticket_no] for index, ticket in enumerate(order_dct["items"]): ticket = order_dct["items"][index] = lib.Ticket.convert_to( *ticket) result = self.ticket_type(ticket, int(ticket_no), index, order_dct["name"], order_dct["deliver"]) if result: self.data.append(result) return result def on_enter(self, task): if task.result(): return else: ScrollingUpdate().advance() def set_item_status(self, items, value): task = self.create_task( self.server_message("set_item_status", data=(tuple(item.dim3 for item in items if item), value))) task.add_done_callback(self.on_enter) return task @abc.abstractmethod def filter(self) -> TicketData: """must return TicketData instance""" @abc.abstractmethod def receipt(self, ticket, print_status) -> [("", {}), ...]: """must return a list of (str, mapping)""" def start_printer(self): async def printer(): while True: for ticket in self.data: print_status = self.order_queue[str( ticket.ticket_no)]["print"] if all( item.parameters.get("print", 1) for item in ticket if item): if self.print: lines = self.receipt(ticket, print_status) if lib.DEBUG: print("\n".join(line[0] for line in lines)) for line in lines: self.printer.writeline(line[0], **line[1]) # give enough room to tear it out self.printer.writeline("\n\n\n") dim3s = tuple(item.dim3 for item in ticket if item) # must be sent to the server (instead of keeping it in a local set) # to prevent printing old tickets. await self.server_message("set_item_printed", (dim3s, False)) await asyncio.sleep(1 / 30) self.create_task(printer())
import mysql.connector from Caller import Caller from Printer import Printer caller = Caller() mydb = mysql.connector.connect( host="localhost", user="******", password="******", database="steam" ) while(True): printer = Printer(0) while (True): choice = input(printer.printOptions()) query = caller.retrieveQuery(choice) if query["call"] != 'INVALID': break cursor = mydb.cursor() cursor.execute(query["call"]) results = cursor.fetchall() printer.printResults(results, query["header"]) choice = input(printer.printFinalOutput())
def make_config_file(self): # Create a config file configFile_0 = os.path.join("/tmp", 'config.h') with open(configFile_0, 'w') as configFile: # GPIO banks banks = {"0": 0, "1": 0, "2": 0, "3": 0} step_banks = {"0": 0, "1": 0, "2": 0, "3": 0} dir_banks = {"0": 0, "1": 0, "2": 0, "3": 0} direction_mask = 0 # Define step and dir pins for name, stepper in self.printer.steppers.iteritems(): step_pin = str(stepper.get_step_pin()) step_bank = str(stepper.get_step_bank()) dir_pin = str(stepper.get_dir_pin()) dir_bank = str(stepper.get_dir_bank()) configFile.write('#define STEPPER_' + name + '_STEP_BANK\t\t' + "STEPPER_GPIO_" + step_bank + '\n') configFile.write('#define STEPPER_' + name + '_STEP_PIN\t\t' + step_pin + '\n') configFile.write('#define STEPPER_' + name + '_DIR_BANK\t\t' + "STEPPER_GPIO_" + dir_bank + '\n') configFile.write('#define STEPPER_' + name + '_DIR_PIN\t\t' + dir_pin + '\n') # Define direction direction = "0" if self.config.getint( 'Steppers', 'direction_' + name) > 0 else "1" configFile.write('#define STEPPER_' + name + '_DIRECTION\t\t' + direction + '\n') index = Printer.axis_to_index(name) direction_mask |= (int(direction) << index) # Generate the GPIO bank masks banks[step_bank] |= (1 << int(step_pin)) banks[dir_bank] |= (1 << int(dir_pin)) step_banks[step_bank] |= (1 << int(step_pin)) dir_banks[dir_bank] |= (1 << int(dir_pin)) configFile.write('#define DIRECTION_MASK ' + bin(direction_mask) + '\n') configFile.write('\n') # Define end stop pins and banks for name, endstop in self.printer.end_stops.iteritems(): bank, pin = endstop.get_gpio_bank_and_pin() configFile.write('#define STEPPER_' + name + '_END_PIN\t\t' + str(pin) + '\n') configFile.write('#define STEPPER_' + name + '_END_BANK\t\t' + "GPIO_" + str(bank) + '_IN\n') configFile.write('\n') # Construct the end stop inversion mask inversion_mask = "#define INVERSION_MASK\t\t0b00" for name in ["Z2", "Y2", "X2", "Z1", "Y1", "X1"]: inversion_mask += "1" if self.config.getboolean( 'Endstops', 'invert_' + name) else "0" configFile.write(inversion_mask + "\n") # Construct the endstop lookup table. for name, endstop in self.printer.end_stops.iteritems(): mask = 0 # stepper name is x_cw or x_ccw option = 'end_stop_' + name + '_stops' for stepper in self.config.get('Endstops', option).split(","): stepper = stepper.strip() if stepper == "": continue m = re.search('^([xyzehabc])_(ccw|cw|pos|neg)$', stepper) if (m == None): raise RuntimeError("'" + stepper + "' is invalid for " + option) # direction should be 1 for normal operation and -1 to invert the stepper. if (m.group(2) == "pos"): direction = -1 elif (m.group(2) == "neg"): direction = 1 else: direction = 1 if self.config.getint( 'Steppers', 'direction_' + stepper[0]) > 0 else -1 if (m.group(2) == "ccw"): direction *= -1 cur = 1 << ("xyzehabc".index(m.group(1))) if (direction == -1): cur <<= 8 mask += cur logging.debug("Endstop {0} mask = {1}".format(name, bin(mask))) bin_mask = "0b" + (bin(mask)[2:]).zfill(16) configFile.write("#define STEPPER_MASK_" + name + "\t\t" + bin_mask + "\n") configFile.write("\n") # Put each dir and step pin in the proper buck if they are for GPIO0 or GPIO1 bank. # This is a restriction due to the limited capabilities of the pasm preprocessor. for name, bank in banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) configFile.write("#define GPIO" + name + "_MASK\t\t" + bin(bank) + "\n") #for name, bank in step_banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) # configFile.write("#define GPIO"+name+"_STEP_MASK\t\t" +bin(bank)+ "\n"); for name, bank in dir_banks.iteritems(): #bank = (~bank & 0xFFFFFFFF) configFile.write("#define GPIO" + name + "_DIR_MASK\t\t" + bin(bank) + "\n") configFile.write("\n") # Add end stop delay to the config file end_stop_delay = self.config.getint('Endstops', 'end_stop_delay_cycles') configFile.write("#define END_STOP_DELAY " + str(end_stop_delay) + "\n") return configFile_0
def _home_internal(self, axis): """ Private method for homing a set or a single axis """ logging.debug("homing internal " + str(axis)) path_search = {} path_backoff = {} path_fine_search = {} path_center = {} path_zero = {} speed = self.printer.home_speed[0] # TODO: speed for each axis accel = self.printer.acceleration[0] # TODO: accel for each axis for a in axis: if not self.printer.steppers[a].has_endstop: logging.debug("Skipping homing for " + str(a)) continue logging.debug("Doing homing for " + str(a)) if self.printer.home_speed[Printer.axis_to_index(a)] < 0: # Search to positive ends path_search[a] = self.travel_length[a] path_center[a] = self.center_offset[a] else: # Search to negative ends path_search[a] = -self.travel_length[a] path_center[a] = -self.center_offset[a] backoff_length = -np.sign( path_search[a]) * self.printer.home_backoff_offset[ Printer.axis_to_index(a)] path_backoff[a] = backoff_length path_fine_search[a] = -backoff_length * 1.2 speed = min(abs(speed), abs(self.printer.home_speed[Printer.axis_to_index(a)])) accel = min(accel, self.printer.acceleration[Printer.axis_to_index(a)]) fine_search_speed = min( abs(speed), abs(self.printer.home_backoff_speed[Printer.axis_to_index(a)])) logging.debug("Search: %s at %s m/s, %s m/s^2" % (path_search, speed, accel)) logging.debug("Backoff to: %s" % path_backoff) logging.debug("Fine search: %s" % path_fine_search) logging.debug("Center: %s" % path_center) # Move until endstop is hit p = RelativePath(path_search, speed, accel, True, False, True, False) self.add_path(p) self.wait_until_done() logging.debug("Coarse search done!") # Reset position to offset p = G92Path(path_center) self.add_path(p) self.wait_until_done() # Back off a bit p = RelativePath(path_backoff, speed, accel, True, False, True, False) self.add_path(p) # Hit the endstop slowly p = RelativePath(path_fine_search, fine_search_speed, accel, True, False, True, False) self.add_path(p) self.wait_until_done() # Reset (final) position to offset p = G92Path(path_center) self.add_path(p) return path_center, speed
def make_customer_file(filename, d, max_id=17770): print "Leyendo archivos movie" m = Printer(max_id) new_filename = d['output_name'] + ".csv" fd = open(new_filename, "w") fd.write("customerid," + d['column_name'] + "\n") customer_array = MyArrayList() for i in range(1, max_id + 1): m.update() with open(filename + str(i) + ".txt") as infile: for line in infile: if ':' in line: continue else: customer_array.insert(line[:-1].split(",")) m.close() print "Creando archivo " + new_filename m.reset(customer_array.get_length()) compare = d['compare'] customer_array.sort(compare) for i in range(0, customer_array.get_length()): m.update() fd.write(customer_array.toLine(i)) m.close() fd.close() return customer_array.get_length() + 1
steppers["X"].set_microstepping(2) steppers["X"].set_steps_pr_mm(6.0) steppers["Y"] = Stepper_00B1("GPIO1_12", "GPIO0_22", "GPIO2_5", 12, 1, "Y", 1, 1) steppers["Y"].set_microstepping(2) steppers["Y"].set_steps_pr_mm(6.0) steppers["Z"] = Stepper_00B1("GPIO0_23", "GPIO0_26", "GPIO0_15", 13, 2, "Z", 2, 2) steppers["Z"].set_microstepping(2) steppers["Z"].set_steps_pr_mm(160.0) steppers["E"] = Stepper_00B1("GPIO1_28", "GPIO1_15", "GPIO2_1", 14, 3, "E", 3, 3) steppers["E"].set_microstepping(2) steppers["E"].set_steps_pr_mm(5.0) steppers["H"] = Stepper_00B1("GPIO1_13", "GPIO1_14", "GPIO2_3", 15, 4, "H", 4, 4) steppers["H"].set_microstepping(2) steppers["H"].set_steps_pr_mm(5.0) printer = Printer() printer.steppers = steppers # Parse the config printer.config = CascadingConfigParser( ['configs/default.cfg']) # Get the revision from the Config file printer.config.parse_capes() revision = printer.config.replicape_revision dirname = os.path.dirname(os.path.realpath(__file__)) Path.set_axes(5) path_planner = PathPlanner(printer, None)
class Input(object): ''' Stores a bunch of different raw inputs to be used. ''' TYPE_TEXT = "text" TYPE_ASCII = "ascii" TYPE_IMAGE = "image" TYPE_STREAM = "stream" mPrinter = None mFormatter = None def __init__(self): ''' Start input choice. ''' self.mPrinter = Printer() self.mFormatter = Formatter() inputType = self.chooseInputType() if(inputType is None): print("Invalid input type.") return if(inputType == self.TYPE_TEXT): print("Text input type selected.") #Handle text type input. self.chooseTextInput() return if(inputType == self.TYPE_ASCII): print("Ascii art input type selected.") #TODO: Handle ascii art type input. return if(inputType == self.TYPE_IMAGE): print("Image input type selected.") #TODO: Handle image type input. return if(inputType == self.TYPE_STREAM): print("Stream input type selected.") #TODO: Hande stream type input. return print("Unknown input type.") return def chooseInputType(self): ''' Ask the user what type of input they want ''' print("Please select an input type.") print("Available input types: text, ascii art, image, stream") userInput = input("Enter type: ") userInputClean = userInput.strip().lower() if(userInputClean in ['text']): return self.TYPE_TEXT if(userInputClean in ['ascii','ascii art','asciiart']): return self.TYPE_ASCII if(userInputClean in ['image','img','picture','pic']): return self.TYPE_IMAGE if(userInputClean in ['stream','feed','twitter']): return self.TYPE_STREAM return None def chooseTextInput(self): 'chooses a text input' print("Available text inputs: tech support oath, not my business, HAL9000 warning, raw.") userInput = input("Please select: ") userInputClean = userInput.lower().strip() if(userInputClean in ['tech support oath','techsupportoath','oath']): oathOutput = self.techSupportOath() self.mPrinter.printRaw(oathOutput) print("Printing complete") return if(userInputClean in ['not my business','notmybusiness']): poemOutput = self.notMyBusiness() self.mPrinter.printRaw(poemOutput) print("Printing complete") return if(userInputClean in ['hal9000 warning','hal warning','hal']): warnOutput = self.halWarning() self.mPrinter.printRaw(warnOutput) print("Printing complete") return def techSupportOath(self): ''' Recites the tech support oath. Parody of the Night's Watch oath. ''' output = "User issues gather, and now my watch begins. " output += "It shall not end until my death. " output += "I shall take no wife (that I will ever see except on weekends), " output += "hold no lands (because I don't make nearly enough), " output += "father no children (because I will never be home anyway). " output += "I shall receive no thanks and win no glory. " output += "I shall live and die at my desk. " output += "I am the antivirus in the darkness. " output += "I am the coder on the walls. " output += "I am the password reset that guards the logins of men. " output += "I pledge my life and honor to the Help Desk's Watch, " output += "for this night and all the nights to come." printOutput = self.mFormatter.title("Tech support oath") printOutput += self.mFormatter.multiLine(output) return printOutput def notMyBusiness(self): ''' Outputs Niyi Osundere's "Not my business" ''' output = self.mFormatter.title("Not My Business") output += self.mFormatter.title("by Niyi Osundere") output += b"They picked Akanni up one morning\n" output += b"Beat him soft like clay\n" output += b"And stuffed him down the belly\n" output += b"Of a waiting jeep.\n" output += b"What business of mine is it\n" output += b"So long they don't take the yam\n" output += b"From my savouring mouth?\n\n" output += b"They came one night\n" output += b"Booted the whole house awake\n" output += b"And dragged Danladi out,\n" output += b"Then off to a lengthy absence.\n" output += b"What business of mine is it\n" output += b"So long they don't take the yam\n" output += b"From my savouring mouth?\n\n" output += b"Chinwe went to work one day\n" output += b"Only to find her job was gone:\n" output += b"No query, no warning, no probe -\n" output += b"Just one neat sack for a stainless record.\n" output += b"What business of mine is it\n" output += b"So long they don't take the yam\n" output += b"From my savouring mouth?\n\n" output += b"And then one evening\n" output += b"As I sat down to eat my yam\n" output += b"A knock on the door froze my hungry hand.\n" output += b"The jeep was waiting on my bewildered lawn\n" output += b"Waiting, waiting in its usual silence." return output def halWarning(self): ''' Outputs HAL9000's warning from the end of 2010:Odyssey Two ''' output = self.mFormatter.bold(self.mFormatter.centreText("ALL THESE WORLDS ARE YOURS-EXCEPT EUROPA")) output += b"\n" output += self.mFormatter.bold(self.mFormatter.centreText("ATTEMPT NO LANDING THERE")) return output @staticmethod def loadImageFile(fileName): fileName = 'Opening_bill_transparent.png' image = Image.open(fileName).convert('RGBA') width,height = image.size newwidth = 400 scalefactor = width/newwidth newheight = height//scalefactor endwidth = math.ceil(newwidth/8)*8 endheight = math.ceil(newheight/8)*8 image = image.resize((endwidth,endheight),Image.ANTIALIAS) image_string = b'\x1d\x2a' image_string += bytes([endwidth//8,endheight//8]) pixnum = 0 pixval = 0 for x in range(endwidth): for y in range(endheight): r,g,b,a = image.getpixel((x,y)) if(r*g*b<100*100*100 and a>50): pixval += 2**(7-pixnum) if(pixnum==7): image_string += bytes([pixval]) pixnum = 0 pixval = 0 else: pixnum += 1 return image_string + b'\x1d\x2f\x00' @staticmethod def loadImageSilhouetteFile(fileName): image = Image.open(fileName).convert('RGBA') width,height = image.size newwidth = 400 scalefactor = width/newwidth newheight = height//scalefactor endwidth = math.ceil(newwidth/8)*8 endheight = math.ceil(newheight/8)*8 image = image.resize((endwidth,endheight),Image.ANTIALIAS) image_string = b'\x1d\x2a' image_string += bytes([endwidth//8,endheight//8]) pixnum = 0 pixval = 0 for x in range(endwidth): for y in range(endheight): _,_,_,a = image.getpixel((x,y)) if(a>10): pixval += 2**(7-pixnum) if(pixnum==7): image_string += bytes([pixval]) pixnum = 0 pixval = 0 else: pixnum += 1 image_string += b'\x1d\x2f\x00' return image_string
def auto_like(self, nickname, count): Printer.START("Starting of LIKEMACHINE. Target - {}".format(nickname)) all_posts = self.get_user_all_posts(nickname) if count < 0 or count > len(all_posts): count = len(all_posts) self.__like(all_posts[:count])
class VM201RelayCard(object): def __init__(self, host, port=9760, username=None, password=None,verbose=True): self.host = host self.port = int(port) self.username = username self.password = password # Socket to communicatie over with the vm201 firmware. self.socket = None # Pre-defined commands stated in the protocol. self.commands = {'STX': '\x02', 'ETX': '\x03', 'CMD_AUTH': 'A', 'LEN_CMD_AUTH': 5, 'CMD_USERNAME': '******', 'LEN_CMD_USERNAME': 14, 'CMD_PASSWORD': '******', 'LEN_CMD_PASSWORD': 14, 'CMD_LOGGED_IN': 'L', 'LEN_CMD_LOGGED_IN': 5, 'CMD_ACCESS_DENIED': 'X', 'LEN_CMD_ACCESS_DENIED': 5, 'CMD_CLOSED': 'C', 'LEN_CMD_CLOSED': 5, 'CMD_NAME': 'N', 'LEN_CMD_NAME': 22, 'CMD_STATUS_REQ': 'R', 'LEN_CMD_STATUS_REQ': 5, 'CMD_STATUS': 'S', 'LEN_CMD_STATUS': 8, 'CMD_ON': 'O', 'LEN_CMD_ON': 6, 'CMD_OFF': 'F', 'LEN_CMD_OFF': 6, 'CMD_TOGGLE': 'T', 'LEN_CMD_TOGGLE': 6, 'CMD_PULSE': 'P', 'LEN_CMD_PULSE': 8, 'CMD_UPDATE': 'V', 'LEN_CMD_UPDATE': 6, 'CMD_TMR_ENA': 'E', 'LEN_CMD_TMR_ENA': 6, 'CMD_TMR_DIS': 'D', 'LEN_CMD_TMR_DIS': 6, 'CMD_TMR_TOGGLE': 'G', 'LEN_CMD_TMR_TOGGLE': 6 } # Relay channels (8 output; 1 input) self.channels = dict() self.channel_string = str() self.timer_string = str() for i in range(1, 10): self.channels[i] = Channel() # TCP packet handler to decode and encode packets. self.tcp_handler = TCPPacketHandler() # Custum print handler self.display = Printer(verbose) def __str__(self): header = ['Name', 'Output', 'Timer'] table = list() for i in range(1, 10): table.append(self.channels[i].as_list()) # table.append(['', '', '']) state = '\n' + str(tabulate(table, header, "rst")) + '\n' return state def lookup(self, cmd_byte): ''' Lookup key in self.commands dict given its value cmd_byte ''' try: return [key for key in self.commands if self.commands[key] == cmd_byte][0] except KeyError, e: msg = 'Error: value \'{0}\' not found'\ .format(cmd_byte) + ' in VM201.commands dict!\n', e self.display.add_tcp_msg(msg) return None
def __init__(self): """ Init """ logging.info("Redeem initializing " + version) self.printer = Printer() # Parse the config files. self.printer.config = CascadingConfigParser( ['/etc/redeem/default.cfg', '/etc/redeem/printer.cfg', '/etc/redeem/local.cfg']) # Get the revision and loglevel from the Config file self.revision = self.printer.config.get('System', 'revision', "A4") level = self.printer.config.getint('System', 'loglevel') if level > 0: logging.getLogger().setLevel(level) 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" or self.revision == "A4A": 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", 123, "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", 123, "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, "E", None, 3, 3) self.printer.steppers["H"] = Stepper("GPIO1_13", "GPIO1_14", "GPIO2_3", 4, "H", 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)) stepper.in_use = self.printer.config.getboolean('Steppers', 'in_use_' + name) 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)) stepper.has_endstop = self.printer.config.getboolean('Endstops', 'has_' + 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 0")) 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(5) mosfet_hbp = Mosfet(4) 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'].P = self.printer.config.getfloat('Heaters', "ext1_pid_p") self.printer.heaters['E'].I = self.printer.config.getfloat('Heaters', "ext1_pid_i") self.printer.heaters['E'].D = self.printer.config.getfloat('Heaters', "ext1_pid_d") 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'].P = self.printer.config.getfloat('Heaters', "hbp_pid_p") self.printer.heaters['HBP'].I = self.printer.config.getfloat('Heaters', "hbp_pid_i") self.printer.heaters['HBP'].D = 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'].P = self.printer.config.getfloat('Heaters', "ext2_pid_p") self.printer.heaters['H'].I = self.printer.config.getfloat('Heaters', "ext2_pid_i") self.printer.heaters['H'].D = 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(0)) self.printer.fans.append(Fan(1)) self.printer.fans.append(Fan(2)) 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) # 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.unbuffered_commands = JoinableQueue(10) # Init the path planner Path.axis_config = int( self.printer.config.get('Geometry', 'axis_config')) Path.max_speeds[0] = float( self.printer.config.get('Steppers', 'max_speed_x')) Path.max_speeds[1] = float( self.printer.config.get('Steppers', 'max_speed_y')) Path.max_speeds[2] = float( self.printer.config.get('Steppers', 'max_speed_z')) Path.max_speeds[3] = float( self.printer.config.get('Steppers', 'max_speed_e')) Path.max_speeds[4] = float( self.printer.config.get('Steppers', 'max_speed_h')) Path.home_speed[0] = float( self.printer.config.get('Steppers', 'home_speed_x')) Path.home_speed[1] = float( self.printer.config.get('Steppers', 'home_speed_y')) Path.home_speed[2] = float( self.printer.config.get('Steppers', 'home_speed_z')) Path.home_speed[3] = float( self.printer.config.get('Steppers', 'home_speed_e')) Path.home_speed[4] = float( self.printer.config.get('Steppers', 'home_speed_h')) Path.steps_pr_meter[0] = self.printer.steppers[ "X"].get_steps_pr_meter() Path.steps_pr_meter[1] = self.printer.steppers[ "Y"].get_steps_pr_meter() Path.steps_pr_meter[2] = self.printer.steppers[ "Z"].get_steps_pr_meter() Path.steps_pr_meter[3] = self.printer.steppers[ "E"].get_steps_pr_meter() Path.steps_pr_meter[4] = self.printer.steppers[ "H"].get_steps_pr_meter() 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.maxJerkXY = float( self.printer.config.get('Steppers', 'maxJerk_xy')); self.printer.maxJerkZ = float( self.printer.config.get('Steppers', 'maxJerk_z')); self.printer.maxJerkEH = float( self.printer.config.get('Steppers', 'maxJerk_eh')); self.printer.path_planner = PathPlanner(self.printer, pru_firmware) travel = {} offset = {} i = 0 for axis in ['X', 'Y', 'Z', 'E', 'H']: travel[axis] = self.printer.config.getfloat('Geometry', 'travel_' + axis.lower()) offset[axis] = self.printer.config.getfloat('Geometry', 'offset_' + axis.lower()) self.printer.acceleration[i] = self.printer.config.getfloat('Steppers', 'acceleration_' + axis.lower()) i += 1 self.printer.path_planner.travel_length = travel self.printer.path_planner.center_offset = offset self.printer.processor = GCodeProcessor(self.printer) # Set up communication channels self.printer.comms["USB"] = USB(self.printer) self.printer.comms["Eth"] = Ethernet(self.printer) self.printer.comms["octoprint"] = Pipe(self.printer, "octoprint") # Pipe for Octoprint self.printer.comms["toggle"] = Pipe(self.printer, "toggle") # Pipe for Toggle self.printer.comms["testing"] = Pipe(self.printer, "testing") # Pipe for testing self.printer.comms["testing_noret"] = Pipe(self.printer, "testing_noret") # Pipe for testing self.printer.comms["testing_noret"].send_response = False self.running = True # Start the two processes p0 = Thread(target=self.loop, args=(self.printer.commands, "buffered")) p1 = Thread(target=self.loop, args=(self.printer.unbuffered_commands, "unbuffered")) p0.daemon = True p1.daemon = True p0.start() p1.start() # Signal everything ready logging.info("Redeem ready") # Wait for exit signal p0.join() p1.join()
""" def maxTree(self, A): # write your code here stack = [] if len(A) == 0: return None for num in A: node = TreeNode(num) if not stack: stack.append(node) else: if stack[-1].val > node.val: stack[-1].right = node stack.append(node) else: while stack and stack[-1].val < node.val: node.left = stack.pop() if stack: stack[-1].right = node stack.append(node) while stack: root = stack.pop() return root root = Solution().maxTree([2, 5, 7, 0, 3, 1, 6]) Printer.tree(root)
def check_characters(self, eq): i = 0 eq_len = len(eq) if (self.is_operator(eq[0]) and eq[0] != '-'): Printer.error("format") while (i < eq_len): if (eq[i].isdigit()): while (i + 1 < eq_len and eq[i].isdigit()): i += 1 # case : not digit(0123456789) not X not op(+-/*^.) if (not self.is_operator(eq[i]) and not self.is_number_or_x(eq[i])): Printer.error("format") # case : . if (eq[i] == '.'): if (not eq[i - 1].isdigit() or not eq[i + 1].isdigit()): Printer.error("format") while (i + 1 < eq_len and eq[i + 1].isdigit()): i += 1 if (i + 1 == eq_len and not eq[i].isdigit()): Printer.error("format") elif (i + 1 < eq_len and eq[i + 1] != '+' and eq[i + 1] != '-' and eq[i + 1] != '*' and eq[i + 1] != 'X'): Printer.error("format") try: # case ^ if (eq[i] == '^'): if (eq[i - 1] != 'X'): Printer.error("format") if (not eq[i + 1].isdigit()): Printer.error("degree") while (i + 1 < eq_len and eq[i + 1].isdigit()): i += 1 if (i + 1 == eq_len and not eq[i].isdigit()): Printer.error("format") elif (i + 1 < eq_len and eq[i + 1] != '+' and eq[i + 1] != '-'): Printer.error("format") # case double operator if (self.is_operator(eq[i]) and self.is_operator(eq[i - 1])): Printer.error("format") # case / and . with else than digit around if ((eq[i] == '/' or eq[i] == '.') and (not self.is_number_or_x(eq[i + 1]) or not self.is_number_or_x(eq[i - 1]))): Printer.error("format") except Exception: Printer.error("format") i += 1 # case last char is operator if (self.is_operator(eq[i - 1])): Printer.error("format")
from Analyzer import Analyzer from FIPGenerator import FIPGenerator from Printer import Printer from Reader import Reader from os import path if __name__ == '__main__': fileName = "" while (True): reader = Reader() analyzer = Analyzer() lexic = analyzer.getFormattedLexic() printer = Printer("fip.xlsx") print("1. Dati fisierul") print("2. Afisati atomii lexicali") print("3. Generati FIP") print("4. Iesire") option = input("Optiune: ") try: if option == "1": fileName = input("Dati numele de fisier: ") if not path.exists(fileName): print("Fisier inexistent") continue elif option == "2": for line in reader.read(fileName):
def main(): Output = {} Output[DENDRIMER] = Dendrimer Output[POLYMER] = Polymer mode = Utils.buildingMode while mode != DENDRIMER and mode != POLYMER: mode = raw_input( 'Choose 1 for Dendrimer or 2 for Polymer construction: ') mode = int(mode) top = Output[mode]() # Read and create bb_factories dict. Ex: bb_factories[CCO] = factory do CCO top.read_bbs() # Read and create connections array top.read_connections() # connect building blocks print("Connecting Building Blocks...") top.connect_bbs() for atom in top.get_atom_list(): atom.set_bond_list([]) atom.set_atom_list([]) for bond in top.get_bond_list(): bond.get_a_1().get_atom_list().append( bond.get_other_atom(bond.get_a_1())) bond.get_a_2().get_atom_list().append( bond.get_other_atom(bond.get_a_2())) top.generate_exclusions() top.generate_pairs14() # catch recursion error of deepcopy if len(top.get_atom_list()) > 1000: print( "You are building a very large structure!\nYour topology will include {} atoms.\n" "This will take a while.\n".format(len(top.get_atom_list()))) sys.setrecursionlimit(100000) print("Increasing recursionlimit...\n\n") print("Building Angles...") top.set_angle_list(top.create_all_angles(top.get_bond_list())) print("Building Dihedrals...") if Utils.verbose: print( "Specfific information about specified dihedrals at branchpoints following, eventually: \n" ) # ----------------------- dihedrals ### ### top.set_dihedral_list(top.create_all_dihedrals(forzmatrix=False)) top.clear_repeated_dihedrals() # ----------------------- angles ### ### top.clear_repeated_angles() print("Topology is done!\n") # ----------------------- write topology ------------------------------ # if Utils.outputFormat == GROMOS_FORMAT: Printer.printGromos(top) elif Utils.outputFormat == GROMACS_FORMAT: Printer.printGromacs(top) else: print("Unkown Output format! Printing Gromacs format instead:") Printer.printGromacs(top) if Utils.nogeom: quit() # test everything before torsion opt # ----------------------- geom opt ------------------------------ # print("Building initial structure...") # angles top.set_angle_list(top.create_all_angles(top.get_bond_list())) # dihedrals top.set_dihedral_list(top.create_all_dihedrals(forzmatrix=True)) top.clear_repeated_dihedrals() top.clear_repeated_angles() print("Optimizing Torsions...") # quit() optGeo = TorsionOpt(top) optGeo.run() print( "Successfully performed optimization of torsional degrees of freedom!") top.calculateAtomsNeighbors() top.createPairList() top.createNonBondedPairs() top.standardPairList() print("Trying to optimize geometry ...") minGeo = OptimizeGeometry(top) minGeo.run() # ----------------------- write coordinates ------------------------------ # if Utils.outputFormat == GROMOS_FORMAT: Printer.printGROMOSCoordFile(top) elif Utils.outputFormat == GROMACS_FORMAT: Printer.printGROMACSCoordFile(top) else: print("Unknown Output format! Printing Gromacs format instead:") Printer.printGROMACSCoordFile(top) print("All Done! Please don't forget to\n") print("***************************") print("*!!!CHECK YOUR TOPOLOGY!!!*") print("***************************\n") print( "If your system has any special feature that is not covered by pyPolyBuilder or" ) print( "If you encounter any bug, please, help us improve the code at www.github.xxx/pypolybuilder\n" )
class POSProtocol(POSInterface): def __init__(self): super().__init__() self.network = False self.connected = False self.test_network_connection() self.connect_task = self.connect() self.receipt_printer = Printer() self.cash_drawer = Drawer() self.screen = LCDScreen() self.stdout = logging.getLogger(f"main.{self.client_id}.gui.stdout") self.stderr = logging.getLogger(f"main.{self.client_id}.gui.stderr") self.last_total = 0 self.last_no = 0 self.last_tab = "" self.pause_screen_update = False def loads(self, string): result = json.loads(string) self.ticket_no = result["ticket_no"] for ticket_no in result["order_queue"]: dct = result["order_queue"][ticket_no] dct["items"] = [ lib.Ticket.convert_to(*item) for item in dct["items"] ] self.order_queue = result["order_queue"] self.requests = result["requests"] self.connected_clients = result["connected_clients"] self.shutdown_now = result["shutdown_now"] def get_ticket_no(self, result): if self.ticket_no is not None: ticket_no = "{:03d}".format(self.ticket_no) result.set(ticket_no) @staticmethod def _new_order(payment_type, cash_given, change_due, name, deliver): order_dct = {"items": list(Order())} order_dct["total"] = Order().total order_dct["subtotal"] = Order().subtotal order_dct["tax"] = Order().tax order_dct["payment_type"] = payment_type order_dct["cash_given"] = cash_given order_dct["change_due"] = change_due order_dct["name"] = name order_dct["deliver"] = deliver return order_dct def _new_receipt_content(self, payment_type, cash_given, change_due): if self.ticket_no is None: self.ticket_no = 1 lines_conf = [("{:03d}".format(self.ticket_no), Order.printer_style["ticket_no"]), (time.strftime("%D %I:%M:%S %p", time.localtime()), { "justify": bytes('C', "utf-8") })] for order in Order(): lines_conf.extend(order.receipt()) fmter = "$ {:.2f}".format print_strs = [ "Subtotal: " + fmter(Order().subtotal / 100), " Tax: " + fmter(Order().tax / 100), " Total: " + fmter(Order().total / 100), " ", "Payment Type: " + payment_type, " Cash Given: " + fmter(cash_given / 100), " Change Due: " + fmter(change_due / 100) ] price_style = Order.printer_style["total"] if payment_type == "Cash": lines_conf.extend((line, price_style) for line in print_strs) else: lines_conf.extend((line, price_style) for line in print_strs[:5]) return lines_conf def _cancel_receipt_content(self, order, ticket_no): lines_conf = [("CANCEL " + "{:03d}".format(int(ticket_no)), Order.printer_style["ticket_no"]), (time.strftime("%D %I:%M:%S %p", time.localtime()), { "justify": bytes('C', "utf-8"), "size": bytes('S', "utf-8") })] price_style = Order.printer_style["total"] lines_conf.append( ("Payment Type: " + order["payment_type"], price_style)) lines_conf.append( (" Change Due: " + "{:.2f}".format(order["total"] / 100), price_style)) return lines_conf def _modify_receipt_content(self, original_order, new_order, cash_given, change_due, difference) -> (list, int): lines_conf = [ ("MODIFY " + "{:03d}".format(self.ticket_no), Order().printer_style["ticket_no"]), (time.strftime("%D %I:%M:%S %p", time.localtime()), { "justify": bytes('C', "utf-8"), "size": bytes('S', "utf-8") }, ("[original]", {})), ] item_difference_count = 0 for original, new in zip(original_order["items"], new_order): original = lib.Ticket.convert_to(*original) line, diff = lib.Ticket.compare(original, new) item_difference_count += diff lines_conf.extend((l, Order.printer_style["item"]) for l in line) price_style = Order.printer_style["total"] payment_type = original_order["payment_type"] lines_conf.append( ("Difference : " + "{:.2f}".format(difference / 100), price_style)) lines_conf.append(("Payment Type: " + payment_type, price_style)) if payment_type == "Cash": lines_conf.append( (" Cash Given: " + "{:.2f}".format(cash_given / 100), price_style)) lines_conf.append( (" Change Due: " + "{:.2f}".format(difference / 100), price_style)) return lines_conf, item_difference_count async def print_receipt(self, receipt, *args): if lib.DEBUG: print("\n".join(line[0] for line in receipt)) for line in receipt: self.receipt_printer.writeline(line[0], **line[1]) await asyncio.sleep(1 / 60) self.receipt_printer.writeline("\n\n\n") await asyncio.sleep(1 / 60) async def update_screen(self, cash, change, pause=False, ticket_no=None, postfix=""): await self.screen.set_cash(cash) await self.screen.set_change(change) if ticket_no is not None: await self.screen.set_ticket_no(ticket_no, postfix) def new_order(self, payment_type, cash_given, change_due, name, deliver): if deliver and not name: return self.stdout.info("Error: No name for delivery") order_dct = self._new_order(payment_type, cash_given, change_due, name, deliver) if payment_type == "Cash": self.stdout.info("({}) Change Due: {:.2f}".format( self.ticket_no, change_due / 100)) self.cash_drawer.open() self.loop.create_task(self.update_screen(cash_given, change_due)) else: self.loop.create_task(self.update_screen(None, None)) receipt = self._new_receipt_content(payment_type, cash_given, change_due) # unblocks printer.writeline self.loop.create_task(self.print_receipt(receipt)) task = self.loop.create_task( self.server_message("new_order", order_dct)) NewOrder() self.ticket_no += 1 def callback(task): ticket_no = task.result() ticket_no = "{:03d}".format(ticket_no) self.stdout.info(f"Received ticket no. {ticket_no}") task.add_done_callback(callback) def cancel_order(self, ticket_no): # check if order still exists serverside order = self.order_queue.get(str(ticket_no)) if order is None: return self.stdout.warning( "Cannot find ticket no. {:03d}".format(ticket_no)) assert isinstance(order, dict) message = "Cancelled ticket no. {:03d}, Change Due: {}" if order["payment_type"] == "Cash": self.cash_drawer.open() message = message.format(ticket_no, -1 * order["total"] / 100) self.loop.create_task( self.update_screen(None, -1 * int(order["total"]), pause=True, ticket_no=ticket_no, postfix="(Cancel)")) if lib.DEBUG: print("drawer open... ") else: message = message.format(ticket_no, order["payment_type"]) self.stdout.info(message) # print receipt cancel_receipt = self._cancel_receipt_content(order, ticket_no) self.loop.create_task(self.print_receipt(cancel_receipt)) task = self.loop.create_task( self.server_message("cancel_order", ticket_no)) def callback(task): if task.result(): self.stdout.info("Cancel success") else: self.stdout.info("Cancel failure") task.add_done_callback(callback) def modify_order(self, ticket_no, modified, cash_given, change, difference): original_dct = self.order_queue[str(ticket_no)] # check cash given is greater than difference only # if original payment type is cash. if change == "- - -" \ and difference \ and original_dct["payment_type"] == "Cash": return self.stdout.info("Cash given is less than difference") cash_given = int(cash_given.replace(".", "")) try: change = int(change.replace(".", "")) except: change = 0 # shows changes made to original order if changes were made # otherwise shows original order modify_receipt, changes_made_cnt = self._modify_receipt_content( original_dct, modified, cash_given, change, difference) if not changes_made_cnt: return self.stdout.info( "No changes made to ticket no. {:03d}".format(int(ticket_no))) total = 0 for i, ticket in enumerate(modified): total += self.get_total(ticket, ticket.addon1, ticket.addon2) modified[i] = lib.Ticket.to_list(modified[i]) modified_dct = self.create_order(modified, total, original_dct["payment_type"]) modified_dct["name"] = original_dct["name"] modified_dct["deliver"] = original_dct["deliver"] # print message to console message = "Modified ticket no. {} - Price difference: {}" difference = "{:.2f}".format((total - original_dct["total"]) / 100) self.stdout.info(message.format(ticket_no, difference)) # open cash drawer if necessary if original_dct["payment_type"] == "Cash"\ and difference != "0.00" \ and change: self.stdout.info(" Change Due: {:.2f}".format(change / 100)) self.loop.create_task(self.update_screen(cash_given, change)) if lib.DEBUG: print("drawer open...") # create non-blocking print task self.loop.create_task(self.print_receipt(modify_receipt)) # send server request task = self.loop.create_task( self.server_message("modify_order", (ticket_no, modified_dct))) def callback(task): _ticket_no = "{:03d}".format(ticket_no) result, reason = task.result() if result: self.stdout.info("Server received modify request") else: self.stdout.critical( f"Server failed to execute modify request - '{reason}'") task.add_done_callback(callback) def get_order_info(self, ticket_no, *args): if args: return (self.order_queue[str(ticket_no)].get(arg) for arg in args) return () def edit_menu(self, new_menu): task = self.loop.create_task(self.server_message( "edit_menu", new_menu)) def done_callback(task): result, reason = task.result() if result: self.stdout.info("Menu saved") else: self.stdout.info("WARNING - Failed to save menu") self.stderr.warning("WARNING - Failed to save menu") task.add_done_callback(done_callback) def get_order_status(self, ticket_no, *args): tickets = self.order_queue.get(str(ticket_no))["items"] if tickets is None: return 100 num_items = 0 num_completed = 0 for ticket in tickets: ticket = ticket, ticket.addon1, ticket.addon2 for item in ticket: if item.name: num_items += 1 if item.name and item.parameters.get( "status") == TICKET_COMPLETE: num_completed += 1 return int((num_completed / num_items) * 100) def get_time(self): raise NotImplementedError def global_shutdown(self, shutdown_in): self.loop.create_task( self.server_message("global_shutdown", shutdown_in)) def edit_order(self): raise NotImplementedError @staticmethod def _item_total(item): if not item.name: return 0 total = item.price for option in item.selected_options: total += item.options[option] return total def get_total(self, item, addon1, addon2): assert all( isinstance(type(_item), lib.TicketType) for _item in (item, addon1, addon2)) total = self._item_total(item) if item.category in Order.two_sides \ or item.category in Order.no_addons: return total if item.category not in Order.include_drinks: for addon in (addon1, addon2): if addon.category == "Drinks": total += self._item_total(addon) if item.category not in Order.include_sides: for addon in (addon1, addon2): if addon.category == "Sides": total += self._item_total(addon) return total @staticmethod def create_order(ordered_items, total, payment_type): """create a modified order""" order_dct = { "items": ordered_items, "payment_type": payment_type, "total": total } tax_scale = int((Order.taxrate * 100) + 10000) subtotal = int( decimal.Decimal((total * 100) / tax_scale).quantize( decimal.Decimal('0.01'), rounding=decimal.ROUND_HALF_DOWN) * 100) tax = total - subtotal order_dct["subtotal"] = subtotal order_dct["tax"] = tax return order_dct def print_invoice(self): self.stdout.info("--DEPRECATED--") month = 2592000 current_time = int(time.time()) start_time = current_time - month for payment_type in (p for p in Order.payment_types if p != "Cash" and p != "Check"): args = [ "awk " f"-vstart={start_time}", f"-vend={current_time}", "-vpayment_type=" + payment_type, "-f" + os.path.join(os.getcwd(), "hwk/POS/invoice.awk "), lib.SALESLOG + " ", ] if not lib.DEBUG: args.append("> /dev/serial0") subprocess.call(" ".join(args), shell=True) # should combine top and bottom function. # but no receipt printer at the moment for testing. # safer to just add another function and awk script. def print_daily_sales(self): self.stdout.info("--DEPRECATED--") day = 86400 current_time = int(time.time()) start_time = current_time - day args = [ "awk ", f"-vstart={start_time}", f"-vend={current_time}", "-f" + os.path.join(os.getcwd(), "hwk/POS/sales.awk "), lib.SALESLOG + " ", ] if not lib.DEBUG: args.append("> /dev/serial0") return subprocess.call(" ".join(args), shell=True) def open_drawer(self): self.cash_drawer.open() # LCD PRICE SCREEN # TODO delegate object knows a bit too much about the widget that's calling it # perhaps extract to another class to be initiated in main def update_total(self, tabbed_frame, editor): async def update(): while True: await asyncio.sleep(1 / 60) current_tab = tabbed_frame.current() if current_tab == self.last_tab: # filling out order for customer if current_tab == "Orders": await self.screen.set_ticket_no(self.ticket_no) await self.screen.set_total(Order().total) self.last_total = Order().total self.last_no = self.ticket_no # use previous value because Order().total resets the moment checkout is complete # we don't want the screen to update until we return back to Orders tab. elif current_tab == "Checkout": await self.screen.set_ticket_no(self.last_no) await self.screen.set_total(self.last_total) # need to show editor information instead # this block also allows the cancel_order() and modify_order() # functions to set cash and change values. elif current_tab == "Processing": if editor.is_gridded: await self.screen.set_ticket_no( editor.ticket_no, "(edit)") await self.screen.set_total(editor.difference) else: await self.screen.set_total(None) await self.screen.set_ticket_no(None) # Orders -> Checkout tab switch. No need to clear out ticket_no, total elif current_tab == "Checkout" and self.last_tab == "Orders": self.last_tab = current_tab continue # switching tabs in any other sequence resets the lcd screen else: self.last_tab = current_tab self.last_no = self.ticket_no await self.screen.set_null() self.create_task(update())
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")