Commit graph

285 commits

Author SHA1 Message Date
Malcolm Robb f9c1dc1da5 Remove duplicate varbles
Several variables within structures contain the same information in
different forms.

The aircraft structure contains addr and hexaddr. Hexaddr is a printable
string version of addr. However, hexaddr is only ever used in printf
statments, so we can use printf(%06x) to print addr. This saves a printf
for every received command.

The modesMessage structure contains addr, and aa1,aa2,aa3 as separate
bytes. aa1,aa2 and aa3 are only ever used to construct addr, and to
print out. Therefore, we can use addr instead of them..
2013-04-25 21:17:00 +01:00
Malcolm Robb 3766492067 Change Mode-A/C to Mode-S detection
The original code made an attempt to reconcile a newly arrived ModeA/C
message with every known Mode-S report at the time of detection.
However, the results of matching up Modes A/C and S are only used in the
interactive display routine, and that is only called periodically from
within the BackgroundTasks loop.

Doing the matching on every ModeA/C arrival incurs quite a large CPU
processing load. Moving the matching up routine to the backgroundTasks
loop means that the task is performed muck less frequently and therefore
uses less CPU time.
2013-04-24 23:47:08 +01:00
Malcolm Robb 3dbc0efffc VK1ET : Decode mode ASCII hex input message types
Modifications entirely base on code supplied by John VK1ET.

Supports additional AVR raw ASCII input message stream types
2013-04-24 20:46:59 +01:00
Malcolm Robb a04e399d7e VK1ET : Implement Relative CPR decoding
Modifications entirely base on code supplied by John VK1ET.

Implements relative CPR Lat/Long decoding for --interactive display
2013-04-24 20:24:46 +01:00
Malcolm Robb b78b60677c Improvements to Mode A/C display
Allow a greater range and negative values for Mode C (down to -1200
feet)

Stop attempting to feed ModeA/C data to SBS Output stream.

Allow Mode A only matches to Mode-S squawks when the Mode A code does
not conflict with any possible (legal) Mode C code.

Allow Mode C matches to track aircraft climbing and descending
relatively slowly. This also helps when trying to match Mode-S altitudes
which are 25 foot increments, with Mode C altitudes which are in 100
foot increments.
2013-04-24 00:13:18 +01:00
Malcolm Robb d63ac81a6a Updated comments, ,no code changes 2013-04-23 22:18:15 +01:00
Malcolm Robb 9fff65ba58 Implement Mode A/C decoding
First attempt at decoding legacy SSR Modes A and C.

If the command line switch --modeac is used, the program will now
attempt to recover Mode A/C signals contained in the raw I/Q data
stream. The current recovery mechanism is quite strict and does not cope
well with overlapping and corrupt SSR replies. I estimate that less than
20% of possible returns are decoded correctly. Hopefully over the next
few iterations this can be improved.

If outputting raw data it is recommended to use the --net-ro-size and
--net-ro-rate command line options to reduce the number of very small
ethernet packets that will be generated by mode A/C replies.
2013-04-22 23:31:59 +01:00
Malcolm Robb 39cb96f24b Fix several bugs in input/output fromat
Thanks to vk1et for these.

1) Correct for additional timestamp langth in raw output buffer when
using mlat mode

2) Don't output a timestamp when the message has been received from a
remote site (the internet). This is to avoid upsetting MLAT because
there is an indeterminate delay between reception at the remote site and
subsequent message arrival in the local dump1090 instance.

3) Allow @ character for raw data input with timestamp, and correctly
calculate the length.
2013-04-20 11:29:27 +01:00
Malcolm Robb 11265089b4 Fix Bug in Beast Mode Output
Original code put the signal strength in before the timestamp. It should
be after.

Also add some code to support MODE A/C output at a future date.
2013-04-19 15:29:39 +01:00
Malcolm Robb e98728108c Bug fix in vertical sign
Incorrect shift amount when detecting vertical rate sign.  Thanks
John-vk1et.
2013-04-19 09:32:34 +01:00
Malcolm Robb 3d25f4bf1a Changes to prevent stale output in SBS-1 format
The original code calculates Lat/Long only if it receives two DF-17
(subtype 9 or 18) within one second of each other. I have no idea why.
It then caches the results in the aircrafts data structure for use in
the --interactive display.

