Beispiel #1
0
class MyApp(App):
    def build(self):
        self.icon = 'myicon.png'
        self.name = ""
        self.title = ""

        #self.atlas = Atlas("./tdpatlas.atlas")
        #print (self.atlas['Chiocciola_1'])
        self.sm = ScreenManager()
        screens = [Screen(name='Title {}'.format(i)) for i in range(4)]
        self.sm.add_widget(screens[0])
        img_tufo = Image(source="pictures/tufo.png")
        screens[0].add_widget(img_tufo)
        self.sm.add_widget(screens[1])
        img_palazzo = Image(source="pictures/palazzo_comunale.png")
        screens[0].add_widget(img_palazzo)
        #root.add_widget(img)
        #img.add_widget(Image(source="pictures/Istrice_1.gif", pos=(100, 100)))
        #c = CustomLayout()
        #root.add_widget(c)
        #c.add_widget(
        #    Image(
        #        source="pictures/palazzo_comunale.png"))
        #root.add_widget(Image(source="pictures/Chiocciola_1.gif"))
        #c = CustomLayout()
        #c.add_widget(
        #        Image(source="pictures/Chiocciola_1.gif",
        #        size_hint= (1, .5),
        #        pos_hint={'center_x':.5, 'center_y':.5}))
        #root.add_widget(c)
        return self.sm
        #filename = "pictures/Chiocciola_1.gif"
        #m = Image(source=filename)
        
    def loginPopup(self):
        box = BoxLayout(orientation='vertical')
        box.add_widget(Label(text="Username", size_hint=(1., None), size=(1., 30)))
        box.add_widget(TextInput(multiline=False, size_hint=(1., None), size=(1., 30)))
        box.add_widget(Label(text="Password", size_hint=(1., None), size=(1., 30)))
        box.add_widget(TextInput(multiline=False, size_hint=(1., None), size=(1., 30), password=True))
        # manca il bottone
        popup = Popup(title='Login', content=box, size_hint=(.5, .3), )
        popup.open()
        return

    def estrazione(self, list_):
        self.sm.next()
        pass
Beispiel #2
0
class IlanPanosuUyg(App):

    def build(self):
        self.py=ScreenManager()

        Builder.load_file("duyuru.kv")
        Builder.load_file("atasozu.kv")
        Builder.load_file("resim.kv")
        self.py.add_widget(duyuruPenceresi(name='ilan'))
        self.py.add_widget(atasozuPenceresi(name='atasozu'))
        self.py.add_widget(resimPenceresi(name='resim'))
        
        Clock.schedule_interval(self.pencereDegistir, 2)
        
        return self.py


    def pencereDegistir(self, *args):
        sonraki = self.py.next()
        pcr = self.py.get_screen(sonraki)
        if sonraki == 'duyuru':
            pcr.ids['duyuru_etiketi'].text = ' *Önümüzdeki hafta sonu veli toplantısı yapılacaktır.\n *Yarın gezi kolu Pamukkale\'ye gidecektir.'
        elif sonraki == 'atasozu':
             pcr.ids['atasozu_etiketi'].text = random.choice(atasozleri)
        elif sonraki == 'resim':
            res = random.choice(resimler)
            pcr.ids['resim'].source = res[0]
            pcr.ids['resim_etiketi'].text = res[1]
            
        self.py.current = sonraki
Beispiel #3
0
class IlanPanosuUyg(App):
    def build(self):
        self.py = ScreenManager()

        Builder.load_file("duyuru.kv")
        Builder.load_file("atasozu.kv")
        Builder.load_file("resim.kv")
        self.py.add_widget(duyuruPenceresi(name='ilan'))
        self.py.add_widget(atasozuPenceresi(name='atasozu'))
        self.py.add_widget(resimPenceresi(name='resim'))

        Clock.schedule_interval(self.pencereDegistir, 2)

        return self.py

    def pencereDegistir(self, *args):
        sonraki = self.py.next()
        pcr = self.py.get_screen(sonraki)
        if sonraki == 'duyuru':
            pcr.ids[
                'duyuru_etiketi'].text = ' *Önümüzdeki hafta sonu veli toplantısı yapılacaktır.\n *Yarın gezi kolu Pamukkale\'ye gidecektir.'
        elif sonraki == 'atasozu':
            pcr.ids['atasozu_etiketi'].text = random.choice(atasozleri)
        elif sonraki == 'resim':
            res = random.choice(resimler)
            pcr.ids['resim'].source = res[0]
            pcr.ids['resim_etiketi'].text = res[1]

        self.py.current = sonraki
