diff --git a/levelonepage.cpp b/levelonepage.cpp index 7d11f1a..ef69996 100644 --- a/levelonepage.cpp +++ b/levelonepage.cpp @@ -42,11 +42,16 @@ LevelOnePage::LevelOnePage(const PageBase &other) localEnhance.reserve(208); clearPage(); + for (int i=0; i<26; i++) + if (other.packetNeeded(i)) + setPacket(i, other.packet(i)); + for (int i=26; i<30; i++) + for (int j=0; j<16; j++) + if (other.packetNeeded(i, j)) + setPacket(i, j, other.packet(i)); + for (int i=PageBase::C4ErasePage; i<=PageBase::C14NOS; i++) setControlBit(i, other.controlBit(i)); - for (int i=0; i<90; i++) - if (other.packetNeededArrayIndex(i)) - setPacketArrayIndex(i, other.packetArrayIndex(i)); } // So far we only call clearPage() once, within the constructor @@ -98,7 +103,7 @@ bool LevelOnePage::isEmpty() const return true; } -QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const +QByteArray LevelOnePage::packet(int packetNumber) const { QByteArray result(40, 0x00); @@ -108,6 +113,13 @@ QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const return result; } + return PageBase::packet(packetNumber); +} + +QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const +{ + QByteArray result(40, 0x00); + if (packetNumber == 26) { if (!packetNeeded(26, designationCode)) return result; // Blank result @@ -206,6 +218,7 @@ bool LevelOnePage::setPacket(int packetNumber, QByteArray packetContents) return true; } + qDebug("LevelOnePage unhandled setPacket X/%d", packetNumber); return PageBase::setPacket(packetNumber, packetContents); } @@ -293,11 +306,11 @@ bool LevelOnePage::setPacket(int packetNumber, int designationCode, QByteArray p return true; } - qDebug("LevelOnePage unhandled packet X/%d/%d", packetNumber, designationCode); + qDebug("LevelOnePage unhandled setPacket X/%d/%d", packetNumber, designationCode); return PageBase::setPacket(packetNumber, designationCode, packetContents); } -bool LevelOnePage::packetNeeded(int packetNumber, int designationCode) const +bool LevelOnePage::packetNeeded(int packetNumber) const { if (packetNumber <= 24) { for (int c=0; c<40; c++) @@ -306,6 +319,11 @@ bool LevelOnePage::packetNeeded(int packetNumber, int designationCode) const return false; } + return PageBase::packetNeeded(packetNumber); +} + +bool LevelOnePage::packetNeeded(int packetNumber, int designationCode) const +{ if (packetNumber == 26) return ((localEnhance.size()+12) / 13) > designationCode; @@ -342,6 +360,7 @@ bool LevelOnePage::packetNeeded(int packetNumber, int designationCode) const return false; } } + return PageBase::packetNeeded(packetNumber, designationCode); } diff --git a/levelonepage.h b/levelonepage.h index 621ba0b..ced0bef 100644 --- a/levelonepage.h +++ b/levelonepage.h @@ -44,8 +44,10 @@ public: bool isEmpty() const override; - QByteArray packet(int, int=0) const override; - bool packetNeeded(int, int=0) const override; + QByteArray packet(int) const override; + QByteArray packet(int, int) const override; + bool packetNeeded(int) const override; + bool packetNeeded(int, int) const override; bool setPacket(int, QByteArray) override; bool setPacket(int, int, QByteArray) override; diff --git a/pagebase.cpp b/pagebase.cpp index 3dd9abf..7abed0d 100644 --- a/pagebase.cpp +++ b/pagebase.cpp @@ -24,112 +24,97 @@ PageBase::PageBase() { // We use nullptrs to keep track of allocated packets, so initialise them this way - for (int i=0; i<90; i++) - m_packets[i] = nullptr; + for (int i=0; i<26; i++) + m_displayPackets[i] = nullptr; + for (int i=0; i<4; i++) + for (int j=0; j<16; j++) + m_designationPackets[i][j] = nullptr; + for (int i=PageBase::C4ErasePage; i<=PageBase::C14NOS; i++) m_controlBits[i] = false; } -PageBase::PageBase(const PageBase &other) -{ - for (int i=PageBase::C4ErasePage; i<=PageBase::C14NOS; i++) - setControlBit(i, other.controlBit(i)); - for (int i=0; i<90; i++) - if (other.packetNeededArrayIndex(i)) - setPacketArrayIndex(i, other.packetArrayIndex(i)); - else - m_packets[i] = nullptr; -} - PageBase::~PageBase() { - for (int i=0; i<90; i++) - if (m_packets[i] != nullptr) - delete m_packets[i]; + for (int i=0; i<26; i++) + if (m_displayPackets[i] != nullptr) + delete m_displayPackets[i]; + for (int i=0; i<4; i++) + for (int j=0; j<16; j++) + if (m_designationPackets[i][j] != nullptr) + delete m_designationPackets[i][j]; } bool PageBase::isEmpty() const { - for (int i=0; i<90; i++) - if (m_packets[i] != nullptr) + for (int i=0; i<26; i++) + if (m_displayPackets[i] != nullptr) return false; + for (int i=0; i<4; i++) + for (int j=0; j<16; j++) + if (m_designationPackets[i][j] != nullptr) + return false; return true; } -QByteArray PageBase::packet(int packetNumber, int designationCode) const +QByteArray PageBase::packet(int i) const { - int arrayIndex = packetNumber; - - if (packetNumber >= 26) - arrayIndex += (packetNumber - 26) * 16 + designationCode; - return packetArrayIndex(arrayIndex); -} - -QByteArray PageBase::packetArrayIndex(int arrayIndex) const -{ - if (m_packets[arrayIndex] == nullptr) + if (m_displayPackets[i] == nullptr) return QByteArray(); // Blank result - return *m_packets[arrayIndex]; + + return *m_displayPackets[i]; } -bool PageBase::packetNeeded(int packetNumber, int designationCode) const +QByteArray PageBase::packet(int i, int j) const { - int arrayIndex = packetNumber; + if (m_designationPackets[i-26][j] == nullptr) + return QByteArray(); // Blank result - if (packetNumber >= 26) - arrayIndex += (packetNumber - 26) * 16 + designationCode; - return packetNeededArrayIndex(arrayIndex); + return *m_designationPackets[i-26][j]; } -bool PageBase::packetNeededArrayIndex(int arrayIndex) const -{ - return m_packets[arrayIndex] != nullptr; -} -bool PageBase::setPacket(int packetNumber, QByteArray packetContents) +bool PageBase::setPacket(int i, QByteArray packetContents) { - return setPacket(packetNumber, 0, packetContents); -} - -bool PageBase::setPacket(int packetNumber, int designationCode, QByteArray packetContents) -{ - int arrayIndex = packetNumber; - - if (packetNumber >= 26) - arrayIndex += (packetNumber - 26) * 16 + designationCode; - return setPacketArrayIndex(arrayIndex, packetContents); -} - -bool PageBase::setPacketArrayIndex(int arrayIndex, QByteArray packetContents) -{ - if (m_packets[arrayIndex] == nullptr) - m_packets[arrayIndex] = new QByteArray(40, 0x00); - *m_packets[arrayIndex] = packetContents; + if (m_displayPackets[i] == nullptr) + m_displayPackets[i] = new QByteArray(40, 0x00); + *m_displayPackets[i] = packetContents; return true; } -/* -bool PageBase::deletePacket(int packetNumber, int designationCode) + +bool PageBase::setPacket(int i, int j, QByteArray packetContents) { - int arrayIndex = packetNumber; + if (m_designationPackets[i-26][j] == nullptr) + m_designationPackets[i-26][j] = new QByteArray(40, 0x00); + *m_designationPackets[i-26][j] = packetContents; - if (packetNumber >= 26) - arrayIndex += (packetNumber - 26) * 16 + designationCode; - - return deletePacketArrayIndex(arrayIndex); + return true; } -bool PageBase::deletePacketArrayIndex(int arrayIndex) +/* +bool PageBase::deletePacket(int i) { - if (m_packets[arrayIndex] != nullptr) { - delete m_packets[arrayIndex]; - m_packets[arrayIndex] = nullptr; + if (m_displayPackets[i] != nullptr) { + delete m_displayPackets[i]; + m_displayPackets[i] = nullptr; + } + + return true; +} + +bool PageBase::deletePacket(int i) +{ + if (m_designationPackets[i-26][j] != nullptr) { + delete m_designationPackets[i-26][j]; + m_designationPackets[i-26][j] = nullptr; } return true; } */ + bool PageBase::setControlBit(int bitNumber, bool active) { m_controlBits[bitNumber] = active; diff --git a/pagebase.h b/pagebase.h index b6125df..9274a20 100644 --- a/pagebase.h +++ b/pagebase.h @@ -31,28 +31,25 @@ public: enum ControlBitsEnum { C4ErasePage, C5Newsflash, C6Subtitle, C7SuppressHeader, C8Update, C9InterruptedSequence, C10InhibitDisplay, C11SerialMagazine, C12NOS, C13NOS, C14NOS }; PageBase(); - PageBase(const PageBase &); - ~PageBase(); + virtual ~PageBase(); virtual bool isEmpty() const; - virtual QByteArray packet(int, int=0) const; - virtual bool packetNeeded(int, int=0) const; + virtual QByteArray packet(int) const; + virtual QByteArray packet(int, int) const; + virtual bool packetNeeded(int i) const { return m_displayPackets[i] != nullptr; } + virtual bool packetNeeded(int i, int j) const { return m_designationPackets[i-26][j] != nullptr; } virtual bool setPacket(int, QByteArray); virtual bool setPacket(int, int, QByteArray); -// bool deletePacket(int, int=0); +// bool deletePacket(int); +// bool deletePacket(int, int); virtual bool controlBit(int bitNumber) const { return m_controlBits[bitNumber]; } virtual bool setControlBit(int, bool); - QByteArray packetArrayIndex(int) const; - bool packetNeededArrayIndex(int) const; - bool setPacketArrayIndex(int, QByteArray); -// bool deletePacketArrayIndex(int); - private: bool m_controlBits[11]; - QByteArray *m_packets[90]; // X/0 to X/25, plus 16 packets for X/26, another 16 for X/27, for X28 and for X/29 + QByteArray *m_displayPackets[26], *m_designationPackets[4][16]; }; #endif