Basic structure figured out
This commit is contained in:
parent
0c3b9cd305
commit
6133e5e801
199
main.cpp
Normal file
199
main.cpp
Normal file
@ -0,0 +1,199 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
class IFrame
|
||||
{
|
||||
public:
|
||||
using FieldKey = int;
|
||||
|
||||
virtual bool read(const std::vector<uint8_t> &data) = 0;
|
||||
virtual bool write(std::vector<uint8_t> &data) const = 0;
|
||||
virtual bool set(const FieldKey key, int index, T value) = 0;
|
||||
bool set(const FieldKey key, T value)
|
||||
};
|
||||
|
||||
/*
|
||||
class Codec
|
||||
{
|
||||
public:
|
||||
virtual bool encode() = 0
|
||||
};*/
|
||||
|
||||
class TextFrame : public IFrame
|
||||
{
|
||||
public:
|
||||
std::string text;
|
||||
|
||||
TextFrame(const std::string &text) : text(text) {}
|
||||
|
||||
virtual bool read(const std::vector<uint8_t> &data) override {
|
||||
text = std::string(data.begin(), data.end());
|
||||
return true;
|
||||
}
|
||||
virtual bool write(std::vector<uint8_t> &data) const override {
|
||||
data = std::vector<uint8_t>(text.begin(), text.end());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class ComplexFrame : public IFrame
|
||||
{
|
||||
uint32_t from;
|
||||
uint32_t to;
|
||||
uint8_t flags;
|
||||
std::vector<uint8_t> data;
|
||||
};
|
||||
|
||||
class BaseCodec
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class Codec
|
||||
{
|
||||
public:
|
||||
using FrameType = T;
|
||||
using DecodeSignal = Signal<void(const FrameType &frame)>;
|
||||
using EncodeSignal = Signal<void(const std::vector<uint8_t> &data)>;
|
||||
|
||||
DecodeSignal decoded;
|
||||
EncodeSignal encoded;
|
||||
|
||||
bool encode(const FrameType &input, std::vector<uint8_t> &output) {
|
||||
auto success = doEncode(input, output);
|
||||
if (success) encoded.emit(output);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool decode(const std::vector<uint8_t> &input, FrameType &output) {
|
||||
auto success = doDecode(input, output);
|
||||
if (success) decoded.emit(output);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool input(const std::vector<uint8_t> &decodable) {
|
||||
FrameType _;
|
||||
return decode(decodable, _);
|
||||
}
|
||||
|
||||
bool output(const FrameType &encodable) {
|
||||
std::vector<uint8_t> _;
|
||||
return encode(encodable, _);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual bool doEncode(const FrameType &input, std::vector<uint8_t> &output) = 0;
|
||||
virtual bool doDecode(const std::vector<uint8_t> &input, FrameType &output) = 0;
|
||||
};
|
||||
|
||||
class MorseCodec : public Codec<TextFrame>
|
||||
{
|
||||
private:
|
||||
static constexpr std::array<const char*, 128> ENCODE_LUT = []{
|
||||
std::array<const char*, 128> lut{};
|
||||
lut['A'] = ".-";
|
||||
lut['B'] = "-...";
|
||||
lut['C'] = "-.-.";
|
||||
lut['D'] = "-..";
|
||||
lut['E'] = ".";
|
||||
lut['F'] = "..-.";
|
||||
lut['G'] = "--.";
|
||||
lut['H'] = "....";
|
||||
lut['I'] = "..";
|
||||
lut['J'] = ".---";
|
||||
lut['K'] = "-.-";
|
||||
lut['L'] = ".-..";
|
||||
lut['M'] = "--";
|
||||
lut['N'] = "-.";
|
||||
lut['O'] = "---";
|
||||
lut['P'] = ".--.";
|
||||
lut['Q'] = "--.-";
|
||||
lut['R'] = ".-.";
|
||||
lut['S'] = "...";
|
||||
lut['T'] = "-";
|
||||
lut['U'] = "..-";
|
||||
lut['V'] = "...-";
|
||||
lut['W'] = ".--";
|
||||
lut['X'] = "-..-";
|
||||
lut['Y'] = "-.--";
|
||||
lut['Z'] = "--..";
|
||||
lut['0'] = "-----";
|
||||
lut['1'] = ".----";
|
||||
lut['2'] = "..---";
|
||||
lut['3'] = "...--";
|
||||
lut['4'] = "....-";
|
||||
lut['5'] = ".....";
|
||||
lut['6'] = "-....";
|
||||
lut['7'] = "--...";
|
||||
lut['8'] = "---..";
|
||||
lut['9'] = "----.";
|
||||
return lut;
|
||||
}();
|
||||
public:
|
||||
bool encode(const IFrame &input, std::vector<uint8_t> &data) {
|
||||
bool succ = true;
|
||||
std::vector<uint8_t> bytes;
|
||||
data.clear();
|
||||
input.write(bytes);
|
||||
for (const auto b : bytes) {
|
||||
auto i = static_cast<size_t>(b);
|
||||
auto morse = ENCODE_LUT[std::toupper(i)];
|
||||
if (morse) {
|
||||
for (const auto c : std::string(morse)) {
|
||||
data.push_back(static_cast<uint8_t>(c));
|
||||
}
|
||||
data.push_back(' ');
|
||||
} else {
|
||||
succ = false;
|
||||
}
|
||||
}
|
||||
return succ;
|
||||
}
|
||||
|
||||
bool decode(const std::vector<uint8_t> &data, std::shared_ptr<IFrame> &frame)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
MorseCodec morse;
|
||||
std::string message = "Welcome back 1848.";
|
||||
|
||||
std::cout << "Encoding \"" << message << "\"" << std::endl;
|
||||
std::shared_ptr<IFrame> input = std::make_shared<TextFrame>(message);
|
||||
std::vector<uint8_t> coded;
|
||||
bool ok = morse.encode(*input, coded);
|
||||
|
||||
std::cout << "Encoded: " << std::string(coded.begin(), coded.end()) << std::endl;
|
||||
|
||||
|
||||
/*
|
||||
MultiCodec codec{std::make_shared<MorseCodec>(), std::make_shared<ComplexCodec>()};
|
||||
|
||||
std::shared_ptr<IFrame> output;
|
||||
if (codec.decode(coded, output)) {
|
||||
// That's certainly one way to do it, but that's whack.
|
||||
output.get(ComplexFrame.FROM, )
|
||||
}*/
|
||||
|
||||
auto morsey = std::make_shared<MorseCodec>();
|
||||
auto complex = std::make_shared<ComplexCodec>();
|
||||
|
||||
MultiDecoder decoder{morsey, complex};
|
||||
|
||||
// That's the way to do it, put the lambda on the P T R
|
||||
morsey.decoded.connect([](std::shared_ptr<TextFrame> frame) {
|
||||
std::cout << "Decoded morse: " << frame.text << std::endl;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user