diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index a433b35..c97d302 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -23,7 +23,6 @@ list(APPEND debug_blocks satnogs_morse_debug_source.xml satnogs_debug_msg_source.xml satnogs_debug_msg_source_raw.xml - satnogs_leo_channel.xml satnogs_cw_encoder.xml ) @@ -51,7 +50,6 @@ list(APPEND enabled_blocks satnogs_ogg_source.xml satnogs_noaa_apt_sink.xml satnogs_whitening.xml - satnogs_frame_acquisition.xml ) if(${INCLUDE_DEBUG_BLOCKS}) diff --git a/grc/satellites/CMakeLists.txt b/grc/satellites/CMakeLists.txt index 69d7f61..ce8e44c 100644 --- a/grc/satellites/CMakeLists.txt +++ b/grc/satellites/CMakeLists.txt @@ -18,4 +18,4 @@ # Boston, MA 02110-1301, USA. -add_subdirectory(upsat) + diff --git a/grc/satellites/upsat/CMakeLists.txt b/grc/satellites/upsat/CMakeLists.txt deleted file mode 100644 index 006546f..0000000 --- a/grc/satellites/upsat/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. - -list(APPEND blocks - satnogs_qb50_deframer.xml - satnogs_upsat_fsk_frame_acquisition.xml - satnogs_upsat_fsk_frame_encoder.xml - satnogs_upsat_transmitter.xml -) - -install(FILES - ${blocks} - DESTINATION share/gnuradio/grc/blocks -) \ No newline at end of file diff --git a/grc/satellites/upsat/satnogs_qb50_deframer.xml b/grc/satellites/upsat/satnogs_qb50_deframer.xml deleted file mode 100644 index 09b4544..0000000 --- a/grc/satellites/upsat/satnogs_qb50_deframer.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - QB50 AX.25 Deframer - satnogs_qb50_deframer - import satnogs - satnogs.qb50_deframer($wod_ssid) - - - WOD SSID - wod_ssid - 0xe - int - - - - in - message - - - - out - message - - - - wod - message - - - diff --git a/grc/satellites/upsat/satnogs_upsat_fsk_frame_acquisition.xml b/grc/satellites/upsat/satnogs_upsat_fsk_frame_acquisition.xml deleted file mode 100644 index 698f2e8..0000000 --- a/grc/satellites/upsat/satnogs_upsat_fsk_frame_acquisition.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - UPSAT FSK Frame Acquisition - satnogs_upsat_fsk_frame_acquisition - import satnogs - satnogs.upsat_fsk_frame_acquisition($preamble, $sync_word, $whitening, $manchester, $check_crc, $ax_25, $whitening_mask, $whitening_seed, $whitening_order, $packet_len) - - - Frame Preamble - preamble - raw - - - - Synchronization Word - sync_word - raw - - - - Whitening - whitening - enum - - - - - - Use Manchester Coding - manchester - enum - - - - - - Check CRC - check_crc - enum - - - - - - Use AX.25 encapsulation - ax_25 - enum - - - - - - Whitening mask - whitening_mask - 0x1001 - int - - - - Whitening seed - whitening_seed - 0x1FF - int - - - - Whitening order - whitening_order - 17 - int - - - - Packet length - packet_len - 0 - int - - - - in - float - - - - pdu - message - - diff --git a/grc/satellites/upsat/satnogs_upsat_fsk_frame_encoder.xml b/grc/satellites/upsat/satnogs_upsat_fsk_frame_encoder.xml deleted file mode 100644 index bebc82f..0000000 --- a/grc/satellites/upsat/satnogs_upsat_fsk_frame_encoder.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - UPSAT FSK Frame Encoder - satnogs_upsat_fsk_frame_encoder - import satnogs - satnogs.upsat_fsk_frame_encoder($preamble, $sync_word, $append_crc, $whitening, $manchester, $msb_first, $ax_25, $src_addr, $src_ssid, $dest_addr, $dest_ssid, $settling_samples) - - - Frame Preamble - preamble - raw - - - - Synchronization Word - sync_word - raw - - - - Append CRC - append_crc - enum - - - - - - Whitening - whitening - enum - - - - - - Use Manchester Coding - manchester - enum - - - - - - Send MS bit first - msb_first - enum - - - - - - Use AX.25 encapsulation - ax_25 - enum - - - - - - Destination Callsign - dest_addr - string - - - - Destination SSID - dest_ssid - int - - - - Source Callsign - src_addr - string - - - - Source SSID - src_ssid - int - - - - Number of zero settling samples - settling_samples - 64 - int - - - - pdu - message - - - - out - float - - diff --git a/grc/satellites/upsat/satnogs_upsat_transmitter.xml b/grc/satellites/upsat/satnogs_upsat_transmitter.xml deleted file mode 100644 index 822a7ac..0000000 --- a/grc/satellites/upsat/satnogs_upsat_transmitter.xml +++ /dev/null @@ -1,180 +0,0 @@ - - Satnogs UPSat Transmitter - satnogs_upsat_transmitter - import satnogs - - satnogs.satnogs_upsat_transmitter(frame_preamble=$frame_preamble, - sync_word=$sync_word, - append_crc=$append_crc, - whitening=$whitening, - manchester=$manchester, - msb_first=$msb_first, - ax25_format=$ax25_format, - dest_addr=$dest_addr, - dest_ssid=$dest_ssid, - src_addr=$src_addr, - src_ssid=$src_ssid, - settling_samples=$settling_samples, - samps_per_symbol=$interp, - interpolation_taps=$taps, - samp_rate=$samp_rate, - lo_offset=$lo_offset, - deviation=$deviation, - baud_rate=$baud_rate) - - - Frame Preamble - frame_preamble - raw - - - Synchronization Word - sync_word - raw - - - Append CRC - append_crc - enum - - - - - - Whitening - whitening - enum - - - - - - Use Manchester Coding - manchester - enum - - - - - - Send MS bit first - msb_first - enum - - - - - - Use AX.25 encapsulation - ax25_format - enum - - - - - - Destination Callsign - dest_addr - string - - - - Destination SSID - dest_ssid - int - - - - Source Callsign - src_addr - string - - - - Source SSID - src_ssid - int - - - - Number of zero settling samples - settling_samples - 64 - int - - - - FIR filter Interpolation - interp - 1 - int - - - Interpolation Taps - taps - real_vector - - - Sampling rate - samp_rate - real - - - LO offset - lo_offset - real - - - baud rate - baud_rate - real - - - Deviation - deviation - real - - - - - in - message - - - - out - complex - - - - \ No newline at end of file diff --git a/grc/satnogs_block_tree.xml b/grc/satnogs_block_tree.xml index cd6db93..71e9748 100644 --- a/grc/satnogs_block_tree.xml +++ b/grc/satnogs_block_tree.xml @@ -13,7 +13,6 @@ UPSat - satnogs_upsat_fsk_frame_acquisition satnogs_upsat_fsk_frame_encoder satnogs_upsat_transmitter satnogs_qb50_deframer @@ -40,6 +39,5 @@ satnogs_ax25_encoder_mb satnogs_waterfall_sink variable_whitening - satnogs_frame_acquisition satnogs_frame_decoder \ No newline at end of file diff --git a/grc/satnogs_frame_acquisition.xml b/grc/satnogs_frame_acquisition.xml deleted file mode 100644 index 3560ee2..0000000 --- a/grc/satnogs_frame_acquisition.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - Generic Frame Acquisition - satnogs_frame_acquisition - import satnogs - satnogs.frame_acquisition($variant, $preamble, $preamble_thrsh, $sync_word, $sync_thrsh, $frame_size_field_len, $frame_len, $crc, $whitening, $max_frame_len) - - - Variant - variant - enum - - - - - - - Frame Preamble - preamble - [0x55, 0x55, 0x55, 0x55, 0x55] - raw - - - - Preamble Threshold - preamble_thrsh - 5 - int - - - - Synchronization Word - sync_word - [0x31, 0xe5] - raw - - - - Synchronization Word Threshold - sync_thrsh - 3 - int - - - - Frame Size Field Length - frame_size_field_len - 1 - int - >#if $variant() == 1 then 'none' else 'all'# - - - - Frame Length - frame_len - 128 - int - >#if $variant() == 0 then 'none' else 'all'# - - - - Maximum Frame Length - max_frame_len - 2048 - int - - - - Whitening - whitening - None - raw - - - - CRC - crc - enum - - - - - - - - - in - byte - - - - out - message - - diff --git a/grc/satnogs_leo_channel.xml b/grc/satnogs_leo_channel.xml deleted file mode 100644 index 8cabddd..0000000 --- a/grc/satnogs_leo_channel.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - LEO Channel - satnogs_leo_channel - [SatNOGS]/Debug - import satnogs - satnogs.leo_channel($freq, $freq_shifts_per_sec) - - - ... - ... - ... - - - - - in - - - - - - out - - - diff --git a/include/satnogs/CMakeLists.txt b/include/satnogs/CMakeLists.txt index ccf7442..d8bc7d0 100644 --- a/include/satnogs/CMakeLists.txt +++ b/include/satnogs/CMakeLists.txt @@ -51,7 +51,6 @@ list(APPEND HEADER_FILES doppler_correction_cc.h doppler_fit.h freq_drift.h - upsat_fsk_frame_acquisition.h upsat_fsk_frame_encoder.h whitening.h udp_msg_sink.h @@ -65,11 +64,12 @@ list(APPEND HEADER_FILES iq_sink.h lrpt_sync.h lrpt_decoder.h - frame_acquisition.h shift_reg.h golay24.h ax25_decoder.h json_converter.h + ieee802_15_4_variant_decoder.h + crc.h ) if(${INCLUDE_DEBUG_BLOCKS}) diff --git a/include/satnogs/ax25.h b/include/satnogs/ax25.h index 9971c72..fbcd456 100644 --- a/include/satnogs/ax25.h +++ b/include/satnogs/ax25.h @@ -21,7 +21,7 @@ #ifndef INCLUDE_SATNOGS_AX25_H_ #define INCLUDE_SATNOGS_AX25_H_ -#include +#include #include #include #include @@ -85,11 +85,7 @@ namespace gr static inline uint16_t ax25_fcs (uint8_t *buffer, size_t len) { - uint16_t fcs = 0xFFFF; - while (len--) { - fcs = (fcs >> 8) ^ crc16_ccitt_table_reverse[(fcs ^ *buffer++) & 0xFF]; - } - return fcs ^ 0xFFFF; + return crc::crc16_ax25(buffer, len); } /** diff --git a/include/satnogs/crc.h b/include/satnogs/crc.h new file mode 100644 index 0000000..4d290b6 --- /dev/null +++ b/include/satnogs/crc.h @@ -0,0 +1,71 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 INCLUDED_SATNOGS_CRC_H +#define INCLUDED_SATNOGS_CRC_H + +#include + +namespace gr +{ +namespace satnogs +{ + +/*! + * CRC class providing a range of different CRC calculation static methods + * + */ +class SATNOGS_API crc +{ +public: + typedef enum crc_type { + PDU = 0, + CRC_VALID, + FREQ_OFFSET, + CORRECTED_BITS, + TIME, + SAMPLE_START, + SAMPLE_CNT, + SYMBOL_ERASURES, + KEYS_NUM + } crc_t; + + static uint16_t + crc16_ccitt_reversed(const uint8_t *data, size_t len); + + static uint16_t + crc16_ccitt(const uint8_t *data, size_t len); + + static uint16_t + crc16_ax25(const uint8_t *data, size_t len); + + static uint16_t + crc16_ibm(const uint8_t *data, size_t len); + +private: + static const uint16_t crc16_ccitt_table_reverse[256]; + static const uint16_t crc16_ccitt_table[256]; +}; + +} // namespace satnogs +} // namespace gr + +#endif /* INCLUDED_SATNOGS_CRC_H */ + diff --git a/include/satnogs/ieee802_15_4_variant_decoder.h b/include/satnogs/ieee802_15_4_variant_decoder.h new file mode 100644 index 0000000..c532b26 --- /dev/null +++ b/include/satnogs/ieee802_15_4_variant_decoder.h @@ -0,0 +1,59 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 INCLUDED_SATNOGS_IEEE802_15_4_VARIANT_DECODER_H +#define INCLUDED_SATNOGS_IEEE802_15_4_VARIANT_DECODER_H + +#include +#include +#include + +namespace gr +{ +namespace satnogs +{ + +/*! + * \brief A IEEE 802.15.4 like decoder + * + * The IEEE 802.15.4 uses the well known preamble + sync word synchronization + * scheme. Many popular on Cubesats ICs like the Texas Instruments CC1xxx family + * or the AXxxxx of On Semiconductors follow this scheme. This decoder + * class provides a generic way to decode signals following this framing + * scheme. + * + */ +class SATNOGS_API ieee802_15_4_variant_decoder +{ +public: + ieee802_15_4_variant_decoder (const std::vector &preamble, + size_t preamble_threshold, + const std::vector &sync, + crc::crc_t crc, + whitening::whitening_sptr descrambler); + ~ieee802_15_4_variant_decoder (); +private: +}; + +} // namespace satnogs +} // namespace gr + +#endif /* INCLUDED_SATNOGS_IEEE802_15_4_VARIANT_DECODER_H */ + diff --git a/include/satnogs/upsat_fsk_frame_acquisition.h b/include/satnogs/upsat_fsk_frame_acquisition.h deleted file mode 100644 index 3d28b9b..0000000 --- a/include/satnogs/upsat_fsk_frame_acquisition.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- c++ -*- */ -/* - * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module - * - * Copyright (C) 2016,2017, - * Libre Space Foundation - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_H -#define INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_H - -#include -#include - -namespace gr -{ - namespace satnogs - { - - /*! - * \brief This block takes samples after the Clock Recovery block - * and tries to extract frames. This is performed by searching for a - * known preamble. For the byte synchronization the block tries to - * search for the specified synchronization word that should be present - * before the start of the payload. - * - * \ingroup satnogs - * - */ - class SATNOGS_API upsat_fsk_frame_acquisition : virtual public gr::sync_block - { - public: - typedef boost::shared_ptr sptr; - - /*! - * Creates the FSK frame acquisition block for the UPSAT satellite. - * @param preamble the bytes that consist the preamble of the frame - * - * @param sync_word the byte synchronization word - * - * @param whitening true if the transmitted data have been processed by - * the whitening algorithm of the CC1120 chip. False otherwise. - * - * @param manchester true if the transmitted data have been processed by - * the Manchester algorithm of the CC1120 chip. False otherwise. - * - * @param check_crc if set to true the decoder will push frames only if - * their CRC field in correct. - * - * @param ax25_format if set to true the frame contains an AX.25 - * encoded payload. Prior producing the payload, AX.25 decoding - * will be performed. If set to false, the payload will be pushed - * as it is. - * - * @param whitening_mask the polynomial of the scrambler - * @param whitening_seed the initial seed of the scrambler - * @param whitening_order the size of the scrambler's LFSR - * @param packet_len if set to 0 the decoder enters the variable - * packet length mode, where the packet length is indicated from the - * first byte after the SYNC word. Otherwise this field specifies the - * payload length in bytes. - */ - static sptr - make (const std::vector &preamble, - const std::vector &sync_word, bool whitening = false, - bool manchester = false, bool check_crc = true, - bool ax25_format = false, - uint32_t whitening_mask = 0x1001, - uint32_t whitening_seed = 0x1FF, - uint32_t whitening_order = 17, - size_t packet_len = 0); - }; - - } // namespace satnogs -} // namespace gr - -#endif /* INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_H */ - diff --git a/include/satnogs/utils.h b/include/satnogs/utils.h index 956c789..2d42795 100644 --- a/include/satnogs/utils.h +++ b/include/satnogs/utils.h @@ -2,7 +2,7 @@ /* * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module * - * Copyright (C) 2016,2018 Libre Space Foundation + * Copyright (C) 2016,2018,2019 Libre Space Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,134 +45,6 @@ mape (double ref, double estimation) return std::abs (ref - estimation) / ref; } -/** - * Lookup table for the CCITT CRC16 - */ -static const uint16_t crc16_ccitt_table_reverse[256] = - { 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, - 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, - 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, - 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, - 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, - 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, 0x3183, - 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, 0xBDCB, - 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, 0x4204, - 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, 0xCE4C, - 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, - 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, - 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, - 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, - 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, - 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, 0xFFCF, - 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, 0x8408, - 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, 0x0840, - 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, 0x9489, - 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, - 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, - 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, - 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, - 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, - 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, - 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, 0x4A44, - 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, 0xD68D, - 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, 0x5AC5, - 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, - 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, - 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, - 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, - 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78 }; - -static const uint16_t crc16_ccitt_table[256] = - { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, - 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, - 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, - 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, - 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, - 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, - 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, - 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, - 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, - 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, - 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, - 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, - 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, - 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, - 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, - 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, - 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, - 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, - 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, - 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, - 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, - 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, - 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, - 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, - 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, - 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, - 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, - 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, - 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, - 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, - 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, - 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; - - -static inline uint16_t -update_crc16_ccitt_reversed (uint16_t crc, const uint8_t *data, size_t len) -{ - register size_t i; - for (i = 0; i < len; i++) { - crc = (crc >> 8) ^ crc16_ccitt_table_reverse[(crc ^ data[i]) & 0xff]; - } - return crc; -} - -static inline uint16_t -crc16_ccitt_reversed (const uint8_t *data, size_t len) -{ - return update_crc16_ccitt_reversed (0xFFFF, data, len) ^ 0xFFFF; -} - -static uint16_t -update_crc16_ccitt (uint16_t crc, const uint8_t *buf, size_t len) -{ - while (len-- != 0) { - crc = crc16_ccitt_table[((crc >> 8) ^ *buf++) & 0xff] ^ (crc << 8); - } - return crc; -} - -static inline uint16_t -crc16_ccitt (const uint8_t *data, size_t len) -{ - return update_crc16_ccitt (0x0000, data, len); -} - -static uint16_t -update_crc16_ibm (uint8_t crc, uint16_t reg) -{ - const uint16_t crc_poly = 0x8005; - for (size_t i = 0; i < 8; i++) { - if (((reg & 0x8000) >> 8) ^ (crc & 0x80)) { - reg = (reg << 1) ^ crc_poly; - } - else { - reg = (reg << 1); - } - crc <<= 1; - } - return reg; -} - -static uint16_t -crc16_ibm (uint8_t *buf, size_t len) -{ - uint16_t crc = 0xFFFF; - for (size_t i = 0; i < len; i++) - crc = update_crc16_ibm (buf[i], crc); - return crc; -} - /** * Counts the number of active bits in x */ diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 700f0a1..9ff5782 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -57,7 +57,6 @@ list(APPEND satnogs_sources frame_encoder_impl.cc doppler_fit.cc freq_drift.cc - upsat_fsk_frame_acquisition_impl.cc upsat_fsk_frame_encoder_impl.cc whitening.cc udp_msg_sink_impl.cc @@ -72,11 +71,12 @@ list(APPEND satnogs_sources lrpt_sync_impl.cc convolutional_deinterleaver.cc lrpt_decoder_impl.cc - frame_acquisition_impl.cc shift_reg.cc golay24.cc ax25_decoder.cc - json_converter_impl.cc) + json_converter_impl.cc + ieee802_15_4_variant_decoder.cc + crc.cc) if(${INCLUDE_DEBUG_BLOCKS}) list(APPEND satnogs_sources ${satnogs_debug_sources}) @@ -129,6 +129,8 @@ list(APPEND test_satnogs_sources ${CMAKE_CURRENT_SOURCE_DIR}/qa_golay24.cc ${CMAKE_CURRENT_SOURCE_DIR}/test_satnogs.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_satnogs.cc + ${CMAKE_CURRENT_SOURCE_DIR}/qa_crc.cc + ${CMAKE_CURRENT_SOURCE_DIR}/qa_ieee802_15_4_variant_decoder.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_json_converter.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_ax25_decoder.cc ) diff --git a/lib/crc.cc b/lib/crc.cc new file mode 100644 index 0000000..b5ac7d8 --- /dev/null +++ b/lib/crc.cc @@ -0,0 +1,153 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +namespace gr +{ +namespace satnogs +{ + + +const uint16_t crc::crc16_ccitt_table_reverse[256] = + { 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, 0x8C48, + 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, 0x1081, 0x0108, + 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, 0x9CC9, 0x8D40, 0xBFDB, + 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, 0x2102, 0x308B, 0x0210, 0x1399, + 0x6726, 0x76AF, 0x4434, 0x55BD, 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, + 0xFAE7, 0xC87C, 0xD9F5, 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, + 0x54B5, 0x453C, 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, + 0xC974, 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, + 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, 0x5285, + 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, 0xDECD, 0xCF44, + 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, 0x6306, 0x728F, 0x4014, + 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, + 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, + 0x242A, 0x16B1, 0x0738, 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, + 0x9AF9, 0x8B70, 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, + 0xF0B7, 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, + 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, 0x18C1, + 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, 0xA50A, 0xB483, + 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, 0x2942, 0x38CB, 0x0A50, + 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, 0xB58B, 0xA402, 0x9699, 0x8710, + 0xF3AF, 0xE226, 0xD0BD, 0xC134, 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, + 0x6E6E, 0x5CF5, 0x4D7C, 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, + 0xA33A, 0xB2B3, 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, + 0x3EFB, 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, + 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, 0xE70E, + 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, 0x6B46, 0x7ACF, + 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, 0xF78F, 0xE606, 0xD49D, + 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, 0x7BC7, 0x6A4E, 0x58D5, 0x495C, + 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78 }; + +const uint16_t crc::crc16_ccitt_table[256] = + { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, + 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, + 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, + 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, + 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, + 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, + 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, + 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, + 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, + 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, + 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, + 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, + 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, + 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, + 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, + 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, + 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, + 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, + 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, + 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, + 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, + 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; + +uint16_t +crc::crc16_ccitt_reversed(const uint8_t *data, size_t len) +{ + uint16_t crc = 0xFFFF; + for (size_t i = 0; i < len; i++) { + crc = (crc >> 8) ^ crc16_ccitt_table_reverse[(crc ^ data[i]) & 0xff]; + } + return crc ^ 0xFFFF; +} + +uint16_t +crc::crc16_ccitt (const uint8_t *data, size_t len) +{ + uint16_t crc = 0; + while (len-- != 0) { + crc = crc16_ccitt_table[((crc >> 8) ^ *data++) & 0xff] ^ (crc << 8); + } + return crc; +} + +uint16_t +crc::crc16_ax25(const uint8_t *data, size_t len) +{ + uint16_t fcs = 0xFFFF; + while (len--) { + fcs = (fcs >> 8) ^ crc16_ccitt_table_reverse[(fcs ^ *data++) & 0xFF]; + } + return fcs ^ 0xFFFF; +} + +static uint16_t +update_crc16_ibm (uint8_t crc, uint16_t reg) +{ + const uint16_t crc_poly = 0x8005; + for (size_t i = 0; i < 8; i++) { + if (((reg & 0x8000) >> 8) ^ (crc & 0x80)) { + reg = (reg << 1) ^ crc_poly; + } + else { + reg = (reg << 1); + } + crc <<= 1; + } + return reg; +} + +uint16_t +crc::crc16_ibm(const uint8_t *data, size_t len) +{ + uint16_t crc = 0xFFFF; + for (size_t i = 0; i < len; i++) + crc = update_crc16_ibm (data[i], crc); + return crc; +} + +} /* namespace satnogs */ +} /* namespace gr */ + diff --git a/lib/ieee802_15_4_variant_decoder.cc b/lib/ieee802_15_4_variant_decoder.cc new file mode 100644 index 0000000..6c06743 --- /dev/null +++ b/lib/ieee802_15_4_variant_decoder.cc @@ -0,0 +1,47 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + + +namespace gr +{ +namespace satnogs +{ + +ieee802_15_4_variant_decoder::ieee802_15_4_variant_decoder ( + const std::vector &preamble, size_t preamble_threshold, + const std::vector &sync, crc::crc_t crc, + whitening::whitening_sptr descrambler) +{ +} + +ieee802_15_4_variant_decoder::~ieee802_15_4_variant_decoder () +{ +} + +} /* namespace satnogs */ +} /* namespace gr */ + diff --git a/lib/qa_crc.cc b/lib/qa_crc.cc new file mode 100644 index 0000000..7ecc225 --- /dev/null +++ b/lib/qa_crc.cc @@ -0,0 +1,39 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#include +#include +#include "qa_crc.h" +#include + +namespace gr +{ +namespace satnogs +{ + +void +qa_crc::t1 () +{ + // Put test here +} + +} /* namespace satnogs */ +} /* namespace gr */ + diff --git a/lib/qa_crc.h b/lib/qa_crc.h new file mode 100644 index 0000000..a0c7323 --- /dev/null +++ b/lib/qa_crc.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 _QA_CRC_H_ +#define _QA_CRC_H_ + +#include +#include + +namespace gr { + namespace satnogs { + + class qa_crc : public CppUnit::TestCase + { + public: + CPPUNIT_TEST_SUITE(qa_crc); + CPPUNIT_TEST(t1); + CPPUNIT_TEST_SUITE_END(); + + private: + void t1(); + }; + + } /* namespace satnogs */ +} /* namespace gr */ + +#endif /* _QA_CRC_H_ */ + diff --git a/lib/qa_ieee802_15_4_variant_decoder.cc b/lib/qa_ieee802_15_4_variant_decoder.cc new file mode 100644 index 0000000..3018f70 --- /dev/null +++ b/lib/qa_ieee802_15_4_variant_decoder.cc @@ -0,0 +1,39 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#include +#include +#include "qa_ieee802_15_4_variant_decoder.h" +#include + +namespace gr +{ +namespace satnogs +{ + +void +qa_ieee802_15_4_variant_decoder::t1 () +{ + // Put test here +} + +} /* namespace satnogs */ +} /* namespace gr */ + diff --git a/lib/qa_ieee802_15_4_variant_decoder.h b/lib/qa_ieee802_15_4_variant_decoder.h new file mode 100644 index 0000000..a015020 --- /dev/null +++ b/lib/qa_ieee802_15_4_variant_decoder.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- */ +/* + * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module + * + * Copyright (C) 2019, Libre Space Foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 _QA_IEEE802_15_4_VARIANT_DECODER_H_ +#define _QA_IEEE802_15_4_VARIANT_DECODER_H_ + +#include +#include + +namespace gr { + namespace satnogs { + + class qa_ieee802_15_4_variant_decoder : public CppUnit::TestCase + { + public: + CPPUNIT_TEST_SUITE(qa_ieee802_15_4_variant_decoder); + CPPUNIT_TEST(t1); + CPPUNIT_TEST_SUITE_END(); + + private: + void t1(); + }; + + } /* namespace satnogs */ +} /* namespace gr */ + +#endif /* _QA_IEEE802_15_4_VARIANT_DECODER_H_ */ + diff --git a/lib/qa_satnogs.cc b/lib/qa_satnogs.cc index fd72032..392ea2d 100644 --- a/lib/qa_satnogs.cc +++ b/lib/qa_satnogs.cc @@ -22,6 +22,8 @@ #include "qa_golay24.h" #include "qa_ax25_decoder.h" #include "qa_json_converter.h" +#include "qa_ieee802_15_4_variant_decoder.h" +#include "qa_crc.h" CppUnit::TestSuite * qa_satnogs::suite() @@ -30,5 +32,7 @@ qa_satnogs::suite() s->addTest(gr::satnogs::qa_golay24::suite()); s->addTest(gr::satnogs::qa_ax25_decoder::suite()); s->addTest(gr::satnogs::qa_json_converter::suite()); + s->addTest(gr::satnogs::qa_ieee802_15_4_variant_decoder::suite()); + s->addTest(gr::satnogs::qa_crc::suite()); return s; } diff --git a/lib/upsat_fsk_frame_acquisition_impl.cc b/lib/upsat_fsk_frame_acquisition_impl.cc deleted file mode 100644 index 92213a2..0000000 --- a/lib/upsat_fsk_frame_acquisition_impl.cc +++ /dev/null @@ -1,410 +0,0 @@ -/* -*- c++ -*- */ -/* - * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module - * - * Copyright (C) 2016,2017, - * Libre Space Foundation - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 . - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "upsat_fsk_frame_acquisition_impl.h" -#include -#include -#include -#include - -namespace gr -{ - namespace satnogs - { - - upsat_fsk_frame_acquisition::sptr - upsat_fsk_frame_acquisition::make (const std::vector &preamble, - const std::vector &sync_word, - bool whitening, bool manchester, - bool check_crc, bool ax25_format, - uint32_t whitening_mask, - uint32_t whitening_seed, - uint32_t whitening_order, - size_t packet_len) - { - return gnuradio::get_initial_sptr ( - new upsat_fsk_frame_acquisition_impl (preamble, sync_word, whitening, - manchester, check_crc, - ax25_format, whitening_mask, - whitening_seed, - whitening_order, - packet_len)); - } - - /* - * The private constructor - */ - upsat_fsk_frame_acquisition_impl::upsat_fsk_frame_acquisition_impl ( - const std::vector &preamble, - const std::vector &sync_word, bool whitening, bool manchester, - bool check_crc, bool ax25_format, uint32_t whitening_mask, - uint32_t whitening_seed, uint32_t whitening_order, - size_t packet_len) : - gr::sync_block ("upsat_fsk_frame_acquisition", - gr::io_signature::make (1, 1, sizeof(float)), - gr::io_signature::make (0, 0, 0)), - d_preamble (preamble), - d_preamble_len (preamble.size ()), - d_sync_word (sync_word), - d_sync_word_len (sync_word.size ()), - /* - * Preamble is used only for AGC. The true synchronization is - * performed using the SYNC word. For this reason if some preamble - * symbols are retrieved, the algorithm should immediately start - * searching for the SYNC word. - */ - d_search_for_sync_thrhld (d_preamble_len / 3), - d_whitening (whitening), - d_manchester (manchester), - d_check_crc (check_crc), - d_is_ax25 (ax25_format), - d_var_packet_len(packet_len == 0), - d_state (SEARCHING), - d_shifting_byte (0x0), - d_decoded_bytes (0), - d_decoded_bits (0), - d_frame_len (0), - d_descrambler (whitening_mask, whitening_seed, whitening_order) - { - size_t i; - message_port_register_out (pmt::mp ("pdu")); - if (d_preamble_len < 3) { - throw std::invalid_argument ("Preamble must be at least 2 bytes long"); - } - - if (d_sync_word_len < 1) { - throw std::invalid_argument ( - "Synchronization word must be at least 1 byte long"); - } - - for (i = 1; i < d_preamble_len; i++) { - if (d_preamble[i] != d_preamble[0]) { - throw std::invalid_argument ( - "The preamble should contain the same bytes"); - } - } - - d_pdu = new uint8_t[UPSAT_MAX_FRAME_LEN]; - d_ax25_tmp_buf = new uint8_t[2 * UPSAT_MAX_FRAME_LEN * 8]; - d_ax25_buf = new uint8_t[2 * UPSAT_MAX_FRAME_LEN]; - - /* If the fixed packet length is set, store the expected frame size */ - d_frame_len = packet_len; - } - - /* - * Our virtual destructor. - */ - upsat_fsk_frame_acquisition_impl::~upsat_fsk_frame_acquisition_impl () - { - delete[] d_pdu; - delete[] d_ax25_tmp_buf; - delete[] d_ax25_buf; - } - - inline void - upsat_fsk_frame_acquisition_impl::slice_and_shift (float in) - { - uint8_t tmp; - /* Slice the input into 0 and 1 bits */ - tmp = in > 0 ? 1 : 0; - d_shifting_byte = d_shifting_byte << 1; - d_shifting_byte |= tmp; - } - - inline void - upsat_fsk_frame_acquisition_impl::reset_state () - { - LOG_DEBUG("Enter reset"); - d_state = SEARCHING; - d_decoded_bytes = 0; - d_decoded_bits = 0; - d_shifting_byte = 0; - } - - inline void - upsat_fsk_frame_acquisition_impl::have_preamble () - { - LOG_DEBUG("Enter have preamble"); - d_state = HAVE_PREAMBLE; - d_decoded_bytes = 1; - } - - inline void - upsat_fsk_frame_acquisition_impl::searching_sync_word () - { - LOG_DEBUG("Enter searching sync"); - d_state = SEARCHING_SYNC_WORD; - d_decoded_bytes = 0; - d_decoded_bits = 0; - } - - inline void - upsat_fsk_frame_acquisition_impl::have_sync () - { - LOG_DEBUG("Enter have sync"); - d_state = HAVE_SYNC_WORD; - /* The first SYNC byte have already been found */ - d_decoded_bytes = 1; - d_decoded_bits = 0; - } - - inline void - upsat_fsk_frame_acquisition_impl::have_frame_len () - { - LOG_DEBUG("Enter frame len"); - d_descrambler.reset (); - d_state = HAVE_FRAME_LEN; - d_decoded_bytes = 0; - d_decoded_bits = 0; - } - - inline void - upsat_fsk_frame_acquisition_impl::have_payload () - { - LOG_DEBUG("Enter have payload"); - d_state = HAVE_PAYLOAD; - if(d_var_packet_len) { - d_decoded_bytes = 1; - } - else { - d_decoded_bytes = 0; - } - d_decoded_bits = 0; - } - - inline void - upsat_fsk_frame_acquisition_impl::unpack_ax25_bytes (size_t len_bytes) - { - size_t i; - uint8_t *in = d_pdu + 1; - - for (i = 0; i < len_bytes; i++) { - d_ax25_tmp_buf[8 * i] = (in[i] >> 7) & 0x1; - d_ax25_tmp_buf[8 * i + 1] = (in[i] >> 6) & 0x1; - d_ax25_tmp_buf[8 * i + 2] = (in[i] >> 5) & 0x1; - d_ax25_tmp_buf[8 * i + 3] = (in[i] >> 4) & 0x1; - d_ax25_tmp_buf[8 * i + 4] = (in[i] >> 3) & 0x1; - d_ax25_tmp_buf[8 * i + 5] = (in[i] >> 2) & 0x1; - d_ax25_tmp_buf[8 * i + 6] = (in[i] >> 1) & 0x1; - d_ax25_tmp_buf[8 * i + 7] = in[i] & 0x1; - } - - /* De-white the data if necessary */ - if (d_whitening) { - d_descrambler.descramble_one_bit_per_byte (d_ax25_tmp_buf, - d_ax25_tmp_buf, - len_bytes * 8); - } - } - - int - upsat_fsk_frame_acquisition_impl::work ( - int noutput_items, gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - int i; - uint16_t crc_received; - uint16_t crc_calc; - size_t ax25_frame_len = 0; - ax25_decode_status_t status; - size_t payload_len; - uint8_t *payload; - - const float *in = (const float *) input_items[0]; - - for (i = 0; i < noutput_items; i++) { - slice_and_shift (in[i]); - - switch (d_state) - { - case SEARCHING: - if (d_shifting_byte == d_preamble[0]) { - have_preamble (); - } - break; - case HAVE_PREAMBLE: - d_decoded_bits++; - - if (d_decoded_bits == 8) { - d_decoded_bits = 0; - if (d_shifting_byte == d_preamble[d_decoded_bytes]) { - d_decoded_bytes++; - if (d_decoded_bytes >= d_search_for_sync_thrhld) { - /* End of the preamble. It's time for the sync word */ - searching_sync_word (); - } - } - else { - /* Reset the preamble detection */ - reset_state (); - } - } - break; - case SEARCHING_SYNC_WORD: - d_decoded_bits++; - if (d_shifting_byte == d_sync_word[0]) { - have_sync (); - break; - } - - if (d_decoded_bits == 8) { - d_decoded_bits = 0; - d_decoded_bytes++; - /* - * If we decoded bytes have length greater than the preamble and - * the SYNC word, we lost the frame... - */ - if (d_decoded_bytes - > d_preamble_len - d_search_for_sync_thrhld - + d_sync_word_len) { - reset_state (); - } - } - break; - case HAVE_SYNC_WORD: - d_decoded_bits++; - if (d_decoded_bits == 8) { - d_decoded_bits = 0; - if (d_shifting_byte == d_sync_word[d_decoded_bytes]) { - d_decoded_bytes++; - if (d_decoded_bytes == d_sync_word_len) { - if(d_var_packet_len) { - have_frame_len (); - } - else{ - have_payload(); - } - } - } - else { - reset_state (); - } - } - break; - case HAVE_FRAME_LEN: - d_decoded_bits++; - if (d_decoded_bits == 8) { - - /* Length field has been whitened if the option is enabled */ - if (d_whitening) { - /* Frame length field is needed for the CRC calculation */ - d_descrambler.descramble (d_pdu, &d_shifting_byte, 1); - /* CRC is not included in the frame length field, but we want it */ - d_frame_len = 1 + d_pdu[0] + sizeof(uint16_t); - } - else { - /* Frame length field is needed for the CRC calculation */ - d_pdu[0] = d_shifting_byte; - /* CRC is not included in the frame length field, but we want it */ - d_frame_len = 1 + d_shifting_byte + sizeof(uint16_t); - } - have_payload (); - } - break; - case HAVE_PAYLOAD: - d_decoded_bits++; - if (d_decoded_bits == 8) { - if(d_var_packet_len) { - payload = d_pdu + 1; - payload_len = d_frame_len - 1; - } - else{ - payload = d_pdu; - payload_len = d_frame_len; - } - - d_decoded_bits = 0; - d_pdu[d_decoded_bytes] = d_shifting_byte; - d_decoded_bytes++; - - if (d_decoded_bytes == d_frame_len) { - if (d_is_ax25) { - - unpack_ax25_bytes (payload_len); - status = ax25_decode (d_ax25_buf, &ax25_frame_len, - d_ax25_tmp_buf, payload_len * 8); - if (status == AX25_DEC_OK) { - /* Skip the AX.25 header */ - message_port_pub ( - pmt::mp ("pdu"), - pmt::make_blob ( - d_ax25_buf + AX25_MIN_ADDR_LEN + 2, - ax25_frame_len - AX25_MIN_ADDR_LEN - 2)); - } - - /* - * We are done here. Whitening and FSK CRC is not supported - * when transmitting/receiving AX.25 frames - */ - reset_state (); - break; - } - - if (d_whitening) { - d_descrambler.descramble (payload, payload, payload_len); - } - - if (!d_check_crc) { - message_port_pub ( - pmt::mp ("pdu"), - pmt::make_blob (payload, - payload_len - sizeof(uint16_t))); - reset_state (); - break; - } - - /* Retrieve and check the CRC */ - memcpy (&crc_received, d_pdu + d_frame_len - sizeof(uint16_t), - sizeof(uint16_t)); - /* The CRC is transmitted in network byte order */ - crc_received = ntohs (crc_received); - crc_calc = crc16_ccitt (d_pdu, d_frame_len - sizeof(uint16_t)); - if (crc_calc == crc_received) { - message_port_pub ( - pmt::mp ("pdu"), - pmt::make_blob (payload, - payload_len - sizeof(uint16_t))); - } - else { - LOG_WARN("Frame with wrong CRC got 0x%x calc 0x%x", - crc_received, crc_calc); - } - reset_state (); - } - } - break; - default: - LOG_WARN("Unknown decoding state"); - } - } - - return noutput_items; - } - - } /* namespace satnogs */ -} /* namespace gr */ - diff --git a/lib/upsat_fsk_frame_acquisition_impl.h b/lib/upsat_fsk_frame_acquisition_impl.h deleted file mode 100644 index 74e760e..0000000 --- a/lib/upsat_fsk_frame_acquisition_impl.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- c++ -*- */ -/* - * gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module - * - * Copyright (C) 2016,2017 - * Libre Space Foundation - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_IMPL_H -#define INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_IMPL_H - -#include -#include -#include - -namespace gr -{ - namespace satnogs - { - - class upsat_fsk_frame_acquisition_impl : public upsat_fsk_frame_acquisition - { - private: - - /** - * Decoding FSM - */ - typedef enum - { - SEARCHING, //!< SEARCHING when searching for the start of the preamble - HAVE_PREAMBLE, //!< HAVE_PREAMBLE when the decoder is inside the preamble - SEARCHING_SYNC_WORD, - HAVE_SYNC_WORD, //!< HAVE_SYNC_WORD when the decoder is inside the sync word - HAVE_FRAME_LEN, //!< HAVE_FRAME_LEN when the decoder is inside the frame length field - HAVE_PAYLOAD //!< HAVE_PAYLOAD when the decoder process the palyload of the frame - } decoding_state_t; - - const std::vector d_preamble; - const size_t d_preamble_len; - const std::vector d_sync_word; - const size_t d_sync_word_len; - const size_t d_search_for_sync_thrhld; - const bool d_whitening; - const bool d_manchester; - const bool d_check_crc; - const bool d_is_ax25; - const bool d_var_packet_len; - decoding_state_t d_state; - uint8_t d_shifting_byte; - size_t d_decoded_bytes; - size_t d_decoded_bits; - size_t d_frame_len; - whitening d_descrambler; - uint8_t *d_pdu; - uint8_t *d_ax25_tmp_buf; - uint8_t *d_ax25_buf; - - inline void - slice_and_shift (float in); - - inline void - reset_state (); - inline void - have_preamble (); - inline void - searching_sync_word (); - inline void - have_sync (); - inline void - have_frame_len (); - inline void - have_payload (); - inline void - unpack_ax25_bytes (size_t len_bytes); - - public: - upsat_fsk_frame_acquisition_impl (const std::vector &preamble, - const std::vector &sync_word, - bool whitening, bool manchester, - bool check_crc, bool ax25_format, - uint32_t whitening_mask, - uint32_t whitening_seed, - uint32_t whitening_order, - size_t packet_len); - ~upsat_fsk_frame_acquisition_impl (); - - // Where all the action really happens - int - work (int noutput_items, gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); - }; - - } // namespace satnogs -} // namespace gr - -#endif /* INCLUDED_SATNOGS_UPSAT_FSK_FRAME_ACQUISITION_IMPL_H */ - diff --git a/lib/upsat_fsk_frame_encoder_impl.cc b/lib/upsat_fsk_frame_encoder_impl.cc index f283ed1..9661940 100644 --- a/lib/upsat_fsk_frame_encoder_impl.cc +++ b/lib/upsat_fsk_frame_encoder_impl.cc @@ -26,6 +26,7 @@ #include "upsat_fsk_frame_encoder_impl.h" #include #include +#include #include namespace gr @@ -223,8 +224,8 @@ namespace gr /* If it is necessary calculate and append the CRC */ if (d_append_crc) { - crc = crc16_ccitt (d_pdu + d_preamble_len + d_sync_word_len, - d_pdu_len + 1); + crc = crc::crc16_ccitt (d_pdu + d_preamble_len + d_sync_word_len, + d_pdu_len + 1); /* CRC must be transmitted MSB first */ crc = htons (crc); memcpy (d_pdu + d_preamble_len + d_sync_word_len + 1 + d_pdu_len, diff --git a/swig/satnogs_swig0.i b/swig/satnogs_swig0.i index 4ccbda6..6709e0c 100644 --- a/swig/satnogs_swig0.i +++ b/swig/satnogs_swig0.i @@ -26,7 +26,6 @@ #include "satnogs/doppler_correction_cc.h" #include "satnogs/frame_decoder.h" #include "satnogs/frame_encoder.h" -#include "satnogs/upsat_fsk_frame_acquisition.h" #include "satnogs/upsat_fsk_frame_encoder.h" #include "satnogs/whitening.h" #include "satnogs/udp_msg_sink.h" @@ -42,8 +41,8 @@ #include "satnogs/json_converter.h" #include "satnogs/lrpt_decoder.h" #include "satnogs/lrpt_sync.h" -#include "satnogs/frame_acquisition.h" #include "satnogs/metadata.h" +#include "satnogs/crc.h" %} @@ -52,6 +51,8 @@ %include "satnogs/amsat_duv_decoder.h" %include "satnogs/ax25_decoder.h" %include "satnogs/metadata.h" +%include "satnogs/crc.h" + %include "satnogs/morse_decoder.h" GR_SWIG_BLOCK_MAGIC2(satnogs, morse_decoder); @@ -77,9 +78,6 @@ GR_SWIG_BLOCK_MAGIC2(satnogs, frame_encoder); %include "satnogs/doppler_correction_cc.h" GR_SWIG_BLOCK_MAGIC2(satnogs, doppler_correction_cc); -%include "satnogs/upsat_fsk_frame_acquisition.h" -GR_SWIG_BLOCK_MAGIC2(satnogs, upsat_fsk_frame_acquisition); - %include "satnogs/upsat_fsk_frame_encoder.h" GR_SWIG_BLOCK_MAGIC2(satnogs, upsat_fsk_frame_encoder); @@ -123,6 +121,3 @@ GR_SWIG_BLOCK_MAGIC2(satnogs, lrpt_sync); %include "satnogs/lrpt_decoder.h" GR_SWIG_BLOCK_MAGIC2(satnogs, lrpt_decoder); - -%include "satnogs/frame_acquisition.h" -GR_SWIG_BLOCK_MAGIC2(satnogs, frame_acquisition);