// Part of dump1090, a Mode S message decoder for RTLSDR devices. // // mode_s.h: Mode S message decoding (prototypes) // // Copyright (c) 2017 FlightAware, LLC // Copyright (c) 2017 Oliver Jowett // // This file is free software: you may copy, redistribute and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation, either version 2 of the License, or (at your // option) any later version. // // This file is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef MODE_S_H #define MODE_S_H #include // // Functions exported from mode_s.c // int modesMessageLenByType(int type); int scoreModesMessage(unsigned char *msg, int validbits); int decodeModesMessage (struct modesMessage *mm, unsigned char *msg); void displayModesMessage(struct modesMessage *mm); void useModesMessage (struct modesMessage *mm); // datafield extraction helpers // The first bit (MSB of the first byte) is numbered 1, for consistency // with how the specs number them. // Extract one bit from a message. static inline __attribute__((always_inline)) unsigned getbit(unsigned char *data, unsigned bitnum) { unsigned bi = bitnum - 1; unsigned by = bi >> 3; unsigned mask = 1 << (7 - (bi & 7)); return (data[by] & mask) != 0; } // Extract some bits (firstbit .. lastbit inclusive) from a message. static inline __attribute__((always_inline)) unsigned getbits(unsigned char *data, unsigned firstbit, unsigned lastbit) { unsigned fbi = firstbit - 1; unsigned lbi = lastbit - 1; unsigned nbi = (lastbit - firstbit + 1); unsigned fby = fbi >> 3; unsigned lby = lbi >> 3; unsigned nby = (lby - fby) + 1; unsigned shift = 7 - (lbi & 7); unsigned topmask = 0xFF >> (fbi & 7); assert (fbi <= lbi); assert (nbi <= 32); assert (nby <= 5); if (nby == 5) { return ((data[fby] & topmask) << (32 - shift)) | (data[fby + 1] << (24 - shift)) | (data[fby + 2] << (16 - shift)) | (data[fby + 3] << (8 - shift)) | (data[fby + 4] >> shift); } else if (nby == 4) { return ((data[fby] & topmask) << (24 - shift)) | (data[fby + 1] << (16 - shift)) | (data[fby + 2] << (8 - shift)) | (data[fby + 3] >> shift); } else if (nby == 3) { return ((data[fby] & topmask) << (16 - shift)) | (data[fby + 1] << (8 - shift)) | (data[fby + 2] >> shift); } else if (nby == 2) { return ((data[fby] & topmask) << (8 - shift)) | (data[fby + 1] >> shift); } else if (nby == 1) { return (data[fby] & topmask) >> shift; } else { return 0; } } extern char ais_charset[64]; #endif