Esempio n. 1
0
    def loginView(self):
        # Login correcto
        if self.login.user:
            print 'Autenticado usuario: %s' % (self.login.user.display_name)
            self.sdvoice = SDVoice(self.mainwindow_file, self.login.user)
            # Show _widget.windowTitle on left-top of each plugin (when
            # it's set in _widget). This is useful when you open multiple
            # plugins at once. Also if you open multiple instances of your
            # plugin at once, these lines add number to make it easy to
            # tell from pane to pane.
            if self.context.serial_number() > 1:
                self.login._widget.setWindowTitle(
                    self.login._widget.windowTitle() +
                    (' (%d)' % self.context.serial_number()))
                self.sdvoice._widget.setWindowTitle(
                    self.sdvoice._widget.windowTitle() +
                    (' (%d)' % self.context.serial_number()))
            # Agregar widget al panel de rqt
            self.context.add_widget(self.sdvoice._widget)
            # TODO: CERRAR WIDGET LOGIN
            self.login._widget.close()

        # Error de datos de usuario
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText(u"Error de Verificación de Usuario:")
            msg.setInformativeText(u"Usuario o contraseña no válidos!")
            msg.setWindowTitle("Error")
            ret = msg.exec_()
Esempio n. 2
0
 def resetSDV(self):
     indexes = self._widget.EstadosDeConexion.selectedIndexes()
     # SI no se ha seleccionado ningun robot SDV arrojar error
     if not indexes:
         msg = QMessageBox()
         msg.setIcon(QMessageBox.Warning)
         msg.setText(u"Error de Asignación de Comando:")
         msg.setInformativeText(
             "Seleccione al menos un robot de la lista de conexiones")
         msg.setWindowTitle("Error")
         ret = msg.exec_()
     else:
         for index in indexes:
             sdv = index.data()
             if sdv == inc.SERVER_USERNAME[0]:
                 self.sdvs[0].sender.publishResetGoal()
             elif sdv == inc.SERVER_USERNAME[1]:
                 self.sdvs[1].sender.publishResetGoal()
             elif sdv == inc.SERVER_USERNAME[2]:
                 self.sdvs[2].sender.publishResetGoal()
             else:
                 msg = QMessageBox()
                 msg.setIcon(QMessageBox.Warning)
                 msg.setText(u"Error de Asignación de Comando:")
                 msg.setInformativeText("No se ha reconocido el robot SDV")
                 msg.setWindowTitle("Error")
                 ret = msg.exec_()
                 return
Esempio n. 3
0
    def connectSSH(self):
        i = self._widget.ListaConexiones.currentIndex()
        # Let the user know we're connecting to the server
        self._widget.statusBar.showMessage("Connecting to server.")
        self.sdvs[i].ssh = ssh(inc.SERVER_IP[i], inc.SERVER_USERNAME[i],
                               inc.SERVER_PASSWORD[i])
        # Agregar a EstadosDeConexion lista de hosts conectados
        if self.sdvs[i].ssh.client != None:
            # Actualizar GUI
            item = QtGui.QStandardItem(
                self._widget.ListaConexiones.currentText())
            self.EstadosDeConexion_model.appendRow(item)

            # TODO: Lanzar el proyecto de sdvoice en el robot SDV
            #node = roslaunch.core.Node('sdvoice', 'agv_nav.launch')
            #launch = roslaunch.scriptapi.ROSLaunch()
            #launch.start()
            #process = launch.launch(node)
            #print process.is_alive()
            #self.ssh_clients[i].sendCommand("roslaunch sdvoice agv_nav.launch")
            #self.ssh_clients[i].sendCommand("ls")

        else:
            # QDialog de Warning por error de conexión
            # TODO: Cambiar tamaño de la ventana del mensaje
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Error de Conexión:")
            msg.setInformativeText(
                "No se pudo conectar a %s!" %
                (self._widget.ListaConexiones.currentText()))
            msg.setWindowTitle("Error")
            ret = msg.exec_()
        self._widget.statusBar.showMessage("")
