Esempio n. 1
0
        /// <summary>
        /// ビット列を追加する
        /// </summary>
        /// <param name="bit">false: 0 / true: 1 / null: 不明</param>
        /// <returns>解析処理を中断するか</returns>
        public bool Append(bool?nbit)
        {
            // 終了・試験信号には92bitの無信号区間が含まれている
            if (State == EwsParserState.ParseEndAndTestBlock && BlockParseStage == 4)
            {
                BitBuffer.Add(2);
                if (BitBuffer.Count >= 90 && nbit != null)
                {
                    State           = EwsParserState.WaitPrefix;
                    BlockParseStage = 0;
                    BitBuffer.Clear();
                    Console.WriteLine();
                }
                else
                {
                    return(false);
                }
            }

            // 出力
            if (nbit == false)
            {
                Console.Write($"0");
            }
            else if (nbit == true)
            {
                Console.Write($"1");
            }
            else
            {
                Console.Write($"x");
            }

            //TODO: 一部解析が失敗しても正常に解析できるようにする
            if (!(nbit is bool bit))
            {
                Reset();
                return(true);
            }

            BitBuffer.Add((byte)(bit ? 1 : 0));

            switch (State)
            {
            case EwsParserState.WaitPrefix:
                if (BitBuffer.Count < 4)
                {
                    return(false);
                }
                if (BitBuffer[0] == 1)
                {
                    for (int i = 0; i < BeginPrefixToken.Length; i++)
                    {
                        if (BeginPrefixToken[i] == BitBuffer[i])
                        {
                            continue;
                        }
                        Console.WriteLine("\n前置符号検出失敗");
                        Reset();
                        return(true);
                    }
                    Console.WriteLine("\n前置符号検出 第1種/第2種");
                    State          = EwsParserState.ParseBeginBlock;
                    BlockCount     = 0;
                    CurrentMessage = new EwsMessage {
                        MessageType = EwsMessageType.Type1
                    };
                }
                else
                {
                    for (int i = 0; i < EndAndTestPrefixToken.Length; i++)
                    {
                        if (EndAndTestPrefixToken[i] == BitBuffer[i])
                        {
                            continue;
                        }
                        Console.WriteLine("\n前置符号検出失敗");
                        Reset();
                        return(true);
                    }
                    Console.WriteLine("\n前置符号検出 試験/終了");
                    State = EwsParserState.ParseEndAndTestBlock;
                    if (CurrentMessage == null)
                    {
                        CurrentMessage = new EwsMessage {
                            MessageType = EwsMessageType.EndAndTest
                        }
                    }
                    ;
                }
                BlockParseStage = 0;
                BitBuffer.Clear();
                break;

            case EwsParserState.ParseBeginBlock:
            case EwsParserState.ParseEndAndTestBlock:
                if (BitBuffer.Count == 16)
                {
                    Console.Write(" ");
                    return(false);
                }
                if (BitBuffer.Count < 32)
                {
                    return(false);
                }
                Console.WriteLine();
                BlockParseStage++;

                if (BitBuffer[0] == 0)
                {
                    for (int i = 0; i < Type1StartAndEndFixedToken.Length; i++)
                    {
                        if (Type1StartAndEndFixedToken[i] == BitBuffer[i])
                        {
                            continue;
                        }
                        Console.WriteLine("\n固定符号検出失敗");
                        Reset();
                        return(true);
                    }
                    Console.Write($" {(State == EwsParserState.ParseBeginBlock ? "第1種" : "終了/試験")}: ");
                }
                else if (BitBuffer[0] == 1)
                {
                    for (int i = 0; i < Type2StartFixedToken.Length; i++)
                    {
                        if (Type2StartFixedToken[i] == BitBuffer[i])
                        {
                            continue;
                        }
                        Console.WriteLine("\n固定符号検出失敗");
                        Reset();
                        return(true);
                    }
                    Console.Write(" 第2種: ");
                    CurrentMessage.MessageType = EwsMessageType.Type2;
                }

                switch (BlockParseStage)
                {
                case 1:
                {
                    var region = SearchToken(AreaTokens, BitBuffer, 18, 12) ?? "不明";
                    Console.WriteLine($"地域: {region}");
                    CurrentMessage.AreaName = region;
                }
                break;

                case 2:
                {
                    bool isEvenBlock = BitBuffer[24] == 1;
                    var  day         = SearchToken(DayTokens, BitBuffer, 19, 5);
                    var  month       = SearchToken(MonthTokens, BitBuffer, 25, 5);
                    Console.WriteLine($"{(isEvenBlock ? "*" : " ")}{month}月 {day}日");
                    if (day == null || month == null)
                    {
                        return(true);
                    }


                    if (CurrentMessage.Time == null)
                    {
                        CurrentMessage.Time = new EwsDateTime();
                    }
                    CurrentMessage.Time.IsRealtime = !isEvenBlock;
                    CurrentMessage.Time.Day        = day.GetValueOrDefault();
                    CurrentMessage.Time.Month      = month.GetValueOrDefault();
                }
                break;

                case 3:
                {
                    bool isEvenBlock = BitBuffer[24] == 1;
                    var  hour        = SearchToken(HourTokens, BitBuffer, 19, 5);
                    var  year        = SearchToken(YearTokens, BitBuffer, 25, 5);
                    Console.WriteLine($"{(isEvenBlock ? "*" : " ")}20x{year}年 {hour}時");
                    if (hour == null || year == null)
                    {
                        return(true);
                    }

                    if (CurrentMessage.Time == null)
                    {
                        CurrentMessage.Time = new EwsDateTime();
                    }
                    CurrentMessage.Time.IsRealtime = !isEvenBlock;
                    CurrentMessage.Time.Hour       = hour.GetValueOrDefault();
                    CurrentMessage.Time.Year       = year.GetValueOrDefault();

                    BlockCount++;
                    Console.WriteLine($"=== ブロック{BlockCount} 終 ===\n");

                    CurrentMessage.BlockId = BlockCount;
                    MassegeReceived?.Invoke(CurrentMessage);
                    CurrentMessage.AreaName = null;
                    CurrentMessage.Time     = null;

                    if (State == EwsParserState.ParseEndAndTestBlock)
                    {
                        //State = EwsParserState.WaitPrefix;
                        BlockParseStage++;
                        if (BlockCount == 4)                                                 // 4ブロック見たら終了させる
                        {
                            Reset();
                            return(true);
                        }
                    }
                    else
                    {
                        BlockParseStage = 0;
                        if (BlockCount == 10)                                                 // 10ブロック見たら終了させる
                        {
                            Reset();
                            return(true);
                        }
                    }
                }
                break;
                }
                BitBuffer.Clear();
                break;
            }
            return(false);
        }
Esempio n. 2
0
 public EwsSampleDemodulator(int sampleRate)
 {
     SampleRate              = sampleRate;
     Parser                  = new EwsParser();
     Parser.MassegeReceived += m => MassegeReceived?.Invoke(m);
 }