public void ClockBit(bool state) { Bits.Add(state); /* every codeword */ if (Bits.Count >= 32) { /* only keep last 32 bits */ Bits.RemoveRange(0, Bits.Count - 32); bool[] bits = (bool[])Bits.ToArray(typeof(bool)); long codeWord = ByteUtil.BitsToLong(bits); if (Synchronized && !CorrectChecksum(bits)) { if (++ParityErrors > ParityErrorsMax) { Log.AddMessage("Parity error, lost synchronization."); Synchronized = false; } } else { ParityErrors = 0; if (codeWord == POCSAG_SYNC || codeWord == POCSAG_SYNCINFO) { if (!Synchronized) { Log.AddMessage("Synchronized..."); } Synchronized = true; BatchPosition = 0; Bits.Clear(); } else if (Synchronized) { if (codeWord == POCSAG_IDLE) { //Log.AddMessage("Idle"); DumpMessage(); } else { if (!bits[0]) { DumpMessage(); /* address */ //Log.AddMessage("Address"); Address = (uint)(codeWord >> 13) & 0x3FFF; Address <<= 3; Address |= (uint)BatchPosition >> 1; Mode = (uint)(codeWord >> 11) & 0x03; } else { /* message bits */ //Log.AddMessage("Message"); MessageBits.AddRange(Bits.GetRange(1, 20)); } } Bits.Clear(); BatchPosition++; } } } }