initial commit

This commit is contained in:
2023-02-10 10:34:41 +01:00
commit fcad3a98b6
44 changed files with 1392 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
{
"build": {
"flags": "-Ofast"
}
}

View File

@@ -0,0 +1,32 @@
#include "ADCSampler.h"
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
ADCSampler::ADCSampler(adc_unit_t adcUnit, adc1_channel_t adcChannel, const i2s_config_t &i2s_config) : I2SSampler(I2S_NUM_0, i2s_config)
{
m_adcUnit = adcUnit;
m_adcChannel = adcChannel;
}
void ADCSampler::configureI2S()
{
//init ADC pad
i2s_set_adc_mode(m_adcUnit, m_adcChannel);
// enable the adc
i2s_adc_enable(m_i2sPort);
}
int ADCSampler::read(int16_t *samples, int count)
{
// read from i2s
size_t bytes_read = 0;
i2s_read(m_i2sPort, samples, sizeof(int16_t) * count, &bytes_read, portMAX_DELAY);
int samples_read = bytes_read / sizeof(int16_t);
for (int i = 0; i < samples_read; i++)
{
samples[i] = (2048 - (uint16_t(samples[i]) & 0xfff)) * 15;
}
return samples_read;
}
#endif

View File

@@ -0,0 +1,18 @@
#pragma once
#include <driver/adc.h>
#include "I2SSampler.h"
class ADCSampler : public I2SSampler
{
private:
adc_unit_t m_adcUnit;
adc1_channel_t m_adcChannel;
protected:
void configureI2S();
public:
ADCSampler(adc_unit_t adc_unit, adc1_channel_t adc_channel, const i2s_config_t &i2s_config);
virtual int read(int16_t *samples, int count);
};

View File

@@ -0,0 +1,52 @@
#include "I2SMEMSSampler.h"
#include "soc/i2s_reg.h"
I2SMEMSSampler::I2SMEMSSampler(
i2s_port_t i2s_port,
i2s_pin_config_t &i2s_pins,
i2s_config_t i2s_config,
int raw_samples_size,
bool fixSPH0645) : I2SSampler(i2s_port, i2s_config)
{
m_i2sPins = i2s_pins;
m_fixSPH0645 = fixSPH0645;
m_raw_samples_size = raw_samples_size;
m_raw_samples = (int32_t *)malloc(sizeof(int32_t) * raw_samples_size);
}
I2SMEMSSampler::~I2SMEMSSampler()
{
free(m_raw_samples);
}
void I2SMEMSSampler::configureI2S()
{
if (m_fixSPH0645)
{
// FIXES for SPH0645
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
REG_SET_BIT(I2S_TIMING_REG(m_i2sPort), BIT(9));
REG_SET_BIT(I2S_CONF_REG(m_i2sPort), I2S_RX_MSB_SHIFT);
#endif
}
i2s_set_pin(m_i2sPort, &m_i2sPins);
}
int I2SMEMSSampler::read(int16_t *samples, int count)
{
// read from i2s
size_t bytes_read = 0;
if (count>m_raw_samples_size)
{
count = m_raw_samples_size; // Buffer is too small
}
i2s_read(m_i2sPort, m_raw_samples, sizeof(int32_t) * count, &bytes_read, portMAX_DELAY);
int samples_read = bytes_read / sizeof(int32_t);
for (int i = 0; i < samples_read; i++)
{
int32_t temp = m_raw_samples[i] >> 11;
samples[i] = (temp > INT16_MAX) ? INT16_MAX : (temp < -INT16_MAX) ? -INT16_MAX : (int16_t)temp;
}
return samples_read;
}

View File

@@ -0,0 +1,25 @@
#pragma once
#include "I2SSampler.h"
class I2SMEMSSampler : public I2SSampler
{
private:
i2s_pin_config_t m_i2sPins;
bool m_fixSPH0645;
int32_t *m_raw_samples;
int m_raw_samples_size;
protected:
void configureI2S();
public:
I2SMEMSSampler(
i2s_port_t i2s_port,
i2s_pin_config_t &i2s_pins,
i2s_config_t i2s_config,
int raw_samples_size,
bool fixSPH0645 = false);
~I2SMEMSSampler();
virtual int read(int16_t *samples, int count);
};

View File

@@ -0,0 +1,21 @@
#include "I2SSampler.h"
#include "driver/i2s.h"
I2SSampler::I2SSampler(i2s_port_t i2sPort, const i2s_config_t &i2s_config) : m_i2sPort(i2sPort), m_i2s_config(i2s_config)
{
}
void I2SSampler::start()
{
//install and start i2s driver
i2s_driver_install(m_i2sPort, &m_i2s_config, 0, NULL);
// set up the I2S configuration from the subclass
configureI2S();
}
void I2SSampler::stop()
{
// stop the i2S driver
i2s_driver_uninstall(m_i2sPort);
}

View File

@@ -0,0 +1,28 @@
#pragma once
#include <freertos/FreeRTOS.h>
#include <driver/i2s.h>
/**
* Base Class for both the ADC and I2S sampler
**/
class I2SSampler
{
protected:
i2s_port_t m_i2sPort = I2S_NUM_0;
i2s_config_t m_i2s_config;
virtual void configureI2S() = 0;
virtual void processI2SData(void *samples, size_t count){
// nothing to do for the default case
};
public:
I2SSampler(i2s_port_t i2sPort, const i2s_config_t &i2sConfig);
void start();
virtual int read(int16_t *samples, int count) = 0;
void stop();
int sample_rate()
{
return m_i2s_config.sample_rate;
}
};