예제 #1
0
 def setupLive(self, firingLength):
     logger.log('Set up results view for live receiving. Max size: {}'.format(firingLength))
     self.liveMode = True
     self.ui.groupBoxRecvResults.setVisible(True)
     self.ui.progressBarReceived.setMaximum(firingLength)
     self.ui.progressBarReceived.setValue(0)
     self.ui.widgetDataAge.start()
예제 #2
0
    def setup(self, data):
        self.raw = {'time': [], 'force': [], 'pressure': []}
        rawFrames = []
        minTime = 0

        # Cut the data up into frames of the correct size
        for start in range(0, len(data), 16):
            rawFrames.append(data[start:start + 16])
        logger.log('Frames: {}'.format(len(rawFrames)))
        # Separate the frames into time, force, and pressure
        for frame in rawFrames:
            # Account for (16 bit) time looping around
            t = minTime + int(frame[0:2], 16) + (256 * int(frame[2:4], 16))
            if len(self.raw['time']) > 0 and t < self.raw['time'][-1]:
                minTime += 2**16
                t += 2**16
            self.raw['time'].append(t)
            self.raw['force'].append(
                int(frame[4:6], 16) + (int(frame[6:8], 16) << 8) +
                (int(frame[8:10], 16) << 16))
            self.raw['pressure'].append(
                int(frame[10:12], 16) + (int(frame[12:14], 16) << 8) +
                (int(frame[14:16], 16) << 16))

        self.ui.widgetTransducerSelector.reset()
        self.ui.motorData.setPreferences(
            QApplication.instance().getPreferences())
        self.ui.motorData.loadProperties(MotorConfig({'cutoffThreshold': 5}))
예제 #3
0
 def processRawData(self):
     path = QFileDialog.getOpenFileName(None, 'Load Raw Data', '',
                                        'Raw Firing Data File (*.MFL)')[0]
     if path != '':
         logger.log('Loading raw data from "{}"'.format(path))
         with open(path, 'rb') as fileData:
             self.showRawData.emit(binascii.hexlify(fileData.read()))
예제 #4
0
 def _process_image(self, filename, label):
     image_string = tensorflow.read_file(filename)
     image_decoded = tensorflow.image.decode_jpeg(image_string, channels=3)
     logger.log("TRank", str(tensorflow.rank(image_decoded)))
     image_resized = tensorflow.image.resize_images(image_decoded, [self.x, self.y])  # Parameterize the size
     result = tensorflow.cast(image_resized, tensorflow.float64)/255.0
     
     return result, label
예제 #5
0
 def saveDatasheet(self):
     path = QFileDialog.getSaveFileName(None, 'Save Motor Datasheet', '',
         'Portable Network Graphic Files (*.png);;Portable Document Format Files (*.pdf)')[0]
     if path is None or path == '':
         return
     if not path.endswith('.png') and not path.endswith('.pdf'):
         path += '.png'
     logger.log('Saving datasheet to "{}"'.format(path))
     app = QApplication.instance()
     saveDatasheet(self.motorData, path, app.convertToUserAndFormat, app.convertAllToUserUnits, app.getUserUnit)
예제 #6
0
 def fireButtonPressed(self):
     if self.firing is None:
         logger.error('Tried to fire without a firing!')
         return
     if not self.checkFireButtonEnabled():
         # The UI should prevent this from happening, but this will catch it if that doesn't work
         logger.warn('Fire button pressed while not enabled!')
         return
     logger.log('Fire button pressed')
     self.firing.fire()
예제 #7
0
 def stopButtonPressed(self):
     if self.firing is None:
         logger.error("Tried to stop without a firing!")
         return
     if not self.checkStopButtonEnabled():
         # The UI should prevent this from happening, but this will catch it if that doesn't work
         logger.warn('Stop button pressed while not enabled!')
         return
     logger.log('Stop button pressed')
     self.toggleFields(self.firingFields, False)
     self.emptyFiringControls()
     self.firing.stop()
