qstmgesturelib/uitimer.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041

#ifndef UITIMER_H_
#define UITIMER_H_

#include <QDateTime>
#include <QDebug>
#include "qstmfilelogger.h"

#define TIMESTAMP() QDateTime::currentDateTime().toString("hh:mm:ss:zzz")

#ifdef Q_OS_SYMBIAN
#include <e32base.h>
#include <e32const.h>

class CUiTimer : public CTimer
{
public:
    enum CUiTimerType
    {
        AfterType,
        HighResType,
        LockType
    };
    
    CUiTimer(int priority) : CTimer(priority), m_timerType(AfterType)
    {
    }
    
    
    
    static CUiTimer* New(int priority)
    {
        CUiTimer* uitao = new CUiTimer(priority);
        if (uitao) {            
            TRAPD(r, uitao->ConstructL());
            if (r == KErrNone) {
                CActiveScheduler::Add(uitao);
            }
            else {
                delete uitao;
                uitao = NULL;
            }
        }
        return uitao;
    }
    
    ~CUiTimer() {}
    
    void Start(TTimeIntervalMicroSeconds32 delay,TTimeIntervalMicroSeconds32 interval,TCallBack callBack)
    {
        __ASSERT_ALWAYS(interval.Int()>=0,User::Panic(_L("Interval < 0"), -1));
        __ASSERT_ALWAYS(delay.Int()>=0,User::Panic(_L("Delay < 0"), -2));
        m_interval = interval.Int();
        m_callback = callBack;
        m_timerType = AfterType;
        After(delay);
    }
    
    void StartHighRes(TTimeIntervalMicroSeconds32 delay,TTimeIntervalMicroSeconds32 interval,TCallBack callBack)
    {
        __ASSERT_ALWAYS(interval.Int()>=0,User::Panic(_L("Interval < 0"), -1));
        __ASSERT_ALWAYS(delay.Int()>=0,User::Panic(_L("Delay < 0"), -2));
        m_interval = interval.Int();
        m_callback = callBack;
        m_timerType = HighResType;
        HighRes(delay);
    }
        
    void StartLock(TTimerLockSpec lockSpec,TCallBack callBack)
    {
        m_lockSpec = lockSpec;
        m_callback = callBack;
        m_timerType = LockType;
        Lock(m_lockSpec);
    }

    
    void RunL()
    {
        switch (m_timerType) {
        case HighResType:
            HighRes(m_interval);
            m_callback.CallBack();
            break;
        case LockType:
            Lock(m_lockSpec);
            m_callback.CallBack();
            break;
        case AfterType:
            After(m_interval);
            m_callback.CallBack();
            break;
        }
    }
    
private:    
    uint            m_interval; 
    TCallBack       m_callback;
    CUiTimerType    m_timerType;
    TTimerLockSpec  m_lockSpec;
};

class UiTimer : QObject
{
    enum UiTimerType
    {
        AfterType,
        HighResType,
        LockType
    };

public:
    static UiTimer*  New() 
    { 
        return new UiTimer(); 
    }
  
    inline UiTimer(): QObject(), m_id(0), m_requestedTicks(-1), 
                      m_ticksCount(0), m_cbName("uiTimerCallback") 
    {    
        m_timer = CUiTimer::New(20);
    }
  
    inline void setPriority(int priority) { m_timer->SetPriority(priority); }
    inline ~UiTimer() { m_timer->Cancel(); delete m_timer;}
    
    inline int timerId() const { return m_id; }

    static int timercallback(TAny* ptr)
    {
        UiTimer* uitimer = static_cast<UiTimer*>(ptr);
        uitimer->doTimerCallback();
        return 0;
    }
    
    void doTimerCallback()
    {
       if (isActive() && (m_requestedTicks < 0 || m_ticksCount++ < m_requestedTicks)) {  
           
           QMetaObject::invokeMethod(m_obj, m_cbName, Qt::DirectConnection);
           if (m_ticksCount == m_requestedTicks) {
               stop();
           }
       }
       return;
    }
    
    void start(int msec, QObject *obj, UiTimerType timerType = HighResType) 
    {
        m_delay = msec;
        m_obj = obj;
        m_ticksCount = 0;
        switch (timerType)
        {
        case HighResType:
            m_timer->StartHighRes((msec + 1) * 1000, (msec + 1) * 1000, TCallBack(timercallback, this));
            break;
        case AfterType:
            m_timer->Start(msec * 1000, msec * 1000, TCallBack(timercallback, this));
            break;
        case LockType:
            TTimerLockSpec lockSpec = static_cast<TTimerLockSpec>(msec);
            m_timer->StartLock(lockSpec, TCallBack(timercallback, this));
            break;
        }
    }
    
    void stop() 
    { 
        m_timer->Cancel(); 
    }
    
    bool isActive() { return m_timer->IsActive(); }
    
    void setRequestedTicks(int ticksCount) { m_requestedTicks = ticksCount; }
    int ticksCount() { return m_ticksCount; }
    
    void setSingleShot(bool isOneShot) { isOneShot ?  m_requestedTicks = 1 : m_requestedTicks = -1; }
    bool isSingleShot() { return m_requestedTicks == 1; }
    
    void setTimerCallback(char* cbName) { m_cbName = cbName; }
    
private:
    int         m_id;
    int         m_delay;
    QObject*    m_obj;
    CUiTimer*   m_timer;
    int         m_requestedTicks;
    int         m_ticksCount;
    char*       m_cbName;
    
};
#else
class UiTimer : public QObject
{
public:
    static UiTimer* New() { return new UiTimer(); }
    UiTimer() : QObject(), m_requestedTicks(-1), m_cbName(0)
    {
    }
    inline void setPriority(int priority) {}
    inline void start(int msec, QObject *obj) 
    {
        m_delay = msec;
        m_obj = obj;
        m_ticksCount = 0;
        m_timer.start(msec, this);
    }
    inline ~UiTimer() {}
        
    inline int timerId() const { return m_timer.timerId(); }

    inline void timerEvent(QTimerEvent *event)
    {
        if (m_requestedTicks < 0 || m_ticksCount++ < m_requestedTicks) {
            QMetaObject::invokeMethod(m_obj, m_cbName ? m_cbName : "uiTimerCallback", Qt::DirectConnection);
        }
        else {
            stop();
        }
        return;
    }

    inline void stop() { m_timer.stop(); }
        
    inline bool isActive() { return m_timer.isActive(); }

    void setRequestedTicks(int ticksCount) { m_requestedTicks = ticksCount; }
    int ticksCount() { return m_ticksCount; }
    
    void setSingleShot(bool isOneShot) { isOneShot ?  m_requestedTicks = 1 : m_requestedTicks = -1; }
    bool isSingleShot() { return m_requestedTicks == 1; }
    void setTimerCallback(char* cbName) { m_cbName = cbName; }

private:
    QBasicTimer  m_timer; 
    int          m_delay;
    QObject*     m_obj;
    int         m_requestedTicks;
    int         m_ticksCount;
    char*       m_cbName;
};

#endif




#endif /* UITIMER_H_ */