mirror of
https://github.com/ggerganov/ggwave.git
synced 2026-03-17 07:56:00 +08:00
remove-stl : start removing stl completely
This commit is contained in:
@@ -12,6 +12,7 @@ static const char channels = 1;
|
||||
|
||||
// default PCM output frequency
|
||||
static const int frequency = 6000;
|
||||
static const int samplesPerFrame = 128;
|
||||
|
||||
static const int qpow = 9;
|
||||
static const int qmax = 1 << qpow;
|
||||
@@ -23,6 +24,10 @@ volatile int qsize = 0;
|
||||
// Buffer to read samples into, each sample is 16-bits
|
||||
TSample sampleBuffer[qmax];
|
||||
|
||||
volatile int err = 0;
|
||||
|
||||
GGWave * g_ggwave = nullptr;
|
||||
|
||||
// helper function to output the generated GGWave waveform via a buzzer
|
||||
void send_text(GGWave & ggwave, uint8_t pin, const char * text, GGWave::TxProtocolId protocolId) {
|
||||
ggwave.init(text, protocolId);
|
||||
@@ -73,15 +78,11 @@ void setup() {
|
||||
// - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
|
||||
// - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shields
|
||||
if (!PDM.begin(channels, frequency)) {
|
||||
Serial.println("Failed to start PDM!");
|
||||
Serial.println(F("Failed to start PDM!"));
|
||||
while (1);
|
||||
}
|
||||
}
|
||||
|
||||
volatile int err = 0;
|
||||
|
||||
void loop() {
|
||||
Serial.println("trying to create ggwave instance");
|
||||
Serial.println(F("Trying to create ggwave instance"));
|
||||
|
||||
auto p = GGWave::getDefaultParameters();
|
||||
|
||||
@@ -89,7 +90,7 @@ void loop() {
|
||||
p.sampleRateInp = frequency;
|
||||
p.sampleRateOut = frequency;
|
||||
p.sampleRate = frequency;
|
||||
p.samplesPerFrame = 128;
|
||||
p.samplesPerFrame = samplesPerFrame;
|
||||
p.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
|
||||
p.sampleFormatOut = GGWAVE_SAMPLE_FORMAT_I16;
|
||||
p.operatingMode = (ggwave_OperatingMode) (GGWAVE_OPERATING_MODE_RX | GGWAVE_OPERATING_MODE_TX | GGWAVE_OPERATING_MODE_USE_DSS | GGWAVE_OPERATING_MODE_TX_ONLY_TONES);
|
||||
@@ -97,22 +98,28 @@ void loop() {
|
||||
GGWave::Protocols::tx().only({GGWAVE_PROTOCOL_MT_FASTEST, GGWAVE_PROTOCOL_DT_FASTEST});
|
||||
GGWave::Protocols::rx().only({GGWAVE_PROTOCOL_MT_FASTEST, GGWAVE_PROTOCOL_DT_FASTEST});
|
||||
|
||||
GGWave ggwave(p);
|
||||
static GGWave ggwave(p);
|
||||
ggwave.setLogFile(nullptr);
|
||||
|
||||
Serial.println("Instance initialized");
|
||||
g_ggwave = &ggwave;
|
||||
|
||||
Serial.println(F("Instance initialized"));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
auto & ggwave = *g_ggwave;
|
||||
|
||||
int nr = 0;
|
||||
int niter = 0;
|
||||
|
||||
GGWave::TxRxData result;
|
||||
while (true) {
|
||||
while (qsize >= p.samplesPerFrame) {
|
||||
while (qsize >= samplesPerFrame) {
|
||||
auto tStart = millis();
|
||||
|
||||
ggwave.decode(sampleBuffer + qhead, p.samplesPerFrame*kSampleSize_bytes);
|
||||
qsize -= p.samplesPerFrame;
|
||||
qhead += p.samplesPerFrame;
|
||||
ggwave.decode(sampleBuffer + qhead, samplesPerFrame*kSampleSize_bytes);
|
||||
qsize -= samplesPerFrame;
|
||||
qhead += samplesPerFrame;
|
||||
if (qhead >= qmax) {
|
||||
qhead = 0;
|
||||
}
|
||||
@@ -120,10 +127,10 @@ void loop() {
|
||||
auto tEnd = millis();
|
||||
if (++niter % 10 == 0) {
|
||||
// print the time it took the last decode() call to complete
|
||||
// should be smaller than p.samplesPerFrame/frequency seconds
|
||||
// for example: p.samplesPerFrame = 128, frequency = 6000 => not more than 20 ms
|
||||
// should be smaller than samplesPerFrame/frequency seconds
|
||||
// for example: samplesPerFrame = 128, frequency = 6000 => not more than 20 ms
|
||||
Serial.println(tEnd - tStart);
|
||||
if (tEnd - tStart > 1000*(float(p.samplesPerFrame)/frequency)) {
|
||||
if (tEnd - tStart > 1000*(float(samplesPerFrame)/frequency)) {
|
||||
Serial.println("Warning: decode() took too long to execute!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,12 +8,19 @@ const int kPinSpeaker = 10;
|
||||
const int kPinButton0 = 2;
|
||||
const int kPinButton1 = 4;
|
||||
|
||||
const int samplesPerFrame = 128;
|
||||
const int sampleRate = 6000;
|
||||
|
||||
GGWave * g_ggwave = nullptr;
|
||||
|
||||
void send_text(GGWave & ggwave, uint8_t pin, const char * text, GGWave::TxProtocolId protocolId) {
|
||||
ggwave.init(text, protocolId);
|
||||
ggwave.encode();
|
||||
|
||||
const auto & tones = ggwave.txTones();
|
||||
//Serial.println(tones.size());
|
||||
float freq_hz = -1.0f;
|
||||
//float frameDuration_ms = (1000.0*samplesPerFrame)/sampleRate;
|
||||
float duration_ms = -1.0f;
|
||||
for (int i = 0; i < (int) tones.size(); ++i) {
|
||||
if (tones[i].size() == 0) continue;
|
||||
@@ -28,6 +35,7 @@ void send_text(GGWave & ggwave, uint8_t pin, const char * text, GGWave::TxProtoc
|
||||
duration_ms = 0.0f;
|
||||
}
|
||||
duration_ms += curTone.duration_ms;
|
||||
//duration_ms += frameDuration_ms;
|
||||
}
|
||||
|
||||
if (duration_ms > 0) {
|
||||
@@ -41,6 +49,33 @@ void send_text(GGWave & ggwave, uint8_t pin, const char * text, GGWave::TxProtoc
|
||||
|
||||
void setup() {
|
||||
Serial.begin(57600);
|
||||
|
||||
pinMode(kPinLed0, OUTPUT);
|
||||
pinMode(kPinSpeaker, OUTPUT);
|
||||
pinMode(kPinButton0, INPUT);
|
||||
pinMode(kPinButton1, INPUT);
|
||||
|
||||
Serial.println(F("Trying to create ggwave instance"));
|
||||
|
||||
auto p = GGWave::getDefaultParameters();
|
||||
p.payloadLength = 16;
|
||||
p.sampleRateInp = sampleRate;
|
||||
p.sampleRateOut = sampleRate;
|
||||
p.sampleRate = sampleRate;
|
||||
p.samplesPerFrame = samplesPerFrame;
|
||||
p.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
|
||||
p.sampleFormatOut = GGWAVE_SAMPLE_FORMAT_U8;
|
||||
p.operatingMode = (ggwave_OperatingMode) (GGWAVE_OPERATING_MODE_TX | GGWAVE_OPERATING_MODE_TX_ONLY_TONES | GGWAVE_OPERATING_MODE_USE_DSS);
|
||||
|
||||
GGWave::Protocols::tx().only(GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(1000);
|
||||
static GGWave ggwave(p);
|
||||
ggwave.setLogFile(nullptr);
|
||||
Serial.println(ggwave.heapSize());
|
||||
|
||||
g_ggwave = &ggwave;
|
||||
|
||||
Serial.println(F("Instance initialized"));
|
||||
}
|
||||
|
||||
char txt[16];
|
||||
@@ -48,86 +83,72 @@ int pressed = 0;
|
||||
bool isDown = false;
|
||||
|
||||
void loop() {
|
||||
Serial.println("hello");
|
||||
auto & ggwave = *g_ggwave;
|
||||
|
||||
auto p = GGWave::getDefaultParameters();
|
||||
p.payloadLength = 16;
|
||||
p.sampleRateInp = 6000;
|
||||
p.sampleRateOut = 6000;
|
||||
p.sampleRate = 6000;
|
||||
p.samplesPerFrame = 128;
|
||||
p.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
|
||||
p.sampleFormatOut = GGWAVE_SAMPLE_FORMAT_U8;
|
||||
p.operatingMode = (ggwave_OperatingMode) (GGWAVE_OPERATING_MODE_TX | GGWAVE_OPERATING_MODE_TX_ONLY_TONES | GGWAVE_OPERATING_MODE_USE_DSS);
|
||||
//Serial.println(F("hello"));
|
||||
|
||||
GGWave::Protocols::tx().only(GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
GGWave ggwave(p);
|
||||
|
||||
pinMode(kPinLed0, OUTPUT);
|
||||
pinMode(kPinSpeaker, OUTPUT);
|
||||
pinMode(kPinButton0, INPUT);
|
||||
pinMode(kPinButton1, INPUT);
|
||||
|
||||
delay(3000);
|
||||
delay(1000);
|
||||
|
||||
////Serial.println(F("sending .."));
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, "Hello!", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
////Serial.println(F("done .."));
|
||||
|
||||
delay(2000);
|
||||
//delay(2000);
|
||||
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, "This is a", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
send_text(ggwave, kPinSpeaker, "ggwave demo", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
//digitalWrite(kPinLed0, HIGH);
|
||||
//send_text(ggwave, kPinSpeaker, "This is a", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//send_text(ggwave, kPinSpeaker, "ggwave demo", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//digitalWrite(kPinLed0, LOW);
|
||||
|
||||
delay(2000);
|
||||
//delay(2000);
|
||||
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, "The arduino", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(200);
|
||||
send_text(ggwave, kPinSpeaker, "transmits data", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(200);
|
||||
send_text(ggwave, kPinSpeaker, "using sound", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(200);
|
||||
send_text(ggwave, kPinSpeaker, "through a buzzer", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
//digitalWrite(kPinLed0, HIGH);
|
||||
//send_text(ggwave, kPinSpeaker, "The arduino", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//delay(200);
|
||||
//send_text(ggwave, kPinSpeaker, "transmits data", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//delay(200);
|
||||
//send_text(ggwave, kPinSpeaker, "using sound", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//delay(200);
|
||||
//send_text(ggwave, kPinSpeaker, "through a buzzer", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//digitalWrite(kPinLed0, LOW);
|
||||
|
||||
delay(1000);
|
||||
//delay(1000);
|
||||
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, "The sound is", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(200);
|
||||
send_text(ggwave, kPinSpeaker, "decoded in a", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
delay(200);
|
||||
send_text(ggwave, kPinSpeaker, "web page.", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
//digitalWrite(kPinLed0, HIGH);
|
||||
//send_text(ggwave, kPinSpeaker, "The sound is", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//delay(200);
|
||||
//send_text(ggwave, kPinSpeaker, "decoded in a", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//delay(200);
|
||||
//send_text(ggwave, kPinSpeaker, "web page.", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//digitalWrite(kPinLed0, LOW);
|
||||
|
||||
delay(1000);
|
||||
//delay(1000);
|
||||
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, "Press the button!", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
//digitalWrite(kPinLed0, HIGH);
|
||||
//send_text(ggwave, kPinSpeaker, "Press the button!", GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
//digitalWrite(kPinLed0, LOW);
|
||||
|
||||
while (true) {
|
||||
int but0 = digitalRead(kPinButton0);
|
||||
int but1 = digitalRead(kPinButton1);
|
||||
//while (true) {
|
||||
// int but0 = digitalRead(kPinButton0);
|
||||
// int but1 = digitalRead(kPinButton1);
|
||||
|
||||
if (but1 == LOW && isDown == false) {
|
||||
delay(200);
|
||||
++pressed;
|
||||
isDown = true;
|
||||
} else if (but1 == HIGH) {
|
||||
isDown = false;
|
||||
}
|
||||
// if (but1 == LOW && isDown == false) {
|
||||
// delay(200);
|
||||
// ++pressed;
|
||||
// isDown = true;
|
||||
// } else if (but1 == HIGH) {
|
||||
// isDown = false;
|
||||
// }
|
||||
|
||||
if (but0 == LOW) {
|
||||
snprintf(txt, 16, "Pressed: %d", pressed);
|
||||
// if (but0 == LOW) {
|
||||
// snprintf(txt, 16, "Pressed: %d", pressed);
|
||||
|
||||
digitalWrite(kPinLed0, HIGH);
|
||||
send_text(ggwave, kPinSpeaker, txt, GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
digitalWrite(kPinLed0, LOW);
|
||||
pressed = 0;
|
||||
}
|
||||
}
|
||||
// digitalWrite(kPinLed0, HIGH);
|
||||
// send_text(ggwave, kPinSpeaker, txt, GGWAVE_PROTOCOL_MT_FASTEST);
|
||||
// digitalWrite(kPinLed0, LOW);
|
||||
// pressed = 0;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
@@ -1122,9 +1122,9 @@ void renderMain() {
|
||||
ImGui::Text("Tx Protocol: ");
|
||||
ImGui::SetCursorScreenPos({ posSave.x + kLabelWidth, posSave.y });
|
||||
}
|
||||
if (ImGui::BeginCombo("##txProtocol", settings.txProtocols.at(GGWave::TxProtocolId(settings.protocolId)).name)) {
|
||||
if (ImGui::BeginCombo("##txProtocol", settings.txProtocols[settings.protocolId].name)) {
|
||||
for (int i = 0; i < (int) settings.txProtocols.size(); ++i) {
|
||||
const auto & txProtocol = settings.txProtocols.at(GGWave::TxProtocolId(i));
|
||||
const auto & txProtocol = settings.txProtocols[i];
|
||||
if (txProtocol.name == nullptr) continue;
|
||||
const bool isSelected = (settings.protocolId == i);
|
||||
if (ImGui::Selectable(txProtocol.name, isSelected)) {
|
||||
@@ -1144,7 +1144,7 @@ void renderMain() {
|
||||
ImGui::SetCursorScreenPos({ posSave.x + kLabelWidth, posSave.y });
|
||||
}
|
||||
{
|
||||
const auto & protocol = settings.txProtocols.at(GGWave::TxProtocolId(settings.protocolId));
|
||||
const auto & protocol = settings.txProtocols[settings.protocolId];
|
||||
ImGui::Text("%4.2f B/s", (float(0.715f*protocol.bytesPerTx)/(protocol.framesPerTx*statsCurrent.samplesPerFrame))*statsCurrent.sampleRate);
|
||||
}
|
||||
|
||||
@@ -1155,7 +1155,7 @@ void renderMain() {
|
||||
}
|
||||
{
|
||||
const float df = statsCurrent.sampleRate/statsCurrent.samplesPerFrame;
|
||||
const auto & protocol = settings.txProtocols.at(GGWave::TxProtocolId(settings.protocolId));
|
||||
const auto & protocol = settings.txProtocols[settings.protocolId];
|
||||
ImGui::Text("%6.2f Hz - %6.2f Hz", df*protocol.freqStart, df*(protocol.freqStart + 2*16*protocol.bytesPerTx));
|
||||
}
|
||||
|
||||
@@ -1262,7 +1262,8 @@ void renderMain() {
|
||||
}
|
||||
{
|
||||
ImGui::PushID("RxProtocols");
|
||||
for (auto & rxProtocol : settings.rxProtocols) {
|
||||
for (int i = 0; i < settings.rxProtocols.size(); ++i) {
|
||||
auto & rxProtocol = settings.rxProtocols[i];
|
||||
if (rxProtocol.name == nullptr) continue;
|
||||
auto posSave = ImGui::GetCursorScreenPos();
|
||||
ImGui::Text("%s", "");
|
||||
@@ -1349,7 +1350,7 @@ void renderMain() {
|
||||
ImGui::SameLine();
|
||||
ImGui::TextDisabled("|");
|
||||
ImGui::SameLine();
|
||||
ImGui::TextColored({ 0.0f, 0.6f, 0.4f, interp }, "%s", settings.txProtocols.at(GGWave::TxProtocolId(message.protocolId)).name);
|
||||
ImGui::TextColored({ 0.0f, 0.6f, 0.4f, interp }, "%s", settings.txProtocols[message.protocolId].name);
|
||||
ImGui::SameLine();
|
||||
if (message.dss) {
|
||||
ImGui::TextColored({ 0.4f, 0.6f, 0.4f, interp }, "DSS");
|
||||
@@ -1597,7 +1598,7 @@ void renderMain() {
|
||||
pos0.x += style.ItemInnerSpacing.x;
|
||||
pos0.y += 0.5*style.ItemInnerSpacing.y;
|
||||
static char tmp[128];
|
||||
snprintf(tmp, 128, "Send message using '%s'", settings.txProtocols.at(GGWave::TxProtocolId(settings.protocolId)).name);
|
||||
snprintf(tmp, 128, "Send message using '%s'", settings.txProtocols[settings.protocolId].name);
|
||||
drawList->AddText(pos0, ImGui::ColorConvertFloat4ToU32({0.0f, 0.6f, 0.4f, 1.0f}), tmp);
|
||||
}
|
||||
}
|
||||
@@ -2114,7 +2115,7 @@ void renderMain() {
|
||||
break;
|
||||
}
|
||||
|
||||
const auto & protocol = settings.txProtocols.at(GGWave::TxProtocolId(msg.protocolId));
|
||||
const auto & protocol = settings.txProtocols[msg.protocolId];
|
||||
const int msgLength_bytes = settings.isFixedLength ? 1.4f*settings.payloadLength : 1.4f*msg.data.size() + GGWave::kDefaultEncodedDataOffset;
|
||||
const int msgLength_frames = settings.isFixedLength ?
|
||||
((msgLength_bytes + protocol.bytesPerTx - 1)/protocol.bytesPerTx)*protocol.framesPerTx :
|
||||
|
||||
Reference in New Issue
Block a user