Esempio n. 4
0
    def sendCommand(self):
        try:  # Todas las columnas de la fila seleccionadas
            name, instr, place = sorted(
                self._widget.TablaInstrucciones.selectedIndexes())
        except:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText(u"Error de Ejecución de Instrucción:")
            msg.setInformativeText(
                "No se ha seleccionado toda la fila. Seleccione el índice de la instrucción"
            )
            msg.setWindowTitle("Error")
            ret = msg.exec_()
            return
        # Selección correcta
        name, place = str(name.data()), str(place.data())

        i = 0
        if name == inc.SERVER_USERNAME[0]:
            i = 0  #SDVUN_LAST_COMMAND[0] = self.sender.pose
        elif name == inc.SERVER_USERNAME[1]:
            i = 1  #SDVUN_LAST_COMMAND[1] = self.sender.pose
        elif name == inc.SERVER_USERNAME[2]:
            i = 2  #SDVUN_LAST_COMMAND[2] = self.sender.pose

        # HOME
        if inc.PLACES[place] == 0:
            self.sdvs[i].sender.sendSDVtoHome()
            # MALLA
        elif inc.PLACES[place] == 1:
            self.sdvs[i].sender.sendSDVtoCeldaExperimental()
            # INDUSTRIAL
        elif inc.PLACES[place] == 2:
            self.sdvs[i].sender.sendSDVtoCeldaIndustrial()
            # MANUFACTURA
        elif inc.PLACES[place] == 3:
            self.sdvs[i].sender.sendSDVtoCeldaManufactura()
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText(u"Error de Asignación de Comando:")
            msg.setInformativeText("No se ha reconocido el destino del SDV")
            msg.setWindowTitle("Error")
            ret = msg.exec_()
            return

        if name == inc.SERVER_USERNAME[0]:
            self.sdvs[i].sender.publishPoseStamped()
        elif name == inc.SERVER_USERNAME[1]:
            self.sdvs[i].sender.publishPoseStamped()
        elif name == inc.SERVER_USERNAME[2]:
            self.sdvs[i].sender.publishPoseStamped()
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText(u"Error de Asignación de Comando:")
            msg.setInformativeText("No se ha reconocido el robot SDV")
            msg.setWindowTitle("Error")
            ret = msg.exec_()
            return
Esempio n. 5
0
 def addManualCommand(self):
     indexes = self._widget.EstadosDeConexion.selectedIndexes()
     # SI no se ha seleccionado ningun robot SDV arrojar error
     if not indexes:
         msg = QMessageBox()
         msg.setIcon(QMessageBox.Warning)
         msg.setText(u"Error de Asignación de Comando:")
         msg.setInformativeText(
             "Seleccione al menos un robot de la lista de conexiones")
         msg.setWindowTitle("Error")
         ret = msg.exec_()
     else:
         for index in indexes:
             sdv = index.data()
             self._comm = [
                 QtGui.QStandardItem(str(sdv)),
                 QtGui.QStandardItem(
                     str(self._widget.ListaInstrucciones.currentText())),
                 QtGui.QStandardItem(
                     str(self._widget.ListaMaquinas.currentText()))
             ]
             self.TablaInstrucciones_model.appendRow(self._comm)
Esempio n. 6
0
 def registro(self):
     email = self._widget.email.text()
     user_name = self._widget.userName.text()
     phone = self._widget.phone.text()
     passw = self._widget.passw.text()
     repassw = self._widget.repass.text()
     # Error de contraseñas
     if passw != repassw:
         self.user = None
         msg = QMessageBox()
         msg.setIcon(QMessageBox.Warning)
         msg.setText(u"Error de Contraseña:")
         msg.setInformativeText(u"Las contraseñas no coinciden")
         msg.setWindowTitle("Error")
         ret = msg.exec_()
     else:
         try:
             self.user = firebase.addUser(email, passw, phone, user_name)
             firebase.newDataBase(self.user.display_name)
         # Error de registro
         except:
             self.user = None
             msg = QMessageBox()
             msg.setIcon(QMessageBox.Warning)
             msg.setText(u"Error de Registro:")
             msg.setInformativeText(
                 u"No se ha podido registrar usuario: \n Datos erroneos, revisar:\n - Contraseña debe tener más de 6 digitos.\n - Verifique símbolos de los datos personales."
             )
             msg.setWindowTitle("Error")
             ret = msg.exec_()
         # Registro exitoso
         msg = QMessageBox()
         msg.setIcon(QMessageBox.Information)
         msg.setText(u"Bienvenido:")
         msg.setInformativeText(u"Usuario creado exitosamente!")
         msg.setWindowTitle(u"Información")
         ret = msg.exec_()