When SBS-1 style ASCII output is selected (port 30003) the code does not
attempt to calculate Lat/Long from the data just received - instead it
picks it up from the cached information in the aircraft's data
structure.

However, if the data isn't being updated this results in stale Lat/Long
being sent out. This is most likely to occur when the aircraft is at the
extreme edge of the receivers range when it may be getting some DF-17s
containing Lat/Long, but not 2 per second. The program will continue
sending the stale data until the aircraft finally times out (default 60
seconds)

I have modified the code to include a sbsflags variable in the aircraft
data structure. When a new Lat/Long is decoded and put into the
structure, a bit is set to indicate SBS_LAT_LONG_FRESH. Then, once the
Lat/Long is output the first time, the bit is cleared. Thereafter the
code will not populate the Lat/Long fields in the output message until
SBS_LAT_LONG_FRESH is set again.
2013-04-17 23:09:01 +01:00
Malcolm Robb bbcf68cf11 Nunojpg Southern Hemisphere bug fix + 1
1) Incorporate nunojpg southern hemisphere bug fix
2) Initialise Modes.stat_DF_Corrected variable
2013-04-17 20:09:49 +01:00
Malcolm Robb a75442d11d Up issue the version and commit
Version 1.01.1503.13
2013-04-15 23:26:12 +01:00
Malcolm Robb 2431dc0c77 Added --net-ro-rate command line switch
The default is 0. This works in conjunction with --net-ro-size.

The program will attempt to gather up "net-ro-size" raw bytes before
sending them out over Ethernet. However, to avoid a long wait if the
traffic density is very low, the program will only wait for
"net-ro-rate" 64mS periods since the last send. before sending any data
added to the output buffer since the last send. This allows the user to
tailor the network load to suit their requirements.
2013-04-15 23:17:08 +01:00
Malcolm Robb 7779ef4d4f Correct CRLF order in SBS-1 ASCII output 2013-04-15 22:37:10 +01:00
Malcolm Robb b15ae2a544 Print DF-11 II/SI 2013-04-15 22:18:45 +01:00
Malcolm Robb 96afd52cb0 Speed up Squawk Decode
Re-write to avoid multiple reads of the same memory variable.
2013-04-15 22:12:40 +01:00
Malcolm Robb 6619d21970 Speed up Error Correction
Move memcopy to outside the main bit loop, and just flip the modified
bit back at the end of each loop if it didn;t work

Pass in a pointer to the mm structure being corrected, and fix-up the
crc with the value inside the function, rather than re-calculate on
return
2013-04-15 22:01:56 +01:00
Malcolm Robb bdf985a792 Don't attempt to error correct DF-11
Don't attempt to error correct DF-11, because we can't be sure that the
checksum/crc is supposed to be 0.

Also a few typo's corrected
2013-04-15 21:55:46 +01:00
Malcolm Robb bb20d0b5b8 SBS-1 ASCII output changes suggested by JungleJet
1) Populate Field 3 witn "111"
2) Populate field 4 with "11111"
3  Populate Field 6 with "111111"
4) End the record with <CRLF>, rather than just <LF>
5) Increase the ctrCommon buffer size to cope with additional field data

Apparently, this makes the output more compatible with Plane Plotter and
RTL1090.
2013-04-15 00:51:04 +01:00
Malcolm Robb 249c11a4c3 Add --net-ro-size command line switch
Allow the user to specify the minimum size of raw data to be sent to the
TCP port. Dump1090 will buffer up raw data until it has at least this
many bytes to send to the TCP socket.

The default is 0, which means every frame is sent to the TCP socket as
it is decoded. The maximum value is limited to 1300 bytes.

Note the buffer will  be flushed every 65 ms regardless of the amount of
data in it so that excessive in transmission do not occur.
2013-04-14 22:51:50 +01:00
Malcolm Robb 0263793928 Add version number to help output screen 2013-04-14 22:03:19 +01:00
Malcolm Robb 444b1cf3a2 Changed the date separator in SBS-1
Changed the separator from \ to /
2013-04-13 02:09:57 +01:00
Malcolm Robb 09d72d2897 Merge JungleJet Updates 2013-04-13 01:37:02 +01:00
Malcolm Robb d96f3a679e Added Raw Output Buffering
The original code wrote every individual received frame to the TCP port.
Some O/S's buffer smaller writes into larger packets. It appears that
some versions of Linux don't. The result is that the (Ethernet) network
gets bombarded with lots of small Ethernet packets.

