64 bit Timer Class.

Timer64.h

Committer:
tedoyle
Date:
2016-03-28
Revision:
3:8396d3e6eb62
Parent:
2:e89b02820e93
Child:
4:9ca673a83acb
Child:
6:100cf27b43aa

File content as of revision 3:8396d3e6eb62:

#ifndef __NEW_TIMER64__
#define __NEW_TIMER64__

#include "platform.h"
#include "ticker_api.h"
#include <stdint.h>
#include "rtos.h"

#define TIMER64_OK                                  0

#define TIMER64_ERROR_NOT_INITIALIZED               -1

#define TIMER64_WARNING_ALREADY_INITIALIZED         1
#define TIMER64_WARNING_ALREADY_RUNNING             2
#define TIMER64_WARNING_ALREADY_STOPPED             3
#define TIMER64_WARNING_ALREADY_RELEASED            4

#define TIMER64_DEFAULT_ROLLOVER_CHECK_IN_MSECS     30000
#define TIMER64_MIN_ROLLOVER_CHECK_IN_MSECS         1000
#define TIMER64_MAX_ROLLOVER_CHECK_IN_MSECS         65535

class Timer64
{

public:
    Timer64();
    ~Timer64();

    /** Initialize the timer - this must be called before the timer can be used
     */
    int init(uint32_t rolloverCheckTimeInMsecc = TIMER64_15MINUTE_ROLLOVER_CHECK_IN_MSECS);

    /** Release the timer
     */
    int release(void);

    /** Start the timer
     */
    int start(void);

    /** Stop the timer
     */
    int stop(void);

    /** Reset the timer to 0.
     *
     * If it was already counting, it will continue
     */
    int reset(void);

    /** Get the time passed in micro-seconds
     */
    int read_us(uint64_t* timeInUsec = NULL);

    /** Get the time passed in milli-seconds
     */
    int read_ms(uint64_t* timeInMsec = NULL);

    /** Get the time passed in seconds
     */
    int read(double* timeInSec = NULL);

private:
    bool _timerInitialized;
    bool _timerRunning;                 // whether the timer is running
    timestamp_t _tickerStartTimeUsec;   // the start time of the latest slice
    uint64_t _totalTimeUsec;            // any accumulated time from previous slices
    const ticker_data_t *_ticker_data;
    RtosTimer* _rollOverCheckTimer;
    uint32_t _rollOverCheckTimerPeriodInMsec;
    Semaphore* _sem;
    
    static void _rollOverCheck(void const* args);
    static uint64_t _read_us(void const* args);
};

#endif