2020-09-06 16:47:38 +01:00
|
|
|
/*
|
2021-12-31 21:40:36 +00:00
|
|
|
* Copyright (C) 2020-2022 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);
|
|
|
|
|
|
2020-10-18 20:56:16 +01:00
|
|
|
X26Triplet(int, int, int);
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
void setAddress(int);
|
|
|
|
|
void setMode(int);
|
|
|
|
|
void setData(int);
|
|
|
|
|
void setAddressRow(int);
|
|
|
|
|
void setAddressColumn(int);
|
|
|
|
|
|
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(); }
|
|
|
|
|
void setObjectLocalDesignationCode(int);
|
|
|
|
|
void setObjectLocalTripletNumber(int);
|
|
|
|
|
void setObjectLocalIndex(int);
|
|
|
|
|
|
2021-06-28 22:07:41 +01:00
|
|
|
int activePositionRow() const { return m_activePositionRow; }
|
|
|
|
|
int activePositionColumn() const { return m_activePositionColumn; }
|
|
|
|
|
X26TripletError error() const { return m_error; }
|
|
|
|
|
|
|
|
|
|
friend class X26TripletList;
|
|
|
|
|
|
2020-09-06 16:47:38 +01:00
|
|
|
private:
|
2020-10-18 20:56:16 +01:00
|
|
|
int m_address, m_mode, m_data;
|
2021-06-28 22:07:41 +01:00
|
|
|
int m_activePositionRow = -1;
|
|
|
|
|
int m_activePositionColumn = -1;
|
|
|
|
|
X26TripletError m_error = NoError;
|
2021-06-27 14:45:51 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class X26TripletList
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
void append(const X26Triplet &);
|
|
|
|
|
void insert(int, const X26Triplet &);
|
|
|
|
|
void removeAt(int);
|
|
|
|
|
void replace(int, const X26Triplet &);
|
|
|
|
|
|
|
|
|
|
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(); }
|
|
|
|
|
|
|
|
|
|
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;
|
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
|