@@ -232,6 +232,90 @@ static int spi_out_le_audio_log_init(void);
232232static void spi_out_le_audio_log_deinit (void );
233233#endif // SPI_OUT_LE_AUDIO_ENABLED
234234
235+ // Private templates
236+ #define IF_1 (...) __VA_ARGS__
237+ #define IF_0 (...)
238+
239+ #define LOG_MODULE_INIT_FLAG (ID ) (ID##_log_inited)
240+ #define LOG_MODULE_CB (ID ) (ID##_log_cb)
241+ #define LOG_MODULE_MUTEX (ID ) (ID##_log_mutex)
242+ #define LOG_MODULE_STR_BUF (ID ) (ID##_log_str_buf)
243+ #define LOG_MODULE_INIT (ID ) (spi_out_##ID##_log_init)
244+ #define LOG_MODULE_DEINIT (ID ) (spi_out_##ID##_log_deinit)
245+ #define LOG_MODULE_FLUSH (ID ) (spi_out_##ID##_log_flush)
246+
247+ #define DECLARE_LOG_MODULE (ID , TYPE , BUF_SIZE , USE_MUTEX , USE_STR ) \
248+ static bool LOG_MODULE_INIT_FLAG(ID) = false; \
249+ static spi_out_log_cb_t *LOG_MODULE_CB(ID) = NULL; \
250+ IF_##USE_MUTEX(static SemaphoreHandle_t LOG_MODULE_MUTEX(ID) = NULL;) \
251+ IF_##USE_STR(static uint8_t *LOG_MODULE_STR_BUF(ID) = NULL;) \
252+ \
253+ static int LOG_MODULE_INIT(ID)(void); \
254+ static void LOG_MODULE_DEINIT(ID)(void); \
255+ static void LOG_MODULE_FLUSH(ID)(void); \
256+ \
257+ static int LOG_MODULE_INIT(ID)(void) { \
258+ if (LOG_MODULE_INIT_FLAG(ID)) { \
259+ return 0; \
260+ } \
261+ IF_##USE_MUTEX( \
262+ LOG_MODULE_MUTEX(ID) = xSemaphoreCreateMutex(); \
263+ if (!LOG_MODULE_MUTEX(ID)) { \
264+ goto failed; \
265+ } \
266+ ) \
267+ IF_##USE_STR( \
268+ LOG_MODULE_STR_BUF(ID) = (uint8_t *)SPI_OUT_MALLOC(SPI_OUT_LOG_STR_BUF_SIZE); \
269+ if (!LOG_MODULE_STR_BUF(ID)) { \
270+ goto failed; \
271+ } \
272+ ) \
273+ if (spi_out_log_cb_init(&LOG_MODULE_CB(ID), BUF_SIZE, TYPE) != 0) { \
274+ goto failed; \
275+ } \
276+ LOG_MODULE_INIT_FLAG(ID) = true; \
277+ return 0; \
278+ failed: \
279+ LOG_MODULE_DEINIT(ID)(); \
280+ return -1; \
281+ } \
282+ static void LOG_MODULE_DEINIT(ID)(void) { \
283+ LOG_MODULE_INIT_FLAG(ID) = false; \
284+ IF_##USE_MUTEX( \
285+ if (!LOG_MODULE_MUTEX(ID)) { \
286+ return; \
287+ } \
288+ xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \
289+ ) \
290+ IF_##USE_STR( \
291+ if (LOG_MODULE_STR_BUF(ID)) { \
292+ free(LOG_MODULE_STR_BUF(ID)); \
293+ LOG_MODULE_STR_BUF(ID) = NULL; \
294+ } \
295+ ) \
296+ spi_out_log_cb_deinit(&LOG_MODULE_CB(ID)); \
297+ \
298+ IF_##USE_MUTEX( \
299+ xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \
300+ vSemaphoreDelete(LOG_MODULE_MUTEX(ID)); \
301+ LOG_MODULE_MUTEX(ID) = NULL; \
302+ ) \
303+ } \
304+ static void LOG_MODULE_FLUSH(ID)(void) { \
305+ if (!LOG_MODULE_INIT_FLAG(ID)) { \
306+ return; \
307+ } \
308+ IF_##USE_MUTEX( \
309+ xSemaphoreTake(LOG_MODULE_MUTEX(ID), portMAX_DELAY); \
310+ ) \
311+ spi_out_log_cb_write_loss(LOG_MODULE_CB(ID)); \
312+ spi_out_log_cb_flush_trans(LOG_MODULE_CB(ID)); \
313+ spi_out_log_cb_append_trans(LOG_MODULE_CB(ID)); \
314+ IF_##USE_MUTEX( \
315+ xSemaphoreGive(LOG_MODULE_MUTEX(ID)); \
316+ ) \
317+ } \
318+
235319// Private functions
236320static int spi_out_init_trans (spi_out_trans_cb_t * * trans_cb , uint16_t buf_size )
237321{
0 commit comments