Merge pull request #3 from nzkarit/argparser

Argparser
This commit is contained in:
nzkarit 2017-09-09 00:13:39 +12:00 committed by GitHub
commit c24fbb0c6b
7 changed files with 82 additions and 40 deletions

View File

@ -5,6 +5,7 @@ from HackRF import HackRF
from PPM import PPM from PPM import PPM
from ModeS import ModeS from ModeS import ModeS
from sys import argv, exit from sys import argv, exit
from optparse import OptionParser
import os import os
############################################################### ###############################################################
@ -24,46 +25,40 @@ import os
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
def optionParser():
usage = 'usage: %prog [options]'
parser = OptionParser(usage=usage)
parser.add_option('-i', '--icao', action='store', type='int', dest='icao', default='0xABCDEF', help='The ICAO number for the plane in hex. Ensure the ICAO is prefixed with \'0x\' to ensure this is parsed as a hex number. Default: %default')
parser.add_option('--lat', '--latitude', action='store', type='float', dest='latitude', default='12.34', help='Latitude for the plane in decminal degrees. Default: %default')
parser.add_option('--lon', '--long', '--longitude', action='store', type='float', dest='longitude', default='56.78', help='Longitude for the place in decminal degrees. Default: %default')
parser.add_option('-a', '--alt', '--altitude', action='store', type='float', dest='altitude', default='9876.5', help='Altitude in decminal feet. Default: %default')
parser.add_option('--ca', '--capability', action='store', type='int', dest='capability', default=5, help='The capability. (Think this is always 5 from ADSB messages. More info would be appreciate). Default: %default')
parser.add_option('--tc', '--typecode', action='store', type='int', dest='typecode', default=11, help='The type for the ADSB messsage. See https://adsb-decode-guide.readthedocs.io/en/latest/content/introduction.html#ads-b-message-types for more information. Default: %default')
parser.add_option('--ss', '--surveillancestatus', action='store', type='int', dest='surveillancestatus', default=0, help='The surveillance status. (Think this is always 0 from ADSB messages. More info would be appreciate). Default: %default')
parser.add_option('--nicsb', '--nicsupplementb', action='store', type='int', dest='nicsupplementb', default=0, help='The NIC supplement-B.(Think this is always 0 from ADSB messages. More info would be appreciate). Default: %default')
parser.add_option('--time', action='store', type='int', dest='time', default=0, help='The time. (Think this is always 0 from ADSB messages. More info would be appreciate). Default: %default')
parser.add_option('-s', '--surface', action='store', default=False, dest='surface', help='If the plane is on the ground or not. Default: %default')
parser.add_option('-o', '--out', '--output', action='store', type='string', default='Samples_256K.iq8s', dest='outputfilename', help='The iq8s output filename. This is the file which you will feed into the hackRF. Default: %default')
return parser.parse_args()
if __name__ == "__main__": if __name__ == "__main__":
argc = len(argv) options, arguments = optionParser()
if argc != 5: print options
print
print 'Usage: '+ argv[0] +' <ICAO> <Latitude> <Longtitude> <Altitude>'
print
print ' Example: '+ argv[0] +' 0xABCDEF 12.34 56.78 9999.0'
print
exit(2)
icao = int(argv[1], 16)
lat = float(argv[2])
lon = float(argv[3])
alt = float(argv[4])
ca = 5 # Capability
tc = 11 # Type Code see: https://adsb-decode-guide.readthedocs.io/en/latest/content/introduction.html#ads-b-message-types
ss = 0 # Surveillance status
nicsb = 0 # NIC supplement-B
time = 0
surface = False
modes = ModeS() modes = ModeS()
(df17_even, df17_odd) = modes.df17_pos_rep_encode(ca, icao, tc, ss, nicsb, alt, time, lat, lon, surface) (df17_even, df17_odd) = modes.df17_pos_rep_encode(options.capability, options.icao, options.typecode, options.surveillancestatus, options.nicsupplementb, options.altitude, options.time, options.latitude, options.longitude, options.surface)
#print ''.join(format(x, '02x') for x in df17_even)
#print ''.join(format(x, '02x') for x in df17_odd)
ppm = PPM() ppm = PPM()
df17_array = ppm.frame_1090es_ppm_modulate(df17_even, df17_odd) df17_array = ppm.frame_1090es_ppm_modulate(df17_even, df17_odd)
#OutFile = open("filename.bin", "wb")
#OutFile.write(df17_array)
hackrf = HackRF() hackrf = HackRF()
samples_array = hackrf.hackrf_raw_IQ_format(df17_array) samples_array = hackrf.hackrf_raw_IQ_format(df17_array)
SamplesFile = open("Samples.iq8s", "wb") # TODO make this a function and take the file name. Also have the option to run dd on it. SamplesFile = open('tmp.iq8s', 'wb')
# TODO make it empty the file first.
SamplesFile.write(samples_array) SamplesFile.write(samples_array)
os.system("dd if=Samples.iq8s of=Samples_256K.iq8s bs=4k seek=63") # TODO make this a flag, also make it take the file name os.system("dd if=tmp.iq8s of=%s bs=4k seek=63" % (options.outputfilename))
os.system('rm tmp.iq8s')

