Mercurial > public > ostc_companion
view 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 source
#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); } } } } }
