sforkowany z mirror/meshtastic-firmware
TypedQueue: make functions return bools instead of BaseType_t
Minor cleanup to hide away some FreeRTOS bits. Note: I believe src/CustomRF95.cpp:62 had a bug where it had the condition inverted.1.2-legacy
rodzic
90ecdf229e
commit
7a4a1af332
|
@ -126,8 +126,7 @@ void CustomRF95::handleInterrupt()
|
||||||
// parsing was successful, queue for our recipient
|
// parsing was successful, queue for our recipient
|
||||||
mp->has_payload = true;
|
mp->has_payload = true;
|
||||||
|
|
||||||
int res = rxDest.enqueueFromISR(mp, &higherPriWoken); // NOWAIT - fixme, if queue is full, delete older messages
|
assert(rxDest.enqueueFromISR(mp, &higherPriWoken)); // NOWAIT - fixme, if queue is full, delete older messages
|
||||||
assert(res == pdTRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clearRxBuf(); // This message accepted and cleared
|
clearRxBuf(); // This message accepted and cleared
|
||||||
|
|
|
@ -66,16 +66,14 @@ public:
|
||||||
/// Return a buffer for use by others
|
/// Return a buffer for use by others
|
||||||
void release(T *p)
|
void release(T *p)
|
||||||
{
|
{
|
||||||
int res = dead.enqueue(p, 0);
|
assert(dead.enqueue(p, 0));
|
||||||
assert(res == pdTRUE);
|
|
||||||
assert(p >= buf && (p - buf) < maxElements); // sanity check to make sure a programmer didn't free something that didn't come from this pool
|
assert(p >= buf && (p - buf) < maxElements); // sanity check to make sure a programmer didn't free something that didn't come from this pool
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a buffer from an ISR, if higherPriWoken is set to true you have some work to do ;-)
|
/// Return a buffer from an ISR, if higherPriWoken is set to true you have some work to do ;-)
|
||||||
void releaseFromISR(T *p, BaseType_t *higherPriWoken)
|
void releaseFromISR(T *p, BaseType_t *higherPriWoken)
|
||||||
{
|
{
|
||||||
int res = dead.enqueueFromISR(p, higherPriWoken);
|
assert(dead.enqueueFromISR(p, higherPriWoken));
|
||||||
assert(res == pdTRUE);
|
|
||||||
assert(p >= buf && (p - buf) < maxElements); // sanity check to make sure a programmer didn't free something that didn't come from this pool
|
assert(p >= buf && (p - buf) < maxElements); // sanity check to make sure a programmer didn't free something that didn't come from this pool
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -173,7 +173,7 @@ void MeshService::handleFromRadio(MeshPacket *mp)
|
||||||
if (d)
|
if (d)
|
||||||
releaseToPool(d);
|
releaseToPool(d);
|
||||||
}
|
}
|
||||||
assert(toPhoneQueue.enqueue(mp, 0) == pdTRUE); // FIXME, instead of failing for full queue, delete the oldest mssages
|
assert(toPhoneQueue.enqueue(mp, 0)); // FIXME, instead of failing for full queue, delete the oldest mssages
|
||||||
|
|
||||||
if (mp->payload.want_response)
|
if (mp->payload.want_response)
|
||||||
sendNetworkPing(mp->from);
|
sendNetworkPing(mp->from);
|
||||||
|
|
|
@ -18,7 +18,7 @@ public:
|
||||||
{
|
{
|
||||||
T *p;
|
T *p;
|
||||||
|
|
||||||
return this->dequeue(&p, maxWait) == pdTRUE ? p : NULL;
|
return this->dequeue(&p, maxWait) ? p : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns a ptr or null if the queue was empty
|
// returns a ptr or null if the queue was empty
|
||||||
|
@ -26,6 +26,6 @@ public:
|
||||||
{
|
{
|
||||||
T *p;
|
T *p;
|
||||||
|
|
||||||
return this->dequeueFromISR(&p, higherPriWoken) == pdTRUE ? p : NULL;
|
return this->dequeueFromISR(&p, higherPriWoken) ? p : nullptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,15 +1,19 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <cassert>
|
||||||
#include <assert.h>
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <freertos/FreeRTOS.h>
|
||||||
|
#include <freertos/queue.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A wrapper for freertos queues. Note: each element object must be quite small, so T should be only
|
* A wrapper for freertos queues. Note: each element object should be small
|
||||||
* pointer types or ints
|
* and POD (Plain Old Data type) as elements are memcpied by value.
|
||||||
*/
|
*/
|
||||||
template <class T>
|
template <class T>
|
||||||
class TypedQueue
|
class TypedQueue
|
||||||
{
|
{
|
||||||
|
static_assert(std::is_pod<T>::value, "T must be pod");
|
||||||
QueueHandle_t h;
|
QueueHandle_t h;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -34,24 +38,22 @@ public:
|
||||||
return uxQueueMessagesWaiting(h) == 0;
|
return uxQueueMessagesWaiting(h) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pdTRUE for success else failure
|
bool enqueue(T x, TickType_t maxWait = portMAX_DELAY)
|
||||||
BaseType_t enqueue(T x, TickType_t maxWait = portMAX_DELAY)
|
|
||||||
{
|
{
|
||||||
return xQueueSendToBack(h, &x, maxWait);
|
return xQueueSendToBack(h, &x, maxWait) == pdTRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseType_t enqueueFromISR(T x, BaseType_t *higherPriWoken)
|
bool enqueueFromISR(T x, BaseType_t *higherPriWoken)
|
||||||
{
|
{
|
||||||
return xQueueSendToBackFromISR(h, &x, higherPriWoken);
|
return xQueueSendToBackFromISR(h, &x, higherPriWoken) == pdTRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pdTRUE for success else failure
|
bool dequeue(T *p, TickType_t maxWait = portMAX_DELAY)
|
||||||
BaseType_t dequeue(T *p, TickType_t maxWait = portMAX_DELAY)
|
|
||||||
{
|
{
|
||||||
return xQueueReceive(h, p, maxWait);
|
return xQueueReceive(h, p, maxWait) == pdTRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseType_t dequeueFromISR(T *p, BaseType_t *higherPriWoken)
|
bool dequeueFromISR(T *p, BaseType_t *higherPriWoken)
|
||||||
{
|
{
|
||||||
return xQueueReceiveFromISR(h, p, higherPriWoken);
|
return xQueueReceiveFromISR(h, p, higherPriWoken);
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue