view editlogdialog.cpp @ 2:177f640940f2

Update exception class and cleanup redifinitions During firmware download and exception caused the application to stop. Rootcause was the defference between QT5 and QT6 exception and string handling which is updated now. In addition some old definitions were removed to avoid compiler warnings.
author Ideenmodellierer
date Fri, 28 Nov 2025 19:57:35 +0100
parents 0b3630a29ad8
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);
                }
            }
        }
    }
}