Ejemplo n.º 1
0
    def initialiseScreenManager(self):

        Logger.debug("Initialising ScreenManager...")

        kwargs = {'piBlockApp': self}

        Logger.debug("Passing KWARGS = {}".format(kwargs))

        self.screenManager = PiBlockScreenManager(**kwargs)

        self.getContentLayout().add_widget(self.screenManager)

        self.screenManager.add_widget(PiBlockStartupScreen(name='startup', piBlockEngine=self.piBlockEngine))
        self.screenManager.add_widget(PiBlockTenderScreen(name='tender', piBlockEngine=self.piBlockEngine))

        self.screenManager.current = 'startup'
        self.currentScreen = 'startup'

        self.status = 'Initialised'

        Logger.debug("Initialising ScreenManager...Done!")
Ejemplo n.º 2
0
class PiBlockApp(App):

    #-------------------------------------------------------------
    # Getters & Setters
    #-------------------------------------------------------------

    @property
    def pbSmallLogoImagePath(self):
        return "{}".format(PBSMALLLOGO)

    @property
    def adlSmallLogoImagePath(self):
        return "{}".format(ADLSMALLLOGO)

    @property
    def bizLogoImagePath(self):
        return "{}".format(BIZLOGO)

    @property
    def pbBannerImagePath(self):
        return "{}".format(PBBANNER)

    @property
    def startupSmileyImagePath(self):
        return "{}".format(STARTUPSMILEY)
    
    @property
    def acceptBitcoinImagePath(self):
        return "{}".format(ACPTBTC)

    @property
    def tenderSmileyImagePath(self):
        return "{}".format(TENDERSMILEY)

    @property
    def uptime(self):
        return time.gmtime(Clock.get_boottime())

    @property
    def sshControlAddressCmd(self):
        return "ssh user@{} -p {}".format(self.sshHostName, self.piBlockEngine.sshPort)

    @property
    def lastStartupTime(self):
        return self._lastStartupTime

    @lastStartupTime.setter
    def lastStartupTime(self, lastStartupTime):
        self._lastStartupTime = lastStartupTime

    @property
    def status(self):
        return self._status

    @status.setter
    def status(self, status):
        self._status = status

    @property
    def fps(self):
        return Clock.get_fps()

    @property
    def sshHostAddress(self):
        return self._sshHostAddress

    @sshHostAddress.setter
    def sshHostAddress(self, sshHostAddress):
        self._sshHostAddress = sshHostAddress

    @property
    def sshHostName(self):
        return self._sshHostName

    @sshHostName.setter
    def sshHostName(self, sshHostName):
        self._sshHostName = sshHostName

    @property
    def currentScreen(self):
        return self._currentScreen

    @currentScreen.setter
    def currentScreen(self, currentScreen):
        self._currentScreen = currentScreen

    def __init__(self, **kwargs):

        Logger.debug("Initialising...")
        
        super(PiBlockApp, self).__init__(**kwargs)

        Logger.debug("Starting PiBlockEngine...")
        self.piBlockEngine = PiBlockEngine()
        Logger.debug("Starting PiBlockEngine...Done!")

        self.lastStartupTime = strftime('%Y/%-m/%-d %H:%M:%S')
        
        self.sshHostAddress = None
        self.sshHostName = None
        self.sshPort = None
        self.controlServer = None
        self.screenManager = None
        self.currentScreen = None
        self.status = None
        
        # self.status = 'Initialised'

        Logger.debug("Initialising...Done!")

    #-------------------------------------------------------------
    # Overriden Methods
    #-------------------------------------------------------------

    def on_start(self):
        Logger.debug("on_start...")

        # self.root.current = 'startup'
        # self.currentScreen = self.root.ids['startup']

        self.testGUITreeRefs()

        Clock.schedule_once(lambda dt: self.loadStaticImages(), 0.1)
        Clock.schedule_once(lambda dt: self.loadStaticInfo(), 0.2)
        Clock.schedule_once(lambda dt: self.loadQuoteInfo(), 0.3)
        Clock.schedule_once(lambda dt: self.startControlServer(), 0.1)
        Clock.schedule_once(lambda dt: self.initialiseScreenManager(), 0.2)

        Logger.debug("Scheduling Running Tasks...")
        
        
        # Clock.schedule_once(lambda dt: self.loadQuoteInfo(), 0.3)
        Clock.schedule_interval(self.updateStatusInfo, 1)
        Clock.schedule_interval(self.updateClockInfo, 1)
        Clock.schedule_interval(self.updateQuoteInfo, 60)

        Logger.debug("Scheduling Running Tasks...Done!")

        # self.getHeaderStatusLabel().text = "Status: [b]{}[/b]".format(self.status)

        # Clock.schedule_interval(self.updateSystemInfo, 1)

        Logger.debug("on_start...Done!")

    #-------------------------------------------------------------
    # Convenience Methods
    #-------------------------------------------------------------

    def loadStaticImages(self):
        Logger.debug("Loading & Setting Static Images...")
        print("{}".format(self.bizLogoImagePath))
        print("{}".format(self.pbSmallLogoImagePath))
        print("{}".format(self.adlSmallLogoImagePath))

        try:
            self.getHeaderBizLogo().source = str(self.bizLogoImagePath)
        
        except Exception as e:
            Logger.error("Error Loading Business Logo Image file at path '{}' beacause:\n{}".format(self.bizLogoImagePath, e.message))

        try:
            self.getFooterPBLogoThumbnailImage().source = str(self.pbSmallLogoImagePath)
        
        except Exception as e:
            Logger.error("Error Loading Business Logo Image file at path '{}' beacause:\n{}".format(self.pbSmallLogoImagePath, e.message))

        try:
            self.getFooterADLLogoThumbnailImage().source = str(self.adlSmallLogoImagePath)
        
        except Exception as e:
            Logger.error("Error Loading Business Logo Image file at path '{}' beacause:\n{}".format(self.adlSmallLogoImagePath, e.message))

        Logger.debug("Loading & Setting Static Images...Done!")

    def loadStaticInfo(self):
        Logger.debug("Loading Static Info...")

        self.getHeaderQuoteSrcLabel().text = "[i]source: {}".format(self.piBlockEngine.pricingLookupURL)

        Logger.debug("Loading Static Info...Done!")

    def loadQuoteInfo(self):
        Logger.debug("Loading Quote Info...")

        Logger.debug("Default Currency = {}".format(self.piBlockEngine.defaultCurrency))

        if self.piBlockEngine.defaultCurrency != None:
            Logger.debug("Setting Quote Info...")

            self.getHeaderQuoteBTCRateLabel().text = "[b]{} {}1.00[/b] = [b]{} BTC[/b]".format(self.piBlockEngine.defaultCurrency, self.piBlockEngine.defaultCurrencySymbol, self.piBlockEngine.rateForBTC(self.piBlockEngine.defaultCurrency))
            self.getHeaderQuoteCurrencyRateLabel().text = "[b]1 BTC[/b] = [b]{} {}{}[/b]".format(self.piBlockEngine.defaultCurrency, self.piBlockEngine.defaultCurrencySymbol, self.piBlockEngine.rateForCurrency(self.piBlockEngine.defaultCurrency))

        Logger.debug("Loading & Setting Quote Info...Done!")

    def updateStatusInfo(self, nap):
        Logger.debug("Update Status Objects...")
        self.getHeaderStatusLabel().text = "Status: [b]{}[/b]".format(self.status)
        Logger.debug("Update Status Objects...Done!")


    def updateClockInfo(self, nap):
        Logger.debug("Update ClockUI Objects...")

        self.getHeaderClockDateLabel().text = strftime('[b]%A, %d %b %Y[/b]')
        self.getHeaderClockTimeLabel().text = strftime('[b]%I:%M[/b]:%S %p')

        Logger.debug("Update ClockUI Objects...Done!")

    def updateQuoteInfo(self, nap):
        Logger.debug("Updating Quote Info...")

        Logger.debug("Default Currency = {}".format(self.piBlockEngine.defaultCurrency))

        if self.piBlockEngine.defaultCurrency != None:
            Logger.debug("Setting Quote Info...")

            self.getHeaderQuoteBTCRateLabel().text = "[b]{} {}1.00[/b] = [b]{} BTC[/b]".format(self.piBlockEngine.defaultCurrency, self.piBlockEngine.defaultCurrencySymbol, self.piBlockEngine.rateForBTC(self.piBlockEngine.defaultCurrency))
            self.getHeaderQuoteCurrencyRateLabel().text = "[b]1 BTC[/b] = [b]{} {}{}[/b]".format(self.piBlockEngine.defaultCurrency, self.piBlockEngine.defaultCurrencySymbol, self.piBlockEngine.rateForCurrency(self.piBlockEngine.defaultCurrency))

        Logger.debug("Loading & Setting Quote Info...Done!")

    def themeColor(self):
        Logger.debug("ThemeColor Requested...")

        Logger.debug("ThemeColor Requested...Done!")

        return get_color_from_hex(THEMECOLOR)

    def initialiseScreenManager(self):

        Logger.debug("Initialising ScreenManager...")

        kwargs = {'piBlockApp': self}

        Logger.debug("Passing KWARGS = {}".format(kwargs))

        self.screenManager = PiBlockScreenManager(**kwargs)

        self.getContentLayout().add_widget(self.screenManager)

        self.screenManager.add_widget(PiBlockStartupScreen(name='startup', piBlockEngine=self.piBlockEngine))
        self.screenManager.add_widget(PiBlockTenderScreen(name='tender', piBlockEngine=self.piBlockEngine))

        self.screenManager.current = 'startup'
        self.currentScreen = 'startup'

        self.status = 'Initialised'

        Logger.debug("Initialising ScreenManager...Done!")

    def getConfigValueForKey(self, key):

        if key == 'RSAKeyLocation':
            return self.piBlockEngine.rsaKeyLocation
        elif key == 'defaultCurrency':
            return self.piBlockEngine.defaultCurrency
        elif key == 'defaultCurrencySymbol':
            return self.piBlockEngine.defaultCurrencySymbol
        elif key == 'pricingLookupURL':
            return self.piBlockEngine.pricingLookupURL
        elif key == 'lastDailyTxCount':
            return self.piBlockEngine.lastDailyTxCount
        elif key == 'sshPort':
            return self.piBlockEngine.sshPort
        elif key == 'kpub':
            return self.piBlockEngine.kpub
        elif key == 'timeout':
            return self.piBlockEngine.timeout
        elif key == 'blockchainInterfaceURL':
            return self.piBlockEngine.blockchainInterfaceURL
        elif key == 'email':
            return self.piBlockEngine.email
        else:
            if self.piBlockEngine.config.get_configValueForKey(key) != None:
                return self.piBlockEngine.config.get_configValueForKey(key)
            else:
                return "Unknown"

    def moveIntoTenderingState(self):

        Logger.debug("BEFORE: self.currentScreen = {}".format(self.currentScreen))
        
        if self.isAppStatusInitialised():

            Window.clearcolor = get_color_from_hex('#FFFFFF')

            self.screenManager.current = 'tender'
            self.currentScreen = 'tender'
            
            self.status = 'Tendering'

            Logger.debug("AFTER: sself.currentScreen = {}".format(self.currentScreen))

        else:

            raise "PiBlock cannot move into the Tendering State because it is in a '{}' state.".format(self.status)

    def moveOutOfTenderingState(self):

        Logger.debug("BEFORE: self.currentScreen = {}".format(self.currentScreen))
        
        if self.isAppStatusTendering():

            Window.clearcolor = get_color_from_hex('#FFFFFF')

            self.screenManager.current = 'startup'
            self.currentScreen = 'startup'

            self.status = 'Initialised'
            
            Logger.debug("AFTER: self.currentScreen = {}".format(self.currentScreen))

        else:

            raise "PiBlock cannot move out of the Tendering State because it is in a '{}' state.".format(self.status)   

    def isAppStatusProcessing(self):
        if self.status == 'Processing':
            return True
        else:
            return False

    def isAppStatusTendering(self):
        if self.status == 'Tendering':
            return True
        else: 
            return False

    def isAppStatusInitialised(self):

        if self.status == 'Initialised':
            return True
        else:
            return False

    #-------------------------------------------------------------
    # PiBlock SSH Control Server Convenience Methods
    #-------------------------------------------------------------
    def startControlServer(self):
        Logger.debug("Starting Control Server...")
        # self.piBlockEngine.startControlServer()

        if not self.controlServer:
            Logger.debug("Initialise PiBlock SSH Host...")

            try:            
                self.shhHostName = socket.gethostname()
                Logger.debug("SSH HostName: {}".format(self.shhHostName))
                self.sshHostAddress = socket.gethostbyname(self.shhHostName)

                Logger.debug("SSH HostAddress: {}".format(self.sshHostAddress))

            except Exception as e:
                Logger.warning("Failed to initialise PiBlock SSH Host because: {}".format(e.message))
        
            Logger.debug("Initialise PiBlock SSH Host...Done!")

        try:

            self.controlServer = PiBlockSSHControlServer(self, int(self.piBlockEngine.sshPort))
            #self.controlServer.startSSHServer()
        except BaseException as e:
            Logger.warning("Could Not start SSH Server because:\n{}".format(e.message))

            Logger.debug("Starting Control Server...Done!")

    def on_controlServerConnected(self, conn):
        Logger.debug("Control Server Connected!\n Connection Details: {}".format(conn))

        self.controlServerConn = conn

    def on_controlMsgRcvd(self, data):
        Logger.debug("A Control Message was recieved: {} from connection {}".format(data, self.controlServerConn))


    #-------------------------------------------------------------
    # Common Screen Element References And UI Updates
    #-------------------------------------------------------------

    def getHeader(self):
        #currentScreen = self.get_screen(self.current)
        #Logger.debug("PiBlockScreenManager's Current Screen is {}".format(self.root.ids.keys()))
        Logger.debug("Header IDs = {}".format(self.root.ids['header'].ids.keys()))

        return self.root.ids['header']

    def getHeaderStatusLabel(self):
        return self.getHeader().ids['statuslabel']

    def getHeaderClock(self):
        return self.getHeader().ids['clock']

    def getHeaderClockTimeLabel(self):
        return self.getHeaderClock().ids['time']

    def getHeaderClockDateLabel(self):
        return self.getHeaderClock().ids['date']

    def getHeaderBizLogo(self):
        return self.getHeader().ids['bizlogo']

    def getHeaderQuote(self):
        return self.getHeader().ids['quote']

    def getHeaderQuoteBTCRateLabel(self):
        return self.getHeaderQuote().ids['quotebtcratelabel']

    def getHeaderQuoteCurrencyRateLabel(self):
        return self.getHeaderQuote().ids['quotecurrencyratelabel']

    def getHeaderQuoteSrcLabel(self):
        return self.getHeaderQuote().ids['quotesrclabel']

    def getFooter(self):
        Logger.debug("Header IDs = {}".format(self.root.ids['footer'].ids.keys()))
        return self.root.ids['footer']

    def getFooterPBLogoThumbnailImage(self):
        return self.getFooter().ids['pblogothumbnail']

    def getFooterADLLogoThumbnailImage(self):
        return self.getFooter().ids['adllogothumbnail']

    def getContentLayout(self):
        return self.root.ids['content']

    #-------------------------------------------------------------
    # SomeTests
    #-------------------------------------------------------------

    def testGUITreeRefs(self):

        Logger.debug("Testing GUI Tree References...")

        Logger.debug("Root IDs = {}".format(self.root.ids.keys()))
        # Logger.debug("Ids in Current Screen = {}".format(self.currentScreen.ids.keys()))
        Logger.debug("Header IDs = {}".format(self.getHeader().ids.keys()))
        Logger.debug("Header BizLogo IDs = {}".format(self.getHeaderBizLogo()))
        Logger.debug("Header Clock IDs = {}".format(self.getHeaderClock().ids.keys()))
        Logger.debug("Header Time IDs = {}".format(self.getHeaderClockTimeLabel()))
        Logger.debug("Header Date IDs = {}".format(self.getHeaderClockDateLabel()))
        Logger.debug("Header Status Label IDs = {}".format(self.getHeaderStatusLabel()))

        Logger.debug("Header Quote IDs = {}".format(self.getHeaderQuote().ids.keys()))
        Logger.debug("Header Quote Btc Rate IDs = {}".format(self.getHeaderQuoteBTCRateLabel()))
        Logger.debug("Header Quote Currency Rate IDs = {}".format(self.getHeaderQuoteCurrencyRateLabel()))
        Logger.debug("Header Quote Src Rate IDs = {}".format(self.getHeaderQuoteSrcLabel()))

        Logger.debug("Footer IDs = {}".format(self.getFooter().ids.keys()))
        Logger.debug("Footer PBLogoThumbnailImage IDs = {}".format(self.getFooterPBLogoThumbnailImage()))
        Logger.debug("Footer PBLogoThumbnailImage IDs = {}".format(self.getFooterADLLogoThumbnailImage()))

        Logger.debug("Testing GUI Tree References...Done!")