Beispiel #4
0
class AudiowallSet(BoxLayout):

    def __init__(self, **kwargs):
        super(AudiowallSet, self).__init__(**kwargs)
        self.pages = []
        self.active_page = 1

        self._container = BoxLayout(orientation='vertical')
        self.add_widget(self._container)

        self._sm = ScreenManager()
        self._sm.transition = SlideTransition()
        self._sm.transition.duration = 0.3
        self._container.add_widget(self._sm)

        self._buttons = BoxLayout(orientation='horizontal', size_hint=(1,0.25))
        self._container.add_widget(self._buttons)

        self.previous = Button(text='<<')
        self.previous.bind(on_press=self.on_previous)
        self._buttons.add_widget(self.previous)

        self.pages_label = Label()
        self._buttons.add_widget(self.pages_label)

        self.next = Button(text='>>')
        self.next.bind(on_press=self.on_next)
        self._buttons.add_widget(self.next)

    def add_page(self, id, name):      
        screen = Screen()
        screen.name = id
        page = AudiowallPage()
        page.name = name
        screen.add_widget(page)
        self._sm.add_widget(screen)
        self.pages.append(page)
        self.pages_label.text = 'Page %i of %i' % (self.active_page, len(self.pages))

    def on_previous(self, *largs):
        self._sm.transition.direction = 'right'
        self._sm.current = self._sm.previous()
        self.active_page -= 1
        if(self.active_page == 0):
            self.active_page = len(self.pages)
        self.pages_label.text = 'Page %i of %i' % (self.active_page, len(self.pages))

    def on_next(self, *largs):
        self._sm.transition.direction = 'left'
        self._sm.current = self._sm.next()
        self.active_page += 1
        if(self.active_page > len(self.pages)):
            self.active_page = 1
        self.pages_label.text = 'Page %i of %i' % (self.active_page, len(self.pages))
Beispiel #5
0
class PencereUyg(App):
    def build(self):
        self.py = ScreenManager()

        for i in range(4):
            p = Screen(name="pncr%d" % i)
            p.add_widget(Label(text="Pencere %d" % i))
            self.py.add_widget(p)
        self.py.current = 'pncr2'
        Clock.schedule_interval(self.pencereDegistir, 2)
        return self.py

    def pencereDegistir(self, *args):
        sonraki = self.py.next()
        self.py.current = sonraki
Beispiel #6
0
class PencereUyg(App):

    def build(self):
        self.py=ScreenManager()

        for i in range(4):
            p=Screen(name="pncr%d" % i)
            p.add_widget(Label(text="Pencere %d" % i))
            self.py.add_widget(p)
        self.py.current = 'pncr2'
        Clock.schedule_interval(self.pencereDegistir, 2)
        return self.py

    def pencereDegistir(self, *args):
        sonraki = self.py.next()
        self.py.current = sonraki
Beispiel #7
0
class NodeApp(App):
    def build(self):
        self.sm = ScreenManager()
        self.ms = MainScreen(name="MainScreen")
        self.ss = SettingsScreen(name="SettingsScreen")
        self.sm.add_widget(self.ss)
        self.sm.add_widget(self.ms)

        self.next_screen = 1

        print(self.sm.screen_names)
        Clock.schedule_interval(lambda *t: self.switch_screens(), 5)
        return self.sm

    def switch_screens(self):
        self.sm.current = self.sm.next()
Beispiel #8
0
 def changeScreen(self):
     sm = ScreenManager()
     sm.add_widget(HomeTab(name='hometab'))
     sm.add_widget(WorkoutTab(name='workouttab'))
     sm.add_widget(SettingsTab(name='settingstab'))
     sm.next()
