Exemple #1
0
    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()
Exemple #2
0
        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()
Exemple #3
0
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)
Exemple #4
0
 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
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
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()))
Exemple #8
0
    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")
Exemple #9
0
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()))
Exemple #10
0
            # 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")
Exemple #11
0
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:
Exemple #12
0
    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)
Exemple #13
0
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
Exemple #14
0
                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")
Exemple #15
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
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)
Exemple #17
0
    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"
            )
Exemple #18
0
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:
Exemple #19
0
    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")
Exemple #20
0
    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)
Exemple #21
0
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()
Exemple #22
0
 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 = {}
Exemple #24
0
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()
Exemple #25
0
    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)
Exemple #26
0
	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
Exemple #27
0
    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",
Exemple #28
0
    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",
Exemple #29
0
    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
Exemple #30
0
 def setUp(self):
     self.printer = Printer(pages_per_second=2.0, capacity=300)
Exemple #31
0
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
Exemple #32
0
# -*- 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)
Exemple #33
0
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)
Exemple #34
0
    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)
Exemple #35
0
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())
Exemple #36
0
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())
Exemple #37
0
    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
Exemple #38
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
Exemple #40
0
    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)
Exemple #41
0
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
Exemple #42
0
 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])
Exemple #43
0
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
Exemple #44
0
    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)
Exemple #46
0
    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")
Exemple #47
0
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):
Exemple #48
0
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"
    )
Exemple #49
0
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())
Exemple #50
0
    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")