From ca01a947dcc8daac558b63da97d9e971230b62cb Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 29 Nov 2018 14:24:50 +0100 Subject: [PATCH] audio plugin --- platformio.ini | 10 +++++++ src/examples/audio/config.h | 20 +++++++++++++ src/examples/audio/main.cpp | 22 ++++++++++++++ src/inputs/audio/AudioInputPlugin.cpp | 41 +++++++++++++++++++++++++++ src/inputs/audio/AudioInputPlugin.h | 39 +++++++++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 src/examples/audio/config.h create mode 100644 src/examples/audio/main.cpp create mode 100644 src/inputs/audio/AudioInputPlugin.cpp create mode 100644 src/inputs/audio/AudioInputPlugin.h diff --git a/platformio.ini b/platformio.ini index d076722..2a49722 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,6 +25,16 @@ src_filter = +<*> - + - + lib_deps = ${common.lib_deps} lib_ignore = Ai Esp32 Rotary Encoder + +[env:audio] +platform = ${common.platform} +board = ${common.board} +framework = ${common.framework} +upload_speed = ${common.upload_speed} +monitor_baud = ${common.monitor_baud} +src_filter = +<*> - + - + +lib_deps = ${common.lib_deps} +lib_ignore = [env:analog_esp32] platform = espressif32 diff --git a/src/examples/audio/config.h b/src/examples/audio/config.h new file mode 100644 index 0000000..a590ce7 --- /dev/null +++ b/src/examples/audio/config.h @@ -0,0 +1,20 @@ +#ifndef __DEVICE_CONFIG__ +#define __DEVICE_CONFIG__ + +// Scheduler +#define _TASK_SLEEP_ON_IDLE_RUN +#define _TASK_STD_FUNCTION +#define _TASK_PRIORITY + +// Chip +#define SPROCKET_TYPE "SPROCKET" +#define SERIAL_BAUD_RATE 115200 +#define STARTUP_DELAY 1000 + +// audio +#define AUDIO_THRESHOLD 0 +#define AUDIO_POLL_INTERVAL 200 +#define AUDIO_PIN A0 +#define AUDIO_TOPIC "audio/peak" + +#endif \ No newline at end of file diff --git a/src/examples/audio/main.cpp b/src/examples/audio/main.cpp new file mode 100644 index 0000000..863ff36 --- /dev/null +++ b/src/examples/audio/main.cpp @@ -0,0 +1,22 @@ +#include "config.h" +#include "Sprocket.h" +#include "inputs/audio/AudioInputPlugin.h" + +Sprocket *sprocket; + +void setup() +{ + sprocket = new Sprocket({STARTUP_DELAY, SERIAL_BAUD_RATE}); + sprocket->addPlugin( + new AudioInputPlugin({AUDIO_PIN, AUDIO_THRESHOLD, AUDIO_POLL_INTERVAL, AUDIO_TOPIC})); + sprocket->subscribe(AUDIO_TOPIC, bind([](String val) { + PRINT_MSG(Serial, "AUDIO", val.c_str()); + }, _1)); + sprocket->activate(); +} + +void loop() +{ + sprocket->loop(); + yield(); +} \ No newline at end of file diff --git a/src/inputs/audio/AudioInputPlugin.cpp b/src/inputs/audio/AudioInputPlugin.cpp new file mode 100644 index 0000000..73d921b --- /dev/null +++ b/src/inputs/audio/AudioInputPlugin.cpp @@ -0,0 +1,41 @@ +#include "AudioInputPlugin.h" + +AudioInputPlugin::AudioInputPlugin(GpioConfig cfg){ + config = cfg; +} +void AudioInputPlugin::activate(Scheduler *userScheduler) +{ + // add update task + inputTask.set(TASK_MILLISECOND * config.updateInterval, TASK_FOREVER, std::bind(&AudioInputPlugin::checkInput, this)); + userScheduler->addTask(inputTask); + inputTask.enable(); + + // add dummy subscription + subscribe(config.topic, [](String msg){}); + + PRINT_MSG(Serial, "PLUGIN", "AudioInputPlugin activated"); +} + +void AudioInputPlugin::checkInput() +{ + startMillis= millis(); + peakToPeak = 0; + signalMax = 0; + signalMin = 1024; + // collect data + while (millis() - startMillis < sampleWindow) { + sample = analogRead(A0); + if (sample < 1024) { + signalMax = sample > signalMax ? sample : signalMax; + signalMin = sample < signalMin ? sample : signalMin; + + } + } + peakToPeak = signalMax - signalMin; + + int val = mapValueToRange(peakToPeak, 0, 1024, 32, 255); + if(val != lastVal){ + publish(config.topic, String(val)); + lastVal = val; + } +} diff --git a/src/inputs/audio/AudioInputPlugin.h b/src/inputs/audio/AudioInputPlugin.h new file mode 100644 index 0000000..ff3a3f5 --- /dev/null +++ b/src/inputs/audio/AudioInputPlugin.h @@ -0,0 +1,39 @@ +#ifndef __AUDIO_INPUT__PLUGIN_H__ +#define __AUDIO_INPUT__PLUGIN_H__ + +#define _TASK_SLEEP_ON_IDLE_RUN +#define _TASK_STD_FUNCTION + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::placeholders; + +class AudioInputPlugin : public Plugin +{ + private: + const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz) + unsigned int sample; + unsigned long startMillis = millis(); + unsigned int peakToPeak = 0; + unsigned int signalMax = 0; + unsigned int signalMin = 1024; + unsigned int lastVal = 0; + + public: + Task inputTask; + int currentVal = 0; + GpioConfig config; + AudioInputPlugin(GpioConfig cfg); + void activate(Scheduler *userScheduler); + void checkInput(); +}; + +#endif