#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>// file sys
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h> //settimer
#include <signal.h> //settimer SIGALRM
#include <sys/vfs.h> //文件系统
#include <dirent.h> // dir
#include <pthread.h>
#include "tbox_storage_interface.h"
#define Gsize (1024.00*1024.00*1024.00)
#define Msize (1024.00*1024.00)
#ifndef EXT_X_SUPER_MAGIC
#define EXT_X_SUPER_MAGIC 0xef53
#endif
#define MAX_BFREE_GB 7
#define LOAD "/home/userone/gxlife/datalog-for-load"
#define LIST_MAX 1024
#define FILE_NAME_MAX 16
static uint8_t current_work_list[LIST_MAX];
static uint8_t mday[12];
static uint8_t mtime[12];
struct TimerType{
uint32_t year; //年
uint32_t mon; //月
uint32_t day; //日
uint32_t hour; //时
uint32_t min; //分
uint32_t sec; //秒
};
struct TimerType current_time;//当前时间
struct TimerType work_time;//记录切换工作路径时的时间
/**/
static struct itimerval new_value;//100ms定时器
static struct itimerval old_value;//100ms定时器
/**/
static int bRun=0;//标记当前程序运行状态
static void SIGINTSignalHandler( int nSignal )
{
bRun = 0;
}
/**************************************************
*功能:组成完整工作路径
*参数 输入/输出 类型
* out uint8_t *work_list 当前工作根目录
* in uint8_t *file_day 年月日描述字符串
* in uint8_t *file_time 时间字符串
*返回值:文件名字字符串长度
***************************************************/
static uint32_t GetCurrentWorkList(uint8_t *work_list,const uint8_t *file_day,const uint8_t *file_time)
{
sprintf(work_list, "%s/%s/%s/", LOAD, file_day,file_time);
return strlen(work_list);
}
/**************************************************
*功能:获取时间
*参数 输入/输出 类型
* out struct TimerType *mytimerp 时间结构信息
*返回值:成功返回0
***************************************************/
static uint8_t GetTime(struct TimerType *mytimerp)
{
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
mytimerp->year= p->tm_year;
mytimerp->mon = 1+p->tm_mon;
mytimerp->day = p->tm_mday;
mytimerp->hour= p->tm_hour;
mytimerp->min = p->tm_min;
mytimerp->sec = p->tm_sec;
return 0;
}
/**************************************************
*功能:获取时间—字符串存储方式
*参数 输入/输出 类型
* out uint8_t *mday 当前年月日字符串
* out uint8_t *mtime 当前时分秒字符串
*返回值:成功返回0
***************************************************/
static uint8_t GetTimeChar(uint8_t *mday,uint8_t *mtime)
{
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
memset(mday, 0, sizeof(mday));
memset(mtime,0, sizeof(mtime));
//printf("%d-%d-%d " ,(1900+p->tm_year),( 1+p->tm_mon), p->tm_mday);
//printf("%d-%d-%d\n",p->tm_hour, p->tm_min, p->tm_sec);
sprintf(mday, "%d-%d-%d", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday);
sprintf(mtime,"%d-%d-%d", p->tm_hour, p->tm_min, p->tm_sec);
//printf("mday: %s \n",mday);
//printf("mtime: %s \n",mtime);
return 0;
}
/**************************************************
*功能:创建工作目录
*参数 输入/输出 类型
* in const uint8_t *sPathName 目录字符串
*返回值:成功返回0
***************************************************/
static uint8_t CreateDir1(const uint8_t *sPathName)
{
uint8_t DirName[LIST_MAX];
strcpy(DirName, sPathName);
uint32_t i,len = strlen(DirName);
for(i=1; i<len; i++) {
if(DirName[i]=='/') {
DirName[i] = 0;
if(access(DirName, NULL)!=0) {
if(mkdir(DirName, 0755)==-1) {
printf("mkdir error\n");
return -1;
}
}
DirName[i] = '/';
}
}
return 0;
}
#if 0
// 备用函数
static uint8_t CreateDir2(const uint8_t *file_day,const uint8_t *file_time)
{
uint8_t DirName[LIST_MAX];
sprintf(DirName,"%s/%s/%s/", LOAD, file_day,file_time);
uint32_t i,len = strlen(DirName);
for(i=1; i<len; i++) {
if(DirName[i]=='/') {
DirName[i] = 0;
if(access(DirName, NULL)!=0) {
if(mkdir(DirName, 0755)==-1) {
printf("mkdir error\n");
return -1;
}
}
DirName[i] = '/';
}
}
return 0;
}
static uint8_t WriteCanData(const uint8_t *work_list,const uint8_t *CAN_ID,uint8_t rate,const uint8_t *CAN_Data)
{
uint8_t filename[FILE_NAME_MAX];
uint8_t filelist[LIST_MAX];
uint8_t data[64];
memset(data, 0, sizeof(data));
memcpy(data,CAN_Data,8);
sprintf(data,"%x%x%x%x%x%x%x%x\n", CAN_Data[0], CAN_Data[1],CAN_Data[2],CAN_Data[3],CAN_Data[4],CAN_Data[5],CAN_Data[6],CAN_Data[7]);
sprintf(filelist,"%s%d%d-%d.txt", work_list, CAN_ID[0],CAN_ID[1],rate);
//printf("%s\n" ,filelist);
//printf(data);
int myfile =0;
myfile=open(filelist,O_RDWR|O_CREAT|O_APPEND);
write(myfile,data,strlen(data));
close(myfile);
return 0;
}
// 备用函数
#endif
/**************************************************
*功能:CAN帧数据存储
*参数 输入/输出 类型
* in const uint8_t *work_list,const 存储绝对路径
* in const uint8_t *CAN_ID 指针,指向can帧ID
* in uint8_t rate can的频率
* in const uint8_t *CAN_Data 指针,指向can帧数据(要存储内容)
*返回值:成功返回0
***************************************************/
static uint8_t WriteCanData_IO(const uint8_t *work_list,const uint8_t *CAN_ID,uint8_t rate,const uint8_t *CAN_Data)
{
uint8_t filename[FILE_NAME_MAX];
uint8_t filelist[LIST_MAX];
uint8_t data[64];
memset(data, 0, sizeof(data));
memcpy(data,CAN_Data,8);
sprintf(data,"%x%x%x%x%x%x%x%x\n", CAN_Data[0], CAN_Data[1],CAN_Data[2],CAN_Data[3],CAN_Data[4],CAN_Data[5],CAN_Data[6],CAN_Data[7]);
sprintf(filelist,"%s%d%d-%d.txt", work_list, CAN_ID[0],CAN_ID[1],rate);
//printf("%s\n" ,filelist);
FILE *myfile;//建立一个文件操作指针
myfile = fopen (filelist, "a");
fwrite(data,1,strlen(data),myfile);
fclose(myfile);
return 0;
}
/**************************************************
*功能:根据当前时间,更新工作目录
*参数 输入/输出 类型
* 无
*返回值:无
***************************************************/
extern void UpData_List(void)
{
GetTime(&work_time);
GetTimeChar(mday,mtime);
GetCurrentWorkList(current_work_list,mday,mtime);
printf("%s\n" ,current_work_list);
CreateDir1(current_work_list);
}
#if 1
// 虚拟数据来源 正式版去掉
uint32_t CANLen;
uint8_t CANdata[200][10];
// 虚拟数据来源 正式版去掉
#endif
/**************************************************
*功能:数据存储主逻辑函数---放置循环中
*参数 输入/输出 类型
* 无
*返回值:无
***************************************************/
static void Log_Fun(void)
{
int i=0,j=0;;
uint8_t *mydata;
#if 0
//判断一小时更新一次目录 正式版存储
GetTime(¤t_time);
int dis_min = (current_time.hour-work_time.hour)*60+(current_time.min-work_time.min);
if(dis_min>=60){
UpData_List();
}
#endif
#if 1
// text 测试使用
GetTime(¤t_time);
int dis_sec = (current_time.min-work_time.min)*60+(current_time.sec-work_time.sec);
if(dis_sec>=60){
UpData_List();
}
memset(CANdata, 0, sizeof(CANdata));
CANLen=100;
for(i=0;i<CANLen;i++){
for(j=0;j<10;j++){
CANdata[i][j]=i+j;
}
}
// text 测试使用
#endif
// 写入数据
for(i=0;i<CANLen;i++){
mydata = CANdata[i];
WriteCanData_IO(current_work_list,mydata,100,mydata+2);
}
}
/********