From: <tr...@ff...> - 2008-09-24 12:35:03
|
Author: ppalmers Date: 2008-09-24 05:34:53 -0700 (Wed, 24 Sep 2008) New Revision: 1341 Modified: branches/libffado-2.0/src/libieee1394/CycleTimerHelper.cpp branches/libffado-2.0/src/libieee1394/CycleTimerHelper.h branches/libffado-2.0/src/libieee1394/ieee1394service.cpp branches/libffado-2.0/src/libieee1394/ieee1394service.h Log: Add reverse mapping support to obtain system time based upon the ctr value Modified: branches/libffado-2.0/src/libieee1394/CycleTimerHelper.cpp =================================================================== --- branches/libffado-2.0/src/libieee1394/CycleTimerHelper.cpp 2008-09-23 21:51:42 UTC (rev 1340) +++ branches/libffado-2.0/src/libieee1394/CycleTimerHelper.cpp 2008-09-24 12:34:53 UTC (rev 1341) @@ -653,6 +653,38 @@ return result; } +uint64_t +CycleTimerHelper::getSystemTimeForCycleTimerTicks(uint32_t ticks) +{ + uint64_t retval; + struct compute_vars *my_vars; + + // get pointer and copy the contents + // no locking should be needed since we have more than one + // of these vars available, and our use will always be finished before + // m_current_shadow_idx changes since this thread's priority should + // be higher than the one of the writer thread. Even if not, we only have to ensure + // that the used dataset is consistent. We can use an older dataset if it's consistent + // since it will also provide a fairly decent extrapolation. + my_vars = m_shadow_vars + m_current_shadow_idx; + + // the number of ticks the request is ahead of the current CTR position + int64_t ticks_diff = diffTicks(ticks, my_vars->ticks); + // to how much time does this correspond? + double x_step_in_usec = ((double)ticks_diff) / my_vars->rate; + int64_t x_step_in_usec_int = (int64_t)x_step_in_usec; + retval = my_vars->usecs + x_step_in_usec_int; + + return retval; +} + +uint64_t +CycleTimerHelper::getSystemTimeForCycleTimer(uint32_t ctr) +{ + uint32_t ticks = CYCLE_TIMER_TO_TICKS(ctr); + return getSystemTimeForCycleTimerTicks(ticks); +} + #else float @@ -684,8 +716,18 @@ uint32_t CycleTimerHelper::getCycleTimerTicks(uint64_t now) { - debugWarning("not implemented!\n"); - return getCycleTimerTicks(); + debugWarning("untested code\n"); + #warning Untested code + uint32_t cycle_timer; + uint64_t local_time; + readCycleTimerWithRetry(&cycle_timer, &local_time, 10); + int64_t ticks = CYCLE_TIMER_TO_TICKS(cycle_timer); + + int delta_t = now - local_time; // how far ahead is the request? + ticks += delta_t * getRate(); // add ticks + if (ticks >= TICKS_PER_SECOND * 128) ticks -= TICKS_PER_SECOND * 128; + else if (ticks < 0) ticks += TICKS_PER_SECOND * 128; + return ticks; } uint32_t @@ -700,10 +742,23 @@ uint32_t CycleTimerHelper::getCycleTimer(uint64_t now) { + return TICKS_TO_CYCLE_TIMER(getCycleTimerTicks(now)); +} + +uint64_t +CycleTimerHelper::getSystemTimeForCycleTimerTicks(uint32_t ticks) +{ debugWarning("not implemented!\n"); - return getCycleTimer(); + return 0; } +uint64_t +CycleTimerHelper::getSystemTimeForCycleTimer(uint32_t ctr) +{ + uint32_t ticks = CYCLE_TIMER_TO_TICKS(ctr); + return getSystemTimeForCycleTimerTicks(ticks); +} + #endif bool Modified: branches/libffado-2.0/src/libieee1394/CycleTimerHelper.h =================================================================== --- branches/libffado-2.0/src/libieee1394/CycleTimerHelper.h 2008-09-23 21:51:42 UTC (rev 1340) +++ branches/libffado-2.0/src/libieee1394/CycleTimerHelper.h 2008-09-24 12:34:53 UTC (rev 1341) @@ -97,6 +97,18 @@ */ uint32_t getCycleTimer(uint64_t now); + /** + * @brief get the system time for a specific cycle timer value (in ticks) + * @note thread safe + */ + uint64_t getSystemTimeForCycleTimerTicks(uint32_t ticks); + + /** + * @brief get the system time for a specific cycle timer value (in CTR format) + * @note thread safe + */ + uint64_t getSystemTimeForCycleTimer(uint32_t ctr); + float getRate(); float getNominalRate(); Modified: branches/libffado-2.0/src/libieee1394/ieee1394service.cpp =================================================================== --- branches/libffado-2.0/src/libieee1394/ieee1394service.cpp 2008-09-23 21:51:42 UTC (rev 1340) +++ branches/libffado-2.0/src/libieee1394/ieee1394service.cpp 2008-09-24 12:34:53 UTC (rev 1341) @@ -384,6 +384,16 @@ return m_pCTRHelper->getCycleTimer(t); } +uint64_t +Ieee1394Service::getSystemTimeForCycleTimerTicks(uint32_t ticks) { + return m_pCTRHelper->getSystemTimeForCycleTimerTicks(ticks); +} + +uint64_t +Ieee1394Service::getSystemTimeForCycleTimer(uint32_t ctr) { + return m_pCTRHelper->getSystemTimeForCycleTimer(ctr); +} + bool Ieee1394Service::readCycleTimerReg(uint32_t *cycle_timer, uint64_t *local_time) { Modified: branches/libffado-2.0/src/libieee1394/ieee1394service.h =================================================================== --- branches/libffado-2.0/src/libieee1394/ieee1394service.h 2008-09-23 21:51:42 UTC (rev 1340) +++ branches/libffado-2.0/src/libieee1394/ieee1394service.h 2008-09-24 12:34:53 UTC (rev 1341) @@ -134,6 +134,18 @@ uint32_t getCycleTimer(uint64_t t); /** + * @brief get the system time for a specific cycle timer value (in ticks) + * @note thread safe + */ + uint64_t getSystemTimeForCycleTimerTicks(uint32_t ticks); + + /** + * @brief get the system time for a specific cycle timer value (in CTR format) + * @note thread safe + */ + uint64_t getSystemTimeForCycleTimer(uint32_t ctr); + + /** * @brief read the cycle timer value from the controller (in CTR format) * * @note Uses a direct method to read the value from the controller |