예제 #8
0
 def newInfo(self, properties):
     if properties['type'] == 'Load Cell':
         self.baseUnit = 'N'
         field = 'Force'
     else:
         self.baseUnit = 'Pa'
         field = 'Pressure'
     logger.log('Set base unit to "{}"'.format(self.baseUnit))
     self.ui.tableWidgetPoints.setHorizontalHeaderLabels([
         'Raw', '{} ({})'.format(field, self.app.getUserUnit(self.baseUnit))
     ])
     self.ui.widgetGraph.setUnit(field, self.baseUnit)
예제 #9
0
    def __init__(self, args):
        super().__init__(args)
        self.setupFileIO()
        self.sensorProfileManager = SensorProfileManager()
        self.sensorProfileManager.loadProfiles()
        self.preferencesManager = PreferencesManager()
        self.preferencesManager.loadPreferences()

        logger.log('Application version: {}.{}.{}'.format(*self.VERSION))

        self.window = MainWindow(self)
        logger.log('Showing window')
        self.window.show()
예제 #10
0
 def cellChanged(self, row, col):
     if not self.clearing and col == 1:
         value = self.ui.tableWidgetPoints.item(row, col).text()
         try:
             conv = QApplication.instance().convertFromUserUnits(
                 float(value), self.baseUnit)
             self.calibration.setReal(row, conv)
         except ValueError:
             logger.log(
                 'Invalid value "{}" entered to cell ({}, {})'.format(
                     value, row, col))
     self.ui.tableWidgetPoints.clearSelection()
     self.ui.pushButtonCapture.setFocus()
예제 #11
0
    def call(self, inputs):
        logger.log(logger.CYAN + "Model Called" + logger.RESET, "")
        tensors = []
        idx = 0

        logger.log(logger.CYAN + "Model Called" + logger.RESET,
                   "Layers Executed. Now doing final layer")

        result = self.lyr["lyr"][0](inputs)
        for i in range(1, len(self.lyr["lyr"])):
            result = self.lyr["lyr"][i](result)

        return result
예제 #12
0
    def getResult(self, x, y, p, images):
        for t in self.parallelLayers:
            for i in self.parallelLayers[t]:
                try:
                    img = i.call(
                        images)  #self.get_layer(index=i).call(images[0:20])
                    pyplot.subplot(x, y, p)
                    pyplot.imshow(img[0])
                    logger.log("Model[" + str(t) + "]",
                               str(logger.GREEN + "RENDER" + logger.RESET))
                except Exception as e:
                    logger.log("Model[" + str(t) + "]",
                               str(logger.RED + str(e) + logger.RESET))
                p += 1
            p += 1

        for t in self.lyr:
            for i in self.lyr[t]:
                try:
                    img = i.call(
                        images)  #self.get_layer(index=i).call(images[0:20])
                    pyplot.subplot(x, y, p)
                    pyplot.imshow(img[0])
                    logger.log("Model[" + str(t) + "]",
                               str(logger.GREEN + "RENDER" + logger.RESET))
                except Exception as e:
                    logger.log("Model[" + str(t) + "]",
                               str(logger.RED + str(e) + logger.RESET))
                p += 1
            p += 1
예제 #13
0
 def saveFIRE(self):
     path = QFileDialog.getSaveFileName(None, 'Save FIRE', '', 'Firing Data File (*.fire)')[0]
     if path is None or path == '':
         return
     if not path.endswith('.fire'):
         path += '.fire'
     logger.log('Saving firing to {}'.format(path))
     try:
         fileIO.save(FILE_TYPES.FIRING, self.motorData.toDictionary(), path)
         self.ui.labelFileName.setText(os.path.basename(path))
         self.saved = True
     except Exception as err:
         logger.log('Failed to save firing data, err: {}'.format(repr(err)))
         QApplication.instance().outputException(err, 'Error saving file:')
