2015-11-22 19:56:25 -05:00
|
|
|
#include "ModemFSK.h"
|
|
|
|
|
|
|
|
ModemFSK::ModemFSK() {
|
2015-11-23 20:44:48 -05:00
|
|
|
// DMR defaults?
|
2015-11-24 00:20:17 -05:00
|
|
|
bps = 1;
|
|
|
|
sps = 9600;
|
2015-11-22 19:56:25 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
Modem *ModemFSK::factory() {
|
|
|
|
return new ModemFSK;
|
|
|
|
}
|
|
|
|
|
2015-11-24 00:20:17 -05:00
|
|
|
int ModemFSK::checkSampleRate(long long sampleRate, int audioSampleRate) {
|
|
|
|
float minSps = pow(2.0,bps);
|
|
|
|
float nextSps = (float(sampleRate) / float(sps));
|
|
|
|
if (nextSps < minSps) {
|
|
|
|
return 2 * bps * sps;
|
|
|
|
} else {
|
|
|
|
return sampleRate;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-23 20:03:47 -05:00
|
|
|
ModemArgInfoList ModemFSK::getSettings() {
|
|
|
|
ModemArgInfoList args;
|
|
|
|
|
2015-11-23 20:44:48 -05:00
|
|
|
ModemArgInfo bpsArg;
|
|
|
|
bpsArg.key = "bps";
|
2015-11-24 00:20:17 -05:00
|
|
|
bpsArg.name = "Bits/symbol";
|
2015-11-23 20:44:48 -05:00
|
|
|
bpsArg.value = std::to_string(bps);
|
2015-11-24 00:20:17 -05:00
|
|
|
bpsArg.description = "Modem bits-per-symbol";
|
2015-11-23 20:44:48 -05:00
|
|
|
bpsArg.type = ModemArgInfo::STRING;
|
|
|
|
|
|
|
|
std::vector<std::string> bpsOpts;
|
2015-11-24 00:20:17 -05:00
|
|
|
bpsOpts.push_back("1");
|
|
|
|
bpsOpts.push_back("2");
|
|
|
|
bpsOpts.push_back("4");
|
|
|
|
bpsOpts.push_back("8");
|
2015-11-23 20:44:48 -05:00
|
|
|
bpsArg.options = bpsOpts;
|
|
|
|
|
|
|
|
args.push_back(bpsArg);
|
|
|
|
|
2015-11-24 00:20:17 -05:00
|
|
|
ModemArgInfo spsArg;
|
|
|
|
spsArg.key = "sps";
|
|
|
|
spsArg.name = "Symbols/second";
|
|
|
|
spsArg.value = std::to_string(sps);
|
|
|
|
spsArg.description = "Modem symbols-per-second";
|
|
|
|
spsArg.type = ModemArgInfo::STRING;
|
|
|
|
|
|
|
|
std::vector<std::string> spsOpts;
|
|
|
|
// some common modem rates ..?
|
|
|
|
spsOpts.push_back("1200");
|
|
|
|
spsOpts.push_back("2400");
|
|
|
|
spsOpts.push_back("4800");
|
|
|
|
spsOpts.push_back("9600");
|
|
|
|
spsOpts.push_back("19200");
|
|
|
|
spsOpts.push_back("38400");
|
|
|
|
spsArg.options = spsOpts;
|
2015-11-23 20:44:48 -05:00
|
|
|
|
2015-11-24 00:20:17 -05:00
|
|
|
args.push_back(spsArg);
|
|
|
|
|
2015-11-23 20:03:47 -05:00
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModemFSK::writeSetting(std::string setting, std::string value) {
|
|
|
|
if (setting == "bps") {
|
2015-11-23 20:44:48 -05:00
|
|
|
bps = std::stoi(value);
|
|
|
|
rebuildKit();
|
2015-11-24 00:20:17 -05:00
|
|
|
} else if (setting == "sps") {
|
|
|
|
sps = std::stoi(value);
|
2015-11-23 20:44:48 -05:00
|
|
|
rebuildKit();
|
2015-11-23 20:03:47 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string ModemFSK::readSetting(std::string setting) {
|
|
|
|
if (setting == "bps") {
|
|
|
|
return std::to_string(bps);
|
2015-11-24 00:20:17 -05:00
|
|
|
} else if (setting == "sps") {
|
|
|
|
return std::to_string(sps);
|
2015-11-23 20:03:47 -05:00
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2015-11-22 19:56:25 -05:00
|
|
|
ModemKit *ModemFSK::buildKit(long long sampleRate, int audioSampleRate) {
|
|
|
|
ModemKitFSK *dkit = new ModemKitFSK;
|
2015-11-24 00:20:17 -05:00
|
|
|
dkit->m = bps;
|
|
|
|
dkit->k = sampleRate / sps;
|
2015-11-22 19:56:25 -05:00
|
|
|
|
2015-11-24 00:20:17 -05:00
|
|
|
dkit->demodFSK = fskdem_create(dkit->m, dkit->k, 0.45);
|
2015-11-22 19:56:25 -05:00
|
|
|
|
|
|
|
dkit->sampleRate = sampleRate;
|
|
|
|
dkit->audioSampleRate = audioSampleRate;
|
|
|
|
|
|
|
|
return dkit;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModemFSK::disposeKit(ModemKit *kit) {
|
|
|
|
ModemKitFSK *dkit = (ModemKitFSK *)kit;
|
|
|
|
|
2015-11-24 00:20:17 -05:00
|
|
|
fskdem_destroy(dkit->demodFSK);
|
|
|
|
|
2015-11-22 19:56:25 -05:00
|
|
|
delete dkit;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string ModemFSK::getName() {
|
|
|
|
return "FSK";
|
|
|
|
}
|
|
|
|
|
|
|
|
ModemFSK::~ModemFSK() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModemFSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) {
|
|
|
|
ModemKitFSK *dkit = (ModemKitFSK *)kit;
|
|
|
|
|
|
|
|
digitalStart(dkit, nullptr, input);
|
|
|
|
|
|
|
|
dkit->inputBuffer.insert(dkit->inputBuffer.end(),input->data.begin(),input->data.end());
|
|
|
|
|
|
|
|
while (dkit->inputBuffer.size() >= dkit->k) {
|
|
|
|
unsigned int sym_out;
|
|
|
|
|
|
|
|
sym_out = fskdem_demodulate(dkit->demodFSK, &dkit->inputBuffer[0]);
|
2015-11-24 00:20:17 -05:00
|
|
|
// float err = fskdem_get_frequency_error(dkit->demodFSK);
|
|
|
|
// std::cout << "ferror: " << err << std::endl;
|
2015-11-22 19:56:25 -05:00
|
|
|
printf("%01X", sym_out);
|
|
|
|
dkit->inputBuffer.erase(dkit->inputBuffer.begin(),dkit->inputBuffer.begin()+dkit->k);
|
|
|
|
}
|
|
|
|
|
|
|
|
digitalFinish(dkit, nullptr);
|
|
|
|
}
|