// Copyright 2020 Mobilinkd LLC. #pragma once #include #include #include #include namespace modemm17 { template struct M17Framer { M17Framer() { reset(); } static constexpr size_t size() { return N; } size_t operator()(int dibit, int8_t** result) { buffer_[index_++] = (dibit >> 1) ? 1 : -1; buffer_[index_++] = (dibit & 1) ? 1 : -1; if (index_ == N) { index_ = 0; *result = buffer_.data(); return N; } return 0; } // LLR mode size_t operator()(std::tuple symbol, int8_t** result) { buffer_[index_++] = std::get<0>(symbol); buffer_[index_++] = std::get<1>(symbol); if (index_ == N) { index_ = 0; *result = buffer_.data(); return N; } return 0; } void reset() { buffer_.fill(0); index_ = 0; } private: alignas(16) std::array buffer_; size_t index_ = 0; }; } // modemm17