diff --git a/ADSB_Encoder.py b/ADSB_Encoder.py index 597499e..e154e57 100755 --- a/ADSB_Encoder.py +++ b/ADSB_Encoder.py @@ -6,6 +6,7 @@ from location import * from conversions import * from parity import * from HackRF import HackRF +from PPM import PPM import os ############################################################### @@ -89,7 +90,7 @@ def df17_pos_rep_encode(ca, icao, tc, ss, nicsb, alt, time, lat, lon, surface): return (df17_even_bytes, df17_odd_bytes) -def frame_1090es_ppm_modulate(even, odd): +"""def frame_1090es_ppm_modulate(even, odd): ppm = [ ] for i in range(48): # pause @@ -121,7 +122,7 @@ def frame_1090es_ppm_modulate(even, odd): #print '[{}]'.format(', '.join(hex(x) for x in ppm)) return bytearray(ppm) - +""" if __name__ == "__main__": @@ -153,8 +154,8 @@ if __name__ == "__main__": #print ''.join(format(x, '02x') for x in df17_even) #print ''.join(format(x, '02x') for x in df17_odd) - - df17_array = frame_1090es_ppm_modulate(df17_even, df17_odd) + ppm = PPM() + df17_array = ppm.frame_1090es_ppm_modulate(df17_even, df17_odd) #OutFile = open("filename.bin", "wb") #OutFile.write(df17_array) diff --git a/Encoder.py b/Encoder.py new file mode 100644 index 0000000..21466c3 --- /dev/null +++ b/Encoder.py @@ -0,0 +1,43 @@ +class Encoder: + """ + Hamming and Manchester Encoding example + + Author: Joel Addison + Date: March 2013 + + Functions to do (7,4) hamming encoding and decoding, including error detection + and correction. + Manchester encoding and decoding is also included, and by default will use + least bit ordering for the byte that is to be included in the array. + """ + + def extract_bit(self, byte, pos): + """ + Extract a bit from a given byte using MS ordering. + ie. B7 B6 B5 B4 B3 B2 B1 B0 + """ + return (byte >> pos) & 0x01 + + def manchester_encode(self, byte): + """ + Encode a byte using Manchester encoding. Returns an array of bits. + Adds two start bits (1, 1) and one stop bit (0) to the array. + """ + # Add start bits (encoded 1, 1) + # manchester_encoded = [0, 1, 0, 1] + manchester_encoded = [] + + # Encode byte + for i in range(7, -1, -1): + if self.extract_bit(byte, i): + manchester_encoded.append(0) + manchester_encoded.append(1) + else: + manchester_encoded.append(1) + manchester_encoded.append(0) + + # Add stop bit (encoded 0) + # manchester_encoded.append(1) + # manchester_encoded.append(0) + + return manchester_encoded diff --git a/PPM.py b/PPM.py new file mode 100644 index 0000000..6faee71 --- /dev/null +++ b/PPM.py @@ -0,0 +1,46 @@ +import numpy +from Encoder import Encoder + +class PPM: + """The PPM class contains functions about PPM manipulation + """ + + def frame_1090es_ppm_modulate(self, even, odd): + """ + Args: + even and odd: The bits you would converted to PPM + Returns: + The bytearray of the PPM data + """ + ppm = [ ] + encoder = Encoder() + + for i in range(48): # pause + ppm.append( 0 ) + + ppm.append( 0xA1 ) # preamble + ppm.append( 0x40 ) + + for i in range(len(even)): + word16 = numpy.packbits(encoder.manchester_encode(~even[i])) + ppm.append(word16[0]) + ppm.append(word16[1]) + + + for i in range(100): # pause + ppm.append( 0 ) + + ppm.append( 0xA1 ) # preamble + ppm.append( 0x40 ) + + for i in range(len(odd)): + word16 = numpy.packbits(encoder.manchester_encode(~odd[i])) + ppm.append(word16[0]) + ppm.append(word16[1]) + + for i in range(48): # pause + ppm.append( 0 ) + + #print '[{}]'.format(', '.join(hex(x) for x in ppm)) + + return bytearray(ppm) diff --git a/encoder.py b/encoder.py deleted file mode 100644 index 98af943..0000000 --- a/encoder.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -Hamming and Manchester Encoding example - -Author: Joel Addison -Date: March 2013 - -Functions to do (7,4) hamming encoding and decoding, including error detection -and correction. -Manchester encoding and decoding is also included, and by default will use -least bit ordering for the byte that is to be included in the array. -""" - -def extract_bit(byte, pos): - """ - Extract a bit from a given byte using MS ordering. - ie. B7 B6 B5 B4 B3 B2 B1 B0 - """ - return (byte >> pos) & 0x01 - -def manchester_encode(byte): - """ - Encode a byte using Manchester encoding. Returns an array of bits. - Adds two start bits (1, 1) and one stop bit (0) to the array. - """ - # Add start bits (encoded 1, 1) - # manchester_encoded = [0, 1, 0, 1] - manchester_encoded = [] - - # Encode byte - for i in range(7, -1, -1): - if extract_bit(byte, i): - manchester_encoded.append(0) - manchester_encoded.append(1) - else: - manchester_encoded.append(1) - manchester_encoded.append(0) - - # Add stop bit (encoded 0) - # manchester_encoded.append(1) - # manchester_encoded.append(0) - - return manchester_encoded