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