Increase buffer sizes to enable higher sample rates with less jitter
This commit is contained in:
@@ -137,7 +137,7 @@
|
|||||||
<form id="configForm" class="controls">
|
<form id="configForm" class="controls">
|
||||||
<div>
|
<div>
|
||||||
<label>Sample Rate (Hz)</label>
|
<label>Sample Rate (Hz)</label>
|
||||||
<input type="number" id="sampleRate" value="10000" min="1" max="100000">
|
<input type="number" id="sampleRate" value="10000" min="1" max="83333">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label>Bit Width</label>
|
<label>Bit Width</label>
|
||||||
|
|||||||
@@ -156,7 +156,8 @@ canvas.addEventListener('click', (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Data buffer
|
// Data buffer
|
||||||
const maxPoints = 1000;
|
const maxPoints = 4000;
|
||||||
|
/** @type Array<number> */
|
||||||
let dataBuffer = new Array(maxPoints).fill(0);
|
let dataBuffer = new Array(maxPoints).fill(0);
|
||||||
|
|
||||||
// WebSocket
|
// WebSocket
|
||||||
@@ -201,7 +202,7 @@ function connect() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function processData(newData) {
|
function processData(/** @type Uint16Array */newData) {
|
||||||
if (isFrozen) {
|
if (isFrozen) {
|
||||||
return; // Skip updating the buffer when frozen
|
return; // Skip updating the buffer when frozen
|
||||||
}
|
}
|
||||||
@@ -219,30 +220,31 @@ function processData(newData) {
|
|||||||
pushToBuffer(newData);
|
pushToBuffer(newData);
|
||||||
} else {
|
} else {
|
||||||
// Accumulation mode (Peak Detect)
|
// Accumulation mode (Peak Detect)
|
||||||
let pointsToPush = [];
|
let pointsToPush = new Uint16Array(newData.length * 2); // Worst case
|
||||||
for (let val of newData) {
|
let idx = 0;
|
||||||
|
for (const val of newData) {
|
||||||
if (val < lowRateState.accMin) lowRateState.accMin = val;
|
if (val < lowRateState.accMin) lowRateState.accMin = val;
|
||||||
if (val > lowRateState.accMax) lowRateState.accMax = val;
|
if (val > lowRateState.accMax) lowRateState.accMax = val;
|
||||||
lowRateState.count++;
|
lowRateState.count++;
|
||||||
|
|
||||||
if (lowRateState.count >= lowRateState.targetCount) {
|
if (lowRateState.count >= lowRateState.targetCount) {
|
||||||
// Push min and max to draw a vertical line
|
// Push min and max to draw a vertical line
|
||||||
pointsToPush.push(lowRateState.accMin);
|
pointsToPush[idx++] = lowRateState.accMin;
|
||||||
pointsToPush.push(lowRateState.accMax);
|
pointsToPush[idx++] = lowRateState.accMax;
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
resetLowRateState();
|
resetLowRateState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pointsToPush.length > 0) {
|
if (idx > 0) {
|
||||||
pushToBuffer(pointsToPush);
|
pushToBuffer(pointsToPush.slice(0, idx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function pushToBuffer(newItems) {
|
function pushToBuffer(/** @type Uint16Array */ newItems) {
|
||||||
if (newItems.length >= maxPoints) {
|
if (newItems.length >= maxPoints) {
|
||||||
dataBuffer = newItems.slice(-maxPoints);
|
dataBuffer = Array.from(newItems.slice(-maxPoints));
|
||||||
} else {
|
} else {
|
||||||
dataBuffer.splice(0, newItems.length);
|
dataBuffer.splice(0, newItems.length);
|
||||||
dataBuffer.push(...newItems);
|
dataBuffer.push(...newItems);
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ static void start_webserver(void);
|
|||||||
#define ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
|
#define ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
|
||||||
#define ADC_GET_DATA(p_data) ((p_data)->type2.data)
|
#define ADC_GET_DATA(p_data) ((p_data)->type2.data)
|
||||||
|
|
||||||
#define ADC_READ_LEN 512
|
#define ADC_READ_LEN 1024
|
||||||
#define ADC_MAX_STORE_BUF_SIZE 1024
|
|
||||||
|
|
||||||
static adc_continuous_handle_t adc_handle = NULL;
|
static adc_continuous_handle_t adc_handle = NULL;
|
||||||
static TaskHandle_t s_task_handle;
|
static TaskHandle_t s_task_handle;
|
||||||
@@ -71,7 +70,7 @@ static int s_ws_client_fd = -1;
|
|||||||
|
|
||||||
// Global configuration state
|
// Global configuration state
|
||||||
static volatile bool s_reconfig_needed = false;
|
static volatile bool s_reconfig_needed = false;
|
||||||
static uint32_t s_sample_rate = 20000;
|
static uint32_t s_sample_rate = 10000;
|
||||||
static adc_atten_t s_atten = ADC_ATTEN_DB_12;
|
static adc_atten_t s_atten = ADC_ATTEN_DB_12;
|
||||||
static adc_bitwidth_t s_bit_width = ADC_BIT_WIDTH;
|
static adc_bitwidth_t s_bit_width = ADC_BIT_WIDTH;
|
||||||
static uint16_t s_test_hz = 100;
|
static uint16_t s_test_hz = 100;
|
||||||
@@ -282,7 +281,7 @@ void app_main(void) {
|
|||||||
ESP_LOGE(TAG, "Failed to create ring buffer");
|
ESP_LOGE(TAG, "Failed to create ring buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
xTaskCreate(adc_read_task, "adc_read_task", 4 * 1024, NULL, 5, NULL);
|
xTaskCreate(adc_read_task, "adc_read_task", 4096 + ADC_READ_LEN, NULL, 5, NULL);
|
||||||
|
|
||||||
// Wait for WiFi connection
|
// Wait for WiFi connection
|
||||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
||||||
|
|||||||
Reference in New Issue
Block a user