Therefore, I've added a 1500 byte output buffer to the raw output
functions. Data is written into this buffer by the raw output routines.

Data is flushed out to the TCP port when either.
1) The latest write to the output buffer takes the contents to more than
1300 bytes
2) At the end of every processed block of data supplied by rtl-sdr. This
will be every 56mS or so,

The end result should be that on systems detecting a lot of traffic, you
should see lots of > 1300-byte Ethernet packets. On systems receiving
less traffic, you should see one network packet every 56 mS or so.

The total number of network packets should be much reduced, and their
average size much bigger. The worst case delay in transmission will be
56 mS.
2013-04-12 22:39:33 +01:00
Malcolm Robb 1324e28a38 Add Timestamps to SBS-1 format output
As requested by mlino

Note : I haven't been able to validate that the format is correct. I
think it should be Ok, but it needs someone with an SBS setup to check
it. Any offers?
2013-04-12 22:03:04 +01:00
Malcolm Robb 1175a03f4b Another attempt to remove UNIX compiler warnings
M$ VC 6.0 does not like long long
UNIX compilers don't like printing int64_t or uint64_t as %lld
Raspberry Pi Linux doesn;t like PRId64

So I give up.

I've changed the affected variables to bog standard unsigned ints.
Assuming these compile as 32 bit unsigned's, its unlikely youll have the
program running long enough for these to overflow.
2013-04-12 21:06:19 +01:00
Malcolm Robb 8c024d1736 Try to correct single bit errors in the DF field
If noist/sampling/Nyquist errors cause bit detection errors in the DF
pare of the frame, then we may not be able to work out the correct
length of the message. We have to guess whether the bit should be a 0 or
a 1.

In such circumstances we assume the message length is long(112 bits)
However, if we start to get encoding errors after bit 56 the we attempt
to change our original guess at the bit, and invert it. If this change
of guess would have resulted in a short message, and if the short
message would have been error free then we can recover.
2013-04-12 20:45:12 +01:00
junglejet 44ca030d3f committ repeated
committ repeated
2013-04-12 12:30:18 +02:00
junglejet c4956704e7 --mlat option and --interactive-rtl1090 option added
--mlat option introduced: to display raw data in Beast ascii format with
counter (@...;), does not affect Beast binary format ;
--interactive-rtl1090 option introduced: order of flight table Iin
interactive mode) and some formats adopted to RTL1090 format, so
comparison is easier
2013-04-12 12:15:52 +02:00
Malcolm Robb 63622355e3 Change the message bit decoder
Change (and hopefully improve) the Message bit decoder.

When decoding bits, a "0" is encoded as (m[j]<m[j+1]), and a "1" is
(m[j]>m[j+1]) . However, there is a problem if mpj[ == m[j+1] because we
can't decide what it's supposed to be.

Antirez's original code defaults to a '1', and then lets the bit error
detection code sort it out. I *think* it's better to default to '0'
because it's more likely that noise added to the signal will produce a
spurious '1' rathar than anything subtracting from the signal to produce
a spurious '0'

Also, Antirez''s code only looks for errors in the first bit of the
message. I don't know why  this is.

There is a potential problem in deciding the message length if there are
any errors in the first 5 bits decoded, because this defines the message
type (the DF-??), and it's the DF that determines how many bits the
message shall contain.

If there is an error in the first 5 bits, then we could ignore the DF,
and continue decoding a long format (112 bits). However, for weak
signals, if the message is a short one (56 bits) this results in the
sigStrength decaying to the point where it's level drops below squelch,
so we discard a possibly decodeable 56bit

However, if we assume it's a short message, and only decode 56 bits, and
it's really a long message we won't have decoded all the bits.

Not sure what to do about this
2013-04-12 10:53:46 +01:00
Malcolm Robb ff697dbb51 Improve the decoding for DF-11
Three changes in this one

1) Change the checksum testing for DF-11
2) Recode the Checksum generation routine to use pointers.
3) Tidy up the appearance of some print debug statments
2013-04-11 19:01:03 +01:00
Malcolm Robb dc7e2b6a22 Change the type of the stats variables from uint64_t to int64_t
Some compilers complain about the printf %llx format being used with a
uint64_t
2013-04-11 18:53:09 +01:00
Malcolm Robb 22c329849a Change the I/Q lookup table values for better detection
Change the I/Q lookup table for better detection. Changes fully
described in the source dump1090.c at line 347 onwards. This change
results in about 30% more frames being detected at weak signal input
levels.

