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);
+                }
+            }
+        }
+    }
+}