Also track Active Position of Level 1.5 decoding

This is needed for the upcoming decoder write as decode.cpp will track the
Active Position from the internal data of x26triplets.

If decode.cpp is rewritten again to track the Active Position independently
of x26triplets this commit may be reverted, but then again tracking how the
Active Position moves on both levels 1.5 and 2.5+ may be useful in terms of
warning the user of differing results on different decoder levels.
This commit is contained in:
G.K.MacGregor
2023-05-02 18:45:39 +01:00
parent 0b50b064db
commit 801efa570c
2 changed files with 35 additions and 0 deletions

View File

@@ -74,6 +74,7 @@ void X26TripletList::updateInternalData()
ActivePosition activePosition; ActivePosition activePosition;
X26Triplet *triplet; X26Triplet *triplet;
// Check for errors, and fill in where the Active Position goes for Level 2.5 and above
for (int i=0; i < m_list.size(); i++) { for (int i=0; i < m_list.size(); i++) {
triplet = &m_list[i]; triplet = &m_list[i];
triplet->m_error = X26Triplet::NoError; triplet->m_error = X26Triplet::NoError;
@@ -182,6 +183,34 @@ void X26TripletList::updateInternalData()
triplet->m_activePositionRow = activePosition.row(); triplet->m_activePositionRow = activePosition.row();
triplet->m_activePositionColumn = activePosition.column(); triplet->m_activePositionColumn = activePosition.column();
} }
// Now work out where the Active Position goes on a Level 1.5 decoder
activePosition.reset();
for (int i=0; i < m_list.size(); i++) {
triplet = &m_list[i];
if (triplet->modeExt() == 0x1f) // Termination marker
break;
switch (triplet->modeExt()) {
case 0x04: // Set Active Position;
activePosition.setRow(triplet->addressRow());
break;
case 0x07: // Address row 0
if (triplet->m_address == 63 && activePosition.setRow(0))
activePosition.setColumn(8);
break;
case 0x22: // G3 mosaic character at level 1.5
case 0x2f ... 0x3f: // G2 character or G0 diacritical mark
activePosition.setColumn(triplet->addressColumn());
break;
}
triplet->m_activePositionRow1p5 = activePosition.row();
triplet->m_activePositionColumn1p5 = activePosition.column();
}
} }
void X26TripletList::append(const X26Triplet &value) void X26TripletList::append(const X26Triplet &value)

View File

@@ -61,6 +61,8 @@ public:
int activePositionRow() const { return m_activePositionRow; } int activePositionRow() const { return m_activePositionRow; }
int activePositionColumn() const { return m_activePositionColumn; } int activePositionColumn() const { return m_activePositionColumn; }
int activePositionRow1p5() const { return m_activePositionRow1p5; }
int activePositionColumn1p5() const { return m_activePositionColumn1p5; }
X26TripletError error() const { return m_error; } X26TripletError error() const { return m_error; }
bool reservedMode() const { return m_reservedMode; } bool reservedMode() const { return m_reservedMode; }
bool reservedData() const { return m_reservedData; } bool reservedData() const { return m_reservedData; }
@@ -68,9 +70,13 @@ public:
friend class X26TripletList; friend class X26TripletList;
private: private:
// Only these variables are manipulated by the X26Triplet class
int m_address, m_mode, m_data; int m_address, m_mode, m_data;
// and the following are filled in by X26TripletList::updateInternalData()
int m_activePositionRow = -1; int m_activePositionRow = -1;
int m_activePositionColumn = -1; int m_activePositionColumn = -1;
int m_activePositionRow1p5 = -1;
int m_activePositionColumn1p5 = -1;
X26TripletError m_error = NoError; X26TripletError m_error = NoError;
bool m_reservedMode = false; bool m_reservedMode = false;
bool m_reservedData = false; bool m_reservedData = false;