mirror of
https://github.com/ggerganov/ggwave.git
synced 2026-03-20 10:09:26 +08:00
ggwave : add option to only generate tones on Tx
This commit is contained in:
@@ -37,9 +37,10 @@ EMSCRIPTEN_BINDINGS(ggwave) {
|
||||
;
|
||||
|
||||
emscripten::enum_<ggwave_OperatingMode>("OperatingMode")
|
||||
.value("GGWAVE_OPERATING_MODE_BOTH_RX_AND_TX", GGWAVE_OPERATING_MODE_BOTH_RX_AND_TX)
|
||||
.value("GGWAVE_OPERATING_MODE_ONLY_RX", GGWAVE_OPERATING_MODE_ONLY_RX)
|
||||
.value("GGWAVE_OPERATING_MODE_ONLY_TX", GGWAVE_OPERATING_MODE_ONLY_TX)
|
||||
.value("GGWAVE_OPERATING_MODE_RX", GGWAVE_OPERATING_MODE_RX)
|
||||
.value("GGWAVE_OPERATING_MODE_TX", GGWAVE_OPERATING_MODE_TX)
|
||||
.value("GGWAVE_OPERATING_MODE_RX_AND_TX", (ggwave_OperatingMode) (GGWAVE_OPERATING_MODE_RX | GGWAVE_OPERATING_MODE_TX))
|
||||
.value("GGWAVE_OPERATING_MODE_TX_ONLY_TONES", GGWAVE_OPERATING_MODE_TX_ONLY_TONES)
|
||||
;
|
||||
|
||||
emscripten::class_<ggwave_Parameters>("Parameters")
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -31,9 +31,10 @@ cdef extern from "ggwave.h" nogil:
|
||||
GGWAVE_TX_PROTOCOL_CUSTOM_9
|
||||
|
||||
ctypedef enum ggwave_OperatingMode:
|
||||
GGWAVE_OPERATING_MODE_BOTH_RX_AND_TX,
|
||||
GGWAVE_OPERATING_MODE_ONLY_RX,
|
||||
GGWAVE_OPERATING_MODE_ONLY_TX,
|
||||
GGWAVE_OPERATING_MODE_RX,
|
||||
GGWAVE_OPERATING_MODE_TX,
|
||||
GGWAVE_OPERATING_MODE_RX_AND_TX,
|
||||
GGWAVE_OPERATING_MODE_TX_ONLY_TONES
|
||||
|
||||
ctypedef struct ggwave_Parameters:
|
||||
int payloadLength
|
||||
|
||||
@@ -53,7 +53,7 @@ void loop() {
|
||||
p.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
|
||||
p.samplesPerFrame = 128;
|
||||
p.payloadLength = 16;
|
||||
p.operatingMode = GGWAVE_OPERATING_MODE_ONLY_RX;
|
||||
p.operatingMode = GGWAVE_OPERATING_MODE_RX;
|
||||
|
||||
GGWave ggwave(p);
|
||||
ggwave.setRxProtocols({
|
||||
|
||||
@@ -699,8 +699,6 @@ uint32_t GGWave::encodeSize_samples() const {
|
||||
}
|
||||
|
||||
bool GGWave::encode(const CBWaveformOut & cbWaveformOut) {
|
||||
int frameId = 0;
|
||||
|
||||
if (m_resampler) {
|
||||
m_resampler->reset();
|
||||
}
|
||||
@@ -750,29 +748,93 @@ bool GGWave::encode(const CBWaveformOut & cbWaveformOut) {
|
||||
RS::ReedSolomon rsData = RS::ReedSolomon(m_tx->txDataLength, nECCBytesPerTx, m_workRSData.data());
|
||||
rsData.Encode(m_tx->txData.data() + 1, m_dataEncoded.data() + m_encodedDataOffset);
|
||||
|
||||
const float factor = m_sampleRate/m_sampleRateOut;
|
||||
// generate tones
|
||||
{
|
||||
int frameId = 0;
|
||||
bool hasNewData = m_tx->hasNewTxData;
|
||||
|
||||
m_tx->waveformTones.clear();
|
||||
while (hasNewData) {
|
||||
m_tx->waveformTones.push_back({});
|
||||
|
||||
if (frameId < m_nMarkerFrames) {
|
||||
for (int i = 0; i < m_nBitsInMarker; ++i) {
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (i%2 == 0) {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i);
|
||||
} else {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i) + m_hzPerSample;
|
||||
}
|
||||
}
|
||||
} else if (frameId < m_nMarkerFrames + totalDataFrames) {
|
||||
int dataOffset = frameId - m_nMarkerFrames;
|
||||
dataOffset /= m_tx->txProtocol.framesPerTx;
|
||||
dataOffset *= m_tx->txProtocol.bytesPerTx;
|
||||
|
||||
std::fill(m_tx->dataBits.begin(), m_tx->dataBits.end(), 0);
|
||||
|
||||
for (int j = 0; j < m_tx->txProtocol.bytesPerTx; ++j) {
|
||||
{
|
||||
uint8_t d = m_dataEncoded[dataOffset + j] & 15;
|
||||
m_tx->dataBits[(2*j + 0)*16 + d] = 1;
|
||||
}
|
||||
{
|
||||
uint8_t d = m_dataEncoded[dataOffset + j] & 240;
|
||||
m_tx->dataBits[(2*j + 1)*16 + (d >> 4)] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (int k = 0; k < 2*m_tx->txProtocol.bytesPerTx*16; ++k) {
|
||||
if (m_tx->dataBits[k] == 0) continue;
|
||||
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (k%2) {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, k/2) + m_hzPerSample;
|
||||
} else {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, k/2);
|
||||
}
|
||||
}
|
||||
} else if (frameId < m_nMarkerFrames + totalDataFrames + m_nMarkerFrames) {
|
||||
for (int i = 0; i < m_nBitsInMarker; ++i) {
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (i%2 == 0) {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i) + m_hzPerSample;
|
||||
} else {
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
hasNewData = false;
|
||||
break;
|
||||
}
|
||||
|
||||
++frameId;
|
||||
}
|
||||
|
||||
if (m_txOnlyTones) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
int frameId = 0;
|
||||
uint32_t offset = 0;
|
||||
m_tx->waveformTones.clear();
|
||||
const float factor = m_sampleRate/m_sampleRateOut;
|
||||
|
||||
while (m_tx->hasNewTxData) {
|
||||
std::fill(m_tx->outputBlock.begin(), m_tx->outputBlock.end(), 0.0f);
|
||||
|
||||
uint16_t nFreq = 0;
|
||||
m_tx->waveformTones.push_back({});
|
||||
|
||||
if (frameId < m_nMarkerFrames) {
|
||||
nFreq = m_nBitsInMarker;
|
||||
|
||||
for (int i = 0; i < m_nBitsInMarker; ++i) {
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (i%2 == 0) {
|
||||
::addAmplitudeSmooth(m_tx->bit1Amplitude[i], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, frameId, m_nMarkerFrames);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i);
|
||||
} else {
|
||||
::addAmplitudeSmooth(m_tx->bit0Amplitude[i], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, frameId, m_nMarkerFrames);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i) + m_hzPerSample;
|
||||
}
|
||||
}
|
||||
} else if (frameId < m_nMarkerFrames + totalDataFrames) {
|
||||
@@ -798,14 +860,10 @@ bool GGWave::encode(const CBWaveformOut & cbWaveformOut) {
|
||||
if (m_tx->dataBits[k] == 0) continue;
|
||||
|
||||
++nFreq;
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (k%2) {
|
||||
::addAmplitudeSmooth(m_tx->bit0Amplitude[k/2], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, cycleModMain, m_tx->txProtocol.framesPerTx);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, k/2) + m_hzPerSample;
|
||||
} else {
|
||||
::addAmplitudeSmooth(m_tx->bit1Amplitude[k/2], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, cycleModMain, m_tx->txProtocol.framesPerTx);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, k/2);
|
||||
}
|
||||
}
|
||||
} else if (frameId < m_nMarkerFrames + totalDataFrames + m_nMarkerFrames) {
|
||||
@@ -813,14 +871,10 @@ bool GGWave::encode(const CBWaveformOut & cbWaveformOut) {
|
||||
|
||||
const int fId = frameId - (m_nMarkerFrames + totalDataFrames);
|
||||
for (int i = 0; i < m_nBitsInMarker; ++i) {
|
||||
m_tx->waveformTones.back().push_back({});
|
||||
m_tx->waveformTones.back().back().duration_ms = (1000.0*m_samplesPerFrame)/m_sampleRate;
|
||||
if (i%2 == 0) {
|
||||
addAmplitudeSmooth(m_tx->bit0Amplitude[i], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, fId, m_nMarkerFrames);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i) + m_hzPerSample;
|
||||
} else {
|
||||
addAmplitudeSmooth(m_tx->bit1Amplitude[i], m_tx->outputBlock, m_tx->sendVolume, 0, m_samplesPerFrame, fId, m_nMarkerFrames);
|
||||
m_tx->waveformTones.back().back().freq_hz = bitFreq(m_tx->txProtocol, i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user