예제 #14
0
 def saveRawCSV(self):
     path = QFileDialog.getSaveFileName(None, 'Save Raw CSV', '', 'Comma Separated Values (*.csv)')[0]
     if path is None or path == '':
         return
     if not path.endswith('.csv'):
         path += '.csv'
     data = self.motorData.getRawCSV()
     logger.log('Saving raw CSV to {}'.format(path))
     try:
         with open(path, 'w') as outFile:
             outFile.write(data)
     except Exception as err:
         logger.log('Failed to save firing data, err: {}'.format(repr(err)))
         QApplication.instance().outputException(err, 'Error saving file:')
예제 #15
0
 def recordError(self, packet):
     newError = False
     for error in packet.getErrors():
         if error not in self.errors:
             self.errors.append(error)
             newError = True
     if newError:
         logger.log('Got an error packet with details ({})'.format(packet))
         output = "The RMTS board reported the following error(s):\n\n"
         output += "\n".join(self.errors)
         output += "\n\n Please resolve them and restart the device before continuing."
         QApplication.instance().outputMessage(output)
         self.newError.emit()
     if len(self.errors) > 0:
         self.hasError.emit()
예제 #16
0
 def closeEvent(self, event=None):
     if (not self.ui.pageFire.exitCheck()
             or not self.ui.pageResults.unsavedCheck()
             or not self.ui.pageCalibration.unsavedCheck()):
         logger.log('Canceling close event')
         if event is not None and not isinstance(event, bool):
             event.ignore()
         return
     self.closed.emit()
     self.ui.pageFire.exit()
     self.ui.pageRecvResults.exit()
     self.ui.pageCalibrationSetup.exit()
     self.ui.pageAbout.exit()
     logger.log('Application exited')
     sys.exit()
예제 #17
0
    def on_epoch_end(self, epoch, logs={}):
        global OLD_LOSS, OLD_ACC, OLD_VLOSS, OLD_VACC, LOSS_DELTA, ACC_DELTA
        global NPOS

        newLossDelta = OLD_LOSS - logs["loss"]
        newAccDelta = OLD_ACC - logs["accuracy"]

        lossDeltaPercentage = newLossDelta / LOSS_DELTA

        l1 = logger.YELLOW if (OLD_LOSS == logs["loss"]) else logger.GREEN if (
            OLD_LOSS > logs["loss"]) else logger.RED
        l2 = logger.YELLOW if (OLD_ACC
                               == logs["accuracy"]) else logger.GREEN if (
                                   OLD_ACC < logs["accuracy"]) else logger.RED
        l3 = logger.YELLOW if (
            OLD_VLOSS == logs["val_loss"]) else logger.GREEN if (
                OLD_VLOSS > logs["val_loss"]) else logger.RED
        l4 = logger.YELLOW if (
            OLD_VACC == logs["val_accuracy"]) else logger.GREEN if (
                OLD_VACC < logs["val_accuracy"]) else logger.RED
        l5 = logger.YELLOW if (
            lossDeltaPercentage == 1.0) else logger.CYAN if (
                (lossDeltaPercentage > 1.2) or
                (lossDeltaPercentage < 0.8)) else logger.GREEN

        # logger.log(str(epoch), str("Loss: " + l1 + str(logs["loss"]).ljust(25) + logger.RESET + " Accuracy: " + l2 + str(logs["accuracy"]).ljust(15) + logger.RESET + " Val_Loss: " + l3 + str(logs["val_loss"]).ljust(25) + logger.RESET + " Val_Accuracy: " + l4 + str(logs["val_accuracy"]).ljust(15) + logger.RESET))
        logger.log(
            logger.CYAN + str(epoch) + logger.RESET,
            str(", " + l1 + str(logs["loss"]) + logger.RESET + ", " + l2 +
                str(logs["accuracy"]) + logger.RESET + ", " + l3 +
                str(logs["val_loss"]) + logger.RESET + ", " + l4 +
                str(logs["val_accuracy"]) + logger.RESET) + ", " + l5 +
            str(lossDeltaPercentage) + logger.RESET)

        if (epoch % (EPOCHS / 10) == 0):
            prediction = model.predict(predictImages, steps=42)
            pyplot.subplot(4, 8, NPOS)
            pyplot.imshow(prediction[0])
            NPOS += 1

        LOSS_DELTA = newLossDelta
        ACC_DELTA = newAccDelta

        OLD_LOSS = logs["loss"]
        OLD_ACC = logs["accuracy"]
        OLD_VLOSS = logs["val_loss"]
        OLD_VACC = logs["val_accuracy"]
