1
0
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:
Alessio Morale 2015-12-29 15:07:23 +01:00
parent cefcacbbcf
commit fe217796b5
4 changed files with 15 additions and 9 deletions

View File

@ -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); }

View File

@ -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);

View File

@ -73,6 +73,7 @@ struct ObjectEventEntry {
xQueueHandle queue; xQueueHandle queue;
UAVObjEventCallback cb; UAVObjEventCallback cb;
uint8_t eventMask; uint8_t eventMask;
bool fast;
}; };
/* /*

View File

@ -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