| /* |
| * Copyright (c) 2022 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_LOGGING_LOG_MULTIDOMAIN_HELPER_H_ |
| #define ZEPHYR_INCLUDE_LOGGING_LOG_MULTIDOMAIN_HELPER_H_ |
| |
| /* This module aims to provide baseline for links and backends and simplify |
| * the implementation. It is not core part of logging in similar way as |
| * log_output module is just a helper for log message formatting. Links and |
| * backends can be implemented without this helper. |
| */ |
| |
| /**@defgroup LOG_MULTIDOMAIN_HALPER_MESSAGE_IDS IDs of message. |
| * @{ |
| */ |
| |
| /** @brief Logging message ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_MSG 0 |
| |
| /** @brief Domain count request ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_GET_DOMAIN_CNT 1 |
| |
| /** @brief Source count request ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_GET_SOURCE_CNT 2 |
| |
| /** @brief Domain name request ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_GET_DOMAIN_NAME 3 |
| |
| /** @brief Source name request ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_GET_SOURCE_NAME 4 |
| |
| /** @brief Compile time and run-time levels request ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_GET_LEVELS 5 |
| |
| /** @brief Setting run-time level ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_SET_RUNTIME_LEVEL 6 |
| |
| /** @brief Get number of dropped message ID. */ |
| #define Z_LOG_MULTIDOMAIN_ID_DROPPED 7 |
| |
| /** @brief Link-backend readiness indication ID/ */ |
| #define Z_LOG_MULTIDOMAIN_ID_READY 8 |
| |
| /**@} */ |
| |
| /**@defgroup LOG_MULTIDOMAIN_STATUS. |
| * @{ |
| */ |
| |
| /** @brief OK. */ |
| #define Z_LOG_MULTIDOMAIN_STATUS_OK 0 |
| /** @brief Error. */ |
| #define Z_LOG_MULTIDOMAIN_STATUS_ERR 1 |
| |
| /**@} */ |
| |
| /** @brief Content of the logging message. */ |
| struct log_multidomain_log_msg { |
| uint8_t data[0]; |
| } __packed; |
| |
| /** @brief Content of the domain count message. */ |
| struct log_multidomain_domain_cnt { |
| uint16_t count; |
| } __packed; |
| |
| /** @brief Content of the source count message. */ |
| struct log_multidomain_source_cnt { |
| uint8_t domain_id; |
| uint16_t count; |
| } __packed; |
| |
| /** @brief Content of the domain name message. */ |
| struct log_multidomain_domain_name { |
| uint8_t domain_id; |
| char name[0]; |
| } __packed; |
| |
| /** @brief Content of the source name message. */ |
| struct log_multidomain_source_name { |
| uint8_t domain_id; |
| uint16_t source_id; |
| char name[0]; |
| } __packed; |
| |
| /** @brief Content of the message for getting logging levels. */ |
| struct log_multidomain_levels { |
| uint8_t domain_id; |
| uint16_t source_id; |
| uint8_t level; |
| uint8_t runtime_level; |
| } __packed; |
| |
| /** @brief Content of the message for setting logging level. */ |
| struct log_multidomain_set_runtime_level { |
| uint8_t domain_id; |
| uint16_t source_id; |
| uint8_t runtime_level; |
| } __packed; |
| |
| /** @brief Content of the message for getting amount of dropped messages. */ |
| struct log_multidomain_dropped { |
| uint32_t dropped; |
| } __packed; |
| |
| /** @brief Union with all message types. */ |
| union log_multidomain_msg_data { |
| struct log_multidomain_log_msg log_msg; |
| struct log_multidomain_domain_cnt domain_cnt; |
| struct log_multidomain_source_cnt source_cnt; |
| struct log_multidomain_domain_name domain_name; |
| struct log_multidomain_source_name source_name; |
| struct log_multidomain_levels levels; |
| struct log_multidomain_set_runtime_level set_rt_level; |
| struct log_multidomain_dropped dropped; |
| }; |
| |
| /** @brief Message. */ |
| struct log_multidomain_msg { |
| uint8_t id; |
| uint8_t status; |
| union log_multidomain_msg_data data; |
| } __packed; |
| |
| /** @brief Forward declaration. */ |
| struct log_multidomain_link; |
| |
| /** @brief Structure with link transport API. */ |
| struct log_multidomain_link_transport_api { |
| int (*init)(struct log_multidomain_link *link); |
| int (*send)(struct log_multidomain_link *link, void *data, size_t len); |
| }; |
| |
| /** @brief Union for holding data returned by associated remote backend. */ |
| union log_multidomain_link_dst { |
| uint16_t count; |
| |
| struct { |
| char *dst; |
| size_t *len; |
| } name; |
| |
| struct { |
| uint8_t level; |
| uint8_t runtime_level; |
| } levels; |
| |
| struct { |
| uint8_t level; |
| } set_runtime_level; |
| }; |
| |
| /** @brief Remote link API. */ |
| extern struct log_link_api log_multidomain_link_api; |
| |
| /** @brief Remote link structure. */ |
| struct log_multidomain_link { |
| const struct log_multidomain_link_transport_api *transport_api; |
| struct k_sem rdy_sem; |
| const struct log_link *link; |
| union log_multidomain_link_dst dst; |
| int status; |
| bool ready; |
| }; |
| |
| /** @brief Forward declaration. */ |
| struct log_multidomain_backend; |
| |
| /** @brief Backend transport API. */ |
| struct log_multidomain_backend_transport_api { |
| int (*init)(struct log_multidomain_backend *backend); |
| int (*send)(struct log_multidomain_backend *backend, void *data, size_t len); |
| }; |
| |
| /** @brief Remote backend API. */ |
| extern const struct log_backend_api log_multidomain_backend_api; |
| |
| /** @brief Remote backend structure. */ |
| struct log_multidomain_backend { |
| const struct log_multidomain_backend_transport_api *transport_api; |
| const struct log_backend *log_backend; |
| struct k_sem rdy_sem; |
| bool panic; |
| int status; |
| bool ready; |
| }; |
| |
| /** @brief Function to be called when data is received from remote. |
| * |
| * @param link Link instance. |
| * @param data Data. |
| * @param len Data length. |
| */ |
| void log_multidomain_link_on_recv_cb(struct log_multidomain_link *link, |
| const void *data, size_t len); |
| |
| /** @brief Function called on error reported by transport layer. |
| * |
| * @param link Link instance. |
| * @param err Error code. |
| */ |
| void log_multidomain_link_on_error(struct log_multidomain_link *link, int err); |
| |
| /** @brief Function called when connection with remote is established. |
| * |
| * @param link Link instance. |
| * @param err Error code. |
| */ |
| void log_multidomain_link_on_started(struct log_multidomain_link *link, int err); |
| |
| /** @brief Function to be called when data is received from remote. |
| * |
| * @param backend Backend instance. |
| * @param data Data. |
| * @param len Data length. |
| */ |
| void log_multidomain_backend_on_recv_cb(struct log_multidomain_backend *backend, |
| const void *data, size_t len); |
| |
| /** @brief Function called on error reported by transport layer. |
| * |
| * @param backend Backend instance. |
| * @param err Error code. |
| */ |
| void log_multidomain_backend_on_error(struct log_multidomain_backend *backend, int err); |
| |
| /** @brief Function called when connection with remote is established. |
| * |
| * @param backend Backend instance. |
| * @param err Error code. |
| */ |
| void log_multidomain_backend_on_started(struct log_multidomain_backend *backend, int err); |
| |
| #endif /* ZEPHYR_INCLUDE_LOGGING_LOG_MULTIDOMAIN_HELPER_H_ */ |