Also a bug fix from the last commit - C doesn't support the min()
function.
2013-04-10 20:57:09 +01:00
Malcolm Robb f806f1899e Basic tidy up of the modesInit() function 2013-04-10 12:16:25 +01:00
Malcolm Robb f1935b280c Get rid of that hideous goto
I'm not overly keen on the continues either :-)
2013-04-10 11:43:55 +01:00
Malcolm Robb e59142b9dc Merge the data bit detection and data byte assembly into the same loop
Original code loops through the analogue array m[] detecting data bits
and putting them into the bits[] array. It then loops through all the
bits[] creating the msg[] byte array. It then loops through the analogue
array m[] again calculating the signal strength.

Change this so that everything is done in one loop so we can go straight
from analogue samples to bytes, calculating the signal strength on the
fly.

Also use the results of the signal strength calculation to populate the
message records mm.signalLevel variable.
2013-04-10 11:33:18 +01:00
Malcolm Robb d85939c4f5 Create a payload pointer in message detector loop
Create a pointer, pPayload, which points to the start of the data bits
in the analogue sample buffer m[]. So pPayload =
&m[j+MODES_PREAMBLE_SAMPLES] Then use this
pointer to perform the data bit detection tests.  It should save a few
cpu cycles per test because accessing pPayload[2] should be quicker than
m[2+j+MODES_PREAMBLE_SAMPLES].

Also change the way phase correction works. the original code saves the
original data (from m[pPayload] to aux[], and then phase corrects m[],
and then restores aux[] back to m[] afterwards. Change this so that m[]
is copied to aux[] and then phase correction is carried out in aux[],
and the pPayload pointer points to aux[]. This then avoids the
requirement to copy aux[] back to m[] afterwards, which saves a fair few
CPU cycles.
2013-04-10 11:08:19 +01:00
Malcolm Robb 70031e1234 Create a preamble pointer in the message detector loop
Create a pointer, pPreamble, which points to the start of the preamble
in the analogue sample buffer m[]. So pPreamble = &m[p] Then use this
pointer to perform the preamble detection tests.  It should save a few
cpu cycles per test because accessing pPointer[2] should be quicker than
m[p+2].

Also move the decision on whether to try OutOfPhase correction to the
end of the first pass, rather than automatically going into phase
correction if the first pass fails. This saves two memcpy's if the
decision in the second pass is to not do phase correction.
2013-04-10 00:48:29 +01:00
Malcolm Robb ff34693d1e Make Things more Windows friendly
Change the following so that M$ compilers and debuggers complain less

1) change all long long data types to uint64_t.
2) Typecast all malloc function returns to the correct pointer types.
3) Explicitly typecast all float to int conversions.
4) Remove inline variable declaration. Allowed in C++, but not in C.
2013-04-09 23:56:20 +01:00
Malcolm Robb 4f7b51a93f Change timer granularity & incorporate terribl's latest changes
Apparently, the Beast output timestamp has a frequency of 12 Mhz.
Therefore, I've updated the timestamp counter to simulate a 12 Mhz
frequency.

Also incorporate terribls latest updates
2013-04-09 21:50:58 +01:00
Malcolm Robb ed80552ca1 Speed up the I/Q to magnitude calculation
Increase the speed of the I/Q to magnitude calculation lookup by
expanding the table to 65536 entries (256*256*2 bytes). At runtime, this
allows us to pick up raw I/Q bytes as a 16 bit value and index into the
magnitude table to get a 16 bit result. This removes the need for
subtracting 127, and then correcting for -ve numbers, so should be
faster, at the expense of a larger data table.

Change the maglut lookup table from 129*129 to 256*256
Initialise the maglut buffer accordingly
Change the data->maglut lookup to use the new maglut buffer
Change the I/Q data buffer pointet to a uint16_t *
2013-04-09 00:58:32 +01:00
Malcolm Robb 3113223029 One bug fix, and some changes to the --interactive output format
I messed up merging the Squawk display in interactive mode into my
master.

