mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-27 16:54:15 +01:00
LP-207 - Implement Fast callback option
This commit is contained in:
parent
cefcacbbcf
commit
fe217796b5
@ -76,7 +76,8 @@ static inline int32_t $(NAME)Set(const $(NAME)Data *dataIn) { return UAVObjSetDa
|
|||||||
static inline int32_t $(NAME)InstGet(uint16_t instId, $(NAME)Data *dataOut) { return UAVObjGetInstanceData($(NAME)Handle(), instId, dataOut); }
|
static inline int32_t $(NAME)InstGet(uint16_t instId, $(NAME)Data *dataOut) { return UAVObjGetInstanceData($(NAME)Handle(), instId, dataOut); }
|
||||||
static inline int32_t $(NAME)InstSet(uint16_t instId, const $(NAME)Data *dataIn) { return UAVObjSetInstanceData($(NAME)Handle(), instId, dataIn); }
|
static inline int32_t $(NAME)InstSet(uint16_t instId, const $(NAME)Data *dataIn) { return UAVObjSetInstanceData($(NAME)Handle(), instId, dataIn); }
|
||||||
static inline int32_t $(NAME)ConnectQueue(xQueueHandle queue) { return UAVObjConnectQueue($(NAME)Handle(), queue, EV_MASK_ALL_UPDATES); }
|
static inline int32_t $(NAME)ConnectQueue(xQueueHandle queue) { return UAVObjConnectQueue($(NAME)Handle(), queue, EV_MASK_ALL_UPDATES); }
|
||||||
static inline int32_t $(NAME)ConnectCallback(UAVObjEventCallback cb) { return UAVObjConnectCallback($(NAME)Handle(), cb, EV_MASK_ALL_UPDATES); }
|
static inline int32_t $(NAME)ConnectCallback(UAVObjEventCallback cb) { return UAVObjConnectCallback($(NAME)Handle(), cb, EV_MASK_ALL_UPDATES,FALSE); }
|
||||||
|
static inline int32_t $(NAME)ConnectCallbackFast(UAVObjEventCallback cb) { return UAVObjConnectCallback($(NAME)Handle(), cb, EV_MASK_ALL_UPDATES, TRUE); }
|
||||||
static inline uint16_t $(NAME)CreateInstance() { return UAVObjCreateInstance($(NAME)Handle(), &$(NAME)SetDefaults); }
|
static inline uint16_t $(NAME)CreateInstance() { return UAVObjCreateInstance($(NAME)Handle(), &$(NAME)SetDefaults); }
|
||||||
static inline void $(NAME)RequestUpdate() { UAVObjRequestUpdate($(NAME)Handle()); }
|
static inline void $(NAME)RequestUpdate() { UAVObjRequestUpdate($(NAME)Handle()); }
|
||||||
static inline void $(NAME)RequestInstUpdate(uint16_t instId) { UAVObjRequestInstanceUpdate($(NAME)Handle(), instId); }
|
static inline void $(NAME)RequestInstUpdate(uint16_t instId) { UAVObjRequestInstanceUpdate($(NAME)Handle(), instId); }
|
||||||
|
@ -236,7 +236,7 @@ void UAVObjSetLoggingUpdateMode(UAVObjMetadata *dataOut, UAVObjUpdateMode val);
|
|||||||
int8_t UAVObjReadOnly(UAVObjHandle obj);
|
int8_t UAVObjReadOnly(UAVObjHandle obj);
|
||||||
int32_t UAVObjConnectQueue(UAVObjHandle obj_handle, xQueueHandle queue, uint8_t eventMask);
|
int32_t UAVObjConnectQueue(UAVObjHandle obj_handle, xQueueHandle queue, uint8_t eventMask);
|
||||||
int32_t UAVObjDisconnectQueue(UAVObjHandle obj_handle, xQueueHandle queue);
|
int32_t UAVObjDisconnectQueue(UAVObjHandle obj_handle, xQueueHandle queue);
|
||||||
int32_t UAVObjConnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb, uint8_t eventMask);
|
int32_t UAVObjConnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb, uint8_t eventMask, bool fast);
|
||||||
int32_t UAVObjDisconnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb);
|
int32_t UAVObjDisconnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb);
|
||||||
void UAVObjRequestUpdate(UAVObjHandle obj);
|
void UAVObjRequestUpdate(UAVObjHandle obj);
|
||||||
void UAVObjRequestInstanceUpdate(UAVObjHandle obj_handle, uint16_t instId);
|
void UAVObjRequestInstanceUpdate(UAVObjHandle obj_handle, uint16_t instId);
|
||||||
|
@ -73,6 +73,7 @@ struct ObjectEventEntry {
|
|||||||
xQueueHandle queue;
|
xQueueHandle queue;
|
||||||
UAVObjEventCallback cb;
|
UAVObjEventCallback cb;
|
||||||
uint8_t eventMask;
|
uint8_t eventMask;
|
||||||
|
bool fast;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
// Private functions
|
// Private functions
|
||||||
static InstanceHandle createInstance(struct UAVOData *obj, uint16_t instId);
|
static InstanceHandle createInstance(struct UAVOData *obj, uint16_t instId);
|
||||||
static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb, uint8_t eventMask);
|
static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb, uint8_t eventMask, bool fast);
|
||||||
static int32_t disconnectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb);
|
static int32_t disconnectObj(UAVObjHandle obj_handle, xQueueHandle queue, UAVObjEventCallback cb);
|
||||||
static void instanceAutoUpdated(UAVObjHandle obj_handle, uint16_t instId);
|
static void instanceAutoUpdated(UAVObjHandle obj_handle, uint16_t instId);
|
||||||
|
|
||||||
@ -1346,7 +1346,7 @@ int32_t UAVObjConnectQueue(UAVObjHandle obj_handle, xQueueHandle queue,
|
|||||||
PIOS_Assert(queue);
|
PIOS_Assert(queue);
|
||||||
int32_t res;
|
int32_t res;
|
||||||
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
|
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
|
||||||
res = connectObj(obj_handle, queue, 0, eventMask);
|
res = connectObj(obj_handle, queue, 0, eventMask, false);
|
||||||
xSemaphoreGiveRecursive(mutex);
|
xSemaphoreGiveRecursive(mutex);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -1377,12 +1377,12 @@ int32_t UAVObjDisconnectQueue(UAVObjHandle obj_handle, xQueueHandle queue)
|
|||||||
* \return 0 if success or -1 if failure
|
* \return 0 if success or -1 if failure
|
||||||
*/
|
*/
|
||||||
int32_t UAVObjConnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb,
|
int32_t UAVObjConnectCallback(UAVObjHandle obj_handle, UAVObjEventCallback cb,
|
||||||
uint8_t eventMask)
|
uint8_t eventMask, bool fast)
|
||||||
{
|
{
|
||||||
PIOS_Assert(obj_handle);
|
PIOS_Assert(obj_handle);
|
||||||
int32_t res;
|
int32_t res;
|
||||||
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
|
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
|
||||||
res = connectObj(obj_handle, 0, cb, eventMask);
|
res = connectObj(obj_handle, 0, cb, eventMask, fast);
|
||||||
xSemaphoreGiveRecursive(mutex);
|
xSemaphoreGiveRecursive(mutex);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -1535,8 +1535,10 @@ int32_t sendEvent(struct UAVOBase *obj, uint16_t instId, UAVObjEventType trigger
|
|||||||
|
|
||||||
// Invoke callback (from event task) if a valid one is registered
|
// Invoke callback (from event task) if a valid one is registered
|
||||||
if (event->cb) {
|
if (event->cb) {
|
||||||
|
if (event->fast) {
|
||||||
|
event->cb(&msg);
|
||||||
|
} else if (EventCallbackDispatch(&msg, event->cb) != pdTRUE) {
|
||||||
// invoke callback from the event task, will not block
|
// invoke callback from the event task, will not block
|
||||||
if (EventCallbackDispatch(&msg, event->cb) != pdTRUE) {
|
|
||||||
++stats.eventCallbackErrors;
|
++stats.eventCallbackErrors;
|
||||||
stats.lastCallbackErrorID = UAVObjGetID(obj);
|
stats.lastCallbackErrorID = UAVObjGetID(obj);
|
||||||
}
|
}
|
||||||
@ -1651,7 +1653,7 @@ InstanceHandle getInstance(struct UAVOData *obj, uint16_t instId)
|
|||||||
* \return 0 if success or -1 if failure
|
* \return 0 if success or -1 if failure
|
||||||
*/
|
*/
|
||||||
static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue,
|
static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue,
|
||||||
UAVObjEventCallback cb, uint8_t eventMask)
|
UAVObjEventCallback cb, uint8_t eventMask, bool fast)
|
||||||
{
|
{
|
||||||
struct ObjectEventEntry *event;
|
struct ObjectEventEntry *event;
|
||||||
struct UAVOBase *obj;
|
struct UAVOBase *obj;
|
||||||
@ -1662,6 +1664,7 @@ static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue,
|
|||||||
if (event->queue == queue && event->cb == cb) {
|
if (event->queue == queue && event->cb == cb) {
|
||||||
// Already connected, update event mask and return
|
// Already connected, update event mask and return
|
||||||
event->eventMask = eventMask;
|
event->eventMask = eventMask;
|
||||||
|
event->fast = fast;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1674,6 +1677,7 @@ static int32_t connectObj(UAVObjHandle obj_handle, xQueueHandle queue,
|
|||||||
event->queue = queue;
|
event->queue = queue;
|
||||||
event->cb = cb;
|
event->cb = cb;
|
||||||
event->eventMask = eventMask;
|
event->eventMask = eventMask;
|
||||||
|
event->fast = fast;
|
||||||
LL_APPEND(obj->next_event, event);
|
LL_APPEND(obj->next_event, event);
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user