View File

@ -10,7 +10,9 @@ class Encoder:
Manchester encoding and decoding is also included, and by default will use 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. least bit ordering for the byte that is to be included in the array.
""" """
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
def extract_bit(self, byte, pos): def extract_bit(self, byte, pos):
""" """
Extract a bit from a given byte using MS ordering. Extract a bit from a given byte using MS ordering.

View File

@ -1,5 +1,7 @@
import numpy import numpy
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
class HackRF: class HackRF:
"""The HackRF class has functions from converting data into a format into which the hackrf can process """The HackRF class has functions from converting data into a format into which the hackrf can process
""" """

View File

@ -1,6 +1,8 @@
from ModeSLocation import ModeSLocation from ModeSLocation import ModeSLocation
import math import math
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
class ModeS: class ModeS:
"""This class handles the ModeS ADSB manipulation """This class handles the ModeS ADSB manipulation
""" """

View File

@ -26,7 +26,9 @@ class ModeSLocation:
# the Free Software Foundation, Inc., 51 Franklin Street, # the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA. # Boston, MA 02110-1301, USA.
# #
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
def encode_alt_modes(self, alt, bit13): def encode_alt_modes(self, alt, bit13):
mbit = False mbit = False
qbit = True qbit = True

4
PPM.py
View File

@ -1,6 +1,8 @@
import numpy import numpy
from Encoder import Encoder from Encoder import Encoder
###############################################################
# Further work on fork
# Copyright (C) 2017 David Robinson
class PPM: class PPM:
"""The PPM class contains functions about PPM manipulation """The PPM class contains functions about PPM manipulation
""" """

View File

@ -9,12 +9,49 @@ open source "ADS-B In" solutions. One known good example is [Stratux](https://gi
The source code is published for academic purpose only. The source code is published for academic purpose only.
## Instructions ## Instructions
1. Execute *ADSB_Encoder.py* script with `<ICAO>` `<Latitude>` `<Longtitude>` `<Altitude>` arguments: 1. Execute *ADSB_Encoder.py* all the options have defaults so none are needed to generate with defaults. Running help will show you the optiosn you can change:
``` ```
$ ADSB_Encoder.py 0xABCDEF 12.34 56.78 9999.0 $ ADSB_Encoder.py
$ ls Samples.iq8s
Samples.iq8s $ ADSB_Encoder.py -h
$ Usage: ADSB_Encoder.py [options]
Options:
-h, --help show this help message and exit
-i ICAO, --icao=ICAO The ICAO number for the plane in hex. Ensure the ICAO
is prefixed with '0x' to ensure this is parsed as a
hex number. Default: 0xABCDEF
--lat=LATITUDE, --latitude=LATITUDE
Latitude for the plane in decminal degrees. Default:
12.34
--lon=LONGITUDE, --long=LONGITUDE, --longitude=LONGITUDE
Longitude for the place in decminal degrees. Default:
56.78
-a ALTITUDE, --alt=ALTITUDE, --altitude=ALTITUDE
Altitude in decminal feet. Default: 9876.5
--ca=CAPABILITY, --capability=CAPABILITY
The capability. (Think this is always 5 from ADSB
messages. More info would be appreciate). Default: 5
--tc=TYPECODE, --typecode=TYPECODE
The type for the ADSB messsage. See https://adsb-
decode-guide.readthedocs.io/en/latest/content/introduc
tion.html#ads-b-message-types for more information.
Default: 11
--ss=SURVEILLANCESTATUS, --surveillancestatus=SURVEILLANCESTATUS
The surveillance status. (Think this is always 0 from
ADSB messages. More info would be appreciate).
Default: 0
--nicsb=NICSUPPLEMENTB, --nicsupplementb=NICSUPPLEMENTB
The NIC supplement-B.(Think this is always 0 from
ADSB messages. More info would be appreciate).
Default: 0
--time=TIME The time. (Think this is always 0 from ADSB messages.
More info would be appreciate). Default: 0
-s SURFACE, --surface=SURFACE
If the plane is on the ground or not. Default: False
-o OUTPUTFILENAME, --out=OUTPUTFILENAME, --output=OUTPUTFILENAME
The iq8s output filename. This is the file which you
will feed into the hackRF. Default: Samples_256K.iq8s
``` ```
2. Transmit the signal into air: 2. Transmit the signal into air:
``` ```