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 + -
显示快捷键?