Mercurial > public > ostc_companion
diff editlogdialog.cpp @ 1:0b3630a29ad8
Initial version based on previous repository.
Project was ported to QT6 and in now cmake based.
| author | Ideenmodellierer <tiefenrauscher@web.de> |
|---|---|
| date | Thu, 27 Nov 2025 18:40:28 +0100 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/editlogdialog.cpp Thu Nov 27 18:40:28 2025 +0100 @@ -0,0 +1,413 @@ +#include "editlogdialog.h" +#include "ui_LogEditor.h" +#include "MainWindow.h" // Needed to propagare retranslate() +#include "Utils/Log.h" + +#include "HardwareOperations.h" + +#include <QApplication> +#include <QDialogButtonBox> +#include <QDir> +#include <QLibraryInfo> +#include <QPushButton> +#include <QTranslator> +#include <QTableWidget> + + +#ifdef Q_OS_WIN +# define NOMINMAX 1 +# include <Windows.h> +# undef NOMINMAX +#endif +#define HEADER2OFFSET 0x400 + +EditLogDialog::EditLogDialog(QWidget* parent, HardwareOperations *op) + : QDialog(parent), + _ui(new Ui::editLogWnd), + _op(op) +{ + uint32_t index, index2; + uint32_t sizeY = 0; + _ui->setupUi(this); + QTableWidget* headerView = _ui->SectorView; + QTableWidget* sampleView = _ui->SampleView; + + _ui->textBrowser_2->setTabStopDistance( + QFontMetricsF(_ui->textBrowser_2->font()).horizontalAdvance(' ') * 4 + ); + headerView->horizontalHeader()->setMinimumSectionSize(8); + headerView->verticalHeader()->setMinimumSectionSize(8); + headerView->horizontalHeader()->setDefaultSectionSize(8); + headerView->verticalHeader()->setDefaultSectionSize(8); + headerView->setColumnWidth(0,8); + headerView->setRowHeight(0,8); + headerView->horizontalHeader()->hide(); + headerView->verticalHeader()->hide(); + + sampleView->horizontalHeader()->setMinimumSectionSize(8); + sampleView->verticalHeader()->setMinimumSectionSize(8); + sampleView->horizontalHeader()->setDefaultSectionSize(8); + sampleView->verticalHeader()->setDefaultSectionSize(8); + sampleView->setColumnWidth(0,8); + sampleView->setRowHeight(0,8); + sampleView->horizontalHeader()->hide(); + sampleView->verticalHeader()->hide(); + + headerView->setRowCount(16); + headerView->setColumnCount(16); + + sampleView->setRowCount(12); + sampleView->setColumnCount(16); + + + HeaderBuffer = new unsigned char[0x8000*8 + 1]; // 64k Headerbuffer + lastDiveindex + SampleBuffer = new unsigned char[0xC00000 + 4]; // 12MB Samplebuffer + nextSampleAddr + + headerView->resize(8*16+2,8*16+2); + sampleView->resize(8*16+2,8*12+2); + sizeY = (uint32_t)(headerView->geometry().width()) / 16; + + if(sizeY < 8) + { + sizeY = 8; + } + + for(index = 0; index <16; index++) + { + headerView->setColumnWidth(index,sizeY); + headerView->setRowHeight(index,sizeY); + for(index2 = 0; index2 < 16; index2++) + { + + item[index * 16 + index2] = new QTableWidgetItem(" "); + headerView->setItem(index, index2, item[index * 16 + index2]); + } + } + + for(index = 0; index <12; index++) + { + sampleView->setColumnWidth(index,sizeY); + sampleView->setRowHeight(index,sizeY); + for(index2 = 0; index2 < 16; index2++) + { + + sampleitem[index * 16 + index2] = new QTableWidgetItem(" "); + sampleView->setItem(index, index2, sampleitem[index * 16 + index2]); + } + } + + headerView->show(); + headerView->setShowGrid(true); + + sampleView->show(); + sampleView->setShowGrid(true); + +} + +EditLogDialog::~EditLogDialog() +{ + uint32_t index; + + for(index = 0; index <256; index++) + { + delete item[index]; + } + for(index = 0; index <192; index++) + { + delete sampleitem[index]; + } + delete _ui; + delete HeaderBuffer; + delete SampleBuffer; +} + + +void EditLogDialog::on_WriteAllHeader_clicked() +{ + _op->writeAllHeader(HeaderBuffer); +} + +void EditLogDialog::on_pushButton_clicked() +{ + Q_ASSERT( _op ); + + HeaderBuffer[0] = 0; + + try { + LOG_INFO(tr("Request All Headers...")); + _op->getAllHeader(HeaderBuffer); + } + catch(const std::exception& e) { + LOG_INFO( QString("<bg><font color='red'>%1</font></color>: %2") + .arg(tr("Error")) + .arg(e.what()) ); + } + if(HeaderBuffer[0] != 0) + { + LOG_INFO(tr("Got something")); + updateHeaderStatus(); + } +} + + + +void EditLogDialog::on_HeaderUsage_valueChanged(int value) +{ + +} + +void EditLogDialog::on_ReadAllSamples_clicked() +{ + try { + LOG_INFO(tr("Request All Samples...")); + _op->getAllSamples(SampleBuffer); + } + catch(const std::exception& e) { + LOG_INFO( QString("<bg><font color='red'>%1</font></color>: %2") + .arg(tr("Error")) + .arg(e.what()) ); + } +} + +void EditLogDialog::on_WriteAllSamples_clicked() +{ + try { + LOG_INFO(tr("Request All Samples...")); + _op->writeAllSamples(SampleBuffer); + } + catch(const std::exception& e) { + LOG_INFO( QString("<bg><font color='red'>%1</font></color>: %2") + .arg(tr("Error")) + .arg(e.what()) ); + } +} + +void EditLogDialog::on_pushButton_2_clicked() +{ + qint64 length; + QFile dumpFile; + dumpFile.setFileName("Log_Dump.bin"); + if( ! dumpFile.open(QIODevice::WriteOnly) ) + { + LOG_THROW( "Cannot create dump file " ); + } + else + { + length = 0x8000*8 + 1; + dumpFile.write((const char*)HeaderBuffer,length); + length = 0xC00000 + 4; + dumpFile.write((const char*)SampleBuffer,length); + dumpFile.close(); + } +} + +void EditLogDialog::on_LoadDump_clicked() +{ + qint64 length; + QFile dumpFile; + dumpFile.setFileName("Log_Dump.bin"); + if( ! dumpFile.open(QIODevice::ReadOnly) ) + { + LOG_THROW( "Cannot read dump file " ); + } + else + { + length = 0x8000*8 + 1; + dumpFile.read((char*)HeaderBuffer,length); + length = 0xC00000 + 4; + dumpFile.read((char*)SampleBuffer,length); + dumpFile.close(); + + updateHeaderStatus(); + updateSampleStatus(); + } +} + +void EditLogDialog::updateHeaderStatus() +{ + QProgressBar* w = _ui->HeaderUsage; + QTableWidget* sv = _ui->SectorView; + SLogbookHeader* LogInfo; + SSmallHeader* smallHeader; + unsigned char HeaderInUse = 0; + uint32_t index, index2; + uint32_t sampleStartAddr, sampleEndAddr, sampleLength; + int row; + int colum; + + for(index = 0; index < 16; index++) + { + for(index2 = 0; index2 < 16; index2++) + { + if((HeaderBuffer[(0x800 * (index * 16 + index2 )) + HEADER2OFFSET] == 0xFA) + && (HeaderBuffer[(0x800 * (index * 16 + index2 )) + HEADER2OFFSET + 1] == 0xFA)) + { + HeaderInUse++; + LogInfo = (SLogbookHeader*)(HeaderBuffer+(0x800 * (index*16+index2))+0x400); + sampleEndAddr = (LogInfo->profileLength[2]<<16) + (LogInfo->profileLength[1]<<8) + LogInfo->profileLength[0]; + if( sampleEndAddr == 0) + { + sv->item(index,index2)->setBackground(Qt::black); + } + else + { + LogInfo = (SLogbookHeader*)(HeaderBuffer+(0x800 * (index*16+index2))); + sampleStartAddr = (LogInfo->pBeginProfileData[2]<<16) + (LogInfo->pBeginProfileData[1]<<8) + LogInfo->pBeginProfileData[0]; + smallHeader = (SSmallHeader*) &SampleBuffer[sampleStartAddr-0x100000]; + sampleLength = (smallHeader->profileLength[2] << 16)+ (smallHeader->profileLength[1] << 8) + smallHeader->profileLength[0]; + if(sampleLength == sampleEndAddr) // - sampleStartAddr)) + { + sv->item(index,index2)->setBackground(Qt::green); + } + else { + sv->item(index,index2)->setBackground(Qt::red); + } + } + + } + else + { + sv->item(index,index2)->setBackground(Qt::white); + } + } + } + row =(HeaderBuffer[(0x8000 * 8)])/16; + colum =(HeaderBuffer[(0x8000 * 8)] % 16); + sv->item(row,colum)->setBackground(Qt::blue); + w->setMaximum(256); + w->setValue(HeaderInUse); +} + + + + + +void EditLogDialog::on_SectorView_cellClicked(int row, int column) +{ + +} + +void EditLogDialog::updateSampleStatus() +{ + uint8_t row,colum; + uint32_t index; + QTableWidget* sv = _ui->SampleView; + QProgressBar* w = _ui->SampleUsage; + uint8_t SamplesInUse = 0; + + for(index = 0; index < 192; index++) + { + row = index / 16; + colum =index % 16; + + if(SampleBuffer[index * 0x10000] != 0xFF) /* used */ + { + SamplesInUse++; + if(SampleBuffer[index * 0x10000 + 0xFFFF] == 0xFF) /* open */ + { + sv->item(row,colum)->setBackground(Qt::blue); + } + else + { + sv->item(row,colum)->setBackground(Qt::green); /* closed */ + } + } + else + { + sv->item(row,colum)->setBackground(Qt::white); /* empty */ + } + } + w->setMaximum(192); + w->setValue(SamplesInUse); +} + + + +void EditLogDialog::on_SectorView_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) +{ + SLogbookHeader* LogInfo; + SLogbookHeader* LogInfo2nd; + QTextEdit* tf = _ui->textBrowser_2; + QString InfoText; + QTableWidget* sv = _ui->SampleView; + uint32_t sampleAddrStart = 0; + uint32_t sampleAddrEnd = 0; + uint8_t rowidx, columidx; + + tf->setReadOnly(true); + + LogInfo = (SLogbookHeader*)(HeaderBuffer+(0x800 * (currentRow*16+currentColumn))); + LogInfo2nd = (SLogbookHeader*)(HeaderBuffer+(0x800 * (currentRow*16+currentColumn)) +0x400); + + updateSampleStatus(); + + if(LogInfo->diveHeaderStart == 0xFAFA) + { + sampleAddrStart = (LogInfo->pBeginProfileData[2]<<16) + (LogInfo->pBeginProfileData[1]<<8) + LogInfo->pBeginProfileData[0]; + sampleAddrEnd = (LogInfo2nd->pEndProfileData[2]<<16) + (LogInfo2nd->pEndProfileData[1]<<8) + LogInfo2nd->pEndProfileData[0]; + + // InfoText.sprintf("Header: %d \nNummer: %d\nSamplestart 0x%x\nSampleend 0x%x", currentRow*16+currentColumn, LogInfo->diveNumber,sampleAddrStart,sampleAddrEnd); + InfoText = QString::asprintf( + "Header: %d \nNummer: %d\nSamplestart 0x%x\nSampleend 0x%x", + currentRow*16 + currentColumn, + LogInfo->diveNumber, + sampleAddrStart, + sampleAddrEnd + ); + sampleAddrStart = (LogInfo->pBeginProfileData[2]<<16) + (LogInfo->pBeginProfileData[1]<<8) + LogInfo->pBeginProfileData[0]; + if(sampleAddrStart != 0) + { + sampleAddrStart -= 0x100000; /* substract memory offset */ + sampleAddrStart /= 0x10000; /* calc sector */ + sv->item(sampleAddrStart / 16, sampleAddrStart % 16)->setBackground(Qt::magenta); + } + else + { + sv->item(0, 0)->setBackground(Qt::black); + } + } + else + { + InfoText = QString::asprintf("Empty"); + } + tf->setPlainText((InfoText)); +} + + + + + +void EditLogDialog::on_SampleView_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) +{ + uint16_t sampleSector; + uint8_t headerRow, headerColumn; + SLogbookHeader* LogInfo; + SLogbookHeader* LogInfo2nd; + uint32_t sectorStart, sectorEnd; + uint32_t sampleAddrStart, sampleAddrEnd; + QTableWidget* headerView = _ui->SectorView; + + sampleSector = currentRow * 16 + currentColumn; + sectorStart = sampleSector * 0x10000 + 0x100000; + sectorEnd = sectorStart +0xFFFF; + if(SampleBuffer[sectorStart - 0x100000] != 0xFF) // is buffer used? + { + updateHeaderStatus(); + for(headerRow = 0; headerRow < 16; headerRow++) + { + for(headerColumn = 0; headerColumn < 16; headerColumn++) + { + LogInfo = (SLogbookHeader*)(HeaderBuffer+(0x800 * (headerRow*16+headerColumn))); + LogInfo2nd = (SLogbookHeader*)(HeaderBuffer+(0x800 * (headerRow*16+headerColumn)) +0x400); + sampleAddrStart = (LogInfo->pBeginProfileData[2]<<16) + (LogInfo->pBeginProfileData[1]<<8) + LogInfo->pBeginProfileData[0]; + sampleAddrEnd = (LogInfo2nd->pEndProfileData[2]<<16) + (LogInfo2nd->pEndProfileData[1]<<8) + LogInfo2nd->pEndProfileData[0]; + + if(((sampleAddrStart >= sectorStart)&&(sampleAddrStart < sectorEnd) + || (sampleAddrEnd >= sectorStart)&&(sampleAddrEnd < sectorEnd))) + { + headerView->item(headerRow, headerColumn)->setBackground(Qt::magenta); + } + } + } + } +}