예제 #18
0
    def on_epoch_end(self, epoch, logs={}):
        global OLD_LOSS, OLD_ACC, OLD_VLOSS, OLD_VACC, LOSS_DELTA, ACC_DELTA
        global NPOS

        newLossDelta = OLD_LOSS - logs["loss"]
        newAccDelta = OLD_ACC - logs["accuracy"]

        if (LOSS_DELTA == 0):
            lossDeltaPercentage = 0
        else:
            lossDeltaPercentage = newLossDelta / LOSS_DELTA

        l1 = logger.YELLOW if (OLD_LOSS == logs["loss"]) else logger.GREEN if (
            OLD_LOSS > logs["loss"]) else logger.RED
        l2 = logger.YELLOW if (OLD_ACC
                               == logs["accuracy"]) else logger.GREEN if (
                                   OLD_ACC < logs["accuracy"]) else logger.RED
        l3 = logger.YELLOW if (
            OLD_VLOSS == logs["val_loss"]) else logger.GREEN if (
                OLD_VLOSS > logs["val_loss"]) else logger.RED
        l4 = logger.YELLOW if (
            OLD_VACC == logs["val_accuracy"]) else logger.GREEN if (
                OLD_VACC < logs["val_accuracy"]) else logger.RED
        l5 = logger.YELLOW if (
            lossDeltaPercentage == 1.0) else logger.CYAN if (
                (lossDeltaPercentage > 1.2) or
                (lossDeltaPercentage < 0.8)) else logger.GREEN

        # logger.log(str(epoch), str("Loss: " + l1 + str(logs["loss"]).ljust(25) + logger.RESET + " Accuracy: " + l2 + str(logs["accuracy"]).ljust(15) + logger.RESET + " Val_Loss: " + l3 + str(logs["val_loss"]).ljust(25) + logger.RESET + " Val_Accuracy: " + l4 + str(logs["val_accuracy"]).ljust(15) + logger.RESET))
        logger.log(
            logger.CYAN + str(epoch) + logger.RESET,
            str(", " + l1 + str(logs["loss"]) + logger.RESET + ", " + l2 +
                str(logs["accuracy"]) + logger.RESET + ", " + l3 +
                str(logs["val_loss"]) + logger.RESET + ", " + l4 +
                str(logs["val_accuracy"]) + logger.RESET) + ", " + l5 +
            str(lossDeltaPercentage) + logger.RESET)

        LOSS_DELTA = newLossDelta
        ACC_DELTA = newAccDelta

        OLD_LOSS = logs["loss"]
        OLD_ACC = logs["accuracy"]
        OLD_VLOSS = logs["val_loss"]
        OLD_VACC = logs["val_accuracy"]
예제 #19
0
    def unsavedCheck(self):
        if self.calibration is None or len(self.calibration.points) == 0:
            return True

        msg = QMessageBox()
        msg.setText("The calibration has not been saved. Close anyway?")
        msg.setWindowTitle("Close without saving?")
        msg.setStandardButtons(QMessageBox.Save | QMessageBox.Discard
                               | QMessageBox.Cancel)
        res = msg.exec_()

        if res == QMessageBox.Discard:
            logger.log('User chose to discard results')
            return True
        if res == QMessageBox.Save:
            logger.log('User chose to save first')
            self.save()
            return True
        return False
