2020-09-06 16:47:38 +01:00
|
|
|
/*
|
2024-01-01 00:12:17 +00:00
|
|
|
* Copyright (C) 2020-2024 Gavin MacGregor
|
2020-09-06 16:47:38 +01:00
|
|
|
*
|
|
|
|
|
* This file is part of QTeletextMaker.
|
|
|
|
|
*
|
|
|
|
|
* QTeletextMaker is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* QTeletextMaker is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with QTeletextMaker. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef X26TRIPLETS_H
|
|
|
|
|
#define X26TRIPLETS_H
|
|
|
|
|
|
2021-06-27 14:45:51 +01:00
|
|
|
#include <QList>
|
|
|
|
|
|
2020-09-06 16:47:38 +01:00
|
|
|
class X26Triplet
|
|
|
|
|
{
|
|
|
|
|
public:
|
2022-04-05 22:11:01 +01:00
|
|
|
// x26model.h has the Plain English descriptions of these errors
|
|
|
|
|
enum X26TripletError { NoError, ActivePositionMovedUp, ActivePositionMovedLeft, InvokePointerInvalid, InvokeTypeMismatch, OriginModifierAlone };
|
2022-05-15 11:22:19 +01:00
|
|
|
enum ObjectSource { InvalidObjectSource, LocalObject, POPObject, GPOPObject };
|
2021-06-28 22:07:41 +01:00
|
|
|
|
2020-10-18 20:56:16 +01:00
|
|
|
X26Triplet() {}
|
2020-09-06 16:47:38 +01:00
|
|
|
// X26Triplet(const X26Triplet &other);
|
|
|
|
|
|
|
|
|
|
// X26Triplet &operator=(const X26Triplet &other);
|
|
|
|
|
|
2023-08-27 14:25:16 +01:00
|
|
|
X26Triplet(int address, int mode, int data);
|
2020-10-18 20:56:16 +01:00
|
|
|
|
|
|
|
|
int address() const { return m_address; }
|
|
|
|
|
int mode() const { return m_mode; }
|
|
|
|
|
int modeExt() const { return (m_address >= 40) ? m_mode : (m_mode | 0x20); }
|
|
|
|
|
int data() const { return m_data; }
|
|
|
|
|
int addressRow() const { return (m_address == 40) ? 24 :m_address-40; }
|
|
|
|
|
int addressColumn() const { return (m_address); }
|
|
|
|
|
bool isRowTriplet() const { return (m_address >= 40); }
|
2020-09-06 16:47:38 +01:00
|
|
|
|
2023-08-27 14:25:16 +01:00
|
|
|
void setAddress(int address);
|
|
|
|
|
void setMode(int mode);
|
|
|
|
|
void setData(int data);
|
|
|
|
|
void setAddressRow(int addressRow);
|
|
|
|
|
void setAddressColumn(int addressColumn);
|
2020-09-06 16:47:38 +01:00
|
|
|
|
2022-05-15 11:22:19 +01:00
|
|
|
int objectSource() const { return (m_address & 0x18) >> 3; }
|
|
|
|
|
|
2021-09-09 14:44:52 +01:00
|
|
|
int objectLocalDesignationCode() const { return (((m_address & 0x01) << 3) | (m_data >> 4)); }
|
|
|
|
|
int objectLocalTripletNumber() const { return m_data & 0x0f; }
|
|
|
|
|
int objectLocalIndex() const { return objectLocalDesignationCode() * 13 + objectLocalTripletNumber(); }
|
2023-08-27 14:25:16 +01:00
|
|
|
void setObjectLocalDesignationCode(int i);
|
|
|
|
|
void setObjectLocalTripletNumber(int i);
|
|
|
|
|
void setObjectLocalIndex(int i);
|
2021-09-09 14:44:52 +01:00
|
|
|
|
2021-06-28 22:07:41 +01:00
|
|
|
int activePositionRow() const { return m_activePositionRow; }
|
|
|
|
|
int activePositionColumn() const { return m_activePositionColumn; }
|
2023-05-02 18:45:39 +01:00
|
|
|
int activePositionRow1p5() const { return m_activePositionRow1p5; }
|
|
|
|
|
int activePositionColumn1p5() const { return m_activePositionColumn1p5; }
|
2021-06-28 22:07:41 +01:00
|
|
|
X26TripletError error() const { return m_error; }
|
2022-08-30 21:07:14 +01:00
|
|
|
bool reservedMode() const { return m_reservedMode; }
|
|
|
|
|
bool reservedData() const { return m_reservedData; }
|
2021-06-28 22:07:41 +01:00
|
|
|
|
|
|
|
|
friend class X26TripletList;
|
|
|
|
|
|
2020-09-06 16:47:38 +01:00
|
|
|
private:
|
2023-05-02 18:45:39 +01:00
|
|
|
// Only these variables are manipulated by the X26Triplet class
|
2020-10-18 20:56:16 +01:00
|
|
|
int m_address, m_mode, m_data;
|
2023-05-02 18:45:39 +01:00
|
|
|
// and the following are filled in by X26TripletList::updateInternalData()
|
2021-06-28 22:07:41 +01:00
|
|
|
int m_activePositionRow = -1;
|
|
|
|
|
int m_activePositionColumn = -1;
|
2023-05-02 18:45:39 +01:00
|
|
|
int m_activePositionRow1p5 = -1;
|
|
|
|
|
int m_activePositionColumn1p5 = -1;
|
2021-06-28 22:07:41 +01:00
|
|
|
X26TripletError m_error = NoError;
|
2022-08-30 21:07:14 +01:00
|
|
|
bool m_reservedMode = false;
|
|
|
|
|
bool m_reservedData = false;
|
2021-06-27 14:45:51 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class X26TripletList
|
|
|
|
|
{
|
|
|
|
|
public:
|
2023-08-27 14:25:16 +01:00
|
|
|
void append(const X26Triplet &value);
|
|
|
|
|
void insert(int i, const X26Triplet &value);
|
|
|
|
|
void removeAt(int i);
|
|
|
|
|
void replace(int i, const X26Triplet &value);
|
2021-06-27 14:45:51 +01:00
|
|
|
|
|
|
|
|
void removeLast() { m_list.removeLast(); }
|
2020-10-18 20:56:16 +01:00
|
|
|
|
2021-06-27 14:45:51 +01:00
|
|
|
const X26Triplet &at(int i) const { return m_list.at(i); }
|
|
|
|
|
bool isEmpty() const { return m_list.isEmpty(); }
|
|
|
|
|
void reserve(int alloc) { m_list.reserve(alloc); }
|
|
|
|
|
int size() const { return m_list.size(); }
|
2024-06-04 18:13:59 +01:00
|
|
|
const QList<int> &objects(int t) const { return m_objects[t]; };
|
2021-06-27 14:45:51 +01:00
|
|
|
|
|
|
|
|
private:
|
2022-04-05 22:11:01 +01:00
|
|
|
void updateInternalData();
|
2021-06-28 22:07:41 +01:00
|
|
|
|
2021-06-27 14:45:51 +01:00
|
|
|
QList<X26Triplet> m_list;
|
2024-06-04 18:13:59 +01:00
|
|
|
QList<int> m_objects[3];
|
2021-06-28 22:07:41 +01:00
|
|
|
|
|
|
|
|
class ActivePosition
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
ActivePosition();
|
|
|
|
|
void reset();
|
|
|
|
|
// int row() const { return (m_row == -1) ? 0 : m_row; }
|
|
|
|
|
// int column() const { return (m_column == -1) ? 0 : m_column; }
|
|
|
|
|
int row() const { return m_row; }
|
|
|
|
|
int column() const { return m_column; }
|
|
|
|
|
bool isDeployed() const { return m_row != -1; }
|
|
|
|
|
bool setRow(int);
|
|
|
|
|
bool setColumn(int);
|
|
|
|
|
// bool setRowAndColumn(int, int);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
int m_row, m_column;
|
|
|
|
|
};
|
2020-09-06 16:47:38 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|