However, the original source posted by terribl causes a print line
length greater than 80 characters. This in turn causes the lines to
spill over on a terminal display. I have therefore re-formatted some of
the output so that it fits within 80 characters.
2013-04-08 23:19:48 +01:00
Malcolm Robb 43c648448f Added some other peoples commit modificatons
Added dtiller's --quiet and --ppm modifications
Added terribl's squawk on interactive modifications

Removed up some unused or un-needed variables
2013-04-08 16:42:27 +01:00
Malcolm Robb d3662bba80 Implemented Beast Binary output 2013-04-07 16:22:02 +01:00
antirez 3307261546 CPR decoding: southern hemisphere coords are now handled correctly. 2013-02-02 14:40:58 +01:00
antirez e9e07e0778 Improved Google map interace: select planes and see details. 2013-01-27 01:37:05 +01:00
antirez 27e3743d87 Remove stale aircrafts when --interactive is not enabled. 2013-01-27 01:25:22 +01:00
antirez 977493cf63 Strong preamble detection even with --aggressive.
To try to decode messages with a fundamentally flawed preamble is mostly
a useless waste of CPU time.

The new aggressive mode still detects a sensible percentage of
additional messages because of the error tolerance and two-bits fixes
but does not waste your CPU time.
2013-01-26 13:03:24 +01:00
antirez 184953ff92 Phase correction fixed, code reshaped to apply more corrections.
The phase correction was applied only to a subset of bits! Because of an
offset error.

The detection code layout was modified a bit to make it simpler to
implement more corrections in the future. However only phase correction
is performed currently. Slope correction, or to compensate for the cycloid
effect are two possible improvements.
2013-01-26 12:58:08 +01:00
antirez 11d8db0d38 Properly initialize ICAO cached addresses hash table. 2013-01-26 01:15:24 +01:00
antirez c2e79d4555 Many small improvements (see full commit message).
* Better preamble detection to skip most of the messages we'll likely
  not be able to decode.

* A Phase correction algorithm that improves the recognition compared
  to the previous algorithm used.

* Javascript output in debug mode, and a debug.html file that can be
  used in order to see graphically undecoded samples.

* Ability to detect cross-read messages, that are, messages that happen
  to start and end across two different reads from the device or file.

* A few bugx fixed.

* README improved.
2013-01-26 01:08:13 +01:00
antirez 9086290b03 SBS-1: Code style adapted to code base. 2013-01-20 00:17:58 +01:00
Kemal Hadimli 071a021f20 New feature: Output in SBS format 2013-01-19 22:44:11 +01:00
antirez 2fe188286e Do not modify the packet when AP gets decoded. 2013-01-19 18:45:00 +01:00
antirez c9bb48675c Squawk extraction fixed. 2013-01-19 18:44:54 +01:00
antirez b4805ea7d4 Two important fixes to CPR decoding: wrong cast and more precise timing.
This commit address two issues with the implementation of CPR decoding:

Fix #1: The two functions N() and DLon() used to have the latitude
parameter as an integer (!), basically truncating the fractional part
before calling the NL() function to perform the lookup.

This resulted into random strange movements of aircrafts, especially
jumps or shifted positions.