예제 #20
0
    def call(self, inputs):
        logger.log(logger.CYAN + "Model Called" + logger.RESET, "")
        tensors = []
        idx = 0
        for t in self.parallelLayers:
            tensors.append(self.parallelLayers[t][0](inputs))
            for i in range(1, len(self.parallelLayers[t])):
                tensors[idx] = self.parallelLayers[t][i](tensors[idx])
            idx += 1

        combined = tensorflow.concat(tensors, 3)

        logger.log(logger.CYAN + "Model Called" + logger.RESET,
                   "Layers Executed. Now doing final layer")

        result = self.lyr["lyr"][0](combined)
        for i in range(1, len(self.lyr["lyr"])):
            result = self.lyr["lyr"][i](result)

        return result
예제 #21
0
    def nextPressed(self):
        forceConv, pressConv = self.ui.widgetTransducerSelector.getConverters()
        if forceConv == None and pressConv == None:
            QApplication.instance().outputMessage(
                'At least one transducer must be used.')
            logger.log('Both transducers set to "None", cancelling')
            return

        # TODO: Validate motor data object
        try:
            motorData = MotorConfig()
            motorData.setProperties(self.ui.motorData.getProperties())
            motor = processRawData(self.raw, forceConv, pressConv, motorData)
            QApplication.instance().newResult(motor)
            self.nextPage.emit()
        except Exception as err:
            QApplication.instance().outputException(err,
                                                    'Could not load motor')
            logger.error('Could not load motor. Error: {}'.format(
                format_exc()))
예제 #22
0
 def showSavedResultsPressed(self):
     path = QFileDialog.getOpenFileName(None, 'Load FIRE', '',
                                        'Firing Data File (*.fire)')[0]
     if path != '':
         try:
             data = fileIO.load(FILE_TYPES.FIRING, path)
         except Exception as err:
             logger.log('Failed to load firing, err: {}'.format(repr(err)))
             QApplication.instance().outputException(
                 err, 'Error loading file:')
             return
         try:
             motor = processRawData(
                 data['rawData'], None if data['forceConv'] is None else
                 Converter(data['forceConv']),
                 None if data['pressureConv'] is None else Converter(
                     data['pressureConv']), FiringConfig(data['motorInfo']))
         except Exception as err:
             logger.log('Failed to process firing, err: {}'.format(
                 repr(err)))
             QApplication.instance().outputException(
                 err, 'Error loading file:')
             return
         logger.log('Loaded saved firing data from "{}"'.format(path))
         QApplication.instance().newResult(motor, os.path.basename(path))
         self.showResultsPage.emit()
예제 #23
0
    def _buildDataSet(self):
        labelset = {}
        files = {}
        labelArray = []
        resultNormalArray = []

        imgset = []
        for r, d, f in os.walk(self.path):
            logger.log(logger.MAGENTA + "READING FILES" + logger.RESET, str(r))
            for file in f:
                if '.png' in file:
                    logger.log(logger.GREEN + "FILE" + logger.RESET, str(file))
                    path = os.path.join(r, file)
                    if(file[0:3] == "SRC"):
                        img = matplotlib.image.imread(path)
                        imgset.append(img)
                    elif(file[0:3] == "TAR"):
                        labelArray.append(matplotlib.image.imread(path))
                    else:
                        pass

        imgsetNPARR = numpy.asarray(imgset)
        labelsetNPARR = numpy.asarray(labelArray)

        pos = self.path.rfind('\\') + 1
        labelGroup = self.path[pos:]

        numpy.save('data\\' + labelGroup + '_images', imgsetNPARR)
        numpy.save('data\\' + labelGroup + '_labels', labelsetNPARR)

        # Map labelset with resultNormalArray
        images_tensor = tensorflow.convert_to_tensor(imgsetNPARR)
        labels_tensor = tensorflow.convert_to_tensor(labelsetNPARR)  ## USE INTEGER

        self.setDataSet(images_tensor, labels_tensor)

        label_names = sorted(list(labelset))
        label_to_index = dict((index, name) for name, index in enumerate(label_names))
        
        return images_tensor, labels_tensor
