Untangle loading TTI files into loadsave

This commit is contained in:
G.K.MacGregor
2020-11-29 15:41:26 +00:00
parent 50345b1627
commit 1855d8dacb
7 changed files with 141 additions and 150 deletions

View File

@@ -17,8 +17,6 @@
* along with QTeletextMaker. If not, see <https://www.gnu.org/licenses/>.
*/
#include <QFile>
#include <QTextStream>
#include <vector>
#include "document.h"
@@ -27,7 +25,7 @@
TeletextDocument::TeletextDocument()
{
m_pageNumber = 0x198;
m_pageNumber = 0x199;
m_description.clear();
m_pageFunction = PFLevelOnePage;
m_packetCoding = Coding7bit;
@@ -58,95 +56,6 @@ void TeletextDocument::setPacketCoding(PacketCodingEnum newPacketEncoding)
}
*/
void TeletextDocument::loadDocument(QFile *inFile)
{
QByteArray inLine;
bool firstSubPageFound = false;
int cycleCommandsFound = 0;
int mostRecentCycleValue = -1;
LevelOnePage::CycleTypeEnum mostRecentCycleType;
LevelOnePage* loadingPage = m_subPages[0];
for (;;) {
inLine = inFile->readLine(160).trimmed();
if (inLine.isEmpty())
break;
if (inLine.startsWith("DE,"))
m_description = QString(inLine.remove(0, 3));
if (inLine.startsWith("PN,")) {
bool pageNumberOk;
int pageNumberRead = inLine.mid(3, 3).toInt(&pageNumberOk, 16);
if ((!pageNumberOk) || pageNumberRead < 0x100 || pageNumberRead > 0x8ff)
pageNumberRead = 0x199;
// When second and subsequent PN commands are found, firstSubPageFound==true at this point
// This assumes that PN is the first command of a new subpage...
if (firstSubPageFound) {
m_subPages.push_back(new LevelOnePage);
loadingPage = m_subPages.back();
}
m_pageNumber = pageNumberRead;
firstSubPageFound = true;
}
/* if (lineType == "SC,") {
bool subPageNumberOk;
int subPageNumberRead = inLine.mid(3, 4).toInt(&subPageNumberOk, 16);
if ((!subPageNumberOk) || subPageNumberRead > 0x3f7f)
subPageNumberRead = 0;
loadingPage->setSubPageNumber(subPageNumberRead);
}*/
if (inLine.startsWith("PS,")) {
bool pageStatusOk;
int pageStatusRead = inLine.mid(3, 4).toInt(&pageStatusOk, 16);
if (pageStatusOk) {
loadingPage->setControlBit(PageBase::C4ErasePage, pageStatusRead & 0x4000);
for (int i=PageBase::C5Newsflash, pageStatusBit=0x0001; i<=PageBase::C11SerialMagazine; i++, pageStatusBit<<=1)
loadingPage->setControlBit(i, pageStatusRead & pageStatusBit);
loadingPage->setDefaultNOS(((pageStatusRead & 0x0200) >> 9) | ((pageStatusRead & 0x0100) >> 7) | ((pageStatusRead & 0x0080) >> 5));
}
}
if (inLine.startsWith("CT,") && (inLine.endsWith(",C") || inLine.endsWith(",T"))) {
bool cycleValueOk;
int cycleValueRead = inLine.mid(3, inLine.size()-5).toInt(&cycleValueOk);
if (cycleValueOk) {
cycleCommandsFound++;
// House-keep CT command values, in case it's the only one within multiple subpages
mostRecentCycleValue = cycleValueRead;
loadingPage->setCycleValue(cycleValueRead);
mostRecentCycleType = inLine.endsWith("C") ? LevelOnePage::CTcycles : LevelOnePage::CTseconds;
loadingPage->setCycleType(mostRecentCycleType);
}
}
if (inLine.startsWith("FL,")) {
bool fastTextLinkOk;
int fastTextLinkRead;
QString flLine = QString(inLine.remove(0, 3));
if (flLine.count(',') == 5)
for (int i=0; i<6; i++) {
fastTextLinkRead = flLine.section(',', i, i).toInt(&fastTextLinkOk, 16);
if (fastTextLinkOk) {
if (fastTextLinkRead == 0)
fastTextLinkRead = 0x8ff;
// Stored as page link with relative magazine number, convert from absolute page number that was read
fastTextLinkRead ^= m_pageNumber & 0x700;
fastTextLinkRead &= 0x7ff; // Fixes magazine 8 to 0
loadingPage->setFastTextLinkPageNumber(i, fastTextLinkRead);
}
}
}
if (inLine.startsWith("OL,"))
loadingPage->loadPagePacket(inLine);
}
// If there's more than one subpage but only one valid CT command was found, apply it to all subpages
// I don't know if this is correct
if (cycleCommandsFound == 1 && m_subPages.size()>1)
for (auto &subPage : m_subPages) {
subPage->setCycleValue(mostRecentCycleValue);
subPage->setCycleType(mostRecentCycleType);
}
subPageSelected();
}
void TeletextDocument::selectSubPageIndex(int newSubPageIndex, bool forceRefresh)
{
// forceRefresh overrides "beyond the last subpage" check, so inserting a subpage after the last one still shows - dangerous workaround?
@@ -198,10 +107,9 @@ void TeletextDocument::deleteSubPage(int subPageToDelete)
void TeletextDocument::setPageNumber(QString pageNumberString)
{
// The LineEdit should check if a valid hex number was entered, but just in case...
bool pageNumberOk;
int pageNumberRead = pageNumberString.toInt(&pageNumberOk, 16);
if ((!pageNumberOk) || pageNumberRead < 0x100 || pageNumberRead > 0x8fe)
if ((!pageNumberOk) || pageNumberRead < 0x100 || pageNumberRead > 0x8ff)
return;
// If the magazine number was changed, we need to update the relative magazine numbers in FastText