aboutsummaryrefslogtreecommitdiffstats
path: root/arduino/cores/nRF5/utility/AdaCallback.h
diff options
context:
space:
mode:
Diffstat (limited to 'arduino/cores/nRF5/utility/AdaCallback.h')
-rwxr-xr-xarduino/cores/nRF5/utility/AdaCallback.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/arduino/cores/nRF5/utility/AdaCallback.h b/arduino/cores/nRF5/utility/AdaCallback.h
new file mode 100755
index 0000000..b6a2708
--- /dev/null
+++ b/arduino/cores/nRF5/utility/AdaCallback.h
@@ -0,0 +1,112 @@
+/**************************************************************************/
+/*!
+ @file AdaCallback.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2018, Adafruit Industries (adafruit.com)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**************************************************************************/
+#ifndef ADACALLBACK_H_
+#define ADACALLBACK_H_
+
+#include "common_inc.h"
+
+#define CFG_CALLBACK_TASK_STACKSIZE (512*2)
+#define CFG_CALLBACK_QUEUE_LENGTH 20
+#define CFG_CALLBACK_TIMEOUT 100
+
+//#ifdef __cplusplus
+//extern "C"{
+//#endif
+
+typedef struct
+{
+ void* malloced_data;
+ void* callback_func;
+
+ uint8_t arg_count;
+ bool from_isr;
+// uint8_t callback_type;
+// uint8_t _reserved[2];
+
+ uint32_t arguments[1]; // flexible array holder
+}ada_callback_t;
+
+VERIFY_STATIC( sizeof(ada_callback_t) == 16 );
+
+/*------------- Defer callback type, determined by number of arguments -------------*/
+typedef void (*adacb_0arg_t) (void);
+typedef void (*adacb_1arg_t) (uint32_t);
+typedef void (*adacb_2arg_t) (uint32_t, uint32_t);
+typedef void (*adacb_3arg_t) (uint32_t, uint32_t, uint32_t);
+typedef void (*adacb_4arg_t) (uint32_t, uint32_t, uint32_t, uint32_t);
+typedef void (*adacb_5arg_t) (uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
+
+#ifdef __cplusplus
+template<typename Func, typename... Args>
+inline void _cb_setup(bool _from_isr, void *_malloced, Func _func, Args... args)
+{
+ uint8_t const _count = sizeof...(args);
+ ada_callback_t* cb_data = (ada_callback_t*) rtos_malloc( sizeof(ada_callback_t) + (_count ? (_count-1)*4 : 0) );
+ cb_data->malloced_data = _malloced;
+ cb_data->callback_func = (void*)_func;
+ cb_data->arg_count = _count;
+ if ( _count ) {
+ uint32_t arguments[] = { ((uint32_t)args)... };
+ memcpy(cb_data->arguments, arguments, 4*_count);
+ }
+
+ extern void ada_callback_queue(ada_callback_t* cb_data, bool from_isr);
+ ada_callback_queue(cb_data, _from_isr);
+}
+#endif // __cplusplus
+
+/**
+ * Schedule an function and parameters to be invoked in Ada Callback Task
+ * Macro can take at least 2 and at max 7 arguments
+ * - 1st arg : pointer data that need to be freed with free(pointer) after function is invoked
+ * - 2nd arg : function to be invoked
+ * - 3rd-7th arg : function argument, will be cast to uint32_t
+ */
+#define ada_callback(... ) _cb_setup(false, __VA_ARGS__)
+
+/**
+ * Similar to ada_callback() but invoke in ISR-context
+ */
+#define ada_callback_fromISR(... ) _cb_setup(true , __VA_ARGS__)
+
+void ada_callback_init(void);
+void ada_callback_queue(ada_callback_t* cb_data, bool from_isr);
+
+//#ifdef __cplusplus
+//}
+//#endif
+
+#endif /* ADACALLBACK_H_ */