@@ -57,12 +57,11 @@ extern "C"{
5757
5858typedef struct
5959{
60- void * malloced_data ;
61- void * callback_func ;
60+ void * malloced_data ;
61+ void const * callback_func ;
6262
6363 uint8_t arg_count ;
64- bool from_isr ;
65- // uint8_t _reserved[2];
64+ // uint8_t _reserved[3];
6665
6766 uint32_t arguments [1 ]; // flexible array holder
6867}ada_callback_t ;
@@ -94,28 +93,11 @@ typedef void (*adacb_5arg_t) (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
9493/**
9594 * Macro function is called by other module with all intended parameters.
9695 */
97- #define _cb_setup (_from_isr , _mdata , _mlen , _func , ... ) \
98- do { \
99- uint8_t const _count = VA_ARGS_NUM(__VA_ARGS__); \
100- ada_callback_t* cb_data = (ada_callback_t*) rtos_malloc( sizeof(ada_callback_t) + (_count ? (_count-1)*4 : 0) );\
101- cb_data->malloced_data = NULL; \
102- if ( (_mdata) && (_mlen) ) { \
103- cb_data->malloced_data = rtos_malloc(_mlen); \
104- memcpy(cb_data->malloced_data, _mdata, _mlen); \
105- } \
106- cb_data->callback_func = (void*)_func; \
107- cb_data->arg_count = _count; \
108- if ( _count ) { \
109- uint32_t arguments[] = { _ADA_CB_ARGS(__VA_ARGS__) }; \
110- /* argument most likely is _mdata if used, change it to malloced one */ \
111- if ( (_mdata ) && (_mlen ) ) { \
112- for (uint8_t i = 0 ; i < _count ; i ++ ) {\
113- if (arguments [i ] == ((uint32_t ) (_mdata ))) { arguments [i ] = ((uint32_t ) cb_data -> malloced_data ); } \
114- }\
115- }\
116- memcpy (cb_data -> arguments , arguments , 4 * _count ); \
117- } \
118- ada_callback_queue (cb_data , _from_isr ); \
96+ #define _cb_setup (_malloc_data , _malloc_len , _func , ... ) \
97+ do { \
98+ uint8_t const _count = VA_ARGS_NUM(__VA_ARGS__); \
99+ uint32_t arguments[] = { _ADA_CB_ARGS(__VA_ARGS__) }; \
100+ ada_callback_invoke(_malloc_data, _malloc_len, (void const*) _func, arguments, _count); \
119101 } while(0)
120102
121103/**
@@ -127,15 +109,12 @@ typedef void (*adacb_5arg_t) (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
127109 * - 3rd arg : function to be invoked
128110 * - 3rd-7th arg : function argument, will be cast to uint32_t
129111 */
130- #define ada_callback (... ) _cb_setup(false, __VA_ARGS__)
112+ #define ada_callback (...) _cb_setup(__VA_ARGS__)
131113
132- /**
133- * Similar to ada_callback() but invoke in ISR-context
134- */
135- #define ada_callback_fromISR (... ) _cb_setup(true, __VA_ARGS__)
136114
137115void ada_callback_init (void );
138- void ada_callback_queue (ada_callback_t * cb_data , bool from_isr );
116+ void ada_callback_invoke (const void * mdata , uint32_t mlen , const void * func , uint32_t arguments [], uint8_t argcount );
117+ void ada_callback_queue (ada_callback_t * cb_item );
139118
140119#ifdef __cplusplus
141120}
0 commit comments