Skip to content

Commit

Permalink
Merge pull request #81 from simoninns/wip-032019
Browse files Browse the repository at this point in the history
Wip 032019
  • Loading branch information
Simon Inns authored Mar 20, 2019
2 parents b5dcc4e + b3d1880 commit 96b5c79
Show file tree
Hide file tree
Showing 31 changed files with 282 additions and 151 deletions.
2 changes: 2 additions & 0 deletions Linux-Application/DomesdayDuplicator/configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ qint32 Configuration::convertCaptureFormatToInt(CaptureFormat captureFormat)
{
if (captureFormat == CaptureFormat::tenBitPacked) return 0;
if (captureFormat == CaptureFormat::sixteenBitSigned) return 1;
if (captureFormat == CaptureFormat::tenBitCdPacked) return 2;

// Default to 0
return 0;
Expand All @@ -172,6 +173,7 @@ Configuration::CaptureFormat Configuration::convertIntToCaptureFormat(qint32 cap
{
if (captureInt == 0) return CaptureFormat::tenBitPacked;
if (captureInt == 1) return CaptureFormat::sixteenBitSigned;
if (captureInt == 2) return CaptureFormat::tenBitCdPacked;

// Default to 10 bit packed
return CaptureFormat::tenBitPacked;
Expand Down
3 changes: 2 additions & 1 deletion Linux-Application/DomesdayDuplicator/configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ class Configuration : public QObject
// Define the possible capture formats
enum CaptureFormat {
tenBitPacked,
sixteenBitSigned
sixteenBitSigned,
tenBitCdPacked
};

// Define the possible serial communication speeds
Expand Down
16 changes: 12 additions & 4 deletions Linux-Application/DomesdayDuplicator/configurationdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,15 @@ void ConfigurationDialog::loadConfiguration(Configuration *configuration)
if(configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitPacked) {
ui->saveAsTenBitRadioButton->setChecked(true);
ui->saveAsSixteenBitRadioButton->setChecked(false);
} else {
ui->saveAs10BitCdRadioButton->setChecked(false);
} else if(configuration->getCaptureFormat() == Configuration::CaptureFormat::sixteenBitSigned) {
ui->saveAsTenBitRadioButton->setChecked(false);
ui->saveAsSixteenBitRadioButton->setChecked(true);
ui->saveAs10BitCdRadioButton->setChecked(false);
} else {
ui->saveAsTenBitRadioButton->setChecked(false);
ui->saveAsSixteenBitRadioButton->setChecked(false);
ui->saveAs10BitCdRadioButton->setChecked(true);
}

// USB
Expand Down Expand Up @@ -98,7 +104,7 @@ void ConfigurationDialog::loadConfiguration(Configuration *configuration)
ui->serialSpeedComboBox->addItem("1200", Configuration::SerialSpeeds::bps1200);

// Select the currently configured serial speed
ui->serialSpeedComboBox->setCurrentIndex(ui->serialSpeedComboBox->findData((unsigned int)configuration->getSerialSpeed()));
ui->serialSpeedComboBox->setCurrentIndex(ui->serialSpeedComboBox->findData(static_cast<unsigned int>(configuration->getSerialSpeed())));

// Keylock flag
ui->keyLockCheckBox->setChecked(configuration->getKeyLock());
Expand All @@ -113,7 +119,8 @@ void ConfigurationDialog::saveConfiguration(Configuration *configuration)
configuration->setCaptureDirectory(ui->captureDirectoryLineEdit->text());

if (ui->saveAsTenBitRadioButton->isChecked()) configuration->setCaptureFormat(Configuration::CaptureFormat::tenBitPacked);
else configuration->setCaptureFormat(Configuration::CaptureFormat::sixteenBitSigned);
else if (ui->saveAsSixteenBitRadioButton->isChecked()) configuration->setCaptureFormat(Configuration::CaptureFormat::sixteenBitSigned);
else configuration->setCaptureFormat(Configuration::CaptureFormat::tenBitCdPacked);

// USB
configuration->setUsbVid(static_cast<quint16>(ui->vendorIdLineEdit->text().toInt()));
Expand All @@ -123,7 +130,7 @@ void ConfigurationDialog::saveConfiguration(Configuration *configuration)
configuration->setSerialDevice(ui->serialDeviceComboBox->currentText());

// Player integration - Serial speed
configuration->setSerialSpeed((Configuration::SerialSpeeds)ui->serialSpeedComboBox->itemData(ui->serialSpeedComboBox->currentIndex()).toInt());
configuration->setSerialSpeed(static_cast<Configuration::SerialSpeeds>(ui->serialSpeedComboBox->itemData(ui->serialSpeedComboBox->currentIndex()).toInt()));

// KeyLock
if (ui->keyLockCheckBox->isChecked()) configuration->setKeyLock(true);
Expand Down Expand Up @@ -173,6 +180,7 @@ void ConfigurationDialog::on_buttonBox_clicked(QAbstractButton *button)
ui->captureDirectoryLineEdit->setText(QDir::homePath());
ui->saveAsTenBitRadioButton->setChecked(true);
ui->saveAsSixteenBitRadioButton->setChecked(false);
ui->saveAs10BitCdRadioButton->setChecked(false);

ui->vendorIdLineEdit->setText(QString::number(7504));
ui->productIdLineEdit->setText(QString::number(24635));
Expand Down
13 changes: 13 additions & 0 deletions Linux-Application/DomesdayDuplicator/configurationdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,19 @@
<bool>true</bool>
</property>
</widget>
<widget class="QRadioButton" name="saveAs10BitCdRadioButton">
<property name="geometry">
<rect>
<x>20</x>
<y>120</y>
<width>361</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Save captures as 10-bit packed (4:1 decimation for CD)</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="usb">
<attribute name="title">
Expand Down
24 changes: 17 additions & 7 deletions Linux-Application/DomesdayDuplicator/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,9 @@ void MainWindow::updateCaptureStatistics(void)
qint32 mbWritten = 0;
if (configuration->getCaptureFormat() == Configuration::CaptureFormat::sixteenBitSigned)
mbWritten = usbDevice->getNumberOfDiskBuffersWritten() * 64; // 16-bit is 64MiB per buffer
else mbWritten = usbDevice->getNumberOfDiskBuffersWritten() * 40; // 10-bit is 40MiB per buffer
else if (configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitPacked)
mbWritten = usbDevice->getNumberOfDiskBuffersWritten() * 40; // 10-bit is 40MiB per buffer
else mbWritten = usbDevice->getNumberOfDiskBuffersWritten() * 10; // 10-bit 4:1 is 8MiB per buffer

ui->numberOfDiskBuffersWrittenLabel->setText(QString::number(mbWritten) + (tr(" MiB")));
}
Expand Down Expand Up @@ -542,9 +544,11 @@ void MainWindow::updateStorageInformation(void)

if (availableMiBs != 0) {
if (configuration->getCaptureFormat() == Configuration::CaptureFormat::sixteenBitSigned) {
availableSeconds = availableMiBs / 64;
availableSeconds = availableMiBs / 64; // 16-bit is 64MiB per buffer
} else if (configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitPacked) {
availableSeconds = availableMiBs / 40; // 10-bit is 40MiB per buffer
} else {
availableSeconds = availableMiBs / 40;
availableSeconds = availableMiBs / 10; // 10-bit 4:1 is 10MiB per buffer
}

// Print the time available (be non-specific if > 24 hours)
Expand Down Expand Up @@ -659,16 +663,22 @@ void MainWindow::on_capturePushButton_clicked()

// Change the suffix depending on if the data is 10 or 16 bit
if (configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitPacked) captureFilename += ".lds";
else captureFilename += ".raw";
else if (configuration->getCaptureFormat() == Configuration::CaptureFormat::sixteenBitSigned) captureFilename += ".raw";
else captureFilename += ".cds";

qDebug() << "MainWindow::on_capturePushButton_clicked(): Starting capture to file:" << captureFilename;
updateGuiForCaptureStart();
isCaptureRunning = true;
qDebug() << "MainWindow::on_capturePushButton_clicked(): Starting transfer";

if (configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitPacked) {
usbDevice->startCapture(captureFilename, true);
qDebug() << "MainWindow::on_capturePushButton_clicked(): Starting transfer - 10-bit packed";
usbDevice->startCapture(captureFilename, true, false);
} else if (configuration->getCaptureFormat() == Configuration::CaptureFormat::tenBitCdPacked) {
qDebug() << "MainWindow::on_capturePushButton_clicked(): Starting transfer - 10-bit packed 4:1 decimated";
usbDevice->startCapture(captureFilename, true, true);
} else {
usbDevice->startCapture(captureFilename, false);
qDebug() << "MainWindow::on_capturePushButton_clicked(): Starting transfer - 16-bit";
usbDevice->startCapture(captureFilename, false, false);
}

qDebug() << "MainWindow::on_capturePushButton_clicked(): Transfer started";
Expand Down
107 changes: 74 additions & 33 deletions Linux-Application/DomesdayDuplicator/usbcapture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@ static void LIBUSB_CALL bulkTransferCallback(struct libusb_transfer *transfer)

UsbCapture::UsbCapture(QObject *parent, libusb_context *libUsbContextParam,
libusb_device_handle *usbDeviceHandleParam,
QString filenameParam, bool isCaptureFormat10BitParam) : QThread(parent)
QString filenameParam, bool isCaptureFormat10BitParam,
bool isCaptureFormat10BitDecimatedParam) : QThread(parent)
{
// Set the libUSB context
libUsbContext = libUsbContextParam;
Expand All @@ -226,6 +227,7 @@ UsbCapture::UsbCapture(QObject *parent, libusb_context *libUsbContextParam,

// Store the requested data format
isCaptureFormat10Bit = isCaptureFormat10BitParam;
isCaptureFormat10BitDecimated = isCaptureFormat10BitDecimatedParam;

// Set the transfer abort flag
transferAbort = false;
Expand Down Expand Up @@ -540,39 +542,78 @@ void UsbCapture::writeBufferToDisk(QFile *outputFile, qint32 diskBufferNumber, b

// Write the data in 10 or 16 bit format
if (isCaptureFormat10Bit) {
// Translate the data in the disk buffer to unsigned 10-bit packed data
quint32 conversionBufferPointer = 0;

for (qint32 diskBufferPointer = 0; diskBufferPointer < (TRANSFERSIZE * TRANSFERSPERDISKBUFFER); diskBufferPointer += 8) {
quint32 originalWords[4];

// Get the original 4 10-bit words
originalWords[0] = diskBuffers[diskBufferNumber][diskBufferPointer + 0];
originalWords[0] += diskBuffers[diskBufferNumber][diskBufferPointer + 1] * 256;
originalWords[1] = diskBuffers[diskBufferNumber][diskBufferPointer + 2];
originalWords[1] += diskBuffers[diskBufferNumber][diskBufferPointer + 3] * 256;
originalWords[2] = diskBuffers[diskBufferNumber][diskBufferPointer + 4];
originalWords[2] += diskBuffers[diskBufferNumber][diskBufferPointer + 5] * 256;
originalWords[3] = diskBuffers[diskBufferNumber][diskBufferPointer + 6];
originalWords[3] += diskBuffers[diskBufferNumber][diskBufferPointer + 7] * 256;

// Convert into 5 bytes of packed 10-bit data
conversionBuffer[conversionBufferPointer + 0] = static_cast<unsigned char>((originalWords[0] & 0x03FC) >> 2);
conversionBuffer[conversionBufferPointer + 1] = static_cast<unsigned char>((originalWords[0] & 0x0003) << 6);
conversionBuffer[conversionBufferPointer + 1] += static_cast<unsigned char>((originalWords[1] & 0x03F0) >> 4);
conversionBuffer[conversionBufferPointer + 2] = static_cast<unsigned char>((originalWords[1] & 0x000F) << 4);
conversionBuffer[conversionBufferPointer + 2] += static_cast<unsigned char>((originalWords[2] & 0x03C0) >> 6);
conversionBuffer[conversionBufferPointer + 3] = static_cast<unsigned char>((originalWords[2] & 0x003F) << 2);
conversionBuffer[conversionBufferPointer + 3] += static_cast<unsigned char>((originalWords[3] & 0x0300) >> 8);
conversionBuffer[conversionBufferPointer + 4] = static_cast<unsigned char>((originalWords[3] & 0x00FF));

// Increment the conversion buffer pointer
conversionBufferPointer += 5;
}
if (!isCaptureFormat10BitDecimated) {
// Translate the data in the disk buffer to unsigned 10-bit packed data
quint32 conversionBufferPointer = 0;

for (qint32 diskBufferPointer = 0; diskBufferPointer < (TRANSFERSIZE * TRANSFERSPERDISKBUFFER); diskBufferPointer += 8) {
quint32 originalWords[4];

// Get the original 4 10-bit words
originalWords[0] = diskBuffers[diskBufferNumber][diskBufferPointer + 0];
originalWords[0] += diskBuffers[diskBufferNumber][diskBufferPointer + 1] * 256;
originalWords[1] = diskBuffers[diskBufferNumber][diskBufferPointer + 2];
originalWords[1] += diskBuffers[diskBufferNumber][diskBufferPointer + 3] * 256;
originalWords[2] = diskBuffers[diskBufferNumber][diskBufferPointer + 4];
originalWords[2] += diskBuffers[diskBufferNumber][diskBufferPointer + 5] * 256;
originalWords[3] = diskBuffers[diskBufferNumber][diskBufferPointer + 6];
originalWords[3] += diskBuffers[diskBufferNumber][diskBufferPointer + 7] * 256;

// Convert into 5 bytes of packed 10-bit data
conversionBuffer[conversionBufferPointer + 0] = static_cast<unsigned char>((originalWords[0] & 0x03FC) >> 2);
conversionBuffer[conversionBufferPointer + 1] = static_cast<unsigned char>((originalWords[0] & 0x0003) << 6);
conversionBuffer[conversionBufferPointer + 1] += static_cast<unsigned char>((originalWords[1] & 0x03F0) >> 4);
conversionBuffer[conversionBufferPointer + 2] = static_cast<unsigned char>((originalWords[1] & 0x000F) << 4);
conversionBuffer[conversionBufferPointer + 2] += static_cast<unsigned char>((originalWords[2] & 0x03C0) >> 6);
conversionBuffer[conversionBufferPointer + 3] = static_cast<unsigned char>((originalWords[2] & 0x003F) << 2);
conversionBuffer[conversionBufferPointer + 3] += static_cast<unsigned char>((originalWords[3] & 0x0300) >> 8);
conversionBuffer[conversionBufferPointer + 4] = static_cast<unsigned char>((originalWords[3] & 0x00FF));

// Increment the conversion buffer pointer
conversionBufferPointer += 5;
}

// Write the conversion buffer to disk
outputFile->write(reinterpret_cast<const char *>(conversionBuffer), sizeof(unsigned char) * conversionBufferPointer);
//qDebug() << "UsbCapture::writeBufferToDisk(): 10-bit - Written" << (sizeof(unsigned char) * conversionBufferPointer) << "bytes to disk";
// Write the conversion buffer to disk
outputFile->write(reinterpret_cast<const char *>(conversionBuffer), sizeof(unsigned char) * conversionBufferPointer);
//qDebug() << "UsbCapture::writeBufferToDisk(): 10-bit - Written" << (sizeof(unsigned char) * conversionBufferPointer) << "bytes to disk";
} else {
// Translate the data in the disk buffer to unsigned 10-bit packed data with 4:1 decimation
quint32 conversionBufferPointer = 0;

for (qint32 diskBufferPointer = 0; diskBufferPointer < (TRANSFERSIZE * TRANSFERSPERDISKBUFFER); diskBufferPointer += (8 * 4)) {
quint32 originalWords[4];

// Get the original 4 10-bit words
originalWords[0] = diskBuffers[diskBufferNumber][diskBufferPointer + 0];
originalWords[0] += diskBuffers[diskBufferNumber][diskBufferPointer + 1] * 256;

originalWords[1] = diskBuffers[diskBufferNumber][diskBufferPointer + 2 + 4];
originalWords[1] += diskBuffers[diskBufferNumber][diskBufferPointer + 3 + 4] * 256;

originalWords[2] = diskBuffers[diskBufferNumber][diskBufferPointer + 4 + 8];
originalWords[2] += diskBuffers[diskBufferNumber][diskBufferPointer + 5 + 8] * 256;

originalWords[3] = diskBuffers[diskBufferNumber][diskBufferPointer + 6 + 12];
originalWords[3] += diskBuffers[diskBufferNumber][diskBufferPointer + 7 + 12] * 256;

// Convert into 5 bytes of packed 10-bit data
conversionBuffer[conversionBufferPointer + 0] = static_cast<unsigned char>((originalWords[0] & 0x03FC) >> 2);
conversionBuffer[conversionBufferPointer + 1] = static_cast<unsigned char>((originalWords[0] & 0x0003) << 6);
conversionBuffer[conversionBufferPointer + 1] += static_cast<unsigned char>((originalWords[1] & 0x03F0) >> 4);
conversionBuffer[conversionBufferPointer + 2] = static_cast<unsigned char>((originalWords[1] & 0x000F) << 4);
conversionBuffer[conversionBufferPointer + 2] += static_cast<unsigned char>((originalWords[2] & 0x03C0) >> 6);
conversionBuffer[conversionBufferPointer + 3] = static_cast<unsigned char>((originalWords[2] & 0x003F) << 2);
conversionBuffer[conversionBufferPointer + 3] += static_cast<unsigned char>((originalWords[3] & 0x0300) >> 8);
conversionBuffer[conversionBufferPointer + 4] = static_cast<unsigned char>((originalWords[3] & 0x00FF));

// Increment the conversion buffer pointer
conversionBufferPointer += 5;
}

// Write the conversion buffer to disk
outputFile->write(reinterpret_cast<const char *>(conversionBuffer), sizeof(unsigned char) * conversionBufferPointer);
//qDebug() << "UsbCapture::writeBufferToDisk(): 10-bit - Written" << (sizeof(unsigned char) * conversionBufferPointer) << "bytes to disk";
}
} else {
// Translate the data in the disk buffer to scaled 16-bit signed data
for (qint32 pointer = 0; pointer < (TRANSFERSIZE * TRANSFERSPERDISKBUFFER); pointer += 2) {
Expand Down
3 changes: 2 additions & 1 deletion Linux-Application/DomesdayDuplicator/usbcapture.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class UsbCapture : public QThread
public:
explicit UsbCapture(QObject *parent = nullptr, libusb_context *libUsbContextParam = nullptr,
libusb_device_handle *usbDeviceHandleParam = nullptr, QString filenameParam = nullptr,
bool isCaptureFormat10BitParam = true);
bool isCaptureFormat10BitParam = true, bool isCaptureFormat10BitDecimatedParam = false);
~UsbCapture() override;

void startTransfer(void);
Expand All @@ -66,6 +66,7 @@ protected slots:
libusb_device_handle *usbDeviceHandle;
QString filename;
bool isCaptureFormat10Bit;
bool isCaptureFormat10BitDecimated;

private:
qint32 numberOfDiskBuffersWritten;
Expand Down
5 changes: 3 additions & 2 deletions Linux-Application/DomesdayDuplicator/usbdevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ bool UsbDevice::sendVendorSpecificCommand(quint8 command, quint16 value)
}

// Start capturing from the USB device
void UsbDevice::startCapture(QString filename, bool isCaptureFormat10Bit)
void UsbDevice::startCapture(QString filename, bool isCaptureFormat10Bit, bool isCaptureFormat10BitDecimated)
{
qDebug() << "UsbDevice::startCapture(): Starting capture";

Expand All @@ -374,7 +374,8 @@ void UsbDevice::startCapture(QString filename, bool isCaptureFormat10Bit)
if (result) {
// Create the capture object
qDebug() << "UsbDevice::startCapture(): Creating the capture object";
usbCapture = new UsbCapture(this, libUsbContext, usbDeviceHandle, filename, isCaptureFormat10Bit);
usbCapture = new UsbCapture(this, libUsbContext, usbDeviceHandle, filename,
isCaptureFormat10Bit, isCaptureFormat10BitDecimated);

// Did we get a valid device handle?
if (usbDeviceHandle != nullptr) {
Expand Down
2 changes: 1 addition & 1 deletion Linux-Application/DomesdayDuplicator/usbdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class UsbDevice : public QThread
bool scanForDevice(void);
void sendConfigurationCommand(bool testMode);

void startCapture(QString filename, bool isCaptureFormat10Bit);
void startCapture(QString filename, bool isCaptureFormat10Bit, bool isCaptureFormat10BitDecimated);
void stopCapture(void);
qint32 getNumberOfTransfers(void);
qint32 getNumberOfDiskBuffersWritten(void);
Expand Down
Loading

0 comments on commit 96b5c79

Please sign in to comment.