/// <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); }
public EwsSampleDemodulator(int sampleRate) { SampleRate = sampleRate; Parser = new EwsParser(); Parser.MassegeReceived += m => MassegeReceived?.Invoke(m); }