Fix #2: Use milliseconds for CPR odd/even timestamps. Dump1090 already
tried to use the most recent packet received among the odd and even
packets currently available, however to do this correctly millisecond
resolution should be used, otherwise many times the odd and even packet
appear to have the same time in seconds and we don't always use the
latest received.
2013-01-18 23:05:08 +01:00
antirez 03759a3eb0 Google map view enhanced: color by altitude and more. 2013-01-16 20:25:28 +01:00
antirez 21fc9de47a HTTP keep-alive fixed. Network debugging capabilities. 2013-01-16 20:07:35 +01:00
antirez e40e55bfe0 Less buggy network requests parser. 2013-01-16 00:40:47 +01:00
antirez dc91712741 Aggressive mode implemented. 2013-01-15 22:37:47 +01:00
antirez 0bf65d8646 Better error handling for network clients. 2013-01-15 00:35:21 +01:00
antirez e1d3724271 Regression fixed: set client socket non-blocking. 2013-01-15 00:24:19 +01:00
antirez 42eb990685 HTTP: Set clen correctly when serving gmap.html. 2013-01-14 20:25:11 +01:00
antirez a583615b66 Initial HTTP support with planes animated using google map. 2013-01-14 15:13:43 +01:00
antirez b10c8dab35 CPR decoding fixed. 2013-01-12 18:18:23 +01:00
antirez 0ce746dc5f Ability to receive traffic from network. 2013-01-12 11:46:32 +01:00
antirez b5ff48e5f5 Network server sending raw data to clients. 2013-01-10 20:58:13 +01:00
antirez 539039f037 Set heading to 0 when speed is 0. 2013-01-10 19:03:41 +01:00
antirez af4964d72f With --raw fflush() at every output to avoid delays. 2013-01-10 19:01:28 +01:00
antirez b6907f400a CPR position decoding. Track calculation from velocity components. 2013-01-09 22:51:29 +01:00
antirez ec1f34f572 Fix for --metric 2013-01-08 20:02:58 +01:00
antirez 32fe8d8d69 New --metric option to use meters and km/h in --interactive. 2013-01-08 19:46:50 +01:00
antirez f231c7adb2 Remove idle aircrafts in interactive mode. 2013-01-08 19:25:28 +01:00
antirez 3f47bb6f47 Initialize aircraft speed in interactive mode.
The effect of this bug was random speeds displayed with --interactive.
2013-01-08 19:23:51 +01:00
antirez 1576b61af5 Minor aesthetic change to interactive mode. 2013-01-07 01:50:34 +01:00
antirez 840a005d16 Interactive mode with --ifile: play at natural speed. 2013-01-07 01:47:39 +01:00
antirez 69ae2491a5 New AP brute forcing algorithm.
The old approach was to loop over a small circular buffer of recently
seen addresses recomputing the CRC every time: this prevented the use of
a big cache, and 20 entries was too small in case of high traffic and
big range antennas.

@prog on ##rtlsdr suggested to use an alternative algorithm where
instead we compute the CRC of the message, and xor it to obtain the
address, that is later checked in our list of recently seen addresses.
This is a lot better and allows for bigger tables in O(1) lookup time.

I used this idea to implement a larger 1024 elements table. Instead of
writing a proper hash table I used the fact we are just dealing with a
cache, so I just hash the ICAO addess and overwrite the old entry at
that idex with the address-timestamp pair, not caring about collisions.

The bigger table makes a huge difference:
In a test vector of 113 seconds recording with 76 simultaneous aircrafts
the new algorithm detected around 10k more messages (!).
2013-01-07 01:15:29 +01:00
antirez fed415b699 Show 16 bit magnitude value with --debug. 2013-01-07 00:29:35 +01:00
antirez 0a7c5c2e2e Threads locking model fixed (reliable --ifile). 2013-01-06 22:56:32 +01:00
antirez c653e0e95d Added a new --onlyaddr option to just output ICAO addresses. 2013-01-06 17:09:31 +01:00
antirez b3945d1b4f Use 16 bit for the magnitude vector to improve sensitivity.
As @keenerd noted on ##rtlsdr, using an 8 bit magnitude vector is not
enough in order to distinguish every different I/Q pair.

With this commit a few more messages with good CRC are detected.
2013-01-06 16:54:54 +01:00
antirez 417cab5fda Improved message detection and --stats option.
The demodulation algorithm now only skips the current message if the
CRC is valid, this improves the amount of messages detected with good
CRC by ~ 4% since sometimes we are just a few samples out of sync.

This also improves the amount of messages that can be fixed.

The --stats option was added in order to better evaluate how the
algorithm performs on the same input after some change. So if you run
the program with both --ifile and --stats no Mode S message is logged
at all, but at the end of the processing the program shows you the
amount of messages decoded with good, bad crc, bit corrections, valid
preambles and so forth.
2013-01-06 15:13:40 +01:00
antirez f01324cea4 Interactive mode: new switch --interactive-rows for max # of rows. 2013-01-05 21:41:09 +01:00
antirez d974a4db90 Everything renamed dump1090 (was mode1090). 2013-01-05 20:00:46 +01:00
Renamed from mode1090.c (Browse further)