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);
            }
        }
示例#3
0
    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);
      }
    }