MRPT  1.9.9
cmtpacket.h
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | https://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2019, Individual contributors, see AUTHORS file |
6  | See: https://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See: https://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #ifndef _CMTPACKET_H_2006_05_10
11 #define _CMTPACKET_H_2006_05_10
12 
13 #ifndef _CMT_MONOLITHIC
14 #include "cmt2.h"
15 #include "cmtdef.h"
16 #endif
17 
18 namespace xsens
19 {
20 //! Indicates that a data item is not available in the packet
21 #define CMT_DATA_ITEM_NOT_AVAILABLE 65535
22 
23 //! A structure containing MT data + timestamp and formatting information.
24 class Packet
25 {
26  protected:
27  //! Contains information about data in the packet and the format of that
28  //! data
29  mutable struct PacketInfo
30  {
68  } * m_infoList;
69  /** A list of the formats of the data items */
71  /** Indicates that xbus-formatting is used */
72  bool m_xm;
73 
74  public:
75  /** The number of data items in the message */
77  /** The message */
79  /** Sample time in ms, based on the sample counter */
81  /** Time of arrival */
83 
84  Packet(uint16_t items, bool xbus);
85  Packet(const Packet& pack);
86  ~Packet();
87 
88  void operator=(const Packet& pack);
89 
90  bool setDataFormat(const CmtDataFormat& format, const uint16_t index = 0);
91  bool setDataFormat(
92  const CmtOutputMode outputMode, const CmtOutputSettings outputSettings,
93  const uint16_t index = 0);
94  CmtDataFormat getDataFormat(const uint16_t index = 0) const;
95  void setXbus(bool xbus, bool convert = false);
96  bool getXbus(void) const;
97 
98  /*! \brief Return the data size.
99 
100  \param index The index of the item of which the size should be returned.
101  */
102  uint16_t getDataSize(const uint16_t index = 0) const;
103 
104  /*! \brief Return the floating/fixed point value size
105 
106  \param index The index of the item whose fp size should be returned.
107  */
108  uint16_t getFPValueSize(const uint16_t index) const;
109 
110  /*! \brief Return the Raw Accelerometer component of a data item.
111 
112  \param index The index of the item of which the data should be returned.
113  */
114  CmtShortVector getRawAcc(const uint16_t index = 0) const;
115  //! Check if data item contains Raw Accelerometer data
116  bool containsRawAcc(const uint16_t index = 0) const;
117  //! Add/update Raw Accelerometer data for the item
118  bool updateRawAcc(const CmtShortVector& vec, const uint16_t index = 0);
119  /*! \brief Return the Raw Gyroscope component of a data item.
120 
121  \param index The index of the item of which the data should be returned.
122  */
123  CmtShortVector getRawGyr(const uint16_t index = 0) const;
124  //! Check if data item contains Raw Gyroscope data
125  bool containsRawGyr(const uint16_t index = 0) const;
126  //! Add/update Raw Gyroscope data for the item
127  bool updateRawGyr(const CmtShortVector& vec, const uint16_t index = 0);
128  /*! \brief Return the Raw Magnetometer component of a data item.
129 
130  \param index The index of the item of which the data should be returned.
131  */
132  CmtShortVector getRawMag(const uint16_t index = 0) const;
133  //! Check if data item contains Raw Magnetometer data
134  bool containsRawMag(const uint16_t index = 0) const;
135  //! Add/update Raw Magnetometer data for the item
136  bool updateRawMag(const CmtShortVector& vec, const uint16_t index = 0);
137  /*! \brief Return the Raw Temperature component of a data item.
138 
139  \param index The index of the item of which the data should be returned.
140  */
141  uint16_t getRawTemp(const uint16_t index = 0) const;
142  //! Check if data item contains Raw Temperature data
143  bool containsRawTemp(const uint16_t index = 0) const;
144  //! Add/update Raw Temperature data for the item
145  bool updateRawTemp(uint16_t temp, const uint16_t index = 0);
146  /*! \brief Return the Raw Data component of a data item.
147 
148  \param index The index of the item of which the data should be returned.
149  */
150  CmtRawData getRawData(const uint16_t index = 0) const;
151  //! Check if data item contains Raw Data
152  bool containsRawData(const uint16_t index = 0) const;
153  //! Add/update Raw Data for the item
154  bool updateRawData(const CmtRawData& data, const uint16_t index = 0);
155  /*! \brief Return the Raw GpsPrint Data component of a data item.
156  // TODO: Implement in COM interface!!!
157  \param index The index of the item of which the data should be returned.
158  */
159  CmtRawGpsData getRawGpsData(const uint16_t index = 0) const;
160  //! Check if data item contains Raw GpsPrint Data
161  bool containsRawGpsData(const uint16_t index = 0) const;
162  //! Add/update Raw GpsPrint Data for the item
163  bool updateRawGpsData(const CmtRawGpsData& data, const uint16_t index = 0);
164  /*! \brief Return the Temperature component of a data item.
165 
166  \param index The index of the item of which the data should be returned.
167  */
168  double getTemp(const uint16_t index = 0) const;
169  //! Check if data item contains Temperature data
170  bool containsTemp(const uint16_t index = 0) const;
171  //! Add/update Calibrated Accelerometer data for the item
172  bool updateTemp(const double& temp, const uint16_t index = 0);
173  /*! \brief Return the Calibrated Accelerometer component of a data item.
174 
175  \param index The index of the item of which the data should be returned.
176  */
177  CmtVector getCalAcc(const uint16_t index = 0) const;
178  //! Check if data item contains Calibrated Accelerometer data
179  bool containsCalAcc(const uint16_t index = 0) const;
180  //! Add/update Calibrated Accelerometer data for the item
181  bool updateCalAcc(const CmtVector& vec, const uint16_t index = 0);
182  /*! \brief Return the Calibrated Gyroscope component of a data item.
183 
184  \param index The index of the item of which the data should be returned.
185  */
186  CmtVector getCalGyr(const uint16_t index = 0) const;
187  //! Check if data item contains Calibrated Gyroscope data
188  bool containsCalGyr(const uint16_t index = 0) const;
189  //! Add/update Calibrated Gyroscope data for the item
190  bool updateCalGyr(const CmtVector& vec, const uint16_t index = 0);
191  /*! \brief Return the Calibrated Magnetometer component of a data item.
192 
193  \param index The index of the item of which the data should be returned.
194  */
195  CmtVector getCalMag(const uint16_t index = 0) const;
196  //! Check if data item contains Calibrated Magnetometer data
197  bool containsCalMag(const uint16_t index = 0) const;
198  //! Add/update Calibrated Magnetometer data for the item
199  bool updateCalMag(const CmtVector& vec, const uint16_t index = 0);
200  /*! \brief Return the Calibrated Data component of a data item.
201 
202  \param index The index of the item of which the data should be returned.
203  */
204  CmtCalData getCalData(const uint16_t index = 0) const;
205  //! Check if data item contains Calibrated Data
206  bool containsCalData(const uint16_t index = 0) const;
207  //! Add/update Calibrated Data for the item
208  bool updateCalData(const CmtCalData& data, const uint16_t index = 0);
209 
210  /*! \brief Return the Orientation component of a data item as a Quaternion.
211 
212  \param index The index of the item of which the data should be returned.
213  */
214  CmtQuat getOriQuat(const uint16_t index = 0) const;
215  //! Check if data item contains Quaternion Orientation data
216  bool containsOriQuat(const uint16_t index = 0) const;
217  //! Add/update Quaternion Orientation data for the item
218  bool updateOriQuat(const CmtQuat& data, const uint16_t index = 0);
219  /*! \brief Return the Orientation component of a data item as Euler angles.
220 
221  \param index The index of the item of which the data should be returned.
222  */
223  CmtEuler getOriEuler(const uint16_t index = 0) const;
224  //! Check if data item contains Euler Orientation data
225  bool containsOriEuler(const uint16_t index = 0) const;
226  //! Add/update Euler Orientation data for the item
227  bool updateOriEuler(const CmtEuler& data, const uint16_t index = 0);
228  /*! \brief Return the Orientation component of a data item as an Orientation
229  Matrix.
230 
231  \param index The index of the item of which the data should be returned.
232  */
233  CmtMatrix getOriMatrix(const uint16_t index = 0) const;
234  //! Check if data item contains Matrix Orientation data
235  bool containsOriMatrix(const uint16_t index = 0) const;
236  //! Add/update Matrix Orientation data for the item
237  bool updateOriMatrix(const CmtMatrix& data, const uint16_t index = 0);
238 
239  /*! \brief Return the AnalogIn 1 component of a data item.
240 
241  \param index The index of the item of which the data should be returned.
242  */
243  CmtAnalogInData getAnalogIn1(const uint16_t index = 0) const;
244  //! Check if data item contains AnalogIn 1
245  bool containsAnalogIn1(const uint16_t index = 0) const;
246  //! Add/update AnalogIn 1 for the item
247  bool updateAnalogIn1(const CmtAnalogInData& data, const uint16_t index = 0);
248 
249  /*! \brief Return the AnalogIn 2 component of a data item.
250 
251  \param index The index of the item of which the data should be returned.
252  */
253  CmtAnalogInData getAnalogIn2(const uint16_t index = 0) const;
254  //! Check if data item contains AnalogIn 2
255  bool containsAnalogIn2(const uint16_t index = 0) const;
256  //! Add/update AnalogIn 2 for the item
257  bool updateAnalogIn2(const CmtAnalogInData& data, const uint16_t index = 0);
258 
259  /*! \brief Return the Position Lat Lon Alt component of a data item.
260 
261  \param index The index of the item of which the data should be returned.
262  */
263  CmtVector getPositionLLA(const uint16_t index = 0) const;
264  //! Check if data item contains Position Lat Lon Alt
265  bool containsPositionLLA(const uint16_t index = 0) const;
266  //! Add/update Position Lat Lon Alt for the item
267  bool updatePositionLLA(const CmtVector& data, const uint16_t index = 0);
268 
269  /*! \brief Return the Velocity component of a data item.
270 
271  \param index The index of the item of which the data should be returned.
272  */
273  CmtVector getVelocity(const uint16_t index = 0) const;
274  //! Check if data item contains Velocity
275  bool containsVelocity(const uint16_t index = 0) const;
276  //! Add/update Velocity for the item
277  bool updateVelocity(const CmtVector& data, const uint16_t index = 0);
278 
279  /*! \brief Return the Status component of a data item.
280 
281  \param index The index of the item of which the data should be returned.
282  */
283  uint8_t getStatus(const uint16_t index = 0) const;
284  //! Check if data item contains Velocity
285  bool containsStatus(const uint16_t index = 0) const;
286  //! Add/update Status information for the item
287  bool updateStatus(const uint8_t data, const uint16_t index = 0);
288 
289  /*! \brief Return the Sample Counter component of the packet.
290 
291  \param index The index of the item of which the data should be returned.
292  (ignored)
293  */
294  uint16_t getSampleCounter(const uint16_t index = 0) const;
295  //! Check if data item contains Sample Counter
296  bool containsSampleCounter(const uint16_t index = 0) const;
297  //! Add/update Sample Counter for all items
299  /*! \brief Return the RTC of the packet.
300 
301  \param index The index of the item of which the data should be returned.
302  (ignored)
303  */
304  CmtTimeStamp getRtc(const uint16_t index = 0) const;
305 
306  /*! \brief Return the XKF-3 Acc-G component of the packet.
307 
308  \param index The index of the item of which the data should be returned.
309  */
310  CmtVector getAccG(const uint16_t index = 0) const;
311  //! Check if data item contains XKF-3 Acc-G data
312  bool containsAccG(const uint16_t index = 0) const;
313  //! Add/update XKF-3 Acc-G data for the item
314  bool updateAccG(const CmtVector& g, const uint16_t index = 0);
315 
316 #ifdef _CMT_DLL_EXPORT
317  //! Interpolate so resulting packet is (1-f)*pa + pb OR pb if pa and pb are
318  //! non-matching types
319  void interpolate(const Packet& pa, const Packet& pb, const double f);
320 #endif
321 };
322 
323 } // namespace xsens
324 
325 #endif // _CMTPACKET_H_2006_05_10
bool updateOriQuat(const CmtQuat &data, const uint16_t index=0)
Add/update Quaternion Orientation data for the item.
Definition: cmtpacket.cpp:916
bool updatePositionLLA(const CmtVector &data, const uint16_t index=0)
Add/update Position Lat Lon Alt for the item.
Definition: cmtpacket.cpp:1122
bool updateRawTemp(uint16_t temp, const uint16_t index=0)
Add/update Raw Temperature data for the item.
Definition: cmtpacket.cpp:539
uint64_t CmtTimeStamp
Definition: cmtdef.h:1288
bool containsCalAcc(const uint16_t index=0) const
Check if data item contains Calibrated Accelerometer data.
Definition: cmtpacket.cpp:740
double getTemp(const uint16_t index=0) const
Return the Temperature component of a data item.
Definition: cmtpacket.cpp:694
CmtVector getPositionLLA(const uint16_t index=0) const
Return the Position Lat Lon Alt component of a data item.
Definition: cmtpacket.cpp:1105
TimeStamp m_toa
Time of arrival.
Definition: cmtpacket.h:82
unsigned __int16 uint16_t
Definition: rptypes.h:47
A structure for storing data formats.
Definition: cmtdef.h:907
bool containsAccG(const uint16_t index=0) const
Check if data item contains XKF-3 Acc-G data.
Definition: cmtpacket.cpp:1262
CmtRawData getRawData(const uint16_t index=0) const
Return the Raw Data component of a data item.
Definition: cmtpacket.cpp:556
bool updateAnalogIn1(const CmtAnalogInData &data, const uint16_t index=0)
Add/update AnalogIn 1 for the item.
Definition: cmtpacket.cpp:1056
CmtVector getAccG(const uint16_t index=0) const
Return the XKF-3 Acc-G component of the packet.
Definition: cmtpacket.cpp:1250
bool containsAnalogIn2(const uint16_t index=0) const
Check if data item contains AnalogIn 2.
Definition: cmtpacket.cpp:1081
bool containsRawAcc(const uint16_t index=0) const
Check if data item contains Raw Accelerometer data.
Definition: cmtpacket.cpp:434
CmtVector getVelocity(const uint16_t index=0) const
Return the Velocity component of a data item.
Definition: cmtpacket.cpp:1145
T interpolate(const T &x, const VECTOR &ys, const T &x0, const T &x1)
Interpolate a data sequence "ys" ranging from "x0" to "x1" (equally spaced), to obtain the approximat...
Definition: interp_fit.hpp:17
bool updateCalData(const CmtCalData &data, const uint16_t index=0)
Add/update Calibrated Data for the item.
Definition: cmtpacket.cpp:868
CmtDataFormat getDataFormat(const uint16_t index=0) const
Definition: cmtpacket.cpp:69
uint16_t getRawTemp(const uint16_t index=0) const
Return the Raw Temperature component of a data item.
Definition: cmtpacket.cpp:526
uint16_t m_itemCount
The number of data items in the message.
Definition: cmtpacket.h:76
bool containsPositionLLA(const uint16_t index=0) const
Check if data item contains Position Lat Lon Alt.
Definition: cmtpacket.cpp:1116
uint16_t getSampleCounter(const uint16_t index=0) const
Return the Sample Counter component of the packet.
Definition: cmtpacket.cpp:1217
CmtRawGpsData getRawGpsData(const uint16_t index=0) const
Return the Raw GpsPrint Data component of a data item. TODO: Implement in COM interface!!! ...
Definition: cmtpacket.cpp:602
bool updateRawAcc(const CmtShortVector &vec, const uint16_t index=0)
Add/update Raw Accelerometer data for the item.
Definition: cmtpacket.cpp:440
int counter
bool containsCalData(const uint16_t index=0) const
Check if data item contains Calibrated Data.
Definition: cmtpacket.cpp:861
bool containsRawGpsData(const uint16_t index=0) const
Check if data item contains Raw GpsPrint Data.
Definition: cmtpacket.cpp:632
A structure containing MT data + timestamp and formatting information.
Definition: cmtpacket.h:24
unsigned char uint8_t
Definition: rptypes.h:44
bool updateRawGpsData(const CmtRawGpsData &data, const uint16_t index=0)
Add/update Raw GpsPrint Data for the item.
Definition: cmtpacket.cpp:639
bool containsRawTemp(const uint16_t index=0) const
Check if data item contains Raw Temperature data.
Definition: cmtpacket.cpp:532
bool containsOriMatrix(const uint16_t index=0) const
Check if data item contains Matrix Orientation data.
Definition: cmtpacket.cpp:1009
TimeStamp m_rtc
Sample time in ms, based on the sample counter.
Definition: cmtpacket.h:80
CmtDataFormat * m_formatList
A list of the formats of the data items.
Definition: cmtpacket.h:70
struct xsens::Packet::PacketInfo * m_infoList
bool updateOriEuler(const CmtEuler &data, const uint16_t index=0)
Add/update Euler Orientation data for the item.
Definition: cmtpacket.cpp:962
bool updateCalGyr(const CmtVector &vec, const uint16_t index=0)
Add/update Calibrated Gyroscope data for the item.
Definition: cmtpacket.cpp:786
bool containsCalGyr(const uint16_t index=0) const
Check if data item contains Calibrated Gyroscope data.
Definition: cmtpacket.cpp:780
CmtVector getCalGyr(const uint16_t index=0) const
Return the Calibrated Gyroscope component of a data item.
Definition: cmtpacket.cpp:769
bool updateVelocity(const CmtVector &data, const uint16_t index=0)
Add/update Velocity for the item.
Definition: cmtpacket.cpp:1164
GLuint index
Definition: glext.h:4068
bool updateAccG(const CmtVector &g, const uint16_t index=0)
Add/update XKF-3 Acc-G data for the item.
Definition: cmtpacket.cpp:1268
bool containsCalMag(const uint16_t index=0) const
Check if data item contains Calibrated Magnetometer data.
Definition: cmtpacket.cpp:820
CmtQuat getOriQuat(const uint16_t index=0) const
Return the Orientation component of a data item as a Quaternion.
Definition: cmtpacket.cpp:897
bool updateCalAcc(const CmtVector &vec, const uint16_t index=0)
Add/update Calibrated Accelerometer data for the item.
Definition: cmtpacket.cpp:746
bool m_xm
Indicates that xbus-formatting is used.
Definition: cmtpacket.h:72
GLubyte g
Definition: glext.h:6372
bool containsRawGyr(const uint16_t index=0) const
Check if data item contains Raw Gyroscope data.
Definition: cmtpacket.cpp:468
CmtShortVector getRawAcc(const uint16_t index=0) const
Return the Raw Accelerometer component of a data item.
Definition: cmtpacket.cpp:424
bool updateTemp(const double &temp, const uint16_t index=0)
Add/update Calibrated Accelerometer data for the item.
Definition: cmtpacket.cpp:708
uint16_t m_rawGpsPressureAge
Definition: cmtpacket.h:54
bool containsOriQuat(const uint16_t index=0) const
Check if data item contains Quaternion Orientation data.
Definition: cmtpacket.cpp:909
bool containsTemp(const uint16_t index=0) const
Check if data item contains Temperature data.
Definition: cmtpacket.cpp:702
uint64_t TimeStamp
A real-time timestamp (ms)
Definition: xsens_time.h:24
uint16_t getDataSize(const uint16_t index=0) const
Return the data size.
Definition: cmtpacket.cpp:178
CmtMatrix getOriMatrix(const uint16_t index=0) const
Return the Orientation component of a data item as an Orientation Matrix.
Definition: cmtpacket.cpp:991
Contains information about data in the packet and the format of that data.
Definition: cmtpacket.h:29
CmtShortVector getRawGyr(const uint16_t index=0) const
Return the Raw Gyroscope component of a data item.
Definition: cmtpacket.cpp:458
uint16_t getFPValueSize(const uint16_t index) const
Return the floating/fixed point value size.
Definition: cmtpacket.cpp:148
bool containsRawMag(const uint16_t index=0) const
Check if data item contains Raw Magnetometer data.
Definition: cmtpacket.cpp:502
bool containsVelocity(const uint16_t index=0) const
Check if data item contains Velocity.
Definition: cmtpacket.cpp:1157
bool setDataFormat(const CmtDataFormat &format, const uint16_t index=0)
Definition: cmtpacket.cpp:80
bool updateOriMatrix(const CmtMatrix &data, const uint16_t index=0)
Add/update Matrix Orientation data for the item.
Definition: cmtpacket.cpp:1015
bool updateRawMag(const CmtShortVector &vec, const uint16_t index=0)
Add/update Raw Magnetometer data for the item.
Definition: cmtpacket.cpp:508
bool updateSampleCounter(uint16_t counter, const uint16_t index=0)
Add/update Sample Counter for all items.
Definition: cmtpacket.cpp:1228
uint32_t CmtOutputMode
An output mode bit-field.
Definition: cmtdef.h:902
bool containsOriEuler(const uint16_t index=0) const
Check if data item contains Euler Orientation data.
Definition: cmtpacket.cpp:956
bool containsAnalogIn1(const uint16_t index=0) const
Check if data item contains AnalogIn 1.
Definition: cmtpacket.cpp:1049
void setXbus(bool xbus, bool convert=false)
Definition: cmtpacket.cpp:109
bool containsStatus(const uint16_t index=0) const
Check if data item contains Velocity.
Definition: cmtpacket.cpp:1193
The namespace of all Xsens software since 2006.
Definition: cmt1.cpp:95
bool updateRawData(const CmtRawData &data, const uint16_t index=0)
Add/update Raw Data for the item.
Definition: cmtpacket.cpp:579
GLenum GLsizei GLenum format
Definition: glext.h:3535
CmtVector getCalMag(const uint16_t index=0) const
Return the Calibrated Magnetometer component of a data item.
Definition: cmtpacket.cpp:809
bool updateCalMag(const CmtVector &vec, const uint16_t index=0)
Add/update Calibrated Magnetometer data for the item.
Definition: cmtpacket.cpp:826
Packet(uint16_t items, bool xbus)
Definition: cmtpacket.cpp:48
bool updateAnalogIn2(const CmtAnalogInData &data, const uint16_t index=0)
Add/update AnalogIn 2 for the item.
Definition: cmtpacket.cpp:1088
bool getXbus(void) const
Definition: cmtpacket.cpp:107
bool containsSampleCounter(const uint16_t index=0) const
Check if data item contains Sample Counter.
Definition: cmtpacket.cpp:1222
CmtTimeStamp getRtc(const uint16_t index=0) const
Return the RTC of the packet.
Definition: cmtpacket.cpp:1242
CmtAnalogInData getAnalogIn2(const uint16_t index=0) const
Return the AnalogIn 2 component of a data item.
Definition: cmtpacket.cpp:1073
bool containsRawData(const uint16_t index=0) const
Check if data item contains Raw Data.
Definition: cmtpacket.cpp:572
CmtVector getCalAcc(const uint16_t index=0) const
Return the Calibrated Accelerometer component of a data item.
Definition: cmtpacket.cpp:729
CmtAnalogInData getAnalogIn1(const uint16_t index=0) const
Return the AnalogIn 1 component of a data item.
Definition: cmtpacket.cpp:1041
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: glext.h:3550
CmtCalData getCalData(const uint16_t index=0) const
Return the Calibrated Data component of a data item.
Definition: cmtpacket.cpp:849
CmtShortVector getRawMag(const uint16_t index=0) const
Return the Raw Magnetometer component of a data item.
Definition: cmtpacket.cpp:492
Class for storing a single message.
Definition: cmtmessage.h:83
bool updateRawGyr(const CmtShortVector &vec, const uint16_t index=0)
Add/update Raw Gyroscope data for the item.
Definition: cmtpacket.cpp:474
uint64_t CmtOutputSettings
An output settings bit-field.
Definition: cmtdef.h:904
void operator=(const Packet &pack)
Definition: cmtpacket.cpp:1299
CmtEuler getOriEuler(const uint16_t index=0) const
Return the Orientation component of a data item as Euler angles.
Definition: cmtpacket.cpp:939
Message m_msg
The message.
Definition: cmtpacket.h:78
bool updateStatus(const uint8_t data, const uint16_t index=0)
Add/update Status information for the item.
Definition: cmtpacket.cpp:1199
uint8_t getStatus(const uint16_t index=0) const
Return the Status component of a data item.
Definition: cmtpacket.cpp:1187



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: 8fe78517f Sun Jul 14 19:43:28 2019 +0200 at lun oct 28 02:10:00 CET 2019