📄 pthread_schedule.c
字号:
/* set tabstop=4 *//******************************************************************************** * * * Copyright(C) 2004 Penta-Micro * * * * ALL RIGHT RESERVED * * * * This software is the property of Penta-Micro and is furnished under * * license by Penta-Micro. This software may be used only in accordance * * with the terms of said license. This copyright notice may not be * * removed, modified or obliterated without the prior written permission * * of Penta-Micro. * * * * This software may not be copyed, transmitted, provided to or otherwise * * made available to any other person, company, corporation or other entity * * except as specified in the terms of said license. * * * * No right, title, ownership or other interest in the software is hereby * * granted or transferred. * * * * The information contained herein is subject to change without notice and * * should not be construed as a commitment by Penta-Micro. * * * ******************************************************************************** MODULE NAME: PTHREAD_SCHEDULE.C REVISION HISTORY: Date Ver Name Description ---------- --- --------------------- ----------------------------------------- 06/28/2004 2.0 CheulBeck(whitefe) Created ............................................................................... DESCRIPTION: This Module contains functions for schdeule record. ...............................................................................*/ /** ************************************************************************* ** ** includes ** ************************************************************************* **/#include <stdio.h>#include "main.h"#include "pthread_schedule.h"/** ************************************************************************* ** ** defines ** ************************************************************************* **/#define m_DEBUG(format, args...) printf(format, ## args);fflush(stdout);//#define m_DEBUG(format, args...) #define m_MSG(format, args...) printf(format, ## args);fflush(stdout);#define m_ERROR(format, args...) printf(format, ## args);fflush(stdout);/** ************************************************************************* ** ** typedefs ** ************************************************************************* **/ /** ************************************************************************* ** ** globals ** ************************************************************************* **/extern PTHREAD_STATE *gp_state_thread;extern SETUP_PARAM *gp_setup_param; /** ************************************************************************* ** ** locals ** ************************************************************************* **/static SCHEDULE_OBJECT *sp_schedule_object;/** ************************************************************************* ** ** forward declarations ** ************************************************************************* **/void *pthread_schedule(void *args){ PTHREAD_ID start_id = 0; PTHREAD_BUF signal; m_DEBUG("\t!!! pthread SCHEDULE !!!\n"); /* 1st. allocate live thread object */ if ( !(sp_schedule_object = (SCHEDULE_OBJECT *) malloc (sizeof(SCHEDULE_OBJECT))) ) { m_ERROR("pthread_schedule.c:error In function 'malloc'\n"); return FAILURE; } memset(sp_schedule_object, 0, sizeof(SCHEDULE_OBJECT)); while (1) { /* 2nd. get current time */ get_current_time(sp_schedule_object); /* 3rd. check schedule time event every one second */ if (time_filter(sp_schedule_object) == TRUE) { /* 4th. check state for schedule record */ check_state_schedule_rec(sp_schedule_object); } /* 5th. idle time */ usleep(500000); // 500ms } /* end of while (!QUIT_SDVR_MAIN) */ return 0;}RETURN get_current_time(SCHEDULE_OBJECT *pso) { time_t p_time; time(&p_time); memcpy(&pso->tm_cur, localtime(&p_time), sizeof(pso->tm_cur)); return SUCCESS;} BOOL time_filter(SCHEDULE_OBJECT *pso) { UNS16 ii; UNS16 flag_schedule; pso->param = gp_setup_param; flag_schedule = 0; for (ii = 0; ii < MAX_CH_NUM; ii ++) { flag_schedule += pso->param->enc_ch[ii].schedule.flag; } if (flag_schedule) { // check setup parameter flag for schedule if ( pso->tm_cur.tm_sec != pso->tm_prev.tm_sec ) { pso->tm_prev.tm_sec = pso->tm_cur.tm_sec; return TRUE; } } return FALSE;} RETURN check_state_schedule_rec(SCHEDULE_OBJECT *pso) { UNS16 ii; PTHREAD_BUF signal; pso->param = gp_setup_param; pso->state = gp_state_thread; for (ii = 0; ii < MAX_CH_NUM; ii ++) { /* reset schedule state parameter */ if (pso->param->enc_ch[ii].schedule.flag != pso->flag_prev[ii]) { if (!pso->param->enc_ch[ii].schedule.flag) { if (pso->state->state_enc.enc_ch[ii].schedule) { pso->state->state_enc.enc_ch[ii].schedule = 0; pso->state->state_enc.schedule_rec = pso->state->state_enc.enc_ch[0].schedule + pso->state->state_enc.enc_ch[1].schedule + pso->state->state_enc.enc_ch[2].schedule + pso->state->state_enc.enc_ch[3].schedule; /* send massage to manager thread */ signal.start_id = PTHREAD_SCHEDULE; signal.m_signal = SIGNAL_1; signal.m_channel = ii; if (pthread_send_signal(&signal, PTHREAD_MANAGER) == FALSE) { m_ERROR("main.c:error: In function 'pthread_send_signal'\n"); } pso->state_prev[ii] = 0; } } pso->flag_prev[ii] = pso->param->enc_ch[ii].schedule.flag; } /* check state for schedule record */ if (pso->param->enc_ch[ii].schedule.flag) { // check flag if ((pso->tm_cur.tm_hour * 60 + pso->tm_cur.tm_min >= pso->param->enc_ch[ii].schedule.from_time[pso->tm_cur.tm_wday].tm_hour * 60 + pso->param->enc_ch[ii].schedule.from_time[pso->tm_cur.tm_wday].tm_min) && (pso->tm_cur.tm_hour * 60 + pso->tm_cur.tm_min < pso->param->enc_ch[ii].schedule.to_time[pso->tm_cur.tm_wday].tm_hour * 60 + pso->param->enc_ch[ii].schedule.to_time[pso->tm_cur.tm_wday].tm_min)) // check time { pso->state->state_enc.enc_ch[ii].schedule = 1; if (pso->state->state_enc.enc_ch[ii].schedule != pso->state_prev[ii]) { // check event pso->state->state_enc.schedule_rec = 1; /* send massage to manager thread */ signal.start_id = PTHREAD_SCHEDULE; signal.m_signal = SIGNAL_0; signal.m_channel = ii; if (pthread_send_signal(&signal, PTHREAD_MANAGER) == FALSE) { m_ERROR("main.c:error: In function 'pthread_send_signal'\n"); } pso->state_prev[ii] = pso->state->state_enc.enc_ch[ii].schedule; } } else { pso->state->state_enc.enc_ch[ii].schedule = 0; if (pso->state->state_enc.enc_ch[ii].schedule != pso->state_prev[ii]) { // check event pso->state->state_enc.schedule_rec = pso->state->state_enc.enc_ch[0].schedule + pso->state->state_enc.enc_ch[1].schedule + pso->state->state_enc.enc_ch[2].schedule + pso->state->state_enc.enc_ch[3].schedule; /* send massage to manager thread */ signal.start_id = PTHREAD_SCHEDULE; signal.m_signal = SIGNAL_1; signal.m_channel = ii; if (pthread_send_signal(&signal, PTHREAD_MANAGER) == FALSE) { m_ERROR("main.c:error: In function 'pthread_send_signal'\n"); } pso->state_prev[ii] = pso->state->state_enc.enc_ch[ii].schedule; } } } } return SUCCESS;} /* end of pthread_schedule.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -