|
@@ -4,6 +4,7 @@
|
|
|
#include "esp_err.h"
|
|
#include "esp_err.h"
|
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/semphr.h"
|
|
#include "freertos/semphr.h"
|
|
|
|
|
+#include "freertos/task.h"
|
|
|
#include "string.h"
|
|
#include "string.h"
|
|
|
#include "driver/gpio.h"
|
|
#include "driver/gpio.h"
|
|
|
#include "esp_err.h"
|
|
#include "esp_err.h"
|
|
@@ -28,7 +29,8 @@
|
|
|
#endif /* ((SOC_SDMMC_HOST_SUPPORTED) && (FUNC_SDMMC_EN)) */
|
|
#endif /* ((SOC_SDMMC_HOST_SUPPORTED) && (FUNC_SDMMC_EN)) */
|
|
|
|
|
|
|
|
|
|
|
|
|
-#define ADC_I2S_CHANNEL 4
|
|
|
|
|
|
|
+#define ADC_I2S_CHANNEL 2
|
|
|
|
|
+#define ADC_BITS_PER_SAMPLE 32
|
|
|
|
|
|
|
|
static sdmmc_card_t *card;
|
|
static sdmmc_card_t *card;
|
|
|
static const char *TAG = "board";
|
|
static const char *TAG = "board";
|
|
@@ -52,6 +54,7 @@ static audio_codec_if_t *play_codec_if = NULL;
|
|
|
static esp_codec_dev_handle_t play_dev = NULL;
|
|
static esp_codec_dev_handle_t play_dev = NULL;
|
|
|
static i2c_master_bus_handle_t i2c_bus_handle = NULL;
|
|
static i2c_master_bus_handle_t i2c_bus_handle = NULL;
|
|
|
static uint32_t SDCard_Size = 0;
|
|
static uint32_t SDCard_Size = 0;
|
|
|
|
|
+static bool s_volume_buttons_task_started = false;
|
|
|
|
|
|
|
|
int mic_level = 0;
|
|
int mic_level = 0;
|
|
|
esp_codec_dev_handle_t esp_ret_play_dev(void)
|
|
esp_codec_dev_handle_t esp_ret_play_dev(void)
|
|
@@ -85,10 +88,9 @@ static esp_err_t i2c_master_init(void)
|
|
|
|
|
|
|
|
|
|
|
|
|
esp_err_t bsp_codec_adc_init(int sample_rate)
|
|
esp_err_t bsp_codec_adc_init(int sample_rate)
|
|
|
-{
|
|
|
|
|
|
|
+{ ESP_LOGI(TAG,"ADC INIT START");
|
|
|
esp_err_t ret_val = ESP_OK;
|
|
esp_err_t ret_val = ESP_OK;
|
|
|
|
|
|
|
|
- // Do initialize of related interface: data_if, ctrl_if and gpio_if
|
|
|
|
|
audio_codec_i2s_cfg_t i2s_cfg = {
|
|
audio_codec_i2s_cfg_t i2s_cfg = {
|
|
|
.port = I2S_NUM_1,
|
|
.port = I2S_NUM_1,
|
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
@@ -96,35 +98,86 @@ esp_err_t bsp_codec_adc_init(int sample_rate)
|
|
|
.tx_handle = NULL,
|
|
.tx_handle = NULL,
|
|
|
#endif
|
|
#endif
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
record_data_if = audio_codec_new_i2s_data(&i2s_cfg);
|
|
record_data_if = audio_codec_new_i2s_data(&i2s_cfg);
|
|
|
|
|
|
|
|
- audio_codec_i2c_cfg_t i2c_cfg = {.addr = ES7210_CODEC_DEFAULT_ADDR,.bus_handle = i2c_bus_handle};
|
|
|
|
|
|
|
+ if(record_data_if == NULL)
|
|
|
|
|
+{
|
|
|
|
|
+ ESP_LOGE(TAG,"record_data_if creation failed");
|
|
|
|
|
+ return ESP_FAIL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ audio_codec_i2c_cfg_t i2c_cfg = {
|
|
|
|
|
+ .addr = ES7210_CODEC_DEFAULT_ADDR,
|
|
|
|
|
+ .bus_handle = i2c_bus_handle
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
record_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg);
|
|
record_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg);
|
|
|
- // New input codec interface
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
es7210_codec_cfg_t es7210_cfg = {
|
|
es7210_codec_cfg_t es7210_cfg = {
|
|
|
.ctrl_if = record_ctrl_if,
|
|
.ctrl_if = record_ctrl_if,
|
|
|
- .mic_selected = ES7210_SEL_MIC1 | ES7210_SEL_MIC2 | ES7210_SEL_MIC3 | ES7210_SEL_MIC4,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ .mic_selected =
|
|
|
|
|
+ ES7210_SEL_MIC1 |
|
|
|
|
|
+ ES7210_SEL_MIC2 |
|
|
|
|
|
+ ES7210_SEL_MIC3 |
|
|
|
|
|
+ ES7210_SEL_MIC4,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
record_codec_if = es7210_codec_new(&es7210_cfg);
|
|
record_codec_if = es7210_codec_new(&es7210_cfg);
|
|
|
- // New input codec device
|
|
|
|
|
|
|
+
|
|
|
|
|
+ ESP_LOGI(TAG,"ES7210 IF=%p", record_codec_if);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
esp_codec_dev_cfg_t dev_cfg = {
|
|
esp_codec_dev_cfg_t dev_cfg = {
|
|
|
.codec_if = record_codec_if,
|
|
.codec_if = record_codec_if,
|
|
|
.data_if = record_data_if,
|
|
.data_if = record_data_if,
|
|
|
.dev_type = ESP_CODEC_DEV_TYPE_IN,
|
|
.dev_type = ESP_CODEC_DEV_TYPE_IN,
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
record_dev = esp_codec_dev_new(&dev_cfg);
|
|
record_dev = esp_codec_dev_new(&dev_cfg);
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if(record_dev == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ ESP_LOGE(TAG,"Failed creating ADC codec");
|
|
|
|
|
+ return ESP_FAIL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
esp_codec_dev_sample_info_t fs = {
|
|
esp_codec_dev_sample_info_t fs = {
|
|
|
- .sample_rate = 16000,
|
|
|
|
|
|
|
+ .sample_rate = sample_rate,
|
|
|
.channel = 2,
|
|
.channel = 2,
|
|
|
- .bits_per_sample = 32,
|
|
|
|
|
|
|
+ .bits_per_sample = 16,
|
|
|
};
|
|
};
|
|
|
- esp_codec_dev_open(record_dev, &fs);
|
|
|
|
|
- // esp_codec_dev_set_in_gain(record_dev, RECORD_VOLUME);
|
|
|
|
|
- esp_codec_dev_set_in_channel_gain(record_dev, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), RECORD_VOLUME);
|
|
|
|
|
- esp_codec_dev_set_in_channel_gain(record_dev, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1), RECORD_VOLUME);
|
|
|
|
|
- esp_codec_dev_set_in_channel_gain(record_dev, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(2), RECORD_VOLUME);
|
|
|
|
|
- esp_codec_dev_set_in_channel_gain(record_dev, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(3), RECORD_VOLUME);
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ret_val = esp_codec_dev_open(record_dev, &fs);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if(ret_val != ESP_OK)
|
|
|
|
|
+ {
|
|
|
|
|
+ ESP_LOGE(TAG,
|
|
|
|
|
+ "Codec open failed %s",
|
|
|
|
|
+ esp_err_to_name(ret_val));
|
|
|
|
|
+ return ret_val;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ esp_codec_dev_set_in_channel_gain(
|
|
|
|
|
+ record_dev,
|
|
|
|
|
+ ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0),
|
|
|
|
|
+ RECORD_VOLUME);
|
|
|
|
|
+
|
|
|
|
|
+ esp_codec_dev_set_in_channel_gain(
|
|
|
|
|
+ record_dev,
|
|
|
|
|
+ ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1),
|
|
|
|
|
+ RECORD_VOLUME);
|
|
|
|
|
+
|
|
|
|
|
|
|
|
return ret_val;
|
|
return ret_val;
|
|
|
}
|
|
}
|
|
@@ -346,14 +399,39 @@ static esp_err_t bsp_i2s_deinit(int i2s_num)
|
|
|
return ret_val;
|
|
return ret_val;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static esp_err_t bsp_codec_init(int adc_sample_rate, int dac_sample_rate, int dac_channel_format, int dac_bits_per_chan)
|
|
|
|
|
|
|
+static esp_err_t bsp_codec_init(
|
|
|
|
|
+ int adc_sample_rate,
|
|
|
|
|
+ int dac_sample_rate,
|
|
|
|
|
+ int dac_channel_format,
|
|
|
|
|
+ int dac_bits_per_chan)
|
|
|
{
|
|
{
|
|
|
- esp_err_t ret_val = ESP_OK;
|
|
|
|
|
|
|
+ //ESP_LOGE(TAG, "bsp_codec_adc_init START");
|
|
|
|
|
+ esp_err_t ret;
|
|
|
|
|
|
|
|
- ret_val |= bsp_codec_adc_init(adc_sample_rate);
|
|
|
|
|
- ret_val |= bsp_codec_dac_init(dac_sample_rate, dac_channel_format, dac_bits_per_chan);
|
|
|
|
|
|
|
+ ret = bsp_codec_adc_init(adc_sample_rate);
|
|
|
|
|
|
|
|
- return ret_val;
|
|
|
|
|
|
|
+ if(ret != ESP_OK)
|
|
|
|
|
+ {
|
|
|
|
|
+ ESP_LOGE(TAG,"ADC init failed: %s",
|
|
|
|
|
+ esp_err_to_name(ret));
|
|
|
|
|
+ return ret;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ret = bsp_codec_dac_init(
|
|
|
|
|
+ dac_sample_rate,
|
|
|
|
|
+ dac_channel_format,
|
|
|
|
|
+ dac_bits_per_chan);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if(ret != ESP_OK)
|
|
|
|
|
+ {
|
|
|
|
|
+ ESP_LOGE(TAG,"DAC init failed: %s",
|
|
|
|
|
+ esp_err_to_name(ret));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static esp_err_t bsp_codec_deinit()
|
|
static esp_err_t bsp_codec_deinit()
|
|
@@ -426,36 +504,64 @@ int get_mic_level (void) {
|
|
|
|
|
|
|
|
return mic_level;
|
|
return mic_level;
|
|
|
}
|
|
}
|
|
|
-esp_err_t esp_get_feed_data(bool is_get_raw_channel, int16_t *buffer, int buffer_len)
|
|
|
|
|
-{
|
|
|
|
|
-
|
|
|
|
|
|
|
+esp_err_t esp_get_feed_data(
|
|
|
|
|
+ bool is_get_raw_channel,
|
|
|
|
|
+ int16_t *buffer,
|
|
|
|
|
+ int buffer_len)
|
|
|
|
|
+{
|
|
|
|
|
|
|
|
- esp_err_t ret = ESP_OK;
|
|
|
|
|
- size_t bytes_read;
|
|
|
|
|
- int audio_chunksize = buffer_len / (sizeof(int16_t) * ADC_I2S_CHANNEL);
|
|
|
|
|
|
|
+ ESP_LOGE(TAG, "NEW esp_get_feed_data CALLED");
|
|
|
|
|
|
|
|
- ret = esp_codec_dev_read(record_dev, (void *)buffer, buffer_len);
|
|
|
|
|
-
|
|
|
|
|
- int64_t sum = 0;
|
|
|
|
|
- for(int i = 0; i < buffer_len/sizeof(int16_t); i++) {
|
|
|
|
|
- sum += abs(buffer[i]);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if(record_dev == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ ESP_LOGE(TAG,"record_dev NULL");
|
|
|
|
|
+ return ESP_ERR_INVALID_STATE;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ESP_LOGI(TAG,
|
|
|
|
|
+ "read buffer=%p size=%d",
|
|
|
|
|
+ buffer,
|
|
|
|
|
+ buffer_len);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ esp_err_t ret;
|
|
|
|
|
+
|
|
|
|
|
+ ret = esp_codec_dev_read(
|
|
|
|
|
+ record_dev,
|
|
|
|
|
+ buffer,
|
|
|
|
|
+ buffer_len);
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ ESP_LOGI(TAG,
|
|
|
|
|
+ "codec read ret=%s",
|
|
|
|
|
+ esp_err_to_name(ret));
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if(ret != ESP_OK)
|
|
|
|
|
+ {
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
- ESP_LOGI("MIC", "Level=%lld", sum/(buffer_len/sizeof(int16_t)));
|
|
|
|
|
- mic_level = sum/(buffer_len/sizeof(int16_t));
|
|
|
|
|
|
|
|
|
|
- if (!is_get_raw_channel) {
|
|
|
|
|
- for (int i = 0; i < audio_chunksize; i++) {
|
|
|
|
|
- int16_t ref = buffer[4 * i + 0];
|
|
|
|
|
- buffer[3 * i + 0] = buffer[4 * i + 1];
|
|
|
|
|
- buffer[3 * i + 1] = buffer[4 * i + 3];
|
|
|
|
|
- buffer[3 * i + 2] = ref;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Check microphone data
|
|
|
|
|
+ int64_t sum = 0;
|
|
|
|
|
+
|
|
|
|
|
+ for(int i=0;i<buffer_len/sizeof(int16_t);i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ sum += abs(buffer[i]);
|
|
|
}
|
|
}
|
|
|
- return ret;
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ESP_LOGI(TAG,
|
|
|
|
|
+ "MIC level=%lld",
|
|
|
|
|
+ sum/(buffer_len/sizeof(int16_t)));
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return ESP_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
int esp_get_feed_channel(void)
|
|
int esp_get_feed_channel(void)
|
|
|
{
|
|
{
|
|
|
return ADC_I2S_CHANNEL;
|
|
return ADC_I2S_CHANNEL;
|
|
@@ -463,12 +569,77 @@ int esp_get_feed_channel(void)
|
|
|
|
|
|
|
|
char* esp_get_input_format(void)
|
|
char* esp_get_input_format(void)
|
|
|
{
|
|
{
|
|
|
- return "RMNM";
|
|
|
|
|
|
|
+ return "RM";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static void bsp_volume_buttons_task(void *arg)
|
|
|
|
|
+{
|
|
|
|
|
+ int last_key1 = 1;
|
|
|
|
|
+ int last_key3 = 1;
|
|
|
|
|
+
|
|
|
|
|
+ while (1) {
|
|
|
|
|
+ int key1 = gpio_get_level(GPIO_KEY1_PIN);
|
|
|
|
|
+ int key3 = gpio_get_level(GPIO_KEY3_PIN);
|
|
|
|
|
+
|
|
|
|
|
+ if (key1 == 0 && last_key1 != 0) {
|
|
|
|
|
+ int current_vol = 0;
|
|
|
|
|
+ if (esp_audio_get_play_vol(¤t_vol) == ESP_OK) {
|
|
|
|
|
+ current_vol += VOLUME_STEP;
|
|
|
|
|
+ if (current_vol > VOLUME_MAX_LEVEL) {
|
|
|
|
|
+ current_vol = VOLUME_MAX_LEVEL;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (esp_audio_set_play_vol(current_vol) == ESP_OK) {
|
|
|
|
|
+ ESP_LOGI(TAG, "Volume up -> %d", current_vol);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ if (key3 == 0 && last_key3 != 0) {
|
|
|
|
|
+ int current_vol = 0;
|
|
|
|
|
+ if (esp_audio_get_play_vol(¤t_vol) == ESP_OK) {
|
|
|
|
|
+ current_vol -= VOLUME_STEP;
|
|
|
|
|
+ if (current_vol < VOLUME_MIN_LEVEL) {
|
|
|
|
|
+ current_vol = VOLUME_MIN_LEVEL;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (esp_audio_set_play_vol(current_vol) == ESP_OK) {
|
|
|
|
|
+ ESP_LOGI(TAG, "Volume down -> %d", current_vol);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ last_key1 = key1;
|
|
|
|
|
+ last_key3 = key3;
|
|
|
|
|
+ vTaskDelay(pdMS_TO_TICKS(VOLUME_BUTTON_POLL_MS));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static esp_err_t bsp_volume_buttons_init(void)
|
|
|
|
|
+{
|
|
|
|
|
+ if (s_volume_buttons_task_started) {
|
|
|
|
|
+ return ESP_OK;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ gpio_config_t io_conf = {
|
|
|
|
|
+ .pin_bit_mask = (1ULL << GPIO_KEY1_PIN) | (1ULL << GPIO_KEY3_PIN),
|
|
|
|
|
+ .mode = GPIO_MODE_INPUT,
|
|
|
|
|
+ .pull_up_en = GPIO_PULLUP_ENABLE,
|
|
|
|
|
+ .pull_down_en = GPIO_PULLDOWN_DISABLE,
|
|
|
|
|
+ .intr_type = GPIO_INTR_DISABLE,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ esp_err_t ret = gpio_config(&io_conf);
|
|
|
|
|
+ if (ret != ESP_OK) {
|
|
|
|
|
+ return ret;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ BaseType_t task_created = xTaskCreate(bsp_volume_buttons_task, "vol_btns", 4096, NULL, 5, NULL);
|
|
|
|
|
+ if (task_created != pdPASS) {
|
|
|
|
|
+ return ESP_FAIL;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ s_volume_buttons_task_started = true;
|
|
|
|
|
+ return ESP_OK;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
esp_err_t esp_board_init(uint32_t sample_rate, int channel_format, int bits_per_chan)
|
|
esp_err_t esp_board_init(uint32_t sample_rate, int channel_format, int bits_per_chan)
|
|
|
{
|
|
{
|
|
@@ -489,10 +660,22 @@ esp_err_t esp_board_init(uint32_t sample_rate, int channel_format, int bits_per_
|
|
|
}
|
|
}
|
|
|
s_bits_per_chan = bits_per_chan;
|
|
s_bits_per_chan = bits_per_chan;
|
|
|
|
|
|
|
|
- bsp_i2s_init(I2S_NUM_1, 16000, 2, 32);
|
|
|
|
|
|
|
+ bsp_i2s_init(I2S_NUM_1, 16000, 2, 16);
|
|
|
// Because record and play use the same i2s.
|
|
// Because record and play use the same i2s.
|
|
|
- bsp_codec_init(16000, 16000, 2, 32);
|
|
|
|
|
|
|
+esp_err_t codec_ret;
|
|
|
|
|
|
|
|
|
|
+codec_ret = bsp_codec_init(16000,16000,2,16);
|
|
|
|
|
+
|
|
|
|
|
+if(codec_ret != ESP_OK)
|
|
|
|
|
+{
|
|
|
|
|
+ ESP_LOGE(TAG,
|
|
|
|
|
+ "bsp_codec_init failed: %s",
|
|
|
|
|
+ esp_err_to_name(codec_ret));
|
|
|
|
|
+}
|
|
|
|
|
+else
|
|
|
|
|
+{
|
|
|
|
|
+ ESP_LOGI(TAG,"bsp_codec_init OK");
|
|
|
|
|
+}
|
|
|
/* Initialize PA */
|
|
/* Initialize PA */
|
|
|
/*gpio_config_t io_conf;
|
|
/*gpio_config_t io_conf;
|
|
|
memset(&io_conf, 0, sizeof(io_conf));
|
|
memset(&io_conf, 0, sizeof(io_conf));
|
|
@@ -504,6 +687,12 @@ esp_err_t esp_board_init(uint32_t sample_rate, int channel_format, int bits_per_
|
|
|
gpio_config(&io_conf);
|
|
gpio_config(&io_conf);
|
|
|
*/
|
|
*/
|
|
|
gpio_set_level(GPIO_PWR_CTRL, 1);
|
|
gpio_set_level(GPIO_PWR_CTRL, 1);
|
|
|
|
|
+
|
|
|
|
|
+ esp_err_t button_ret = bsp_volume_buttons_init();
|
|
|
|
|
+ if (button_ret != ESP_OK) {
|
|
|
|
|
+ ESP_LOGW(TAG, "Failed to initialize volume buttons: %s", esp_err_to_name(button_ret));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return ESP_OK;
|
|
return ESP_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -693,4 +882,4 @@ uint16_t Folder_retrieval(const char* directory, const char* fileExtension, char
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return fileCount;
|
|
return fileCount;
|
|
|
-}
|
|
|
|
|
|
|
+}
|