void onDoorStatus() { debug("onDoorStatus()"); door_status = (DS) cmd.readInt32Arg(); cmd.sendCmd(GC_Acknowledge, F("door")); if( ((door_command == DC_OPEN_DOOR) && (door_status == DS_Open )) || // door is now open ((door_command == DC_CLOSE_DOOR) && (door_status == DS_Closed)) || // door is now closed (door_command == DC_NONE) ) { door_command = DC_NONE; movementWatchdog.stop(); switch( door_status ) { case DS_Open: openLed.on(); closeLed.off(); break; case DS_Closed: closeLed.on(); openLed.off(); break; } } else { switch( door_command ) { case DC_OPEN_DOOR: breathe(openLed); closeLed.off(); break; case DC_CLOSE_DOOR: breathe(closeLed); openLed.off(); break; } } updateDisplay(); Particle.publish(F("Door"), toString(door_status), PRIVATE); //lcdPrint(0, toString(door_status)); //lcdPrint(1, toString(door_command)); }
void i_breathing(pob o) { if (o->blessing > -1) Objects[o->id].known = 1; breathe(o->blessing); }
bool PrePostRollFlagger::go() { int secsSince = 0; int requiredBuffer = 120; int requiredHeadStart = requiredBuffer; bool wereRecording = stillRecording; secsSince = startedAt.secsTo(MythDate::current()); while (stillRecording && (secsSince < requiredHeadStart)) { emit statusUpdate(QObject::tr("Waiting to pass preroll + head start")); emit breathe(); if (m_bStop) return false; sleep(5); secsSince = startedAt.secsTo(MythDate::current()); } if (player->OpenFile() < 0) return false; Init(); // Don't bother flagging short ~realtime recordings if ((wereRecording) && (!stillRecording) && (secsSince < requiredHeadStart)) return false; aggressiveDetection = gCoreContext->GetNumSetting("AggressiveCommDetect", 1); if (!player->InitVideo()) { LOG(VB_GENERAL, LOG_ERR, "NVP: Unable to initialize video for FlagCommercials."); return false; } player->EnableSubtitles(false); emit breathe(); if (m_bStop) return false; QTime flagTime; flagTime.start(); if (recordingStopsAt < MythDate::current() ) myTotalFrames = player->GetTotalFrameCount(); else myTotalFrames = (long long)(player->GetFrameRate() * (recordingStartedAt.secsTo(recordingStopsAt))); if (showProgress) { if (myTotalFrames) cerr << " 0%/ "; else cerr << " 0/ "; cerr.flush(); } float aspect = player->GetVideoAspect(); SetVideoParams(aspect); emit breathe(); long long stopFrame = preRoll + fps * 120; //look up to 2 minutes past long long framesToProcess = 0; if(preRoll) framesToProcess += stopFrame; if(postRoll) //guess two minutes before framesToProcess += myTotalFrames - postRoll + fps * 120; long long framesProcessed = 0; if(preRoll > 0) { //check from preroll after LOG(VB_COMMFLAG, LOG_INFO, QString("Finding closest after preroll(%1-%2)") .arg(preRoll).arg(stopFrame)); closestAfterPre = findBreakInrange(preRoll, stopFrame, framesToProcess, framesProcessed, flagTime, false); LOG(VB_COMMFLAG, LOG_INFO, QString("Closest after preroll: %1") .arg(closestAfterPre)); //check before preroll long long startFrame = 0; if(closestAfterPre) startFrame = preRoll - (closestAfterPre - preRoll) - 1; LOG(VB_COMMFLAG, LOG_INFO, QString("Finding before preroll (%1-%2)") .arg(startFrame).arg(preRoll)); closestBeforePre = findBreakInrange(startFrame, preRoll, framesToProcess, framesProcessed, flagTime, true); LOG(VB_COMMFLAG, LOG_INFO, QString("Closest before preroll: %1") .arg(closestBeforePre)); if(closestBeforePre || closestAfterPre) emit gotNewCommercialBreakList(); // for better processing percent framesToProcess -= (stopFrame - framesProcessed); } if(stillRecording) { while (MythDate::current() <= recordingStopsAt) { emit breathe(); if (m_bStop) return false; emit statusUpdate(QObject::tr("Waiting for recording to finish")); sleep(5); } stillRecording = false; myTotalFrames = player->GetTotalFrameCount(); } if(postRoll > 0) { //check from preroll after long long postRollStartLoc = myTotalFrames - postRoll; LOG(VB_COMMFLAG, LOG_INFO, QString("Finding closest after postroll(%1-%2)") .arg(postRollStartLoc).arg(myTotalFrames)); closestAfterPost = findBreakInrange(postRollStartLoc, myTotalFrames, framesToProcess, framesProcessed, flagTime, false); LOG(VB_COMMFLAG, LOG_INFO, QString("Closest after postRoll: %1") .arg(closestAfterPost)); //check before preroll long long startFrame = 0; if(closestAfterPost) startFrame = postRollStartLoc - (closestAfterPost - postRollStartLoc) - 1; LOG(VB_COMMFLAG, LOG_INFO, QString("finding closest before preroll(%1-%2)") .arg(startFrame).arg(postRollStartLoc)); closestBeforePost = findBreakInrange(startFrame, postRollStartLoc, framesToProcess, framesProcessed, flagTime, true); LOG(VB_COMMFLAG, LOG_INFO, QString("Closest before postroll: %1") .arg(closestBeforePost)); framesToProcess = framesProcessed; } if (showProgress) { //float elapsed = flagTime.elapsed() / 1000.0; //float flagFPS = (elapsed > 0.0f) ? (framesProcessed / elapsed) : 0.0f; if (myTotalFrames) cerr << "\b\b\b\b\b\b \b\b\b\b\b\b"; else cerr << "\b\b\b\b\b\b\b\b\b\b\b\b\b " "\b\b\b\b\b\b\b\b\b\b\b\b\b"; cerr.flush(); } return true; }
long long PrePostRollFlagger::findBreakInrange(long long startFrame, long long stopFrame, long long totalFrames, long long &framesProcessed, QTime &flagTime, bool findLast) { float flagFPS; int requiredBuffer = 30; long long currentFrameNumber; int prevpercent = -1; if(startFrame > 0) startFrame--; else startFrame = 0; player->DiscardVideoFrame(player->GetRawVideoFrame(0)); long long tmpStartFrame = startFrame; VideoFrame* f = player->GetRawVideoFrame(tmpStartFrame); float aspect = player->GetVideoAspect(); currentFrameNumber = f->frameNumber; LOG(VB_COMMFLAG, LOG_INFO, QString("Starting with frame %1") .arg(currentFrameNumber)); player->DiscardVideoFrame(f); long long foundFrame = 0; while (player->GetEof() == kEofStateNone) { struct timeval startTime; if (stillRecording) gettimeofday(&startTime, NULL); VideoFrame* currentFrame = player->GetRawVideoFrame(); currentFrameNumber = currentFrame->frameNumber; if(currentFrameNumber % 1000 == 0) { LOG(VB_COMMFLAG, LOG_INFO, QString("Processing frame %1") .arg(currentFrameNumber)); } if(currentFrameNumber > stopFrame || (!findLast && foundFrame)) { player->DiscardVideoFrame(currentFrame); break; } double newAspect = currentFrame->aspect; if (newAspect != aspect) { SetVideoParams(aspect); aspect = newAspect; } if (((currentFrameNumber % 500) == 0) || (((currentFrameNumber % 100) == 0) && (stillRecording))) { emit breathe(); if (m_bStop) { player->DiscardVideoFrame(currentFrame); return false; } } while (m_bPaused) { emit breathe(); sleep(1); } // sleep a little so we don't use all cpu even if we're niced if (!fullSpeed && !stillRecording) usleep(10000); if (((currentFrameNumber % 500) == 0) || ((showProgress || stillRecording) && ((currentFrameNumber % 100) == 0))) { float elapsed = flagTime.elapsed() / 1000.0; if (elapsed) flagFPS = framesProcessed / elapsed; else flagFPS = 0.0; int percentage; if (stopFrame) percentage = framesProcessed * 100 / totalFrames; else percentage = 0; if (percentage > 100) percentage = 100; if (showProgress) { if (stopFrame) { QString tmp = QString("\b\b\b\b\b\b\b\b\b\b\b%1%/%2fps") .arg(percentage, 3).arg((int)flagFPS, 3); QByteArray ba = tmp.toAscii(); cerr << ba.constData() << flush; } else { QString tmp = QString("\b\b\b\b\b\b\b\b\b\b\b\b\b%1/%2fps") .arg(currentFrameNumber, 6).arg((int)flagFPS, 3); QByteArray ba = tmp.toAscii(); cerr << ba.constData() << flush; } cerr.flush(); } if (stopFrame) emit statusUpdate(QObject::tr("%1% Completed @ %2 fps.") .arg(percentage).arg(flagFPS)); else emit statusUpdate(QObject::tr("%1 Frames Completed @ %2 fps.") .arg((long)currentFrameNumber).arg(flagFPS)); if (percentage % 10 == 0 && prevpercent != percentage) { prevpercent = percentage; LOG(VB_GENERAL, LOG_INFO, QString("%1%% Completed @ %2 fps.") .arg(percentage) .arg(flagFPS)); } } ProcessFrame(currentFrame, currentFrameNumber); if(frameInfo[currentFrameNumber].flagMask & (COMM_FRAME_SCENE_CHANGE | COMM_FRAME_BLANK)) { foundFrame = currentFrameNumber; } if (stillRecording) { int secondsRecorded = recordingStartedAt.secsTo(MythDate::current()); int secondsFlagged = (int)(framesProcessed / fps); int secondsBehind = secondsRecorded - secondsFlagged; long usecPerFrame = (long)(1.0 / player->GetFrameRate() * 1000000); struct timeval endTime; gettimeofday(&endTime, NULL); long long usecSleep = usecPerFrame - (((endTime.tv_sec - startTime.tv_sec) * 1000000) + (endTime.tv_usec - startTime.tv_usec)); if (secondsBehind > requiredBuffer) { if (fullSpeed) usecSleep = 0; else usecSleep = (long)(usecSleep * 0.25); } else if (secondsBehind < requiredBuffer) usecSleep = (long)(usecPerFrame * 1.5); if (usecSleep > 0) usleep(usecSleep); } player->DiscardVideoFrame(currentFrame); framesProcessed++; } return foundFrame; }
void s_breathe(void) { breathe(0); }
/* Has all kinds of effects in different circumstances. Eventually will be more interesting */ void s_ritual(void) { pob symbol; int i,roomno; int x,y; mprint("You begin your ritual...."); mprint("You enter a deep trance. Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); if (RitualHour == hour()) mprint("Your mental fatigue prevents from completing the ritual!"); else if (random_range(100) > Player.iq+Player.pow+Player.level) mprint("Your concentration was broken -- the ritual fails!"); else { mprint("You charge the ritual with magical energy and focus your will."); mprint("Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); RitualHour = hour(); /* set of random conditions for different ritual effects */ if (Current_Environment == E_CITY) { mprint("Flowing waves of mystical light congeal all around you."); mprint("'Like wow, man! Colors!'"); mprint("Appreciative citizens throw you spare change."); Player.cash +=random_range(50); } else if ( (roomno=Level->site[Player.x][Player.y].roomnumber) >= ROOMBASE ) { if (RitualRoom == roomno) mprint("For some reason the ritual doesn't work this time..."); else { RitualRoom = roomno; switch (RitualRoom) { case RS_TREASURE: /* ransacked treasure chamber */ mprint("Your spell sets off frenetic growth all around you!"); for(i=0; i<8; i++) { Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar = HEDGE; Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf = L_TRIFID; lset(Player.x+Dirs[0][i], Player.y+Dirs[1][i], CHANGED); } break; case RS_HAREM: /* harem */ case RS_BOUDOIR: /* boudoir */ mprint("A secret panel opens next to the bed...."); if (random_range(2)) summon(0,INCUBUS); /* succubus/incubus */ else summon(0,SATYR); /* satyr/nymph */ break; case RS_SHRINE: /*shrine to high magic */ mprint("A storm of mana coaelesces around you."); mprint("You are buffeted by bursts of random magic."); p_damage(random_range(Player.pow),UNSTOPPABLE,"high magic"); mprint("Continue ritual? Could be dangerous.... [yn] "); if (ynq()=='y') s_wish(); else mprint("The mana fades away to nothingness."); x = Player.x; y = Player.y; while (x >= 0 && Level->site[x - 1][y].roomnumber == RS_SHRINE) x--; while (y >= 0 && Level->site[x][y - 1].roomnumber == RS_SHRINE) y--; for (i = 0; Level->site[x][y].roomnumber == RS_SHRINE;) { Level->site[x][y].roomnumber = RS_ZORCH; lset(x, y, CHANGED); x++; i++; if (Level->site[x][y].roomnumber != RS_SHRINE) { x -= i; i = 0; y++; } } break; case RS_MAGIC_LAB: /* magician's lab */ mprint("Your magical activity sets off a latent spell in the lab!"); cast_spell(random_range(NUMSPELLS)); break; case RS_PENTAGRAM: /* pentagram room */ mprint("A smoky form begins to coalesce...."); summon(-1,-1); mprint("Fortunately, it seems confined to the pentagram."); m_status_reset(Level->mlist->m,MOBILE); break; case RS_OMEGA_DAIS: /* blue omega room */ mprint("The Lords of Destiny look upon you...."); if (Player.level > 10) { mprint("A curtain of blue flames leaps up from the omega."); morewait(); l_adept(); } else { if (Player.patron == DESTINY) { mprint("Your patrons take pity on you."); if ((Player.rank[PRIESTHOOD]<SPRIEST) && (! find_item(&symbol,OB_SYMBOL_DESTINY,-1))) { symbol = ((pob) checkmalloc(sizeof(objtype))); *symbol = Objects[OB_SYMBOL_DESTINY]; symbol->known = 2; symbol->charge = 17; gain_item(symbol); mprint("You feel uplifted."); } else gain_experience(min(1000,Player.xp)); } else if (random_range(3)==1) { mprint("You feel Fated."); gain_experience(Player.level*Player.level*10); Player.hp = max(Player.hp, Player.maxhp); } else if (random_range(2)) { mprint("You feel Doomed."); Player.hp = 1; Player.mana = 0; Player.xp = 0; } else mprint("The Lords of Destiny laugh at you!"); } break; default: mprint("Well, not much effect. Chalk it up to experience."); gain_experience(Player.level*5); break; } } } else { if (RitualRoom == Level->site[Player.x][Player.y].roomnumber) mprint("The ritual fails for some unexplainable reason."); else { mprint("The ritual seems to be generating some spell effect."); RitualRoom = Level->site[Player.x][Player.y].roomnumber; switch (RitualRoom) { case RS_WALLSPACE: shadowform(); break; case RS_CORRIDOR: haste(0); break; case RS_PONDS: breathe(0); break; case RS_ADEPT: hero(1); break; default: mprint("The ritual doesn't seem to produce any tangible results..."); gain_experience(Player.level*6); } } } } }