def test_rsh_16(self): k = bf(0xFFF,length=16) self.assertEqual(int(k), 0xFFF) k >>= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x7FF) k >>= 1 self.assertEqual(int(k), 0x3FF) k >>= 4 self.assertEqual(int(k), 0x03F) k >>= 4 self.assertEqual(int(k), 0x003) k >>= 4 self.assertEqual(int(k), 0x000) k = bf(0xFFFFF,16) self.assertEqual(int(k), 0xFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFF) k >>= 1 self.assertEqual(int(k), 0x3FFF) k >>= 4 self.assertEqual(int(k), 0x03FF) k >>= 4 self.assertEqual(int(k), 0x003F) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFFFF) #Check to make sure that the length has been remembered k = k | 0xFFFFFFFF self.assertEqual(int(k), 0xFFFF)
def test_rsh_16(self): k = bf(0xFFF, length=16) self.assertEqual(int(k), 0xFFF) k >>= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x7FF) k >>= 1 self.assertEqual(int(k), 0x3FF) k >>= 4 self.assertEqual(int(k), 0x03F) k >>= 4 self.assertEqual(int(k), 0x003) k >>= 4 self.assertEqual(int(k), 0x000) k = bf(0xFFFFF, 16) self.assertEqual(int(k), 0xFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFF) k >>= 1 self.assertEqual(int(k), 0x3FFF) k >>= 4 self.assertEqual(int(k), 0x03FF) k >>= 4 self.assertEqual(int(k), 0x003F) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFFFF) #Check to make sure that the length has been remembered k = k | 0xFFFFFFFF self.assertEqual(int(k), 0xFFFF)
def test_rsh(self): k = bf(0xFF) self.assertEqual(int(k), 0xFF) k >>= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x7F) k >>= 1 self.assertEqual(int(k), 0x3F) k >>= 4 self.assertEqual(int(k), 0x03) k >>= 4 self.assertEqual(int(k), 0x00) k = bf(0xFFFF) self.assertEqual(int(k), 0xFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFF) k >>= 1 self.assertEqual(int(k), 0x3FFF) k >>= 4 self.assertEqual(int(k), 0x03FF) k >>= 4 self.assertEqual(int(k), 0x003F) k = bf(0xFFFFFFFF) self.assertEqual(int(k), 0xFFFFFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFFFFFF) k >>= 1 self.assertEqual(int(k), 0x3FFFFFFF) k >>= 4 self.assertEqual(int(k), 0x03FFFFFF) k >>= 4 self.assertEqual(int(k), 0x003FFFFF)
def test_full_assign_8bit(self): # make sure the shuffled sequence does not lose any elements k = bf(0x1,8) self.assertIsInstance(k,bf) self.assertEqual(int(k), 1) self.assertTrue(int(k)==1) self.assertTrue(k) self.assertEqual(len(k), 8) k = bf(0xFF,8) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k)==0xFF) self.assertTrue(k) k = bf(0xFFFF,8) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k)==0xFF) self.assertTrue(k) k = bf(0xFFFFFFFF,8) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k)==0xFF) self.assertTrue(k)
def test_full_assign_8bit(self): # make sure the shuffled sequence does not lose any elements k = bf(0x1, 8) self.assertIsInstance(k, bf) self.assertEqual(int(k), 1) self.assertTrue(int(k) == 1) self.assertTrue(k) self.assertEqual(len(k), 8) k = bf(0xFF, 8) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k) == 0xFF) self.assertTrue(k) k = bf(0xFFFF, 8) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k) == 0xFF) self.assertTrue(k) k = bf(0xFFFFFFFF, 8) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k) == 0xFF) self.assertTrue(k)
def test_full_assign_16(self): # make sure the shuffled sequence does not lose any elements k = bf(0x1, length=16) self.assertIsInstance(k, bf) self.assertEqual(int(k), 1) self.assertTrue(int(k) == 1) self.assertTrue(k) self.assertEqual(len(k), 16) k = bf(0xFF, length=16) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k) == 0xFF) self.assertTrue(k) k = bf(0xFFFF, length=16) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFFFF) self.assertTrue(int(k) == 0xFFFF) self.assertTrue(k) k = bf(0xFFFFFFFF, length=16) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0xFFFF) self.assertTrue(int(k) == 0xFFFF) print int(k) k = bf(0x8000, length=16) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x8000) self.assertTrue(int(k) == 0x8000) print int(k)
def test_rsh(self): k = bf(0xFF) self.assertEqual(int(k), 0xFF) k >>= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x7F) k >>= 1 self.assertEqual(int(k), 0x3F) k >>= 4 self.assertEqual(int(k), 0x03) k >>= 4 self.assertEqual(int(k), 0x00) k = bf(0xFFFF) self.assertEqual(int(k), 0xFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFF) k >>= 1 self.assertEqual(int(k), 0x3FFF) k >>= 4 self.assertEqual(int(k), 0x03FF) k >>= 4 self.assertEqual(int(k), 0x003F) k = bf(0xFFFFFFFF) self.assertEqual(int(k), 0xFFFFFFFF) k >>= 1 self.assertEqual(int(k), 0x7FFFFFFF) k >>= 1 self.assertEqual(int(k), 0x3FFFFFFF) k >>= 4 self.assertEqual(int(k), 0x03FFFFFF) k >>= 4 self.assertEqual(int(k), 0x003FFFFF)
def test_full_assign_16(self): # make sure the shuffled sequence does not lose any elements k = bf(0x1,length=16) self.assertIsInstance(k,bf) self.assertEqual(int(k), 1) self.assertTrue(int(k)==1) self.assertTrue(k) self.assertEqual(len(k), 16) k = bf(0xFF,length=16) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFF) self.assertTrue(int(k)==0xFF) self.assertTrue(k) k = bf(0xFFFF,length=16) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFFFF) self.assertTrue(int(k)==0xFFFF) self.assertTrue(k) k = bf(0xFFFFFFFF,length=16) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0xFFFF) self.assertTrue(int(k)==0xFFFF) print int(k) k = bf(0x8000,length=16) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x8000) self.assertTrue(int(k)==0x8000) print int(k)
def test_str(self): k = bf(0x6) self.assertEqual(str(k),"110") k = bf(0) self.assertEqual(str(k),"0") k = bf(0x6,8) self.assertEqual(str(k),"00000110") k = bf(0,8) self.assertEqual(str(k),"00000000")
def setUp(self): self.data_zero = [] self.data_1 = [] for i in range(10): self.data_zero.append(bf(0, 32)) self.data_1.append(bf(0, 32)) self.data_1[5] = bf(0x123456 << 6, 30) self.data_1[6] = bf(0x345678 << 6, 30)
def test_str(self): k = bf(0x6) self.assertEqual(str(k), "110") k = bf(0) self.assertEqual(str(k), "0") k = bf(0x6, 8) self.assertEqual(str(k), "00000110") k = bf(0, 8) self.assertEqual(str(k), "00000000")
def setUp(self): self.data_zero=[] self.data_1=[] for i in range(10): self.data_zero.append(bf(0,32)) self.data_1.append(bf(0,32)) self.data_1[5]=bf(0x123456<<6,30) self.data_1[6]=bf(0x345678<<6,30)
def test_or_16(self): k = bf(0x3,16) k=k | 0x300 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x303) k = bf(0x3,16) k=k | 0x30 self.assertEqual(int(k), 0x033) k=k | 0xF30 self.assertEqual(int(k), 0xF33) k=k | 0xFFF00 self.assertEqual(int(k), 0xFF33)
def test_or_16(self): k = bf(0x3, 16) k = k | 0x300 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x303) k = bf(0x3, 16) k = k | 0x30 self.assertEqual(int(k), 0x033) k = k | 0xF30 self.assertEqual(int(k), 0xF33) k = k | 0xFFF00 self.assertEqual(int(k), 0xFF33)
def dump(self, dump_undecoded=False, dump_decoded=False, dump_timestamp=False, dump_header=False): if self.Dump_Levels[self.packet_ID]: print "***********************************************************" if dump_timestamp: print datetime.now() print RTCM2_Message_Names[self.packet_ID] + " (" + str( self.packet_ID) + ")" if dump_header: print(' Zcount : ' + str(self.zcount)) print(' Length : ' + str(self.length)) print(' Sequence : ' + str(self.sqn_num)) print(' Health : ' + RTCM2_Health_Names[self.health]) if self.Handler[self.packet_ID]: self.Handler[self.packet_ID].dump( self.Dump_Levels[self.packet_ID]) else: print "!Undecoded packet" if dump_undecoded: for word in range(3, self.length + 3): print "{:2} ".format(word) + str( bf(extract_rtcm_bits(self.data[word], 1, 24), 24))
def test_zero_default(self): # make sure the shuffled sequence does not lose any elements k = bf() self.assertIsInstance(k, bf) self.assertEqual(int(k), 0) self.assertEqual(len(k), 0) self.assertFalse(k)
def test_lsh_rsh_16(self): k = bf(0x0F,16) self.assertEqual(int(k), 0x0F) k <<= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x1E) k <<= 1 self.assertEqual(int(k), 0x3C) k <<= 4 self.assertEqual(int(k), 0x3C0) k >>= 4 self.assertEqual(int(k), 0x3C) k <<= 8 self.assertEqual(int(k), 0x3C00) k <<= 4 self.assertEqual(int(k), 0xC000) k <<= 4 self.assertEqual(int(k), 0x0000) k >>= 4 self.assertEqual(int(k), 0x0000) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFFFF) #Check to make sure that the length has been remembered k = k | 0xFFFFFFFF self.assertEqual(int(k), 0xFFFF)
def test_lsh_rsh_16(self): k = bf(0x0F, 16) self.assertEqual(int(k), 0x0F) k <<= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x1E) k <<= 1 self.assertEqual(int(k), 0x3C) k <<= 4 self.assertEqual(int(k), 0x3C0) k >>= 4 self.assertEqual(int(k), 0x3C) k <<= 8 self.assertEqual(int(k), 0x3C00) k <<= 4 self.assertEqual(int(k), 0xC000) k <<= 4 self.assertEqual(int(k), 0x0000) k >>= 4 self.assertEqual(int(k), 0x0000) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFFFF) #Check to make sure that the length has been remembered k = k | 0xFFFFFFFF self.assertEqual(int(k), 0xFFFF)
def test_zero_default(self): # make sure the shuffled sequence does not lose any elements k = bf() self.assertIsInstance(k,bf) self.assertEqual(int(k), 0) self.assertEqual(len(k), 0) self.assertFalse(k)
def test_read_bit(self): k = bf(0x6) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x006) self.assertEqual(k[0], 0x0) self.assertEqual(k[1], 0x1) self.assertEqual(k[2], 0x1) self.assertEqual(k[3], 0x0)
def test_or_8(self): k = bf(0x3, 8) k = k | 0x300 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x003) k = k | 0x30 self.assertEqual(int(k), 0x033)
def test_read_bit(self): k = bf(0x6) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x006) self.assertEqual(k[0], 0x0) self.assertEqual(k[1], 0x1) self.assertEqual(k[2], 0x1) self.assertEqual(k[3], 0x0)
def test_or_8(self): k = bf(0x3,8) k=k | 0x300 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x003) k=k | 0x30 self.assertEqual(int(k), 0x033)
def test_or_32(self): k = bf(0x3,32) k=k | 0x300 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x303) k = bf(0x3,32) k=k | 0x30 self.assertEqual(int(k), 0x033) k=k | 0xF30 self.assertEqual(int(k), 0xF33) k=k | 0xFFF00 self.assertEqual(int(k), 0xFFF33) k=k | 0x12300000 self.assertEqual(int(k), 0x123FFF33)
def test_or_32(self): k = bf(0x3, 32) k = k | 0x300 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x303) k = bf(0x3, 32) k = k | 0x30 self.assertEqual(int(k), 0x033) k = k | 0xF30 self.assertEqual(int(k), 0xF33) k = k | 0xFFF00 self.assertEqual(int(k), 0xFFF33) k = k | 0x12300000 self.assertEqual(int(k), 0x123FFF33)
def test_slice_assign(self): k = bf() self.assertIsInstance(k,bf) k[3:7]=5 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x28) k = bf() k[3:7]=7 self.assertEqual(int(k), 0x38) k = bf() k[3:7]=15 self.assertEqual(int(k), 0x78) #This test is to make sure we do not assign more than the slice k = bf() k[3:7]=0xFF self.assertEqual(int(k), 0x78) k = bf(0x0000) k[3:7]=0xF self.assertEqual(int(k), 0x78) k = bf(0x0000) k[4:8]=0xF self.assertEqual(int(k), 0xF0) k = bf(0xFFFF) k[4:8]=0x0 self.assertEqual(int(k), 0x0FF0F) k = bf(0xFFFF) k[0:8]=0x0 self.assertEqual(int(k), 0x0FF00) k = bf(0xFFFF) k[0:1]=0x0 self.assertEqual(int(k), 0x0FFFE) k = bf(0xFFFF) k[15:16]=0x0 self.assertEqual(int(k), 0x07FFF)
def test_slice_assign(self): k = bf() self.assertIsInstance(k, bf) k[3:7] = 5 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x28) k = bf() k[3:7] = 7 self.assertEqual(int(k), 0x38) k = bf() k[3:7] = 15 self.assertEqual(int(k), 0x78) #This test is to make sure we do not assign more than the slice k = bf() k[3:7] = 0xFF self.assertEqual(int(k), 0x78) k = bf(0x0000) k[3:7] = 0xF self.assertEqual(int(k), 0x78) k = bf(0x0000) k[4:8] = 0xF self.assertEqual(int(k), 0xF0) k = bf(0xFFFF) k[4:8] = 0x0 self.assertEqual(int(k), 0x0FF0F) k = bf(0xFFFF) k[0:8] = 0x0 self.assertEqual(int(k), 0x0FF00) k = bf(0xFFFF) k[0:1] = 0x0 self.assertEqual(int(k), 0x0FFFE) k = bf(0xFFFF) k[15:16] = 0x0 self.assertEqual(int(k), 0x07FFF)
def test_lsh(self): k = bf(1) self.assertEqual(int(k), 0x01) k <<= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x02) k <<= 1 self.assertEqual(int(k), 0x04) k <<= 4 self.assertEqual(int(k), 0x40) k = bf(0x0F) self.assertEqual(int(k), 0x0F) k <<= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x1E) k <<= 1 self.assertEqual(int(k), 0x3C) k <<= 4 self.assertEqual(int(k), 0x3C0) k <<= 4 self.assertEqual(int(k), 0x3C00)
def test_lsh(self): k = bf(1) self.assertEqual(int(k), 0x01) k <<= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x02) k <<= 1 self.assertEqual(int(k), 0x04) k <<= 4 self.assertEqual(int(k), 0x40) k = bf(0x0F) self.assertEqual(int(k), 0x0F) k <<= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x1E) k <<= 1 self.assertEqual(int(k), 0x3C) k <<= 4 self.assertEqual(int(k), 0x3C0) k <<= 4 self.assertEqual(int(k), 0x3C00)
def test_lsh_8(self): k = bf(1,8) self.assertEqual(int(k), 0x01) k <<= 1 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x02) k <<= 1 self.assertEqual(int(k), 0x04) k <<= 4 self.assertEqual(int(k), 0x40) k <<= 4 self.assertEqual(int(k), 0x00) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFF)
def test_lsh_8(self): k = bf(1, 8) self.assertEqual(int(k), 0x01) k <<= 1 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x02) k <<= 1 self.assertEqual(int(k), 0x04) k <<= 4 self.assertEqual(int(k), 0x40) k <<= 4 self.assertEqual(int(k), 0x00) #Check to make sure that the length has been remembered k = k | 0xFFFF self.assertEqual(int(k), 0xFF)
def test_set_bit(self): k = bf(0x6) self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x006) self.assertEqual(k[0], 0x0) self.assertEqual(k[1], 0x1) self.assertEqual(k[2], 0x1) self.assertEqual(k[3], 0x0) k[0]=1 k[1]=0 k[2]=0 k[3]=1 self.assertEqual(k[0], 0x1) self.assertEqual(k[1], 0x0) self.assertEqual(k[2], 0x0) self.assertEqual(k[3], 0x1)
def test_set_bit(self): k = bf(0x6) self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x006) self.assertEqual(k[0], 0x0) self.assertEqual(k[1], 0x1) self.assertEqual(k[2], 0x1) self.assertEqual(k[3], 0x0) k[0] = 1 k[1] = 0 k[2] = 0 k[3] = 1 self.assertEqual(k[0], 0x1) self.assertEqual(k[1], 0x0) self.assertEqual(k[2], 0x0) self.assertEqual(k[3], 0x1)
def __init__(self, default_output_level): self.undecoded = bytearray("") self.buffer = bytearray("") self.default_output_level = default_output_level self.packet_ID = None self.packet_Length = None self.Dump_Levels = array("I") self.Handler = [] self.commands = {} self.last_32_bits = bf(0x00, width=32) self.bit_count = 0 self.framing_mode = HDR_WORD1_SRCH self.frame_locked = False self.data = [] for i in range(RTCM2_Max_Words): self.data.append(0) self.word_count = 0 for i in range(RTCM2_Min_Message_ID, RTCM2_Max_Message_ID): self.Dump_Levels.append(default_output_level) self.Handler.append(None) self.Handler[1] = RTCM2_Type1.Type1() self.Handler[2] = RTCM2_Type2.Type2() self.Handler[3] = RTCM2_Type3.Type3() self.Handler[7] = RTCM2_Type7.Type7() self.Handler[9] = RTCM2_Type1.Type1( ) # Type 9 is just type 1 but without all the SV information self.Handler[18] = RTCM2_Type18.Type18() self.Handler[19] = RTCM2_Type19.Type19() self.Handler[22] = RTCM2_Type22.Type22() self.Handler[23] = RTCM2_Type23.Type23() self.Handler[24] = RTCM2_Type24.Type24() self.Handler[27] = RTCM2_Type27.Type27() self.Handler[31] = RTCM2_Type31.Type31() self.Handler[41] = RTCM2_Type41.Type41()
def dump (self,dump_undecoded=False,dump_decoded=False,dump_timestamp=False,dump_header=False): if self.Dump_Levels[self.packet_ID] : print "***********************************************************" if dump_timestamp : print datetime.now() print RTCM2_Message_Names[self.packet_ID] + " ("+ str(self.packet_ID) +")" if dump_header: print(' Zcount : '+ str(self.zcount)); print(' Length : '+ str(self.length)); print(' Sequence : '+ str(self.sqn_num)); print(' Health : '+ RTCM2_Health_Names[self.health]) if self.Handler[self.packet_ID]: self.Handler[self.packet_ID].dump(self.Dump_Levels[self.packet_ID]) else : print "!Undecoded packet" if dump_undecoded: for word in range (3,self.length+3): print "{:2} ".format(word) + str(bf(extract_rtcm_bits(self.data[word],1,24),24))
def __init__ (self,default_output_level): self.undecoded=bytearray("") self.buffer=bytearray("") self.default_output_level=default_output_level self.packet_ID=None self.packet_Length=None self.Dump_Levels=array("I") self.Handler=[] self.commands={} self.last_32_bits=bf(length=32) self.bit_count=0 self.framing_mode = HDR_WORD1_SRCH self.frame_locked=False self.data=[] for i in range(RTCM2_Max_Words): self.data.append(0) self.word_count=0 for i in range (RTCM2_Min_Message_ID,RTCM2_Max_Message_ID): self.Dump_Levels.append(default_output_level) self.Handler.append(None) self.Handler[1]=RTCM2_Type1.Type1() self.Handler[2]=RTCM2_Type2.Type2() self.Handler[3]=RTCM2_Type3.Type3() self.Handler[7]=RTCM2_Type7.Type7() self.Handler[9]=RTCM2_Type1.Type1() # Type 9 is just type 1 but without all the SV information self.Handler[18]=RTCM2_Type18.Type18() self.Handler[19]=RTCM2_Type19.Type19() self.Handler[22]=RTCM2_Type22.Type22() self.Handler[23]=RTCM2_Type23.Type23() self.Handler[24]=RTCM2_Type24.Type24() self.Handler[27]=RTCM2_Type27.Type27() self.Handler[31]=RTCM2_Type31.Type31() self.Handler[41]=RTCM2_Type41.Type41()
def process_rtcm_byte (self, rtcm_byte): good_parity=False; format_status=NO_INFO # OutputDebugString("Process RTCM Byte Start: " + "{:02X}".format(rtcm_byte)) # OutputDebugString('Process RTCM Byte: ' + str(self.framing_mode)+ ' ' + str(self.frame_locked)) if ((rtcm_byte & 0xC0) <> 0x40) : OutputDebugString('Not 6 of 8'); return NO_INFO; # Invalid 6 of 8 byte, so give up rtcm_byte &= 0x3F # OutputDebugString("Process RTCM Start: " + "{:06b}".format(rtcm_byte)) for Count in range(6,0,-1): # The low 6 Bits in the byte we care about, we have to make this into a bit stream #OutputDebugString("Process RTCM Byte: " + "{:02X}".format(rtcm_byte) + " " + str(Count)) self.last_32_bits<<=1; #always shift left 1 if rtcm_byte & 1 : self.last_32_bits[0]=1; #Had a 1 in the byte add to the last_32_bits self.bit_count+=1 #OutputDebugString(str(self.last_32_bits)+ " " + str(self.bit_count)); rtcm_byte >>=1 if self.bit_count >= 30: self.bit_count=0; # Not convinced that we should reset this here, since it seems wrong in the case that we have a bit stream and are trying to sync # In practice though we are only working with byte aligned streams, since we bail if the byte doesn't start with 0x40 self.word_boundary=True; good_parity=self.check_gps_parity(self.last_32_bits) # OutputDebugString("word_boundary: " + str(good_parity)) #Need to check if we should bail here or if we have to keep going for the headers # if not good_parity: # continue else: self.word_boundary=False; if( self.frame_locked ) : # In an effort to save throughput, we make use of the # fact that the switch statement below need only be # executed on a non-word boundary when frame_locked is FALSE. continue; if self.framing_mode == HDR_WORD1_SRCH: # If last msg ok, then wait for next word boundary if( (not self.frame_locked ) or self.word_boundary ): #OutputDebugString("HDR_WORD1_SRCH"); # Look for a valid preamble bit sequence. If one is found, overwrite B30 with the assumed value *) # preamble = self.last_32_bits & 0x3fc00000; preamble = extract_rtcm_bits(self.last_32_bits,1,8) # print preamble, POS_VER2_PREAMBLE, NEG_VER2_PREAMBLE # print preamble==POS_VER2_PREAMBLE, preamble==NEG_VER2_PREAMBLE # print int(preamble)==int(POS_VER2_PREAMBLE), int(preamble)==int(NEG_VER2_PREAMBLE) if( preamble == POS_VER2_PREAMBLE ) : self.last_32_bits[30]=0 # &= (not 0x40000000); # Clear D30* *) # OutputDebugString('Pos Ver Preamble'); self.found_RTCMV2_header=True elif( preamble == NEG_VER2_PREAMBLE ) : self.last_32_bits[30]=1 # |= 0x40000000; # Set D30* *) # OutputDebugString('Neg Ver Preamble'); self.found_RTCMV2_header=True else : self.found_RTCMV2_header=False if self.found_RTCMV2_header: # OutputDebugString('Found Header'); # received_checksum=self.last_32_bits[0:6] # & $3F received_checksum=extract_rtcm_bits(self.last_32_bits,25,30) calced_checksum=self.compute_gps_parity(self.last_32_bits) xor_checksum=received_checksum ^ calced_checksum # OutputDebugString("Checksum: " + "{:02X}".format(xor_checksum)) if (xor_checksum == 0x29) : self.last_32_bits ^= 0x80000000; #Don't understand this one at all. # OutputDebugString('Checksum 29 hack used'); xor_checksum=0 if (xor_checksum == 0 ): self.bit_count=0; self.framing_mode=HDR_WORD2_CONFIRM; self.format_status=GOOD_HDR1 self.hdr_word=self.extract_data(self.last_32_bits) self.stn_id = extract_rtcm_bits(self.hdr_word, 15, 24); # print " Stn Id : " + str(self.stn_id); self.packet_ID = extract_rtcm_bits(self.hdr_word,9,14); # print " Type : " + str(self.packet_ID) else : self.format_status = ERROR_DETECTED; self.frame_locked = False elif self.framing_mode == HDR_WORD2_CONFIRM: if ( self.word_boundary ) : if( good_parity ) : self.hdr_word=bf(self.extract_data(self.last_32_bits),30) # OutputDebugString('HDR Word2 CONFIRM Good Parity'); self.frame_locked = True; # Extract fields for word 2 of the message header *) self.zcount = int(extract_rtcm_bits( self.hdr_word, 1, 13 )); self.sqn_num = int(extract_rtcm_bits( self.hdr_word, 14, 16 )); self.length = int(extract_rtcm_bits( self.hdr_word, 17, 21 )); self.health = int(extract_rtcm_bits( self.hdr_word, 22, 24 )); # Handle the 0 length message case eg :- Type 6 *) if( self.length == 0 ) : self.framing_mode = HDR_WORD1_SRCH; format_status = MESSAGE_COMPLETE_GOOD_ID; else: self.framing_mode = DATA_COLLECT; # OutputDebugString('HDR Word2 going to Data Collect'); format_status = GOOD_HDR2; self.word_count = 0; else : self.frame_locked = False; self.framing_mode = HDR_WORD1_SRCH; format_status = ERROR_DETECTED; elif self.framing_mode == DATA_COLLECT: if ( self.word_boundary ) : if( good_parity ) : # OutputDebugString('Data Collect: ' + str(self.word_count) + " " + str(self.length)); self.data[self.word_count+3] = self.extract_data(self.last_32_bits) self.word_count+=1 if( self.word_count >= self.length ): # This word completes the message. Perform the message termination work. *) self.framing_mode = HDR_WORD1_SRCH; self.bit_count = 0; format_status = MESSAGE_COMPLETE_GOOD_ID; # OutputDebugString("Message Complete") return format_status else: # A bad data word has been received. Reset data collection. *) self.framing_mode = HDR_WORD1_SRCH; self.frame_locked = False; format_status = ERROR_DETECTED; return format_status
def test_full_assign_fail(self): # make sure the shuffled sequence does not lose any elements k = bf(2) self.assertIsInstance(k, bf) self.assertFalse(int(k) == 1) self.assertNotEqual(int(k), 1)
def test_zero_default_length(self): k8 = bf(length=8) self.assertIsInstance(k8, bf) self.assertEqual(int(k8), 0) self.assertFalse(k8)
def test_and(self): k = bf(1) k = k & 0x3 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x001)
def test_or(self): k = bf(1) k = k | 0x3 self.assertIsInstance(k, bf) self.assertEqual(int(k), 0x003)
def process_rtcm_byte(self, rtcm_byte): good_parity = False format_status = NO_INFO # OutputDebugString("Process RTCM Byte Start: " + "{:02X}".format(rtcm_byte)) # OutputDebugString('Process RTCM Byte: ' + str(self.framing_mode)+ ' ' + str(self.frame_locked)) if ((rtcm_byte & 0xC0) <> 0x40): OutputDebugString('Not 6 of 8') return NO_INFO # Invalid 6 of 8 byte, so give up rtcm_byte &= 0x3F # OutputDebugString("Process RTCM Start: " + "{:06b}".format(rtcm_byte)) for Count in range( 6, 0, -1 ): # The low 6 Bits in the byte we care about, we have to make this into a bit stream #OutputDebugString("Process RTCM Byte: " + "{:02X}".format(rtcm_byte) + " " + str(Count)) self.last_32_bits <<= 1 #always shift left 1 if rtcm_byte & 1: self.last_32_bits[0] = 1 #Had a 1 in the byte add to the last_32_bits self.bit_count += 1 #OutputDebugString(str(self.last_32_bits)+ " " + str(self.bit_count)); rtcm_byte >>= 1 if self.bit_count >= 30: self.bit_count = 0 # Not convinced that we should reset this here, since it seems wrong in the case that we have a bit stream and are trying to sync # In practice though we are only working with byte aligned streams, since we bail if the byte doesn't start with 0x40 self.word_boundary = True good_parity = self.check_gps_parity(self.last_32_bits) # OutputDebugString("word_boundary: " + str(good_parity)) #Need to check if we should bail here or if we have to keep going for the headers # if not good_parity: # continue else: self.word_boundary = False if (self.frame_locked): # In an effort to save throughput, we make use of the # fact that the switch statement below need only be # executed on a non-word boundary when frame_locked is FALSE. continue if self.framing_mode == HDR_WORD1_SRCH: # If last msg ok, then wait for next word boundary if ((not self.frame_locked) or self.word_boundary): #OutputDebugString("HDR_WORD1_SRCH"); # Look for a valid preamble bit sequence. If one is found, overwrite B30 with the assumed value *) # preamble = self.last_32_bits & 0x3fc00000; preamble = extract_rtcm_bits(self.last_32_bits, 1, 8) # print preamble, POS_VER2_PREAMBLE, NEG_VER2_PREAMBLE # print preamble==POS_VER2_PREAMBLE, preamble==NEG_VER2_PREAMBLE # print int(preamble)==int(POS_VER2_PREAMBLE), int(preamble)==int(NEG_VER2_PREAMBLE) if (preamble == POS_VER2_PREAMBLE): self.last_32_bits[ 30] = 0 # &= (not 0x40000000); # Clear D30* *) # OutputDebugString('Pos Ver Preamble'); self.found_RTCMV2_header = True elif (preamble == NEG_VER2_PREAMBLE): self.last_32_bits[ 30] = 1 # |= 0x40000000; # Set D30* *) # OutputDebugString('Neg Ver Preamble'); self.found_RTCMV2_header = True else: self.found_RTCMV2_header = False if self.found_RTCMV2_header: # OutputDebugString('Found Header'); # received_checksum=self.last_32_bits[0:6] # & $3F received_checksum = extract_rtcm_bits( self.last_32_bits, 25, 30) calced_checksum = self.compute_gps_parity( self.last_32_bits) xor_checksum = received_checksum ^ calced_checksum # OutputDebugString("Checksum: " + "{:02X}".format(xor_checksum)) if (xor_checksum == 0x29): self.last_32_bits ^= 0x80000000 #Don't understand this one at all. # OutputDebugString('Checksum 29 hack used'); xor_checksum = 0 if (xor_checksum == 0): self.bit_count = 0 self.framing_mode = HDR_WORD2_CONFIRM self.format_status = GOOD_HDR1 self.hdr_word = self.extract_data(self.last_32_bits) self.stn_id = extract_rtcm_bits(self.hdr_word, 15, 24) # print " Stn Id : " + str(self.stn_id); self.packet_ID = extract_rtcm_bits( self.hdr_word, 9, 14) # print " Type : " + str(self.packet_ID) else: self.format_status = ERROR_DETECTED self.frame_locked = False elif self.framing_mode == HDR_WORD2_CONFIRM: if (self.word_boundary): if (good_parity): self.hdr_word = bf( self.extract_data(self.last_32_bits), 30) # OutputDebugString('HDR Word2 CONFIRM Good Parity'); self.frame_locked = True # Extract fields for word 2 of the message header *) self.zcount = int( extract_rtcm_bits(self.hdr_word, 1, 13)) self.sqn_num = int( extract_rtcm_bits(self.hdr_word, 14, 16)) self.length = int( extract_rtcm_bits(self.hdr_word, 17, 21)) self.health = int( extract_rtcm_bits(self.hdr_word, 22, 24)) # Handle the 0 length message case eg :- Type 6 *) if (self.length == 0): self.framing_mode = HDR_WORD1_SRCH format_status = MESSAGE_COMPLETE_GOOD_ID else: self.framing_mode = DATA_COLLECT # OutputDebugString('HDR Word2 going to Data Collect'); format_status = GOOD_HDR2 self.word_count = 0 else: self.frame_locked = False self.framing_mode = HDR_WORD1_SRCH format_status = ERROR_DETECTED elif self.framing_mode == DATA_COLLECT: if (self.word_boundary): if (good_parity): # OutputDebugString('Data Collect: ' + str(self.word_count) + " " + str(self.length)); self.data[self.word_count + 3] = self.extract_data( self.last_32_bits) self.word_count += 1 if (self.word_count >= self.length): # This word completes the message. Perform the message termination work. *) self.framing_mode = HDR_WORD1_SRCH self.bit_count = 0 format_status = MESSAGE_COMPLETE_GOOD_ID # OutputDebugString("Message Complete") return format_status else: # A bad data word has been received. Reset data collection. *) self.framing_mode = HDR_WORD1_SRCH self.frame_locked = False format_status = ERROR_DETECTED return format_status
def test_or(self): k = bf(1) k=k | 0x3 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x003)
def test_and(self): k = bf(1) k=k & 0x3 self.assertIsInstance(k,bf) self.assertEqual(int(k), 0x001)
def test_full_assign_fail(self): # make sure the shuffled sequence does not lose any elements k = bf(2) self.assertIsInstance(k,bf) self.assertFalse(int(k)==1) self.assertNotEqual(int(k), 1)
def test_zero_default_length(self): k8 = bf(length=8) self.assertIsInstance(k8,bf) self.assertEqual(int(k8), 0) self.assertFalse(k8)