From 519f8cfebc1ad4e8909a321997b2c1fa9d6b5474 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 1 Dec 2015 21:28:53 -0800 Subject: [PATCH] Extract Manchester decoder, formatter. --- firmware/application/Makefile | 1 + firmware/application/manchester.cpp | 57 ++++++++++++++++++++ firmware/application/manchester.hpp | 77 ++++++++++++++++++++++++++++ firmware/application/ui_receiver.cpp | 75 --------------------------- 4 files changed, 135 insertions(+), 75 deletions(-) create mode 100644 firmware/application/manchester.cpp create mode 100644 firmware/application/manchester.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 94687405..60b109c9 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -170,6 +170,7 @@ CPPSRC = main.cpp \ spectrum_color_lut.cpp \ ais_baseband.cpp \ sd_card.cpp \ + manchester.cpp \ ../common/utility.cpp \ ../common/chibios_cpp.cpp \ ../common/debug.cpp \ diff --git a/firmware/application/manchester.cpp b/firmware/application/manchester.cpp new file mode 100644 index 00000000..95205043 --- /dev/null +++ b/firmware/application/manchester.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "manchester.hpp" + +// TODO: SERIOUSLY!? Including this, just to use to_string_hex?! Refactor!!!1 +#include "ui_widget.hpp" + +ManchesterFormatted format_manchester( + const ManchesterDecoder& decoder +) { + const size_t payload_length_decoded = decoder.symbols_count(); + const size_t payload_length_hex_characters = (payload_length_decoded + 3) / 4; + const size_t payload_length_symbols_rounded = payload_length_hex_characters * 4; + + std::string hex_data; + std::string hex_error; + hex_data.reserve(payload_length_hex_characters); + hex_error.reserve(payload_length_hex_characters); + + uint_fast8_t data = 0; + uint_fast8_t error = 0; + for(size_t i=0; i +#include +#include +#include + +class ManchesterDecoder { +public: + struct DecodedSymbol { + uint_fast8_t value; + uint_fast8_t error; + }; + + constexpr ManchesterDecoder( + const std::bitset<1024>& encoded, + const size_t count, + const size_t sense = 0 + ) : encoded { encoded }, + count { count }, + sense { sense } + { + } + + DecodedSymbol operator[](const size_t index) const { + const size_t encoded_index = index * 2; + if( (encoded_index + 1) < count ) { + const auto value = encoded[encoded_index + sense]; + const auto error = encoded[encoded_index + 0] == encoded[encoded_index + 1]; + return { value, error }; + } else { + return { 0, 1 }; + } + } + + size_t symbols_count() const { + return count / 2; + } + +private: + const std::bitset<1024>& encoded; + const size_t count; + const size_t sense; +}; + +struct ManchesterFormatted { + const std::string data; + const std::string errors; +}; + +ManchesterFormatted format_manchester( + const ManchesterDecoder& decoder +); + +#endif/*__MANCHESTER_H__*/ diff --git a/firmware/application/ui_receiver.cpp b/firmware/application/ui_receiver.cpp index 66ea5473..182b6bac 100644 --- a/firmware/application/ui_receiver.cpp +++ b/firmware/application/ui_receiver.cpp @@ -497,81 +497,6 @@ ReceiverView::~ReceiverView() { receiver_model.disable(); } -class ManchesterDecoder { -public: - struct DecodedSymbol { - uint_fast8_t value; - uint_fast8_t error; - }; - - constexpr ManchesterDecoder( - const std::bitset<1024>& encoded, - const size_t count, - const size_t sense = 0 - ) : encoded { encoded }, - count { count }, - sense { sense } - { - } - - DecodedSymbol operator[](const size_t index) const { - const size_t encoded_index = index * 2; - if( (encoded_index + 1) < count ) { - const auto value = encoded[encoded_index + sense]; - const auto error = encoded[encoded_index + 0] == encoded[encoded_index + 1]; - return { value, error }; - } else { - return { 0, 1 }; - } - } - - size_t symbols_count() const { - return count / 2; - } - -private: - const std::bitset<1024>& encoded; - const size_t count; - const size_t sense; -}; - -struct ManchesterFormatted { - const std::string data; - const std::string errors; -}; - -static ManchesterFormatted format_manchester( - const ManchesterDecoder& decoder -) { - const size_t payload_length_decoded = decoder.symbols_count(); - const size_t payload_length_hex_characters = (payload_length_decoded + 3) / 4; - const size_t payload_length_symbols_rounded = payload_length_hex_characters * 4; - - std::string hex_data; - std::string hex_error; - hex_data.reserve(payload_length_hex_characters); - hex_error.reserve(payload_length_hex_characters); - - uint_fast8_t data = 0; - uint_fast8_t error = 0; - for(size_t i=0; i