view editlogdialog.cpp @ 12:ac837fe1d590 default tip

Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
author Ideenmodellierer
date Mon, 12 Jan 2026 13:58:41 +0000
parents 21ce6187d32e
children
line wrap: on
line source

#include "editlogdialog.h"
#include "MainWindow.h" // Needed to propagare retranslate()
#include "Utils/Log.h"
#include "ui_LogEditor.h"

#include "HardwareOperations.h"

#include <QApplication>
#include <QDialogButtonBox>
#include <QDir>
#include <QLibraryInfo>
#include <QPushButton>
#include <QTableWidget>
#include <QTranslator>

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