Arduino driver library for Decawave DW1000  Dec 20 2016
DW1000Time.h
Go to the documentation of this file.
1 
30 #ifndef DW1000TIME_H
31 #define DW1000TIME_H
32 
33 #include <Arduino.h>
34 #include <stdint.h>
35 #include <inttypes.h>
36 #include "DW1000CompileOptions.h"
37 #include "deprecated.h"
38 #include "require_cpp11.h"
39 
40 #if DW1000TIME_H_PRINTABLE
41 class DW1000Time : public Printable {
42 #else
43 class DW1000Time {
44 #endif // DW1000Time_H_PRINTABLE
45 public:
46  // Time resolution in micro-seconds of time based registers/values.
47  // Each bit in a timestamp counts for a period of approx. 15.65ps
48  static constexpr float TIME_RES = 0.000015650040064103f;
49  static constexpr float TIME_RES_INV = 63897.6f;
50 
51  // Speed of radio waves [m/s] * timestamp resolution [~15.65ps] of DW1000
52  static constexpr float DISTANCE_OF_RADIO = 0.0046917639786159f;
53  static constexpr float DISTANCE_OF_RADIO_INV = 213.139451293f;
54 
55  // timestamp byte length - 40 bit -> 5 byte
56  static constexpr uint8_t LENGTH_TIMESTAMP = 5;
57 
58  // timer/counter overflow (40 bits) -> 4overflow approx. every 17.2 seconds
59  static constexpr int64_t TIME_OVERFLOW = 0x10000000000; //1099511627776LL
60  static constexpr int64_t TIME_MAX = 0xffffffffff;
61 
62  // time factors (relative to [us]) for setting delayed transceive
63  // TODO use non float
64  static constexpr float SECONDS = 1e6;
65  static constexpr float MILLISECONDS = 1e3;
66  static constexpr float MICROSECONDS = 1;
67  static constexpr float NANOSECONDS = 1e-3;
68 
69  // constructor
70  DW1000Time();
71  DW1000Time(int64_t time);
72  DW1000Time(byte data[]);
73  DW1000Time(const DW1000Time& copy);
74  DW1000Time(float timeUs);
75  DW1000Time(int32_t value, float factorUs);
76  ~DW1000Time();
77 
78  // setter
79  // dw1000 timestamp, increase of +1 approx approx. 15.65ps real time
80  void setTimestamp(int64_t value);
81  void setTimestamp(byte data[]);
82  void setTimestamp(const DW1000Time& copy);
83 
84  // real time in us
85  void setTime(float timeUs);
86  void setTime(int32_t value, float factorUs);
87 
88  // getter
89  int64_t getTimestamp() const;
90  void getTimestamp(byte data[]) const;
91 
92  DEPRECATED_MSG("use getAsMicroSeconds()")
93  float getAsFloat() const;
94  // getter, convert the timestamp to usual units
95  float getAsMicroSeconds() const;
96  //void getAsBytes(byte data[]) const; // TODO check why it is here, is it old version of getTimestamp(byte) ?
97  float getAsMeters() const;
98 
99  DW1000Time& wrap();
100 
101  // self test
102  bool isValidTimestamp();
103 
104  // assign
105  DW1000Time& operator=(const DW1000Time& assign);
106  // add
107  DW1000Time& operator+=(const DW1000Time& add);
108  DW1000Time operator+(const DW1000Time& add) const;
109  // subtract
110  DW1000Time& operator-=(const DW1000Time& sub);
111  DW1000Time operator-(const DW1000Time& sub) const;
112  // multiply
113  // multiply with float cause lost in accuracy, because float calculates only with 23bit matise
114  DW1000Time& operator*=(float factor);
115  DW1000Time operator*(float factor) const;
116  // no accuracy lost
117  DW1000Time& operator*=(const DW1000Time& factor);
118  DW1000Time operator*(const DW1000Time& factor) const;
119  // divide
120  // divide with float cause lost in accuracy, because float calculates only with 23bit matise
121  DW1000Time& operator/=(float factor);
122  DW1000Time operator/(float factor) const;
123  // no accuracy lost
124  DW1000Time& operator/=(const DW1000Time& factor);
125  DW1000Time operator/(const DW1000Time& factor) const;
126  // compare
127  boolean operator==(const DW1000Time& cmp) const;
128  boolean operator!=(const DW1000Time& cmp) const;
129 
130 #ifdef DW1000TIME_H_PRINTABLE
131  // print to serial for debug
132  DEPRECATED_MSG("use Serial.print(object)")
133  void print();
134  // for usage with e.g. Serial.print()
135  size_t printTo(Print& p) const;
136 #endif // DW1000Time_H_PRINTABLE
137 
138 private:
139  // timestamp size from dw1000 is 40bit, maximum number 1099511627775
140  // signed because you can calculate with DW1000Time; negative values are possible errors
141  int64_t _timestamp = 0;
142 };
143 
144 #endif // DW1000Time_H
void setTime(float timeUs)
Definition: DW1000Time.cpp:112
static constexpr float MICROSECONDS
Definition: DW1000Time.h:66
float getAsMeters() const
Definition: DW1000Time.cpp:172
static constexpr int64_t TIME_OVERFLOW
Definition: DW1000Time.h:59
void print()
Definition: DW1000Time.cpp:287
float getAsFloat() const
Definition: DW1000Time.cpp:154
static constexpr float NANOSECONDS
Definition: DW1000Time.h:67
DW1000Time & wrap()
Definition: DW1000Time.cpp:187
float getAsMicroSeconds() const
Definition: DW1000Time.cpp:163
static constexpr float DISTANCE_OF_RADIO
Definition: DW1000Time.h:52
size_t printTo(Print &p) const
Definition: DW1000Time.cpp:297
bool isValidTimestamp()
Definition: DW1000Time.cpp:198
DW1000Time()
Definition: DW1000Time.cpp:28
static constexpr float DISTANCE_OF_RADIO_INV
Definition: DW1000Time.h:53
~DW1000Time()
Definition: DW1000Time.cpp:78
static constexpr float TIME_RES
Definition: DW1000Time.h:48
Definition: DW1000Time.h:43
static constexpr float MILLISECONDS
Definition: DW1000Time.h:65
static constexpr uint8_t LENGTH_TIMESTAMP
Definition: DW1000Time.h:56
static constexpr float SECONDS
Definition: DW1000Time.h:64
static constexpr float TIME_RES_INV
Definition: DW1000Time.h:49
#define DEPRECATED_MSG(msg)
Definition: deprecated.h:17
int64_t getTimestamp() const
Definition: DW1000Time.cpp:134
static constexpr int64_t TIME_MAX
Definition: DW1000Time.h:60
void setTimestamp(int64_t value)
Definition: DW1000Time.cpp:84