diff options
Diffstat (limited to 'src/system/dlt-system-log.c')
-rw-r--r-- | src/system/dlt-system-log.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/system/dlt-system-log.c b/src/system/dlt-system-log.c index de40176..dc556e2 100644 --- a/src/system/dlt-system-log.c +++ b/src/system/dlt-system-log.c @@ -10,11 +10,117 @@ #include "dlt_common.h" #include "dlt_user.h" +#include "dlt_filetransfer.h" #include "dlt-system.h" #include "dlt-system_cfg.h" #include "dlt-system-log.h" +void dlt_system_filetransfer_init(DltSystemOptions *options,DltSystemRuntime *runtime) +{ + runtime->filetransferFile[0] = 0; + runtime->filetransferRunning = 0; + runtime->filetransferCountPackages = 0; +} + +void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *runtime,DltContext *context) +{ + struct dirent *dp; + char filename[256]; + unsigned long size_oldest = 0; + struct stat status; + time_t time_oldest = 0; + int transferResult; + int total_size, used_size; + + if(runtime->filetransferRunning == 0) { + /* delete last transmitted file */ + if(runtime->filetransferFile[0]!=0) { + printf("Remove File: %s\n",runtime->filetransferFile); + if(remove(runtime->filetransferFile)) { + printf("Remove file %s failed!\n",runtime->filetransferFile); + return; + } + runtime->filetransferFile[0]=0; + } + + /* filetransfer not running, check directory */ + filename[0] = 0; + DIR *dir = opendir(options->FiletransferDirectory); + while ((dp=readdir(dir)) != NULL) { + if(strcmp(dp->d_name,".")!=0 && strcmp(dp->d_name,"..")!=0) { + sprintf(filename,"%s/%s",options->FiletransferDirectory,dp->d_name); + stat(filename,&status); + if(time_oldest == 0 || status.st_mtime < time_oldest) { + time_oldest = status.st_mtime; + size_oldest = status.st_size; + strcpy(runtime->filetransferFile,filename); + } + } + } + closedir(dir); + + /* start filetransfer if file exists */ + if(runtime->filetransferFile[0]) { + printf("Start Filetransfer: %s\n",runtime->filetransferFile); + runtime->filetransferCountPackages = dlt_user_log_file_packagesCount(context,runtime->filetransferFile); + if(runtime->filetransferCountPackages < 0 ) + { + printf("Error: dlt_user_log_file_packagesCount\n"); + runtime->filetransferCountPackages = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->filetransferRunning = 1; + transferResult = dlt_user_log_file_header(context,runtime->filetransferFile); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_header\n"); + runtime->filetransferCountPackages = 0; + runtime->filetransferRunning = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->filetransferLastSentPackage = 0; + } + + } + + if (runtime->filetransferRunning == 1) { + /* filetransfer is running, send next data */ + while(runtime->filetransferLastSentPackage<runtime->filetransferCountPackages) { + runtime->filetransferLastSentPackage++; + transferResult = dlt_user_log_file_data(context,runtime->filetransferFile,runtime->filetransferLastSentPackage,0); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_data\n"); + return; + } + /* wait sending next package if more than 50% of buffer used */ + dlt_user_check_buffer(&total_size, &used_size); + if((total_size - used_size) < (total_size/2)) + break; + } + if(runtime->filetransferLastSentPackage==runtime->filetransferCountPackages) { + transferResult = dlt_user_log_file_end(context,runtime->filetransferFile,0); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_end\n"); + runtime->filetransferCountPackages = 0; + runtime->filetransferRunning = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + runtime->filetransferRunning = 0; + } + + } + + + +} + void dlt_system_log_kernel_version(DltSystemOptions *options,DltContext *context) { FILE * pFile; char buffer[1024]; |