skyscraper8/skyscraper8/Teletext/EbuTeletextDataField.cs
feyris-tan e3b125e29d
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m49s
minor bug fixes.
2025-10-30 07:58:27 +01:00

131 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.IO;
namespace skyscraper5.Teletext
{
public class EbuTeletextDataField : Validatable
{
public EbuTeletextDataField(byte[] dataFieldContent)
{
InversionTable.TeletextInversion(dataFieldContent,2);
MemoryStream ms = new MemoryStream(dataFieldContent);
byte readUInt8 = ms.ReadUInt8();
FieldParity = (readUInt8 & 0x20) != 0;
LineOffset = (readUInt8 & 0x1f);
FramingCode = ms.ReadUInt8();
byte mpag = ms.ReadHamming84();
Magazine = mpag & 0x07;
PacketNumber = (mpag >> 3) & 0x1f;
if (PacketNumber != 0)
{
if (PacketNumber >= 26)
{
//Non-Displayable Packet Y = 26 to 31
if (ms.GetAvailableBytes() == 0)
{
Valid = false;
return;
}
DesignationCode = ms.ReadUInt8();
if (ms.GetAvailableBytes() < 39)
{
Valid = false;
return;
}
CharacterCodes = ms.ReadBytes(39);
}
else
{
//Normal Packet (Y = 1 to 25)
if (ms.GetAvailableBytes() < 40)
{
Valid = false;
return;
}
CharacterCodes = ms.ReadBytes(40);
}
}
else
{
//Page Header Packet (Y = 0)
//To-Do: Read Page No, Sub-code, and Control bits
PageNumber = (byte)ms.ReadHamming84().UnpackBcd();
Header = new PageHeader();
ms.ReadUInt8(); //byte 8
readUInt8 = ms.ReadUInt8();
Header.ErasePage = (readUInt8 & 0x80) != 0;
ms.ReadUInt8(); //byte 10
readUInt8 = ms.ReadUInt8(); //byte 11
Header.Newsflash = (readUInt8 & 0x60) != 0;
Header.Subtitle = (readUInt8 & 0x80) != 0;
readUInt8 = ms.ReadUInt8(); //byte 12
Header.SurpressHeader = (readUInt8 & 0x02) != 0;
Header.UpdateIndicator = (readUInt8 & 0x08) != 0;
Header.InterruptedSequence = (readUInt8 & 0x20) != 0;
Header.InhibitDisplay = (readUInt8 & 0x80) != 0;
readUInt8 = ms.ReadUInt8(); //byte 13
Header.SerialMode = (readUInt8 & 0x02) != 0;
if (ms.GetAvailableBytes() < 32)
{
Valid = false;
return;
}
CharacterCodes = ms.ReadBytes(32);
}
if (PacketNumber < 26)
{
for (int i = 0; i < CharacterCodes.Length; i++)
{
CharacterCodes[i] &= 0x7f;
}
}
Valid = true;
}
public byte DesignationCode { get; private set; }
public byte PageNumber { get; set; }
public class PageHeader
{
public bool ErasePage { get; internal set; }
public bool Newsflash { get; internal set; }
public bool Subtitle { get; internal set; }
public bool SurpressHeader { get; internal set; }
public bool UpdateIndicator { get; internal set; }
public bool InterruptedSequence { get; internal set; }
public bool InhibitDisplay { get; internal set; }
public bool SerialMode { get; internal set; }
}
public PageHeader Header { get; private set; }
public byte[] CharacterCodes { get; private set; }
public int PacketNumber { get; private set; }
public int Magazine { get; private set; }
public byte FramingCode { get; private set; }
public int LineOffset { get; private set; }
public bool FieldParity { get; private set; }
}
}