pthread_search.c

来自「1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码」· C语言 代码 · 共 927 行 · 第 1/3 页

C
927
字号
{	UNS16	ii;		UNS16	list_num;	UNS16	only_one;	UNS16	after_on;	UNS16	count;	S8		str_buf[20];	FILE	*fd;		MENU_FONT_t *mft;		STATE_DB	*psdb;	psdb = &gp_state_thread->state_db;	/* LOCK "MAIN_DB" file */	sem_wait(&psdb->search_sem);	/* Main DB file open */		if( !(fd = fopen(MAIN_DB_NAME, "rb")) ) {		m_ERROR("pthread_search.c:error: In function 'fopen'\n");	      /* UNLOCK "MAIN_DB" file */		sem_post(&psdb->search_sem);		return FAILURE;	}	only_one = TRUE;	list_num = 0;	sprintf(str_buf, "%04d%02d%02d_%02d", pso->tm_select.tm_year+1900, pso->tm_select.tm_mon+1, 										pso->tm_select.tm_mday, pso->tm_select.tm_hour);	/* file list condition check */	while (fread(&pso->search_list.db_nrec[list_num], sizeof(S8), sizeof(DB_RECORD), fd) > 0) {		/* nearby next file info save */		if (only_one) {			from_str_to_time(pso->search_list.db_nrec[list_num].fname + 6, &pso->tm_after);						only_one = FALSE;		}		if (after_on) {			from_str_to_time(pso->search_list.db_nrec[list_num].fname + 6, &pso->tm_after);						after_on = FALSE;		}			/* check save mode */		if ( !strncmp(pso->search_list.db_nrec[list_num].fname + 6, str_buf, 11) ) { /* year(4)+Month(2)+Day(2)+dummy(1)+Hour(2) */			if (pso->search_list.mode == ALL) {			// mode: All				list_num ++;			} else if (pso->search_list.mode == CONTI) {	// mode: continuouse					if (pso->search_list.db_nrec[list_num].conti) {					list_num ++;				}			} else if (pso->search_list.mode == MOTION) {	// mode: motion					if (pso->search_list.db_nrec[list_num].motion) {					list_num ++;				}			} else if (pso->search_list.mode == SENSOR) {	// mode: sensor					if (pso->search_list.db_nrec[list_num].sensor) {					list_num ++;				}			} 		} else if (strncmp(pso->search_list.db_nrec[list_num].fname + 6, str_buf, 11) < 0) {			/* nearby previous file info save */			from_str_to_time(pso->search_list.db_nrec[list_num].fname + 6, &pso->tm_before);						after_on = TRUE;		}	}		/* Main DB file close */	fclose(fd);		/* UNLOCK "MAIN_DB" file */	sem_post(&psdb->search_sem);		pso->search_list.total_num = list_num;	count = pso->search_list.total_num - pso->search_list.start_num;	if (count >= FILELIST_NUM) {		pso->search_list.list_num = FILELIST_NUM;	} else {		pso->search_list.list_num = count;	}	/* Search OSD List */	mft = search_menu_font[SEARCH_FILELIST];		 	for (ii = pso->search_list.start_num; ii <= FILELIST_NUM; ii++) {		if ( ii < (pso->search_list.start_num + pso->search_list.list_num) ) {			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, pso->search_list.db_nrec[ii].fname + 6);			if (pso->search_list.db_nrec[ii].conti) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "C");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "");			}			if (pso->search_list.db_nrec[ii].motion) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "M");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "");			}			if (pso->search_list.db_nrec[ii].sensor) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "S");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "");			}					} else {			if (pso->search_list.list_num == 0) {				if (ii == 0) {					strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, "     ---  NO FILE  ---");				} else {					strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, "");				}				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "");				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "");				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "");							} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, "");				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "");				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "");				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "");			}		}	}	return SUCCESS;}RETURN set_osd_for_search_list(SEARCH_OBJECT *pso){	UNS16	ii;		UNS16	count;	MENU_FONT_t *mft;			count = pso->search_list.total_num - pso->search_list.start_num;	if (count >= FILELIST_NUM) {		pso->search_list.list_num = FILELIST_NUM;	} else {		pso->search_list.list_num = count;	}	/* Search OSD List */	mft = search_menu_font[SEARCH_FILELIST];		 	for (ii = pso->search_list.start_num; ii <= pso->search_list.start_num + FILELIST_NUM; ii++) {		if ( ii < (pso->search_list.start_num + pso->search_list.list_num) ) {			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, pso->search_list.db_nrec[ii].fname + 6);						if (pso->search_list.db_nrec[ii].conti) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "C");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "");			}			if (pso->search_list.db_nrec[ii].motion) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "M");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "");			}			if (pso->search_list.db_nrec[ii].sensor) {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "S");			} else {				strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "");			}						} else {			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_LIST1].str, "");			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_CONTI].str, "");			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_MOTION].str, "");			strcpy(mft[(ii-pso->search_list.start_num)*4 + VALUE_L1_SENSOR].str, "");					}	}	return SUCCESS;}S16 get_start_end_time(SEARCH_OBJECT *pso){	FILE	*fd;	S8		osd[10];	UNS16	ret = 0;			DB_RECORD		dr;		MENU_FONT_t 	*mft;	MENU_ACTIVE_ITEM_t	*location_cur;			STATE_DB	*psdb;	psdb = &gp_state_thread->state_db;	/* LOCK "MAIN_DB" file */	sem_wait(&psdb->search_sem);	pso->tm_start.tm_year = 0;		/* Record DB file open */	if( !(fd = fopen(MAIN_DB_NAME, "rb")) ) {		m_MSG("\t!!! NO MAIN DB FILE !!!\n");		/* UNLOCK "MAIN_DB" file */		sem_post(&psdb->search_sem);		return -1;	}	/* find start time */	if (fread(&dr, sizeof(S8), sizeof(DB_RECORD), fd) <= 0) {		m_ERROR("pthread_search.c:error: In function 'fread'\n");		return -1;	}	from_str_to_time(dr.fname + 6, &pso->tm_start);		/* move to file end pointer */	fseek(fd, -sizeof(DB_RECORD), SEEK_END);	/* find end time */	if (fread(&dr, sizeof(S8), sizeof(DB_RECORD), fd) <= 0) {			m_ERROR("pthread_search.c:error: In function 'fread'\n");		return -1;	}	from_str_to_time(dr.fname + 6, &pso->tm_end);	from_str_to_time(dr.fname + 6, &pso->tm_select);		/* Main DB file close */	fclose(fd);		/* UNLOCK "MAIN_DB" file */	sem_post(&psdb->search_sem);	    /* Relate shift num	*/    if (pso->tm_start.tm_year == pso->tm_end.tm_year) {		ret++;    	    	if (pso->tm_start.tm_mon == pso->tm_end.tm_mon) {			ret++;			if (pso->tm_start.tm_mday == pso->tm_end.tm_mday)				ret++;    	}    }    pso->cur_loc = VALUE_SLT_YEAR;	/* return to start position */					location_cur = &search_menu_active[SEARCH_MAIN];	location_cur->start = pso->cur_loc + ret;    	/* Time Search OSD */		mft = search_menu_font[SEARCH_MAIN];		sprintf(osd,"%04d", pso->tm_start.tm_year+1900);	strcpy(mft[VALUE_ST_YEAR].str, osd);		sprintf(osd,"%02d", pso->tm_start.tm_mon + 1);	strcpy(mft[VALUE_ST_MONTH].str, osd);		sprintf(osd,"%02d", pso->tm_start.tm_mday);	strcpy(mft[VALUE_ST_DAY].str, osd);		sprintf(osd,"%02d", pso->tm_start.tm_hour);		strcpy(mft[VALUE_ST_HOUR].str, osd);		sprintf(osd,"%02d", pso->tm_start.tm_min);		strcpy(mft[VALUE_ST_MIN].str, osd);		sprintf(osd,"%02d", pso->tm_start.tm_sec);			strcpy(mft[VALUE_ST_SEC].str, osd);	sprintf(osd,"%04d", pso->tm_end.tm_year+1900);	strcpy(mft[VALUE_ET_YEAR].str, osd);		sprintf(osd,"%02d", pso->tm_end.tm_mon + 1);	strcpy(mft[VALUE_ET_MONTH].str, osd);		sprintf(osd,"%02d", pso->tm_end.tm_mday);	strcpy(mft[VALUE_ET_DAY].str, osd);		sprintf(osd,"%02d", pso->tm_end.tm_hour);		strcpy(mft[VALUE_ET_HOUR].str, osd);		sprintf(osd,"%02d", pso->tm_end.tm_min);		strcpy(mft[VALUE_ET_MIN].str, osd);		sprintf(osd,"%02d", pso->tm_end.tm_sec);			strcpy(mft[VALUE_ET_SEC].str, osd);	sprintf(osd,"%04d", pso->tm_select.tm_year+1900);	strcpy(mft[VALUE_SLT_YEAR].str, osd);		sprintf(osd,"%02d", pso->tm_select.tm_mon + 1);	strcpy(mft[VALUE_SLT_MONTH].str, osd);		sprintf(osd,"%02d", pso->tm_select.tm_mday);	strcpy(mft[VALUE_SLT_DAY].str, osd);		sprintf(osd,"%02d", pso->tm_select.tm_hour);		strcpy(mft[VALUE_SLT_HOUR].str, osd);			    return ret;}RETURN	from_str_to_time(char	*str_time, struct tm *Time){	sscanf(str_time,"%04d%02d%02d_%02d%02d%02d", &Time->tm_year, &Time->tm_mon,			&Time->tm_mday, &Time->tm_hour, &Time->tm_min, &Time->tm_sec);	Time->tm_year -= 1900;	Time->tm_mon -= 1;		return SUCCESS;}/* main db and stream file matching */UNS32 db_record_matching(DB_RECORD *db, UNS32 record_idx){	FILE	       *fd;		DB_RECORD		db_t;		STATE_DB	*psdb;	psdb = &gp_state_thread->state_db;	/* LOCK "MAIN_DB" file */    	sem_wait(&psdb->search_sem);		/* Main DB file open */		if( !(fd = fopen(MAIN_DB_NAME, "rb")) ) {		m_ERROR("pthread_search.c:error: In function 'fopen'\n");		return FAILURE;	}      if(fseek(fd, record_idx, SEEK_SET))   	    	fseek(fd, -sizeof(DB_RECORD), SEEK_END);	while (fread(&db_t, sizeof(S8), sizeof(DB_RECORD), fd) > 0) {		if(strcmp(db->fname, db_t.fname) < 0) {			fseek(fd, db_t.prev_db_fp, SEEK_SET);			/* When the file pointer until the start location coming */			if(db_t.next_db_fp == sizeof(DB_RECORD)) {				fclose(fd);				/* UNLOCK "MAIN_DB" file */    				sem_post(&psdb->search_sem);				return 0;			}		}		else {			fclose(fd);			/* UNLOCK "MAIN_DB" file */    			sem_post(&psdb->search_sem);			return (db_t.next_db_fp - sizeof(DB_RECORD));		}	}}/* end of pthread_search.c */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?