view editlogdialog.cpp @ 4:e30f00f760d3 default tip

Cleanup OSTC label and removed url The computer type will now show OSTC 4/5 instead of only 4. The url has been removed because it is no longer maintained. The ui header have been deleted because they are generated files shich should not be under version controll. Delete locally if you want to force an update of the dialog layout.
author Ideenmodellierer
date Sun, 30 Nov 2025 18:37:32 +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);
                }
            }
        }
    }
}