diff options
author | S. Hameed <shameed@jp.adit-jv.com> | 2015-07-28 16:26:00 +0900 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2015-07-30 10:22:17 +0200 |
commit | 81d76cfeaa3588069887a19f9be7d4337c567c65 (patch) | |
tree | 4e00527db6efd632fc0559e8bcc505c9bcee1b39 | |
parent | 4092d77b78cd3b1e6805c4c32d9842de83d23e7f (diff) | |
download | DLT-daemon-81d76cfeaa3588069887a19f9be7d4337c567c65.tar.gz |
Offline Logstorage [1/4]: DLT preparation to enable offline logstorage
Signed-off-by: S. Hameed <shameed@jp.adit-jv.com>
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rwxr-xr-x | include/dlt/dlt_common.h | 11 | ||||
-rwxr-xr-x | include/dlt/dlt_protocol.h | 1 | ||||
-rwxr-xr-x | src/daemon/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/daemon/dlt-daemon.c | 27 | ||||
-rwxr-xr-x | src/daemon/dlt-daemon.h | 2 | ||||
-rw-r--r-- | src/daemon/dlt.conf | 9 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_client.c | 89 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_client.h | 9 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_common.c | 10 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_common.h | 3 |
11 files changed, 160 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fa70b9..a036676 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/ ${CMAKE_SOURCE_DIR}/include/dlt ${CMAKE_SOURCE_DIR}/src/shared/ + ${CMAKE_SOURCE_DIR}/src/offlinelogstorage/ ${CMAKE_SOURCE_DIR}/src/lib/ ${CMAKE_SOURCE_DIR}/src/daemon/ ${CMAKE_SOURCE_DIR}/systemd/3rdparty/ diff --git a/include/dlt/dlt_common.h b/include/dlt/dlt_common.h index 0f8531c..10334ca 100755 --- a/include/dlt/dlt_common.h +++ b/include/dlt/dlt_common.h @@ -543,6 +543,17 @@ typedef struct uint8_t status; /**< reponse status */ } PACKED DltServiceMarker; +/*** + * The structure of the DLT Service Offline Logstorage + */ +typedef struct +{ + uint32_t service_id; /**< service ID */ + uint8_t dev_num; /**< device number of the connected device */ + uint8_t connection_type; /**< connection status of the connected device connected/disconnected */ + char comid[DLT_ID_SIZE]; /**< communication interface */ +} PACKED DltServiceOfflineLogstorage; + /** * Structure to store filter parameters. * ID are maximal four characters. Unused values are filled with zeros. diff --git a/include/dlt/dlt_protocol.h b/include/dlt/dlt_protocol.h index d734084..3c8488a 100755 --- a/include/dlt/dlt_protocol.h +++ b/include/dlt/dlt_protocol.h @@ -198,6 +198,7 @@ #define DLT_SERVICE_ID_CONNECTION_INFO 0xf02 /**< Service ID: Message connection info */ #define DLT_SERVICE_ID_TIMEZONE 0xf03 /**< Service ID: Timezone */ #define DLT_SERVICE_ID_MARKER 0xf04 /**< Service ID: Marker */ +#define DLT_SERVICE_ID_OFFLINE_LOGSTORAGE 0xf05 /**< Service ID: Offline log storage */ #define DLT_SERVICE_ID_CALLSW_CINJECTION 0xFFF /**< Service ID: Message Injection (minimal ID) */ /* diff --git a/src/daemon/CMakeLists.txt b/src/daemon/CMakeLists.txt index 1955273..a3c7439 100755 --- a/src/daemon/CMakeLists.txt +++ b/src/daemon/CMakeLists.txt @@ -20,7 +20,7 @@ if(WITH_SYSTEMD_WATCHDOG OR WITH_SYSTEMD) message( STATUS "Added ${systemd_SRCS} to dlt-daemon") endif(WITH_SYSTEMD_WATCHDOG OR WITH_SYSTEMD) -set(dlt_daemon_SRCS dlt-daemon.c dlt_daemon_common.c dlt_daemon_socket.c dlt_daemon_serial.c dlt_daemon_client.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_user_shared.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_common.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_shm.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_offline_trace.c) +set(dlt_daemon_SRCS dlt-daemon.c dlt_daemon_common.c dlt_daemon_socket.c dlt_daemon_serial.c dlt_daemon_client.c dlt_daemon_offline_logstorage.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_user_shared.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_common.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_shm.c ${CMAKE_SOURCE_DIR}/src/shared/dlt_offline_trace.c ${CMAKE_SOURCE_DIR}/src/offlinelogstorage/dlt_offline_logstorage.c) add_executable(dlt-daemon ${dlt_daemon_SRCS} ${systemd_SRCS}) target_link_libraries(dlt-daemon rt ${CMAKE_THREAD_LIBS_INIT}) diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index 41cc807..0c70cde 100644 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -195,6 +195,7 @@ int option_file_parser(DltDaemonLocal *daemon_local) daemon_local->flags.sendECUSoftwareVersion = 0; memset(daemon_local->flags.pathToECUSoftwareVersion, 0, sizeof(daemon_local->flags.pathToECUSoftwareVersion)); daemon_local->flags.sendTimezone = 0; + daemon_local->flags.offlineLogstorageMaxDevices = 0; /* open configuration file */ if(daemon_local->flags.cvalue[0]) @@ -377,6 +378,10 @@ int option_file_parser(DltDaemonLocal *daemon_local) daemon_local->flags.sendTimezone = atoi(value); //printf("Option: %s=%s\n",token,value); } + else if(strcmp(token, "OfflineLogstorageMaxDevices")==0) + { + daemon_local->flags.offlineLogstorageMaxDevices = atoi(value); + } else { fprintf(stderr, "Unknown option: %s=%s\n",token,value); @@ -736,6 +741,19 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in } } + /* Init offline logstorage for MAX devices */ + if(daemon_local->flags.offlineLogstorageMaxDevices > 0) + { + daemon->storage_handle = malloc(sizeof(DltLogStorage) * daemon_local->flags.offlineLogstorageMaxDevices); + + if(daemon->storage_handle == NULL) + { + dlt_log(LOG_ERR,"Could not initialize offline logstorage\n"); + return -1; + } + memset(daemon->storage_handle, 0, (sizeof(DltLogStorage) * daemon_local->flags.offlineLogstorageMaxDevices)); + } + /* Set ECU id of daemon */ if (daemon_local->flags.evalue[0]) { @@ -1863,6 +1881,15 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemo dlt_daemon_log_internal(daemon, daemon_local, str, daemon_local->flags.vflag); dlt_log(LOG_DEBUG,str); } + if(daemon_local->flags.offlineLogstorageMaxDevices) + { + /* Store log level set for offline logstorage into context structure*/ + context->storage_log_level = dlt_daemon_logstorage_get_loglevel(daemon, daemon_local->flags.offlineLogstorageMaxDevices, usercontext->apid, usercontext->ctid); + } + else + { + context->storage_log_level = DLT_LOG_DEFAULT; + } /* Create automatic get log info response for registered context */ if (daemon_local->flags.rflag) { diff --git a/src/daemon/dlt-daemon.h b/src/daemon/dlt-daemon.h index 424dec4..fee6767 100755 --- a/src/daemon/dlt-daemon.h +++ b/src/daemon/dlt-daemon.h @@ -79,6 +79,7 @@ #include <dlt_offline_trace.h> #include <sys/time.h> +#include "dlt_daemon_offline_logstorage.h" /** * The flags of a dlt daemon. @@ -110,6 +111,7 @@ typedef struct int sendECUSoftwareVersion; /**< (Boolean) Send ECU software version perdiodically */ char pathToECUSoftwareVersion[256]; /**< (String: Filename) The file from which to read the ECU version from. */ int sendTimezone; /**< (Boolean) Send Timezone perdiodically */ + int offlineLogstorageMaxDevices; /**< (int) Maximum devices to be used as offline logstorage devices */ } DltDaemonFlags; /** diff --git a/src/daemon/dlt.conf b/src/daemon/dlt.conf index d3ba7f3..5976c1f 100644 --- a/src/daemon/dlt.conf +++ b/src/daemon/dlt.conf @@ -116,4 +116,11 @@ RingbufferStepSize = 500000 ######################################################################## # Send periodic timezone info (Default: 0) -# SendTimezone = 0
\ No newline at end of file +# SendTimezone = 0 + +############################################################################## +# Offline logstorage # +############################################################################## +# Store DLT log messages, if not set offline logstorage is off (Default: off) +# Maximum devices to be used as offline logstorage devices +# OfflineLogstorageMaxDevices = 1 diff --git a/src/daemon/dlt_daemon_client.c b/src/daemon/dlt_daemon_client.c index c28f098..b792e73 100644 --- a/src/daemon/dlt_daemon_client.c +++ b/src/daemon/dlt_daemon_client.c @@ -60,6 +60,7 @@ #include "dlt_daemon_client.h" +#include "dlt_daemon_offline_logstorage.h" /** Global text output buffer, mainly used for creation of error/warning strings */ static char str[DLT_DAEMON_TEXTBUFSIZE]; @@ -120,6 +121,13 @@ int dlt_daemon_client_send(int sock,DltDaemon *daemon,DltDaemonLocal *daemon_loc //return DLT_DAEMON_ERROR_WRITE_FAILED; } } + /* write messages to offline logstorage only if there is an extended header set + * this need to be checked because the function is dlt_daemon_client_send is called by + * newly introduced dlt_daemon_log_internal */ + if(daemon_local->flags.offlineLogstorageMaxDevices > 0) + { + dlt_daemon_logstorage_write(daemon, daemon_local->flags.offlineLogstorageMaxDevices, storage_header, storage_header_size, data1, size1, data2, size2); + } } /* send messages to daemon socket */ @@ -304,7 +312,7 @@ int dlt_daemon_client_process_control(int sock, DltDaemon *daemon, DltDaemonLoca id_tmp = *((uint32_t*)(msg->databuffer)); id=DLT_ENDIAN_GET_32(msg->standardheader->htyp ,id_tmp); - if ((id > 0) && (id < DLT_SERVICE_ID_LAST_ENTRY)) + if ((id > 0) && ((id < DLT_SERVICE_ID_LAST_ENTRY) || ((id == DLT_SERVICE_ID_OFFLINE_LOGSTORAGE)))) { /* Control message handling */ switch (id) @@ -427,6 +435,11 @@ int dlt_daemon_client_process_control(int sock, DltDaemon *daemon, DltDaemonLoca dlt_daemon_control_message_buffer_overflow(sock, daemon, daemon_local, daemon->overflow_counter,"",verbose); break; } + case DLT_SERVICE_ID_OFFLINE_LOGSTORAGE: + { + dlt_daemon_control_service_logstorage(sock, daemon, daemon_local, msg, verbose); + break; + } default: { dlt_daemon_control_service_response(sock, daemon, daemon_local, id, DLT_SERVICE_RESPONSE_NOT_SUPPORTED, verbose); @@ -1627,3 +1640,77 @@ void dlt_daemon_control_message_time(int sock, DltDaemon *daemon, DltDaemonLocal } +void dlt_daemon_control_service_logstorage(int sock, DltDaemon *daemon, DltDaemonLocal *daemon_local, DltMessage *msg, int verbose) +{ + DltServiceOfflineLogstorage *req; + int ret; + + PRINT_FUNCTION_VERBOSE(verbose); + + if ((daemon==0) ||(msg == 0) ||(daemon_local == 0)) + { + dlt_log(LOG_ERR, "Invalid function parameters used for dlt_daemon_control_service_logstorage\n"); + return ; + } + + if(daemon_local->flags.offlineLogstorageMaxDevices <= 0) + { + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_ERROR, verbose); + dlt_log(LOG_INFO, "Offline logstorage functionality not enabled or MAX device set is 0\n"); + return; + } + + req = (DltServiceOfflineLogstorage*) (msg->databuffer); + + /* Check for device connection request from log storage ctrl app */ + if (req->connection_type == DLT_OFFLINE_LOGSTORAGE_DEVICE_CONNECTED) + { + if(req->dev_num > daemon_local->flags.offlineLogstorageMaxDevices) + { + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_ERROR, verbose); + dlt_log(LOG_INFO, "Device number received is greater than MAX device configured \n"); + return; + } + /* Adding +1 to device number as ctrl app sends device number 1 less (to support indexing of storage_handle */ + ret = dlt_logstorage_device_connected(&(daemon->storage_handle[req->dev_num]), req->dev_num+1); + if(ret != 0) + { + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_ERROR, verbose); + return; + } + + /* Setup logstorage with config file settings */ + ret = dlt_logstorage_load_config(&(daemon->storage_handle[req->dev_num])); + if(ret != 0) + { + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_ERROR, verbose); + return; + } + + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE,DLT_SERVICE_RESPONSE_OK, verbose); + + /* Check if log level of running application needs an update */ + dlt_daemon_logstorage_update_application_loglevel(daemon, req->dev_num, verbose); + + } + /* Check for device disconnection request from log storage ctrl app */ + else if(req->connection_type == DLT_OFFLINE_LOGSTORAGE_DEVICE_DISCONNECTED) + { + if(req->dev_num > daemon_local->flags.offlineLogstorageMaxDevices) + { + dlt_log(LOG_INFO, "Device number received is greater than MAX device configured \n"); + return; + } + + /* Check if log level of running application needs to be reset */ + dlt_daemon_logstorage_reset_application_loglevel(daemon, req->dev_num, daemon_local->flags.offlineLogstorageMaxDevices, verbose); + + dlt_logstorage_device_disconnected(&(daemon->storage_handle[req->dev_num])); + + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_OK, verbose); + } + else + { + dlt_daemon_control_service_response(sock, daemon, daemon_local, DLT_SERVICE_ID_OFFLINE_LOGSTORAGE, DLT_SERVICE_RESPONSE_ERROR, verbose); + } +} diff --git a/src/daemon/dlt_daemon_client.h b/src/daemon/dlt_daemon_client.h index 0eae719..c7ec9e9 100644 --- a/src/daemon/dlt_daemon_client.h +++ b/src/daemon/dlt_daemon_client.h @@ -246,5 +246,14 @@ void dlt_daemon_control_set_timing_packets(int sock, DltDaemon *daemon, DltDaemo * @param verbose if set to true verbose information is printed out. */ void dlt_daemon_control_message_time(int sock, DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose); +/** + * Service offline logstorage command request + * @param sock connection handle used for sending response + * @param daemon pointer to dlt daemon structure + * @param daemon_local pointer to dlt daemon local structure + * @param msg pointer to received control message + * @param verbose if set to true verbose information is printed out. + */ +void dlt_daemon_control_service_logstorage(int sock, DltDaemon *daemon, DltDaemonLocal *daemon_local, DltMessage *msg, int verbose); #endif /* DLT_DAEMON_CLIENT_H */ diff --git a/src/daemon/dlt_daemon_common.c b/src/daemon/dlt_daemon_common.c index ad1256e..2064e94 100644 --- a/src/daemon/dlt_daemon_common.c +++ b/src/daemon/dlt_daemon_common.c @@ -217,6 +217,7 @@ int dlt_daemon_init(DltDaemon *daemon,unsigned long RingbufferMinSize,unsigned l return -1; } + daemon->storage_handle = NULL; return 0; } @@ -1131,8 +1132,15 @@ int dlt_daemon_user_send_log_level(DltDaemon *daemon,DltDaemonContext *context,i { return -1; } + if(context->storage_log_level != DLT_LOG_DEFAULT) + { + usercontext.log_level = context->log_level > context->storage_log_level ? context->log_level:context->storage_log_level; + } + else /* Storage log level is not updated (is DEFAULT) then no device is yet connected so ignore */ + { + usercontext.log_level = ((context->log_level == DLT_LOG_DEFAULT)?daemon->default_log_level:context->log_level); + } - usercontext.log_level = ((context->log_level == DLT_LOG_DEFAULT)?daemon->default_log_level:context->log_level); usercontext.trace_status = ((context->trace_status == DLT_TRACE_STATUS_DEFAULT)?daemon->default_trace_status:context->trace_status); usercontext.log_level_pos = context->log_level_pos; diff --git a/src/daemon/dlt_daemon_common.h b/src/daemon/dlt_daemon_common.h index 9a5e6c1..1ad1ce6 100644 --- a/src/daemon/dlt_daemon_common.h +++ b/src/daemon/dlt_daemon_common.h @@ -81,6 +81,7 @@ #include <semaphore.h> #include "dlt_common.h" #include "dlt_user.h" +#include "dlt_offline_logstorage.h" #ifdef __cplusplus extern "C" { @@ -135,6 +136,7 @@ typedef struct int log_level_pos; /**< offset of context in context field on user application */ int user_handle; /**< connection handle for connection to user application */ char *context_description; /**< context description */ + int8_t storage_log_level; /**< log level set for offline logstorage */ } DltDaemonContext; /** @@ -161,6 +163,7 @@ typedef struct char connectionState; /**< state for tracing: 0 = no client connected, 1 = client connected */ char *ECUVersionString; /**< Version string to send to client. Loaded from a file at startup. May be null. */ DltDaemonState state; /**< the current logging state of dlt daemon. */ + DltLogStorage *storage_handle; } DltDaemon; /** |