class ChecklistWindow(QWidget):
    def __init__(self, aircraft_id):
        super(ChecklistWindow, self).__init__()
        # Set properties of the window
        self.setWindowTitle("BTO and BPO Checklist")
        self.resize(500, 700)
        self.move(200,100)
        self.checklist_state = 0

        # Relative path for the default BPO and BTO checklist
        BPO_checklist_file = os.path.join(rospkg.RosPack().get_path('yonah_rqt'), 'src/yonah_rqt', 'BPO_checklist.csv')
        BTO_checklist_file = os.path.join(rospkg.RosPack().get_path('yonah_rqt'), 'src/yonah_rqt', 'BTO_checklist.csv')
        
        # Check whether checklist is present, if not print a error message to terminal
        try:
            # If checklist is present, parse it and pass it to its respective variable
            self.BPO_checklist = self.excel_parser(BPO_checklist_file)
            self.BTO_checklist = self.excel_parser(BTO_checklist_file)
        except:
            rospy.logerr("Checklist files are missing or named wrongly. Please follow the original directory and naming")
            exit()
    
        # Create the layout
        self.main_layout = QVBoxLayout()
        self.buttons_layout = QHBoxLayout()
        self.tree_widget_layout = QHBoxLayout()
        
        # Create the widgets
        self.create_widget()
        self.has_message_opened = 0

        # Add the widgets into the layouts
        self.main_layout.addLayout(self.tree_widget_layout)
        self.main_layout.addLayout(self.buttons_layout)
        self.setLayout(self.main_layout)

    # Create the main layout of widget
    def create_widget(self):
        # Create tree structure
        self.create_tree()

        # Declare buttons and connect each of them to a function
        self.load_button = QPushButton('Load')
        self.ok_button = QPushButton('OK')
        self.cancel_button = QPushButton('Cancel')
        self.load_button.pressed.connect(self.load_clicked)
        self.ok_button.pressed.connect(self.ok_clicked)
        self.cancel_button.pressed.connect(self.cancel_clicked)
        
        # Add buttons into the layout
        self.buttons_layout.addWidget(self.load_button)
        self.buttons_layout.addWidget(self.cancel_button)
        self.buttons_layout.addWidget(self.ok_button)
        self.tree_widget_layout.addWidget(self.tree_widget)

    # Create the tree layout of widget inside of the main layout
    def create_tree(self):
        # Set up the main tree widget
        self.tree_widget = QTreeWidget()
        self.tree_widget.setColumnCount(2)
        self.tree_widget.setColumnWidth(0, 250)
        self.tree_widget.setHeaderLabels(['Parts', 'Status'])
        self.item = QTreeWidgetItem()
        
        # Create the BPO section
        self.BPO_header = QTreeWidgetItem(self.tree_widget)
        self.BPO_header.setFlags(self.BPO_header.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        self.BPO_header.setText(0, 'BPO Checklist')
        self.BPO_header.setExpanded(True)
        self.create_item(self.BPO_header, self.BPO_checklist) # Adds the list of items into the section

        # Create the BTO section
        self.BTO_header = QTreeWidgetItem(self.tree_widget)
        self.BTO_header.setFlags(self.BTO_header.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        self.BTO_header.setText(0, 'BTO Checklist')
        self.BTO_header.setExpanded(True)
        self.create_item(self.BTO_header, self.BTO_checklist) # Adds the list of items into the section

    # Populate the tree layout with items
    def create_item(self, parent, list):
        section_header = [] # List of the section headers
        for i in range (len(list)):
            if (list[i][1] == '' and list[i][0] != ''):
                section_header.append(list[i][0])
        k = 0

        # Iterate through the different sections
        for j in range (len(section_header)):
            # Child refers to the sections (mechanical, avionics, etc)
            child = QTreeWidgetItem(parent)
            child.setFlags(child.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
            child.setText(0, section_header[j])

            while k < len(list):
                if list[k][0] in section_header:
                    # When the while loop encounters the first title, continue the loop
                    if (list[k][0] == section_header[0]):
                        k += 1
                        continue
                    # When the while loop encounters the next titles, break the loop so that the value of j increases
                    k += 1 
                    break
                # when the list contains empty cells, skip the cell and continue
                elif list[k][0] == '':
                    k += 1
                    continue
                # Add the list items to the treewidgetitem
                # Grandchild refers to the items under each section (wing nuts, tail nuts, etc)
                grandchild = QTreeWidgetItem(child)
                grandchild.setText(0, list[k][0])
                grandchild.setText(1, list[k][1])
                grandchild.setCheckState(0, Qt.Unchecked) # Set all checkbox to its unchecked state
                k += 1

    # Read the excel sheet and parse it as an array
    def excel_parser(self, file_name):
        with open(file_name, 'r') as file:
            checklist = []
            reader = csv.reader(file)
            for row in reader:
                checklist.append(row)
            return checklist            
    
    # Determines what happens when load button is clicked
    def load_clicked(self):
        # Use QFileDialog to open the system's file browser
        filenames = QFileDialog.getOpenFileNames(
            self, self.tr('Load from Files'), '.', self.tr('csv files {.csv} (*.csv)'))
        # Iterate through the file names selected
        for filename in filenames[0]:
            # If the file names has the word BPO or BTO in it, remove current widget, add the loaded one
            if (filename.find('BPO') != -1):
                self.BPO_checklist = self.excel_parser(filename)
                self.remove_widget()
                self.create_widget()
            elif (filename.find('BTO') != -1):
                self.BTO_checklist = self.excel_parser(filename)
                self.remove_widget()
                self.create_widget()
            else:
                rospy.logerr('rqt: Checklist name must contain BPO or BTO')
                self.close()
    
    # Close all the main_layout
    def remove_widget(self):
        self.main_layout.removeWidget(self.tree_widget)
        self.tree_widget.deleteLater()
        self.buttons_layout.removeWidget(self.ok_button)
        self.buttons_layout.removeWidget(self.cancel_button)
        self.buttons_layout.removeWidget(self.load_button)
        self.ok_button.deleteLater()
        self.cancel_button.deleteLater()
        self.load_button.deleteLater()
    
     # Declare what will happen when ok button is clicked
    def ok_clicked(self):
        if self.BPO_header.checkState(0) != 2 or self.BTO_header.checkState(0) != 2: # User clicks ok without checking all
            self.dialog_window("Some items in the checklist are still unchecked", "Do you still want to continue?", True)
        else:
            self.checklist_state = 1
            self.close()

    # Declare what will happen when cancel button is clicked
    def cancel_clicked(self):
        if self.BPO_header.checkState(0) != 0 or self.BTO_header.checkState(0) != 0: # User clicks cancel with some boxes checked
            self.dialog_window('Some of your items are checked. Cancelling will uncheck all your items', 'Do you still want to continue?', False)
        else:
            self.BTO_header.setCheckState(0, Qt.Unchecked)
            self.BPO_header.setCheckState(0, Qt.Unchecked)
            self.close()
    
    # Create a pop up window when user pre-emptively cancelled or clicked ok without completing the checklist
    def dialog_window(self, message, detail, check):
        self.message = QMessageBox()
        self.has_message_opened = 1
        self.message.setIcon(QMessageBox.Warning)
        self.message.setText(message)
        self.message.setInformativeText(detail)
        self.message.setWindowTitle("Items are unchecked")
        self.message.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        self.message.show()
        if check == True: # Check == True means it is from ok_clicked
            self.message.buttonClicked.connect(self.message_action)
        else:
            self.message.buttonClicked.connect(self.message_action_uncheck)
    
    # Determines what happens after dialog_window pops up from ok_button
    def message_action(self, i):
        if i.text() == '&Yes':
            self.checklist_state = 1
            self.close()
        else:
            self.message.close()

    # Determines what happens after dialog_window pops up from cancel_button
    def message_action_uncheck(self, i):
        self.response = i.text()
        if self.response == '&Yes':
            self.checklist_state = 1
            self.BTO_header.setCheckState(0, Qt.Unchecked)
            self.BPO_header.setCheckState(0, Qt.Unchecked)
            self.close()
        else:
            self.message.close()

    # Shutdown function
    def shutdown(self):
        self.close()
        if self.has_message_opened == 1:
            self.message.close()