попытки запустится до 1 МГц
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user