Beispiel #9
0
class DescargarApp(App):

    # Desactiva el cuadro de configuración genérico de Kivy
    use_kivy_settings = False

    # Para que no se cierre al cambiar de aplicación en Android
    def on_pause(self):
        return True

    def build(self):
        self.download_thread = None

        self.store = JsonStore("descargar-aragontv.json")

        if not self.store.exists("target_folder"):

            if self.get_platform_name()=="android":
                from jnius import autoclass
                Environment = autoclass('android.os.Environment')
                download_folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                self.store.put("target_folder",value=download_folder.getAbsolutePath() )
            else:
                self.store.put("target_folder",value=os.path.expanduser("~") )

        if not self.store.exists("source_url"):
            self.store.put("source_url",value="http://alacarta.aragontelevision.es/programas/chino-chano/por-la-sierra-de-armantes-28022016-1452")

        self.screen_manager = ScreenManager(transition=FadeTransition())
        
        self.paso1 = Paso1(name='Paso 1')
        self.paso1.ids.target_folder.text = self.store.get("target_folder")["value"]
        self.paso1.ids.page_url.text = self.store.get("source_url")["value"]

        self.paso2 = Paso2(name='Paso 2')
        self.paso3 = Paso3(name='Paso 3')
        self.screen_manager.add_widget(self.paso1)
        self.screen_manager.add_widget(self.paso2)
        self.screen_manager.add_widget(self.paso3)
        return self.screen_manager

    def dismiss_popup(self):
        self._popup.dismiss()

    def target_selected(self, path, filename):
        self._popup.dismiss()
        self.paso1.ids.target_folder.text = path
        self.store.put("target_folder",value=self.paso1.ids.target_folder.text)

    def target_selection(self):
        content = LoadDialog(load=self.target_selected, cancel=self.dismiss_popup)
        content.ids.filechooser.path = self.paso1.ids.target_folder.text
        self._popup = Popup(title="Elige destino", content=content, size_hint=(0.9, 0.9))
        self._popup.open()

    def message(self,title,body):

        content = MessageDialog()
        content.ids.message_body.text = body
        self._popup = Popup(title=title, content=content, size_hint=(0.8, 0.8))
        self._popup.open()

    def url_ready(self,page_url):
        print "url_ready"

        print self.paso1.ids.page_url.text

        if not self.paso1.ids.page_url.text.startswith("http://") and not self.paso1.ids.page_url.text.startswith("https://"):
            self.message("Hay un problema...","La URL que has introducido no es válida")
            return

        self.store.put("target_folder",value=self.paso1.ids.target_folder.text)
        self.store.put("source_url",value=self.paso1.ids.page_url.text)

        from core.item import Item
        item = Item(url=self.paso1.ids.page_url.text)

        from channels import aragontv
        item = aragontv.detalle_episodio(item)

        self.video_title = item.title
        self.media_url = item.media_url

        if self.media_url=="":
            self.message("Hay un problema...","No se puede encontrar un vídeo en esa URL")
            return

        self.screen_manager.current = self.screen_manager.next()

        self.paso2.ids.description.text = "[b]"+item.title+"[/b]\n\n"+item.plot

    def start_download(self):
        print "start_download"

        self.paso3.resultado = "Descargando "+self.media_url+"\n\n"

        self.screen_manager.current = self.screen_manager.next()

        # Start download in background
        from core import downloadtools
        clean_file_name = downloadtools.limpia_nombre_caracteres_especiales(self.video_title.decode("utf-8"))+".flv"
        #print "clean_file_name="+clean_file_name

        self.target_file = os.path.join( self.paso1.ids.target_folder.text , clean_file_name )
        #print "target_file="+self.target_file

        if self.get_platform_name()=="win":
            self.target_file = self.target_file.encode("utf-8")

        # get_platform_name es: win, linux, android, macosx, ios or unknown
        folder_platform = os.path.join( os.getcwd() , "rtmpdump" , self.get_platform_name() )
        print "folder_platform="+folder_platform
        if self.get_platform_name()=="win":
            rtmpdump = os.path.join(folder_platform,"rtmpdump.exe")
        elif self.get_platform_name()=="linux":
            rtmpdump = "rtmpdump"
        else:
            rtmpdump = os.path.join(folder_platform,"rtmpdump")

        # En Android hay que darle antes expresamente permisos de ejecución al binario de rtmpdump
        if self.get_platform_name()=="android":
            subprocess.Popen(["chmod","0755",rtmpdump], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

        exe = [rtmpdump]
        exe.append("-r")
        exe.extend(self.media_url.replace("app=","--app ").replace("playpath=","--playpath ").split(" "))
        #exe.append("--live")
        exe.append("-o")
        exe.append(self.target_file)

        self.paso3.ids.cargando.opacity=1

        self.download_thread = DownloadThread(exe,self.paso3)
        self.download_thread.start()

        Clock.schedule_interval(self.check_output_size, 0.5)

    def abort_download(self):
        print "abort_download"

        self.download_thread.abort()
        self.screen_manager.current = self.screen_manager.previous()

    def check_output_size(self,value):
        #print "check_output_size"

        if os.path.exists(self.target_file):
            statinfo = os.stat(self.target_file)
            self.paso3.tamanyo = human_size(statinfo.st_size)

    def on_stop(self):
        print "on_stop!"

        if self.download_thread is not None:
            self.download_thread.abort()

    def get_platform_name(self):
        from kivy import platform
        platform_name = str(platform)
        print "platform_name="+platform_name
        return platform_name
class QuestionnairesApp(App):
    sm = None
    qf = None
    float_layout = None

    cei2 = None
    bfi = None

    def build(self):
        # initialize logger
        #KL.start([DataMode.file, DataMode.communication]) #, "/sdcard/curiosity/", the_ip='127.0.0.1')#self.user_data_dir)
        KL.start([DataMode.file, DataMode.communication, DataMode.ros],
                 self.user_data_dir)

        self.sm = ScreenManager()

        screen = ZeroScreen()
        screen.start()
        screen.ids['subject_id'].bind(
            text=screen.ids['subject_id'].on_text_change)
        self.sm.add_widget(screen)

        return self.sm

    def add_all(self):
        self.qf = []
        self.add_questionnaire('questionnaires/BFI.json')
        self.qf.append(MiddleForm(self))
        self.add_questionnaire('questionnaires/Need for Cognition.json')
        self.qf.append(MiddleForm(self))
        self.add_questionnaire('questionnaires/Questionnaire3.json')
        self.qf.append(MiddleForm(self))
        self.add_questionnaire('questionnaires/Questionnaire4.json')

        for kqf in range(0, len(self.qf)):
            screen = Screen(name="question" + str(kqf))
            screen.add_widget(self.qf[kqf])
            self.sm.add_widget(screen)

        screen = Screen(name='final_form')
        screen.add_widget(FinalForm(self))
        self.sm.add_widget(screen)

        self.start()

    def add_questionnaire(self, filename=""):
        new_questionnaire = Questionnaire(filename)
        for p in range(0, len(new_questionnaire.page_dict)):
            self.qf.append(
                QuestionsForm(self, new_questionnaire.page_dict[p],
                              new_questionnaire.questionnaire_name))

    def start(self):
        KL.start([DataMode.file, DataMode.communication, DataMode.ros],
                 self.user_data_dir)
        for qf in self.qf:
            qf.start()

    def on_pause(self):
        return True

    def press_start(self, pre_post):
        print(self.sm.size)
        self.add_all()
        self.sm.current = self.sm.next()
Beispiel #11
0
class DownloaderApp(App):

    use_kivy_settings = False

    def on_pause(self):
        return True

    def paste(self):
        '''
        try:
            from kivy.core.clipboard import Clipboard
            self.main_screen.ids.page_url.text = Clipboard.paste()
        except:
            logger.error("Could not be pasted to clipboard!")
            pass
        '''
        pass

    def copy(self,text):
        try:
            from kivy.core.clipboard import Clipboard
            Clipboard.copy(text)
        except:
            logger.error("Could not be copied to clipboard: "+text)
            pass

    def build(self):
        self.store = JsonStore("data/store.json")
        self.download_thread = None
        self.screen_manager = ScreenManager(transition=FadeTransition())
        self.main_screen = StartScreen(name='Welcome Screen')
        self.download_screen = DownloadScreen(name="Download Screen")
        self.screen_manager.add_widget(self.main_screen)
        self.screen_manager.add_widget(self.download_screen)
        return self.screen_manager

    def target_selected(self, path, filename):
        self._popup.dismiss()
        self.main_screen.ids.target_folder.text = path
        self.store.put("target_folder",value=self.main_screen.ids.target_folder.text)

    def target_selection(self):
        content = LoadDialog(load=self.target_selected, cancel=self.dismiss_popup)
        content.ids.filechooser.path = self.main_screen.ids.target_folder.text
        self._popup = Popup(title="Choose destination", content=content, size_hint=(0.9, 0.9))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()

    def url_ready(self,page_url):
        if not self.main_screen.ids.page_url.text.startswith("http://") and not self.main_screen.ids.page_url.text.startswith("https://"):
            self.message("There is a problem...","URL is not accepted, needs an http/s url")
            return
        self.store.put("target_folder",value=self.main_screen.ids.target_folder.text)
        self.store.put("source_url",value=self.main_screen.ids.page_url.text)

        self.media_url = self.main_screen.ids.page_url.text
        self.video_title = self.media_url

        self.screen_manager.current = self.screen_manager.next()

        self.start_download()

    def start_download(self):
        logger.debug("start_download called")

        self.download_screen.result = "downloading "+self.media_url+"\n\n"

        self.target_file = os.path.join( self.main_screen.ids.target_folder.text , self.video_title.decode("utf-8") )
        self.target_folder = self.main_screen.ids.target_folder.text

        self.download_screen.ids.loading.opacity=1
        self.download_screen.ids.label_text_message.text="decoding:\n\n"+self.media_url
        progressDialog = self.download_screen.ids.progress_bar_download
        progressDialoglabel = self.download_screen.ids.label_text_message
        self.download_thread = DownloadThread(self.media_url,self.target_folder,self.download_screen,progressDialog,progressDialoglabel)
        self.download_thread.start()

    def abort_download(self):
        logger.debug("abort_download")
        try:
            self.download_thread.abort()
        except:
            pass
        self.screen_manager.current = self.screen_manager.previous()

    def message(self,title,body):

        content = MessageDialog()
        content.ids.message_body.text = body
        self._popup = Popup(title=title, content=content, size_hint=(0.8, 0.8))
        self._popup.open()

    def on_stop(self):
        logger.debug("on_stop event called: goodbye!")
Beispiel #12
0
 def load_next_screen(self):
     self.current = ScreenManager.next(self)
Beispiel #13
0
class FacultyGameApp(App):
    sm = None
    cg = None
    cf = None
    qf = None
    lf = None
    dfp = None
    dff = None
    dfg = None
    ff = None
    framing_form = None
    score = None
    float_layout = None

    cei2 = None
    bfi = None
    learn = None

    the_condition = ''
    # game_mode:
    #   True: game, no framing, no stop, no details
    #   False: Keren's study
    game_mode = True

    original_size = [1920, 1128]

    def build(self):
        # initialize logger
        self.init_communication()

        self.cg = CuriosityGame(self)
        self.cf = ConsentForm(self)
        self.framing_form = FramingForm(self)

        self.cei2 = CEI2('questions.json')
        self.bfi = CEI2('more_questions.json')
        self.qf = []
        for p in range(0, len(self.cei2.page_dict)):
            self.qf.append(QuestionsForm(self, self.cei2.page_dict[p]))
        for p in range(0, len(self.bfi.page_dict)):
            self.qf.append(QuestionsForm(self, self.bfi.page_dict[p]))

        self.learn = Learning(self)
        self.lf = [LearningForm(self)]
        for i in range(1, self.learn.max_number_questions /
                       self.lf[0].q_per_page):
            self.lf.append(LearningForm(self))

        self.dfp = DetailsFormPersonal(self)
        self.dff = DetailsFormFaculty(self)
        self.dfg = DetailsFormGrades(self)
        self.ff = FinalForm(self)

        self.score = CuriosityScore(self.cg.game_duration, len(self.cg.items),
                                    self.user_data_dir)

        self.sm = ScreenManager()

        if self.game_mode:
            screen = ZeroScreen()
            screen.start()
            screen.ids['subject_id'].bind(
                text=screen.ids['subject_id'].on_text_change)
            self.sm.add_widget(screen)
        else:
            screen = ConsentScreen(name='consent')
            screen.add_widget(self.cf)
            self.sm.add_widget(screen)

        if not self.game_mode:
            screen = Screen(name='framing')
            screen.add_widget(self.framing_form)
            self.sm.add_widget(screen)

        screen = Screen(name='thegame')
        screen.add_widget(self.cg.the_widget)
        self.sm.add_widget(screen)

        for kqf in range(0, len(self.qf)):
            screen = Screen(name="question" + str(kqf))
            screen.add_widget(self.qf[kqf])
            self.sm.add_widget(screen)

        for i, ilf in enumerate(self.lf):
            screen = Screen(name="learning_" + str(i))
            screen.add_widget(ilf)
            screen.bind(on_pre_enter=self.learn.start)
            self.sm.add_widget(screen)

        if not self.game_mode:
            screen = Screen(name="details_personal")
            screen.add_widget(self.dfp)
            self.sm.add_widget(screen)

            screen = DetailsScreenFaculty(name="details_faculty")
            screen.add_widget(self.dff)
            self.sm.add_widget(screen)

            screen = Screen(name="details_grades")
            screen.add_widget(self.dfg)
            self.sm.add_widget(screen)

        screen = Screen(name="final")
        screen.bind(on_enter=self.ff.start)
        screen.add_widget(self.ff)
        self.sm.add_widget(screen)

        if self.game_mode:
            self.sm.current = 'zero_screen'
        else:
            self.sm.current = 'consent'

        return self.sm

    def on_start(self):
        self.start()

    def start(self):
        self.cf.start(self)
        for qf in self.qf:
            qf.start()
        self.dfp.start()
        self.dff.start()
        self.dfg.start()
        self.score.init_score()

        self.choose_condition()

        if self.game_mode:
            self.sm.current = 'zero_screen'
        else:
            self.sm.current = 'consent'

    def choose_condition(self):
        if self.game_mode:
            self.the_condition = 'no_framing/no_stop'
        else:
            self.the_condition = random.choice(conditions)
        KL.log.insert(action=LogAction.data,
                      obj='condition',
                      comment=self.the_condition)

        self.framing_form.set_text(self.the_condition)
        self.cg.set_stop_button(self.the_condition)

    def on_pause(self):
        return True

    def init_communication(self):
        KC.start(the_ip='192.168.1.254', the_parents=[self])  # 127.0.0.1
        KL.start(mode=[DataMode.file], pathname=self.user_data_dir)

    def press_start(self, *args):
        self.cg.start()
        self.sm.current = self.sm.next()
Beispiel #14
0
class DoorMonitorApp(MDApp):
    """
    Frontend for CatchScanner configuration

    """
    connection = ObjectProperty()
    current_user = StringProperty()
    access_level = NumericProperty(0)
    access = ObjectProperty(None)
    gui = ObjectProperty()
    api_response = ObjectProperty()

    timer_cnt = BoundedNumericProperty(5, min=0, max=ACCESS_TIMEOUT)
    timer = None
    _mqttc = mqtt.Client

    def __init__(self, cfg: dict) -> None:
        super().__init__()

        bell_config = MqttStringConfig(**cfg['bell'])

        door_list = []
        for door, d_cfg in cfg['doors'].items():
            print(f"new_door: {door}")
            new_door = Door(door_id=door,
                            name=d_cfg['name'],
                            command_topic=d_cfg['command_topic'],
                            state_topic=d_cfg['state_topic'])
            # new_door.set_relay()
            door_list.append(new_door)

        doors_config = DoorsConfig(doors=door_list)

        print(cfg['garage'])

        garage_config = MqttStringConfig(**cfg['garage'])

        mode_config = MqttStringConfig(**cfg['mode'])

        self.kelvin = kelvin_rgb_to_kivy()
        self.azure = get_color_from_hex('#f0ffff')

        self.theme_cls = ThemeManager()
        self.theme_cls.primary_palette = "Blue"
        self.theme_cls.primary_hue = "500"
        self.theme_cls.accent_palette = "Yellow"
        self.theme_cls.accent_palette_hue = "500"
        self.theme_cls.theme_style = "Light"

        self.doors_config = doors_config
        self.bell_config = bell_config
        self.garage_config = garage_config
        self.mode_config = mode_config

        self.backlight = Backlight()

        ## GUI ##
        self.gui = ScreenManager(transition=NoTransition())
        try:
            self.screens = config.screens
        except AttributeError:
            self.screens = None
        else:
            for screen in self.screens:
                print(f'New screen: {screen}')
                try:
                    import_statemet = self.screens[screen][
                        "import"] + ' as NewScreen'
                    print(import_statemet)
                    exec(import_statemet)
                except Exception as e:
                    print(e)
                else:
                    screen_kwargs = {}
                    screen_kwargs.update({'name': screen})
                    # screen_kwargs.update({'controller':self})
                    # screen_kwargs.update({'sub':self.screens[screen].get("sub", None)})
                    # screen_kwargs.update({'memory':kwargs.get(screen,None)})

                    print(f'SCREEN NAME IS: {screen}')
                    print(f'with kwargs: {screen_kwargs}')

                    self.screens[screen]["object"] = eval('NewScreen')(
                        **screen_kwargs)

                    self.gui.add_widget(self.screens[screen]["object"])

        self.change_screen(self.gui.screen_names[0])

    def presence_out_of_bounds(self, am: AccessModel):
        print(f"USER OUT OF BOUNDS {am}")

    def presence_detected(self, am: AccessModel):
        print(f"presence_detected {am}")
        if am.name:
            self.current_user = am.name
            toast(f"Velkommen {am.name}")
        if am.access_level > 0:
            self.access_level = am.access_level
            self.change_screen('Control')
            self.screens['DoorBell']["object"].login_feedback(True)

    # def detected_beacon_response(self, request, result):
    #     if result is not None:
    #         try:
    #             self.access_level = result
    #             if self.access_level > 0:
    #                 self.change_screen('Control')
    #                 self.screens['DoorBell']["object"].login_feedback(True)
    #             else:
    #                 print("Login failed")
    #                 self.screens['DoorBell']["object"].login_feedback(False)
    #         except ValueError as e:
    #             print(f"result: {result}")
    #             print(e)
    #     else:
    #         print(f"result: {result}")

    # # def detected_beacon(self, devices_discovered, address, packet_type):
    # #         print(f'found: {devices_discovered} with address {address} aand packet type {packet_type}')

    # def detected_beacon(self, uuid, rssi):
    #     print(f'found uuid: {uuid} with rssi {rssi}')
    #     detected_beacon(on_success=self.detected_beacon_response,uuid=uuid, rssi=rssi)

    def get_door_name(self, door_id, *args):
        print(door_id)
        door = self.doors_config.get_by_id(door_id)
        if door is not None:
            return door.name
        else:
            return ""

    # @property
    # def access_level(self):
    #     print(f"current access level: {self.access_level}")
    #     return self.access_level

    def on_door_states(self, *args):
        print("on_door_states")

    def on_start(self):
        self.make_client()

    # def try_pin(self, pin):
    #     """"
    #     Log in.

    #     Log in to sw with user and password. Hardcoded for now. Should interact with DB.

    #     Args:
    #         user:       Username
    #         password:   Password

    #     """
    #     success = False
    #     success = self.api.authenticate_pin(pin)

    def next_screen(self):
        self.gui.next_screen()

    def prev_screen(self):
        self.gui.prev_screen()

    def on_enter_view(self, *args):
        pass

    def build(self):
        """
        Kivy build.

        Function to return Kivy Layout from App class.


        Returns:
            Widget containing GUI

        """
        return self.gui

    def try_login_response(self, request, result):
        self.access_level = result
        if result > 0:
            self.change_screen('Control')
            self.screens['DoorBell']["object"].login_feedback(True)
        else:
            print("Login failed")
            self.screens['DoorBell']["object"].login_feedback(False)

    def log_out(self, *args):
        self.access_level = 0
        self.change_screen("DoorBell")
        print(f"Log out, access level is: {self.access_level}")

    # def setaccess_level(self, level):
    #     self.access_level = level
    #     print(f"access level is: {self.access_level}")

    def start_log_out_timer(self):
        if self.access_level > 0:
            print(f"access timeout set")
            # self.acccess_timeout = Clock.schedule_once(self.acccess_timeout, ACCESS_TIMEOUT)
            self.timer_cnt = ACCESS_TIMEOUT
            self.timer = Clock.schedule_interval(self.tic, 1)

    def cancel_log_out_timer(self):
        self.timer.cancel()

    def tic(self, dt):
        self.timer_cnt -= 1

    def on_timer_cnt(self, *args):
        if self.timer_cnt == 0:
            self.cancel_log_out_timer()
            self.log_out()

    def extend_log_out_timer(self):
        self.timer_cnt = ACCESS_TIMEOUT

    # def acccess_timeout(self, dt):
    #     self.log_out()
    #     print(f"access level timeout")
    #     self.acccess_timeout.cancel()

    def try_login(self, pin, *args):
        try_login(pin=pin, on_success=self.try_login_response)

    #### MQTT STUFF ####
    def make_client(self):
        # parameters = {'self': self}
        self._mqttc = mqtt.Client(MQTT_CLIENT_ID)
        # self._mqttc = mqtt.Client(MQTT_CLIENT_ID, userdata = parameters)
        self._mqttc.on_message = self.mqtt_on_message
        self._mqttc.on_connect = self.mqtt_on_connect
        self._mqttc.on_publish = self.mqtt_on_publish
        self._mqttc.on_subscribe = self.mqtt_on_subscribe
        self.mqttc_connect_to_broker()
        self.mqttc_subscribe()
        self.mqttc_run()

    def mqtt_on_connect(self, mqttc, obj, flags, rc):
        print("rc: " + str(rc))
        print(f"flag: {flags}")

    def mqtt_on_message(self, mqttc, obj, msg):
        print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
        topic = msg.topic
        payload = msg.payload.decode("utf-8")

        door = self.doors_config.get_by_state_topic(topic)
        if door is not None:
            print(f"state received")
            if payload == DOORLOCK_STATUS_PAYLOAD.LOCKED:
                door.state = "LOCKED"
                self.screens['Control']["object"].update_door_states(
                    door.door_id, True)

            elif payload == DOORLOCK_STATUS_PAYLOAD.UNLOCKED:
                door.state = "UNLOCKED"
                self.screens['Control']["object"].update_door_states(
                    door.door_id, False)

        elif topic == self.mode_config.command_topic:
            print(f"mode received: {payload}")
            self.mode_config.state = payload

    def mqtt_on_publish(self, mqttc, obj, mid):
        print("mid: " + str(mid))

    def mqtt_on_subscribe(self, mqttc, obj, mid, granted_qos):
        print("Subscribed: " + str(mid) + " " + str(granted_qos))

    def mqtt_on_log(self, mqttc, obj, level, string):
        print(string)

    def tls_set(self):
        #TODO: sett ssl and cert for encrypt
        pass

    def mqttc_connect_to_broker(self):
        print(f"connecting to broker {MQTT_BROKER} as {MQTT_CLIENT_ID}")
        # broker_parsed = urllib.parse.urlparse(MQTT_BROKER)
        self._mqttc.username_pw_set(MQTT_USERNAME, password=MQTT_PASSWORD)
        self._mqttc.connect(MQTT_BROKER, port=MQTT_PORT, keepalive=60)

    def mqttc_subscribe(self):
        for door in self.doors_config.doors:
            self._mqttc.subscribe(door.state_topic, qos=0)
        self._mqttc.subscribe(self.mode_config.command_topic, qos=0)

    def mqttc_run(self):
        self._mqttc.loop_start()

    def ring_bell(self):
        print('ringing that bell')
        print(f'self.mode_config.state: {self.mode_config.state}')
        self._mqttc.publish(self.bell_config.command_topic,
                            payload=BELL_COMMAND_PAYLOAD.DO)
        if self.mode_config.state == MODE_COMMAND_PAYLOAD.NORMAL:
            pass
        elif self.mode_config.state == MODE_COMMAND_PAYLOAD.HALLOWEEN:
            self.change_screen('Scary')

    def toggle_door(self, door, locked, *args):
        if locked:

            for d in self.doors_config.doors:
                if d.name == door:
                    print(f"mqtt unlock door {door}")
                    self._mqttc.publish(
                        d.command_topic,
                        payload=DOORLOCK_COMMAND_PAYLOAD.UNLOCK)
        else:
            for d in self.doors_config.doors:
                if d.name == door:
                    print(f"mqtt lock door {door}")
                    self._mqttc.publish(d.command_topic,
                                        payload=DOORLOCK_COMMAND_PAYLOAD.LOCK)

    def garage_open(self, *args):
        self._mqttc.publish(self.garage_config.command_topic,
                            payload=GARAGE_COMMAND_PAYLOAD.OPEN)

    def garage_close(self, *args):
        self._mqttc.publish(self.garage_config.command_topic,
                            payload=GARAGE_COMMAND_PAYLOAD.CLOSE)

    def garage_stop(self, *args):
        self._mqttc.publish(self.garage_config.command_topic,
                            payload=GARAGE_COMMAND_PAYLOAD.STOP)

    def next_screen(self):
        self.change_screen(self.gui.next())

    def prev_screen(self):
        self.change_screen(self.gui.previous())

    def change_screen(self, screen_name):

        print(f"entering screen {screen_name}")

        # if screen_name == self.ids['sm'].screen_names[0]:
        #     print(f"screen is first")
        #     self.ids['sm'].current_screen.content.is_first()

        # else:
        #     print(f"screen is inbetween")
        #     # self.ids['sm'].current_screen.content.override_allow_prev(True)

        # if screen_name == self.ids['sm'].screen_names[-1]:
        #     print(f"screen is last")
        #     self.ids['sm'].current_screen.content.is_last()

        self.gui.current = screen_name
Beispiel #15
0
class NeuralNetworkDemoApp(App):
    # Application properties
    # See https://kivy.org/docs/api-kivy.properties.html
    # for available kinds of properties.

    # The dataset
    dataset_name = OptionProperty("POFA", options=["CAFE", "POFA"])

    dataset_cache = {}

    def _load_dataset(self):
        if self.dataset_name not in NeuralNetworkDemoApp.dataset_cache.keys():
            filename = 'data/%s.pkl' % self.dataset_name.lower()
            import pickle
            Logger.info('Loading data from %s' % filename)
            with open(filename, 'r') as f:
                NeuralNetworkDemoApp.dataset_cache[self.dataset_name] = pickle.load(f)
        return NeuralNetworkDemoApp.dataset_cache[self.dataset_name]

    dataset = AliasProperty(_load_dataset, None, bind=['dataset_name'])
    maximum_pca_components = AliasProperty(lambda self: min(self.dataset['data'].shape), None, bind=['dataset'])

    # PCA transformed data
    pca_data = AliasProperty(lambda self: PCAData(self.dataset['data']), None, bind=['dataset'])

    # PCA components (the max will be controlled by the maximum_pca_components)
    pca_components = BoundedNumericProperty(10, min=1)

    # PCA transformer
    pca_transformer = AliasProperty(lambda self: PCATransformer(self.pca_data, self.pca_components), None,
                                    bind=['pca_data', 'pca_components'])

    # train inputs
    num_hidden_units = BoundedNumericProperty(10, min=1)
    num_valid_input = BoundedNumericProperty(0, min=0)
    num_test_data = BoundedNumericProperty(0.2, min=0, max=1.0)
    hidden_units_learning_rate = BoundedNumericProperty(0.1, min=0.001, max=1.0)
    output_units_learning_rate = BoundedNumericProperty(0.2, min=0.001, max=1.0)
    momentum = BoundedNumericProperty(0.2, min=0, max=1.0)
    epochs = BoundedNumericProperty(1000, min=1, max=10000)
    minimum_rmse = BoundedNumericProperty(0, min=0.0, max=1.0)

    # the categories of training
    target_name = OptionProperty('Expression', options=['Gender', 'Expression', 'Identity'])
    training_target = OptionProperty('epochs', options=['epochs', 'rmse'])

    #
    # Main Kivy code for building the application UI.
    #
    def build(self):
        '''Build the application UI.'''
        self.manager = ScreenManager()
        for i, screen_cls in enumerate(ALL_SCREENS):
            self.manager.add_widget(screen_cls(name='Screen %d' % (i + 1)))
        self.manager.current = 'Screen 1'

        # Dispatch all events in order to initialize UIs
        for property_name in self.properties():
            Logger.info('Initializing UI for %s' % property_name)
            self.property(property_name).dispatch(self)

        return self.manager

    # Manage the screen transitions
    def go_next(self):
        '''Go to the next screen.'''
        self.manager.transition.direction = 'left'
        Logger.info('Moving to ' + self.manager.next())
        self.manager.current = self.manager.next()

    def go_back(self):
        '''Go back one screen.'''
        self.manager.transition.direction = 'right'
        Logger.info('Moving to ' + self.manager.previous())
        self.manager.current = self.manager.previous()