public void StartPage(TeletextPageHeader header, UInt64 presentTime) { _presentTime = presentTime; int mag = header.Magazine(); if (mag != _magId) { ServiceRegistration.Get <ILogger>().Debug("Magazine magid mag: {0}, {1}", _magId, mag); } Assert(mag == _magId, "Inconsistent magazine id"); Assert(_pageNumInProgress == -1 || (_pageNumInProgress >= 100 && _pageNumInProgress <= 966), "PageNumInProgress out of range"); if (header.IsTimeFiller() || !header.IsSubtitle()) { // time filling header to indicate end of page if (_pageNumInProgress != -1) { // if we were working on a previous page its finished now EndPage(); } //LogDebug("Mag %i FILLER ends page %i", magID, pageNumInProgress); Clear(); _pageNumInProgress = -1; return; } if (header.IsSerial() && !_isSerial) { ServiceRegistration.Get <ILogger>().Debug("MagID {0} is in serial mode", _magId); _isSerial = true; } int newPageNum = header.PageNumber(); _language = header.Language(); if (_pageNumInProgress != newPageNum) { //LogDebug("Mag %i, Page %i finished by new page %i", magID, pageNumInProgress, new_page_num); if (_pageNumInProgress != -1) { // if we were working on a previous page its finished now EndPage(); } Clear(); _pageNumInProgress = newPageNum; } if (header.EraseBit()) { Clear(); } Assert(_pageNumInProgress >= 100 && _pageNumInProgress <= 966, "StartPage: pageNumInProgress out of range"); }
public void OnTeletextPacket(byte[] data, UInt64 presentTime) { Assert(data.Length == DATA_FIELD_SIZE, "Data length not as expected! " + data.Length); // data_field byte reservedParityOffset = data[0]; // parity/offset etc //LogDebug("first data_field byte: %s", ToBinary(reserved_parity_offset).c_str()); byte reservedFutureUse = (byte)(data[0] & 0xC0); // first two bits Assert(reservedFutureUse == 0xC0, "Reserved future use unexpected value"); byte fieldParity = (byte)((data[0] & 0x20) >> 5); // 3rd bit //LogDebug("field parity %i", field_parity); byte lineOffset = (byte)(data[0] & 0x1F); // last 5 bits Assert(lineOffset == 0x00 || (lineOffset >= 0x07 && lineOffset <= 0x16), "Line offset wrong!"); byte framingCode = data[1]; Assert(framingCode == 0xE4, "Framing code wrong " + framingCode); // what is this for? (A: reverse bit ordering) for (int j = 2; j < DATA_FIELD_SIZE; j++) { data[j] = _invtab[data[j]]; } byte magazineAndPacketAddress1 = data[2]; byte magazineAndPacketAddress2 = data[3]; byte magazineAndPacketAddress = Hamming.Unham(magazineAndPacketAddress1, magazineAndPacketAddress2); byte mag = (byte)(magazineAndPacketAddress & 7); // mag == 0 means page is 8nn if (mag == 0) { mag = 8; } int magIndex = mag - 1; Assert(magIndex >= 0 && magIndex <= 7, "Magindex out of range " + magIndex); byte y = (byte)((magazineAndPacketAddress >> 3) & 0x1f); // Y is the packet number int offset = 4; // start of data differs between packet types if (y == 0) { // teletext packet header //ServiceRegistration.Get<ILogger>().Debug("Header package : Data length is {0} , offset is {1}", data.Length, offset); byte[] offsetdata = new byte[data.Length - offset]; Array.Copy(data, offset, offsetdata, 0, offsetdata.Length); TeletextPageHeader header = new TeletextPageHeader(mag, offsetdata); if (header.IsSerial()) { // to support serial mode, just end all pages in progress (there should be only one) int inProgress = 0; for (int i = 0; i < 8; i++) { if (_magazines[i].PageInProgress()) { inProgress++; } _magazines[i].EndPage(); } Assert(inProgress <= 1, "Serial mode: too many pages in progress : " + inProgress); // at most one page should be in progress if (inProgress > 1) { ServiceRegistration.Get <ILogger>().Debug("Pages in progress at same time exceeds one ! (%i)", inProgress); } } /*if (header.isSubtitle()) * {*/ _magazines[magIndex].StartPage(header, presentTime); //} } else if (y >= 1 && y <= 25) { // display content //ServiceRegistration.Get<ILogger>().Debug("Content package : Data length is {0} , offset is {1}", data.Length, offset); byte[] offsetdata = new byte[data.Length - offset]; Array.Copy(data, offset, offsetdata, 0, offsetdata.Length); _magazines[magIndex].SetLine(y, offsetdata); //WAS: magazines[magIndex].SetLine(Y,&data[offset]); } else { //LogDebug("Packet %i for magazine %i (discarded)", Y, mag); } }
public void StartPage(TeletextPageHeader header, UInt64 presentTime) { _presentTime = presentTime; int mag = header.Magazine(); if (mag != _magId) { ServiceRegistration.Get<ILogger>().Debug("Magazine magid mag: {0}, {1}", _magId, mag); } Assert(mag == _magId, "Inconsistent magazine id"); Assert(_pageNumInProgress == -1 || (_pageNumInProgress >= 100 && _pageNumInProgress <= 966), "PageNumInProgress out of range"); if (header.IsTimeFiller() || !header.IsSubtitle()) { // time filling header to indicate end of page if (_pageNumInProgress != -1) { // if we were working on a previous page its finished now EndPage(); } //LogDebug("Mag %i FILLER ends page %i", magID, pageNumInProgress); Clear(); _pageNumInProgress = -1; return; } if (header.IsSerial() && !_isSerial) { ServiceRegistration.Get<ILogger>().Debug("MagID {0} is in serial mode", _magId); _isSerial = true; } int newPageNum = header.PageNumber(); _language = header.Language(); if (_pageNumInProgress != newPageNum) { //LogDebug("Mag %i, Page %i finished by new page %i", magID, pageNumInProgress, new_page_num); if (_pageNumInProgress != -1) { // if we were working on a previous page its finished now EndPage(); } Clear(); _pageNumInProgress = newPageNum; } if (header.EraseBit()) { Clear(); } Assert(_pageNumInProgress >= 100 && _pageNumInProgress <= 966, "StartPage: pageNumInProgress out of range"); }
public void OnTeletextPacket(byte[] data, UInt64 presentTime) { Assert(data.Length == DATA_FIELD_SIZE, "Data length not as expected! " + data.Length); // data_field byte reservedParityOffset = data[0]; // parity/offset etc //LogDebug("first data_field byte: %s", ToBinary(reserved_parity_offset).c_str()); byte reservedFutureUse = (byte) (data[0] & 0xC0); // first two bits Assert(reservedFutureUse == 0xC0, "Reserved future use unexpected value"); byte fieldParity = (byte) ((data[0] & 0x20) >> 5); // 3rd bit //LogDebug("field parity %i", field_parity); byte lineOffset = (byte) (data[0] & 0x1F); // last 5 bits Assert(lineOffset == 0x00 || (lineOffset >= 0x07 && lineOffset <= 0x16), "Line offset wrong!"); byte framingCode = data[1]; Assert(framingCode == 0xE4, "Framing code wrong " + framingCode); // what is this for? (A: reverse bit ordering) for (int j = 2; j < DATA_FIELD_SIZE; j++) { data[j] = _invtab[data[j]]; } byte magazineAndPacketAddress1 = data[2]; byte magazineAndPacketAddress2 = data[3]; byte magazineAndPacketAddress = Hamming.Unham(magazineAndPacketAddress1, magazineAndPacketAddress2); byte mag = (byte) (magazineAndPacketAddress & 7); // mag == 0 means page is 8nn if (mag == 0) mag = 8; int magIndex = mag - 1; Assert(magIndex >= 0 && magIndex <= 7, "Magindex out of range " + magIndex); byte y = (byte) ((magazineAndPacketAddress >> 3) & 0x1f); // Y is the packet number int offset = 4; // start of data differs between packet types if (y == 0) { // teletext packet header //ServiceRegistration.Get<ILogger>().Debug("Header package : Data length is {0} , offset is {1}", data.Length, offset); byte[] offsetdata = new byte[data.Length - offset]; Array.Copy(data, offset, offsetdata, 0, offsetdata.Length); TeletextPageHeader header = new TeletextPageHeader(mag, offsetdata); if (header.IsSerial()) { // to support serial mode, just end all pages in progress (there should be only one) int inProgress = 0; for (int i = 0; i < 8; i++) { if (_magazines[i].PageInProgress()) { inProgress++; } _magazines[i].EndPage(); } Assert(inProgress <= 1, "Serial mode: too many pages in progress : " + inProgress); // at most one page should be in progress if (inProgress > 1) ServiceRegistration.Get<ILogger>().Debug("Pages in progress at same time exceeds one ! (%i)", inProgress); } /*if (header.isSubtitle()) {*/ _magazines[magIndex].StartPage(header, presentTime); //} } else if (y >= 1 && y <= 25) { // display content //ServiceRegistration.Get<ILogger>().Debug("Content package : Data length is {0} , offset is {1}", data.Length, offset); byte[] offsetdata = new byte[data.Length - offset]; Array.Copy(data, offset, offsetdata, 0, offsetdata.Length); _magazines[magIndex].SetLine(y, offsetdata); //WAS: magazines[magIndex].SetLine(Y,&data[offset]); } else { //LogDebug("Packet %i for magazine %i (discarded)", Y, mag); } }