void *CAdZapMenu::Run(void *) { while (azm->running) { CChannelList *channelList = NULL; t_channel_id curChannelId; if (azm->monitor) { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 1; sem_timedwait(&azm->sem, &ts); if (azm->monitor && (azm->monitorLifeTime.tv_sec > ts.tv_sec)) { channelList = CNeutrinoApp::getInstance()->channelList; curChannelId = channelList ? channelList->getActiveChannel_ChannelID() : -1; if (!azm->armed && (azm->channelId != curChannelId)) { azm->armed = true; clock_gettime(CLOCK_REALTIME, &azm->zapBackTime); azm->zapBackTime.tv_sec += g_settings.adzap_zapBackPeriod - ZAPBACK_ALERT_PERIOD; azm->alerted = false; } else if (azm->channelId == curChannelId) { azm->armed = false; azm->alerted = false; } } else { azm->monitor = false; azm->armed = false; azm->alerted = false; } } else if (azm->armed) sem_timedwait(&azm->sem, &azm->zapBackTime); else sem_wait(&azm->sem); if (azm->armed) { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); if (ts.tv_sec >= azm->zapBackTime.tv_sec) { if (!channelList) { channelList = CNeutrinoApp::getInstance()->channelList; curChannelId = channelList ? channelList->getActiveChannel_ChannelID() : -1; } if (!azm->alerted) { if (azm->channelId != curChannelId) { std::string name = g_Locale->getText(LOCALE_ADZAP_ANNOUNCE); name += "\n" + azm->channelName; ShowHintUTF(LOCALE_ADZAP, name.c_str()); } azm->alerted = true; azm->zapBackTime.tv_sec += ZAPBACK_ALERT_PERIOD; } else { azm->alerted = false; if (channelList) channelList->zapTo_ChannelID(azm->channelId); azm->armed = false; } } } } return NULL; }
void CAdZapMenu::Run() { set_threadname("CAdZapMenu::Run"); while (true) { CChannelList *channelList = NULL; t_channel_id curChannelId = -1; if (monitor) { clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 1; sem_timedwait(&sem, &ts); if (monitor && (monitorLifeTime.tv_sec > ts.tv_sec)) { channelList = CNeutrinoApp::getInstance()->channelList; curChannelId = channelList ? channelList->getActiveChannel_ChannelID() : -1; if (!armed && (channelId != curChannelId)) { armed = true; clock_gettime(CLOCK_REALTIME, &zapBackTime); zapBackTime.tv_sec += g_settings.adzap_zapBackPeriod - ZAPBACK_ALERT_PERIOD; alerted = false; } else if (channelId == curChannelId) { armed = false; alerted = false; } } else { monitor = false; armed = false; alerted = false; } } else if (armed) { if (g_settings.adzap_writeData) { clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 1; sem_timedwait(&sem, &ts); } else sem_timedwait(&sem, &zapBackTime); } else sem_wait(&sem); if (armed) { clock_gettime(CLOCK_REALTIME, &ts); if (ts.tv_sec >= zapBackTime.tv_sec) { if (!channelList) { channelList = CNeutrinoApp::getInstance()->channelList; curChannelId = channelList ? channelList->getActiveChannel_ChannelID() : -1; } if (!alerted) { if (channelId != curChannelId) { char name[1024]; snprintf(name, sizeof(name)-1, g_Locale->getText(LOCALE_ADZAP_ANNOUNCE), ZAPBACK_ALERT_PERIOD, channelName.c_str()); ShowHint(LOCALE_ADZAP, name); } alerted = true; zapBackTime.tv_sec += ZAPBACK_ALERT_PERIOD; } else { alerted = false; if ((channelId != curChannelId) && channelList) channelList->zapTo_ChannelID(channelId); armed = false; } } } if (g_settings.adzap_writeData && (monitor || armed)) WriteData(); else RemoveData(); } }