예제 #24
0
    def connect(self):
        self.forceConv, self.pressConv = self.ui.widgetTransducerSelector.getConverters(
        )
        if self.forceConv == None and self.pressConv == None:
            QApplication.instance().outputMessage(
                'At least one transducer must be used.')
            logger.log('Both transducers set to "None", cancelling')
            return

        port = self.ui.widgetPortSelector.getPort()

        motorConfig = MotorConfig()
        motorConfig.setProperties(self.ui.widgetMotorConfig.getProperties())

        self.ui.pushButtonConnect.setEnabled(False)

        self.firing = Firing(self.forceConv, self.pressConv, motorConfig, port)
        self.firing.newGraph.connect(QApplication.instance().newResult)
        self.firing.fullSizeKnown.connect(self.gotoResults)
        self.firing.newResultsPacket.connect(
            QApplication.instance().newResultsPacket)
        self.firing.initialResultsTime.connect(self.initialResultsTime)
예제 #25
0
    def exportENG(self, config):
        title = 'Save ENG'
        formats = 'RASP ENG File (*.eng)'
        if config['append'] == 'Append':
            mode = 'a'
            path = QFileDialog.getSaveFileName(None, title, '', formats, options=QFileDialog.DontConfirmOverwrite)[0]
        else:
            mode = 'w'
            path = QFileDialog.getSaveFileName(None, title, '', formats)[0]
        if path is None or path == '':
            return
        if not path.endswith('.eng'):
            path += '.eng'
        logger.log('Saving ENG to {} (Mode={})'.format(path, config['append']))
        with open(path, mode) as outFile:
            propMass = self.motorData.getPropMass()
            contents = ' '.join([config['designation'],
                                 str(round(config['diameter'] * 1000, 6)),
                                 str(round(config['length'] * 1000, 6)),
                                 'P',
                                 str(round(propMass, 6)),
                                 str(round(config['totalMass'], 6)),
                                 config['manufacturer']
                                 ]) + '\n'

            timeData = self.motorData.getTime()
            forceData = self.motorData.getForce()
            # Add on a 0-thrust datapoint right after the burn to satisfy RAS Aero
            if forceData[-1] != 0:
                timeData.append(timeData[-1] + 0.01)
                forceData.append(0)
            for time, force in zip(timeData, forceData):
                if time == 0 and force == 0: # Increase the first point so it isn't 0 thrust
                    force += 0.01
                contents += str(round(time, 4)) + ' ' + str(round(force, 4)) + '\n'

            contents += ';\n;\n'

            outFile.write(contents)
예제 #26
0
    def connect(self):
        logger.log('Connect clicked, setting up firing')
        port = self.ui.widgetPortSelector.getPort()
        self.forceConv, self.pressConv = self.ui.widgetTransducerSelector.getConverters(
        )
        if self.forceConv == None and self.pressConv == None:
            QApplication.instance().outputMessage(
                'At least one transducer must be used.')
            logger.log('Both transducers set to "None", canceling')
            return
        forceConvName = 'None'
        if self.forceConv is not None:
            forceConvName = self.forceConv.getProperty('name')
        pressureConvName = 'None'
        if self.pressConv is not None:
            pressureConvName = self.pressConv.getProperty('name')
        logger.log('Using LC profile: "{}", PT: "{}"'.format(
            forceConvName, pressureConvName))

        fireData = FiringConfig()
        fireData.setProperties(self.ui.firingConfig.getProperties())
        logger.log('Firing properties: {}'.format(fireData.getProperties()))
        self.firing = Firing(self.forceConv, self.pressConv, fireData, port)
        self.firing.newSetupPacket.connect(self.newSetupPacket)
        self.firing.newErrorPacket.connect(self.errorCollector.recordError)
        self.firing.newFiringPacket.connect(self.newFiringPacket)
        self.firing.fullSizeKnown.connect(self.gotoResults)
        self.firing.newResultsPacket.connect(
            QApplication.instance().newResultsPacket)
        self.firing.newGraph.connect(QApplication.instance().newResult)
        self.firing.stopped.connect(
            lambda: self.toggleFields(self.resultsFields, True))
        self.firing.initialResultsTime.connect(self.initialResultsTime)

        self.ui.widgetDataAge.start()
        self.firing.newSetupPacket.connect(self.ui.widgetDataAge.reset)
        self.firing.newErrorPacket.connect(self.ui.widgetDataAge.reset)
        self.firing.newFiringPacket.connect(self.ui.widgetDataAge.reset)
        self.toggleFields(self.setupFields, False)
        self.toggleFields(self.firingFields, True)
