попытки запустится до 1 МГц

This commit is contained in:
2026-08-05 18:54:42 +03:00
parent c4c9167df1
commit 1edc420b77
11 changed files with 182 additions and 63 deletions

View File

@@ -16,7 +16,7 @@ uint32_t PulseReceiver::tickHz() const {
bool PulseReceiver::begin() {
#if OPTICAL_USE_RMT_DMA
queue_ = xQueueCreate(16, sizeof(SymbolBlock));
queue_ = xQueueCreate(RMT_QUEUE_BLOCKS, sizeof(SymbolBlock));
rmt_rx_channel_config_t cfg = {};
cfg.clk_src = RMT_CLK_SRC_DEFAULT; cfg.resolution_hz = CAPTURE_RESOLUTION_HZ;
cfg.gpio_num = static_cast<gpio_num_t>(GPIO_RX);
@@ -77,7 +77,7 @@ void PulseReceiver::stop() {
void PulseReceiver::resetStream() {
if (queue_) xQueueReset(queue_);
overflow_ = false; haveRise_ = haveFall_ = haveRawTick_ = false;
overflow_ = false; droppedItems_ = 0; haveRise_ = haveFall_ = haveRawTick_ = false;
lastRawTick_ = 0; tickEpoch_ = rise_ = fall_ = 0;
#if OPTICAL_USE_RMT_DMA
block_ = {}; blockIndex_ = 0; phase_ = 0; haveLevel_ = false; level_ = false; rmtTick_ = 0;
@@ -109,17 +109,22 @@ bool PulseReceiver::overflowed() {
const bool value = overflow_; overflow_ = false; return value;
}
uint32_t PulseReceiver::takeDroppedItems() {
return __atomic_exchange_n(&droppedItems_, 0, __ATOMIC_RELAXED);
}
#if OPTICAL_USE_RMT_DMA
bool IRAM_ATTR PulseReceiver::onRmt(rmt_channel_handle_t, const rmt_rx_done_event_data_t *data, void *ctx) {
PulseReceiver *self = static_cast<PulseReceiver *>(ctx);
BaseType_t wake = pdFALSE;
size_t offset = 0;
while (offset < data->num_symbols) {
SymbolBlock b = {};
SymbolBlock &b = self->isrBlock_;
b.count = static_cast<uint16_t>((data->num_symbols - offset) > BLOCK_SYMBOLS ?
BLOCK_SYMBOLS : (data->num_symbols - offset));
memcpy(b.symbols, data->received_symbols + offset, b.count * sizeof(rmt_symbol_word_t));
if (xQueueSendFromISR(self->queue_, &b, &wake) != pdTRUE) self->overflow_ = true;
if (xQueueSendFromISR(self->queue_, &b, &wake) != pdTRUE)
__atomic_fetch_add(&self->droppedItems_, b.count, __ATOMIC_RELAXED);
offset += b.count;
}
return wake == pdTRUE;
@@ -146,10 +151,12 @@ bool PulseReceiver::nextRmtEdge(Edge &edge) {
}
}
bool PulseReceiver::poll(PulsePeriod &period) {
size_t PulseReceiver::readPeriods(PulsePeriod *periods, size_t capacity) {
size_t count = 0;
Edge e;
while (nextRmtEdge(e)) if (consumeEdge(e, period)) return true;
return false;
while (count < capacity && nextRmtEdge(e))
if (consumeEdge(e, periods[count])) ++count;
return count;
}
#else
void IRAM_ATTR PulseReceiver::onGpio(void *ctx) {
@@ -158,13 +165,16 @@ void IRAM_ATTR PulseReceiver::onGpio(void *ctx) {
if (RX_SIGNAL_INVERTED) level = !level;
Edge e = {esp_cpu_get_cycle_count(), static_cast<uint8_t>(level)};
BaseType_t wake = pdFALSE;
if (xQueueSendFromISR(self->queue_, &e, &wake) != pdTRUE) self->overflow_ = true;
if (xQueueSendFromISR(self->queue_, &e, &wake) != pdTRUE)
__atomic_fetch_add(&self->droppedItems_, 1U, __ATOMIC_RELAXED);
if (wake) portYIELD_FROM_ISR();
}
bool PulseReceiver::poll(PulsePeriod &period) {
size_t PulseReceiver::readPeriods(PulsePeriod *periods, size_t capacity) {
size_t count = 0;
Edge e;
while (xQueueReceive(queue_, &e, 0) == pdTRUE) if (consumeEdge(e, period)) return true;
return false;
while (count < capacity && xQueueReceive(queue_, &e, 0) == pdTRUE)
if (consumeEdge(e, periods[count])) ++count;
return count;
}
#endif