1 // Copyright (c) Charles J. Cliffe
2 // SPDX-License-Identifier: GPL-2.0+
3 
4 #include "ModemASK.h"
5 
ModemASK()6 ModemASK::ModemASK() : ModemDigital()  {
7     demodASK2 = modem_create(LIQUID_MODEM_ASK2);
8     demodASK4 = modem_create(LIQUID_MODEM_ASK4);
9     demodASK8 = modem_create(LIQUID_MODEM_ASK8);
10     demodASK16 = modem_create(LIQUID_MODEM_ASK16);
11     demodASK32 = modem_create(LIQUID_MODEM_ASK32);
12     demodASK64 = modem_create(LIQUID_MODEM_ASK64);
13     demodASK128 = modem_create(LIQUID_MODEM_ASK128);
14     demodASK256 = modem_create(LIQUID_MODEM_ASK256);
15     demodASK = demodASK2;
16     cons = 2;
17 }
18 
factory()19 ModemBase *ModemASK::factory() {
20     return new ModemASK;
21 }
22 
~ModemASK()23 ModemASK::~ModemASK() {
24     modem_destroy(demodASK4);
25     modem_destroy(demodASK8);
26     modem_destroy(demodASK16);
27     modem_destroy(demodASK32);
28     modem_destroy(demodASK64);
29     modem_destroy(demodASK128);
30     modem_destroy(demodASK256);
31 }
32 
getName()33 std::string ModemASK::getName() {
34     return "ASK";
35 }
36 
getSettings()37 ModemArgInfoList ModemASK::getSettings() {
38     ModemArgInfoList args;
39 
40     ModemArgInfo consArg;
41     consArg.key = "cons";
42     consArg.name = "Constellation";
43     consArg.description = "Modem Constellation Pattern";
44     consArg.value = std::to_string(cons);
45     consArg.type = ModemArgInfo::Type::STRING;
46     std::vector<std::string> consOpts;
47     consOpts.push_back("2");
48     consOpts.push_back("4");
49     consOpts.push_back("8");
50     consOpts.push_back("16");
51     consOpts.push_back("32");
52     consOpts.push_back("64");
53     consOpts.push_back("128");
54     consOpts.push_back("256");
55     consArg.options = consOpts;
56     args.push_back(consArg);
57 
58     return args;
59 }
60 
writeSetting(std::string setting,std::string value)61 void ModemASK::writeSetting(std::string setting, std::string value) {
62     if (setting == "cons") {
63         int newCons = std::stoi(value);
64         updateDemodulatorCons(newCons);
65     }
66 }
67 
readSetting(std::string setting)68 std::string ModemASK::readSetting(std::string setting) {
69     if (setting == "cons") {
70         return std::to_string(cons);
71     }
72     return "";
73 }
74 
updateDemodulatorCons(int cons_in)75 void ModemASK::updateDemodulatorCons(int cons_in) {
76     cons = cons_in;
77     switch (cons_in) {
78         case 2:
79             demodASK = demodASK2;
80             break;
81         case 4:
82             demodASK = demodASK4;
83             break;
84         case 8:
85             demodASK = demodASK8;
86             break;
87         case 16:
88             demodASK = demodASK16;
89             break;
90         case 32:
91             demodASK = demodASK32;
92             break;
93         case 64:
94             demodASK = demodASK64;
95             break;
96         case 128:
97             demodASK = demodASK128;
98             break;
99         case 256:
100             demodASK = demodASK256;
101             break;
102     }
103 }
104 
demodulate(ModemKit * kit,ModemIQData * input,AudioThreadInput *)105 void ModemASK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput * /* audioOut */) {
106     auto *dkit = (ModemKitDigital *)kit;
107 
108     digitalStart(dkit, demodASK, input);
109 
110     for (size_t i = 0, bufSize = input->data.size(); i < bufSize; i++) {
111         modem_demodulate(demodASK, input->data[i], &demodOutputDataDigital[i]);
112     }
113     updateDemodulatorLock(demodASK, 0.005f);
114 
115     digitalFinish(dkit, demodASK);
116 }
117