예제 #27
0
 def exitCheck(self):
     if self.firing is None or self.firing.onResultsView:
         return True
     logger.log('Checking if user really wants to exit firing widget')
     msg = QMessageBox()
     msg.setText("The radio is currently connected. Close anyway?")
     msg.setWindowTitle("Close while connected?")
     msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
     res = msg.exec_()
     if res == QMessageBox.Yes:
         logger.log('User chose to close')
         return True
     if res == QMessageBox.No:
         logger.log('User chose to stay on page')
         return False
     return False
예제 #28
0
 def unsavedCheck(self):
     if not self.liveMode or self.saved:
         return True
     logger.log('Checking if user wants to save before exiting results widget')
     msg = QMessageBox()
     msg.setText("The received results have not been saved. Close anyway?")
     msg.setWindowTitle("Close without saving?")
     msg.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
     res = msg.exec_()
     if res == QMessageBox.Discard:
         logger.log('User chose to discard results')
         return True
     if res == QMessageBox.Save:
         logger.log('User chose to save first')
         self.saveFIRE()
         return self.saved
     return False
예제 #29
0
    def newSetupPacket(self, packet):
        if self.tared:
            if self.forceConv is not None:
                realForce = self.forceConv.convert(
                    self.forceBuff.addData(
                        packet.force)) - self.tareOffsetForce
                self.ui.lineEditForce.setText(
                    QApplication.instance().convertToUserAndFormat(
                        realForce, 'N', 1))
            else:
                self.ui.lineEditForce.setText('N/A')

            if self.pressConv is not None:
                realPressure = self.pressConv.convert(
                    self.pressureBuff.addData(
                        packet.pressure)) - self.tareOffsetPressure
                self.ui.lineEditPressure.setText(
                    QApplication.instance().convertToUserAndFormat(
                        realPressure, 'Pa', 1))
            else:
                self.ui.lineEditPressure.setText('N/A')
        else:
            self.tareDataForce.append(packet.force)
            self.tareDataPressure.append(packet.pressure)
            if len(self.tareDataForce) == 10:
                logger.log('Tare complete')
                self.tared = True
                if self.forceConv is not None:
                    tareAvgForce = sum(self.tareDataForce) / len(
                        self.tareDataForce)
                    self.tareOffsetForce = self.forceConv.convert(tareAvgForce)
                    logger.log(
                        '\tForce offset = ({:.4f} conv, {:.4f} raw)'.format(
                            self.tareOffsetForce, tareAvgForce))
                if self.pressConv is not None:
                    tareAvgPressure = sum(self.tareDataPressure) / len(
                        self.tareDataPressure)
                    self.tareOffsetPressure = self.pressConv.convert(
                        tareAvgPressure)
                    logger.log(
                        '\tPressure offset = ({:.4f} conv, {:.4f} raw)'.format(
                            self.tareOffsetPressure, tareAvgPressure))

        self.ui.lineEditContinuity.setText(
            "Yes" if packet.continuity else "No")
예제 #30
0
 def saveENG(self):
     logger.log('Showing ENG exporter')
     self.engExporter.show()