dotPeek & Visual Studio 2019
NET 4.6 C#

NetInfoWindow.cs

public void UpdateTextBox(List<Dictionary<GlobalNames, int>> rawData)
{
...

            MmPrimitivesType mmPrimitivesType = (MmPrimitivesType) num1;
            switch (mmPrimitivesType)
            {
              case MmPrimitivesType.D_OTAR:
                if (dictionary.TryGetValue(GlobalNames.Otar_sub_type, out num1))
                {
                  str2 = str2 + " OTAR: " + (object) (D_OtarPduSubType) num1;
                  //modx new
                  if (dictionary.TryGetValue(GlobalNames.SCKN, out num1))
                     str2 = str2 + " SCKN: " + num1.ToString();
                  if (dictionary.TryGetValue(GlobalNames.GSKO_VN, out num1))
                     str2 = str2 + " GSKO_VN: " + num1.ToString();
                  if (dictionary.TryGetValue(GlobalNames.OTAR_Retry_Interval, out num1))
                     str2 = str2 + " OTAR_Retry_Interval: " + num1.ToString();
                  if (dictionary.TryGetValue(GlobalNames.OTAR_retry_interval, out num1))
                     str2 = str2 + " OTAR_retry_interval: " + num1.ToString();
                  if (dictionary.TryGetValue(GlobalNames.Random_Seed_for_OTAR, out num1))
                     str2 = str2 + " Random_Seed_for_OTAR: " + num1.ToString();
                  //end new

                  break;
                }
                break;
              case MmPrimitivesType.D_AUTHENTICATION:
...

            if (dictionary.TryGetValue(GlobalNames.MM_SSI, out num1))
              str2 = str2 + " xSSI: " + num1.ToString();
            // modx
            if (dictionary.TryGetValue(GlobalNames.USSI, out num1))
              str2 = str2 + " USSI: " + num1.ToString();

            if (dictionary.TryGetValue(GlobalNames.SMI, out num1))
               str2 = str2 + " SMI: " + num1.ToString();

            if (dictionary.TryGetValue(GlobalNames.KSG_number, out num1))
              str2 = str2 + " KSG_number: " + num1.ToString();
            //modx new
            if (dictionary.TryGetValue(GlobalNames.Session_key, out num1))
              str2 = str2 + " Session_key: " + num1.ToString();
            if (dictionary.TryGetValue(GlobalNames.Encryption_key_number, out num1))
              str2 = str2 + " Encryption_key_number: " + num1.ToString();
            //end new

TetraDecoder.cs
Show logic channel data as bitstring in burst window

    public unsafe int Process(
      float* inBuffer,
      int length,
      byte* audioOut,
      ref int frame_stealing,
      ref string burstMessage)
    {
    ...
            if (flag5)
            {
              if (NetInfoWindow._noSYNCpdus)
              {
                burstMessage = string.Format(" {0:HH:mm:ss tt}", (object) DateTime.Now) + "   SYNCIN" + string.Format("{0,-51}", (object) "FO + SCH/HD [NULL]") + " (FN:" + string.Format("{0:00}", (object) this._lowerMac.FR) + " - TN:" + (object) this._lowerMac.TS + ") - " + string.Format("{0,-11}", (object) this._parse.DownLinkChannelType) + Environment.NewLine;
                break;
              }
              break;
            }
            if (NetInfoWindow._noSYNCpdus)
            {
              burstMessage = string.Format(" {0:HH:mm:ss tt}", (object) DateTime.Now) + "   SYNCIN" + string.Format("{0,-51}", (object) "FO [BAD CRC] + SCH/HD [NULL]") + " (FN:" + string.Format("{0:00}", (object) this._lowerMac.FR) + " - TN:" + (object) this._lowerMac.TS + ") - " + string.Format("{0,-11}", (object) this._parse.DownLinkChannelType) + Environment.NewLine;
              break;
            }
            break;
          }
          break;
      }
      //modx new
      burstMessage = burstMessage + TetraUtils.BitsToString(_logicChannel.Ptr, 0, _logicChannel.Length - 1) + Environment.NewLine;
      //end new

      this.BurstReceived = flag1;
      this.UpdateData(this._data);

 

or if just some burst types with logic channel bitstring, then add above (bolded) in specific case blocks, e.g.

      switch (trainingSequence.Type)
      {
        case BurstType.NDB1:
          if (TetraPanel.DmoMode)
          {
            if (!this._networkTime.IsSynchronized)
              return num1;
            this._logicChannel = this._lowerMac.ExtractLogicChannelFromBKN1BKN2(this._bkn1BufferPtr, this._bkn2BufferPtr, this._bkn1Buffer.Length);
            if (this._logicChannel.CrcIsOk)
            {
              string empty = string.Empty;
              this._parse.DmoParseMacPDU(this._logicChannel, this._data);
              int num2 = 0;
              if (this._data1.TryGetValue(GlobalNames.Null_PDU_flag, out num2) && num2 == 1)
                burstMessage = string.Format(" {0:HH:mm:ss tt}", (object) DateTime.Now) + "   SCH/F  " + string.Format("{0,-50}", (object) "[NULL]") + " (FN:" + string.Format("{0:00}", (object) this._lowerMac.FR) + " - TN:" + (object) this._lowerMac.TS + ")" + Environment.NewLine;
              this._data[this._data.Count - 1].TryGetValue(GlobalNames.LCH_in_frame_3, out this._dmoLCH);
              break;
            }
            if (this._lowerMac.FR != 18)
            {
              this._logicChannel = this._lowerMac.ExtractVoiceDataFromBKN1BKN2(this._bkn1BufferPtr, this._bkn2BufferPtr, this._bkn1Buffer.Length);
              Utils.Memcpy((void*) audioOut, (void*) this._logicChannel.Ptr, this._logicChannel.Length);
              frame_stealing = 0;
              burstMessage = string.Format(" {0:HH:mm:ss tt}", (object) DateTime.Now) + "   TCH/F  " + string.Format("{0,-43}", (object) " ") + "[VOICE] (FN:" + string.Format("{0:00}", (object) this._lowerMac.FR) + " - TN:" + (object) this._lowerMac.TS + ") - Traffic" + Environment.NewLine;
              burstMessage = burstMessage + TetraUtils.BitsToString(_logicChannel.Ptr, 0, _logicChannel.Length - 1) + Environment.NewLine;
              num1 = this._lowerMac.TS;
              break;
            }
            break;