WarpTwin
Documentation for WarpTwin models and classes.
Loading...
Searching...
No Matches
DataIO.hpp
Go to the documentation of this file.
1/******************************************************************************
2* Copyright (c) ATTX LLC 2024. All Rights Reserved.
3*
4* This software and associated documentation (the "Software") are the
5* proprietary and confidential information of ATTX, LLC. The Software is
6* furnished under a license agreement between ATTX and the user organization
7* and may be used or copied only in accordance with the terms of the agreement.
8* Refer to 'license/attx_license.adoc' for standard license terms.
9*
10* EXPORT CONTROL NOTICE: THIS SOFTWARE MAY INCLUDE CONTENT CONTROLLED UNDER THE
11* INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) OR THE EXPORT ADMINISTRATION
12* REGULATIONS (EAR99). No part of the Software may be used, reproduced, or
13* transmitted in any form or by any means, for any purpose, without the express
14* written permission of ATTX, LLC.
15******************************************************************************/
16/*
17Data IO Header File
18
19Author: Alex Reynolds
20*/
21#ifndef DATA_MANAGEMENT_DATA_IO_HPP
22#define DATA_MANAGEMENT_DATA_IO_HPP
23
24#include <type_traits>
25#include <stdio.h>
26#if CLOCKWERK_ALLOW_STD_STRING
27#include <string>
28#endif
29#if CLOCKWERK_ALLOW_VECTOR
30#include <vector>
31#endif
32#include <array>
33#include <iostream>
34
35#include "DataIOBase.h"
37#include "logging/SimLogger.h"
38#include "utils/stringutils.hpp"
39
40namespace clockwerk {
41
59 template <typename T>
60 class DataIO : public DataIOBase {
61 public:
68 DataIO(GraphTreeObject* data_parent, const char* data_name, T initial_value);
69 DataIO(GraphTreeObject* data_parent, const char* data_name);
70 DataIO(GraphTreeObject* data_parent);
71 DataIO();
72 ~DataIO() {};
73
76 int dataSize() override {return sizeof(T);}
77
80 void mapToPointer(T* data_source) {_data_ptr = data_source; _data = this; _writeAllowed = true; _root = true;}
81
85 int16 operator()(const T &new_value);
86
94
99
102 const T& operator()() const;
103
107#if CLOCKWERK_ALLOW_STD_STRING
108#if CLOCKWERK_ALLOW_VECTOR
109 int16 log(void* logger);
110
114 int16 header(void* logger);
115#endif
116#endif
119 virtual int16 getValueAsString(char* retval, size_t size) override;
120
124 virtual int16 setValueFromString(const char* value) override;
125 protected:
129
131 void* tmp_ptr;
132
133 // A series of functions to output values as strings
134 int16 _asString(double val, char* retval, size_t size) {return numberToString(val, retval, size);}
135 int16 _asString(bool val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
136 int16 _asString(int8 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
137 int16 _asString(int16 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
138 int16 _asString(int32 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
139 int16 _asString(int64 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
140 int16 _asString(uint8 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
141 int16 _asString(uint16 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
142 int16 _asString(uint32 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
143 int16 _asString(uint64 val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
144 int16 _asString(void* val, char* retval, size_t size) {return numberToString((int64)val, retval, size);}
145 int16 _asString(char* val, char* retval, size_t size) {
146 if(strlen(val) < size) {
147 strcpy(retval, val);
148 return NO_ERROR;
149 } else {
150 return ERROR_MAX_MSG_SIZE;
151 }
152 }
153 int16 _asString(const GraphTreeObject &val, char* retval, size_t size) {return val.str(retval, size);}
154 template <typename Tn, size_t N>
155 int16 _asString(const std::array<Tn, N>& val, char* retval, size_t size) {
156 return numberToString(val, retval, size);
157 }
158#if CLOCKWERK_ALLOW_VECTOR
159 template <typename Tn>
160 int16 _asString(const std::vector<Tn>& val, char* retval, size_t size) {
161 if(retval == nullptr) {return ERROR_NULLPTR;}
162
163 bool dimensions_error = false;
164 uint32 val_idx = 0;
165 int num_chars_filled = 0;
166 while (val_idx < val.size() && !dimensions_error) {
167 // Call number to string conversion, starting at open space in our buffer
168 int16 err = numberToString(val[val_idx], retval + num_chars_filled, size - num_chars_filled);
169 if(err) {dimensions_error = true;}
170
171 if(!dimensions_error) {
172 // Calculate updated parameters
173 num_chars_filled = strnlen(retval, size);
174
175 // Add in comma to separate values
176 if(size - num_chars_filled > 1) {
177 if(val_idx < val.size() - 1) {
178 strcpy(retval + num_chars_filled, ",");
179 num_chars_filled += 1;
180 }
181 } else {
182 dimensions_error = true;
183 }
184 }
185
186 val_idx++;
187 }
188
189 if(dimensions_error) {return ERROR_DIMENSIONS;}
190 return NO_ERROR;
191 }
192#endif
193 template <uint32 R, uint32 C>
194 int16 _asString(const Matrix<R, C> &val, char* retval, size_t size) {
195 return val.str(retval, size);
196 }
197#if CLOCKWERK_ALLOW_STD_STRING
198 int16 _asString(const std::string val, char* retval, size_t size) {
199 if(val.size() < size) {
200 strcpy(retval, val.c_str());
201 return NO_ERROR;
202 } else {
203 return ERROR_MAX_MSG_SIZE;
204 }
205 }
206#endif
207
208 // A series of functions to set values from strings
209 int16 _fromString(const char* setval, bool& retval);
210 int16 _fromString(const char* setval, int8& retval);
211 int16 _fromString(const char* setval, int16& retval);
212 int16 _fromString(const char* setval, int32& retval);
213 int16 _fromString(const char* setval, int64& retval);
214 int16 _fromString(const char* setval, uint8& retval);
215 int16 _fromString(const char* setval, uint16& retval);
216 int16 _fromString(const char* setval, uint32& retval);
217 int16 _fromString(const char* setval, uint64& retval);
218 int16 _fromString(const char* setval, float& retval);
219 int16 _fromString(const char* setval, double& retval);
220 int16 _fromString(const char* setval, void* retval);
221 int16 _fromString(const char* setval, char* retval) {return ERROR_BUFFER_NOT_IMPLEMENTED;}
222 int16 _fromString(const char* setval, GraphTreeObject& retval);
223 template <uint32 R, uint32 C>
224 int16 _fromString(const char* setval, Matrix<R, C>& retval) {
225 return retval.fromStr(setval);
226 }
227 template <typename Tn, long unsigned int N>
228 int16 _fromString(const char* setval, std::array<Tn, N>& retval) {
229 return setArrayFromString(setval, retval.data(), N);
230 }
231#if CLOCKWERK_ALLOW_VECTOR
232 template <typename Tn>
233 int16 _fromString(const char* setval, std::vector<Tn>& retval) {
234 return setArrayFromString(setval, retval.data(), retval.size());
235 }
236#endif
237#if CLOCKWERK_ALLOW_STD_STRING
238 int16 _fromString(const char* setval, std::string& retval) {retval = std::string(setval); return NO_ERROR;}
239#endif
240 };
241
242 template <typename T>
243 int16 DataIO<T>::operator()(const T &new_value) {
245 tmp_ptr = writePtr();
246
248 if(tmp_ptr == nullptr) {
250 }
251 *(T*)tmp_ptr = new_value;
252
253 return NO_ERROR;
254 }
255
256 template <typename T>
257 const T& DataIO<T>::operator()() const {
258 return *(T*)read();
259 }
260
261 template <typename T>
262 DataIO<T>::DataIO(GraphTreeObject* data_parent, const char* data_name, T initial_value)
263 : _root_data(initial_value) {
264
266
268 DataIOBase::parent(data_parent);
269 DataIOBase::name(data_name);
270
273
274 _loggable = true;
275 }
276
277 template <typename T>
278 DataIO<T>::DataIO(GraphTreeObject* data_parent, const char* data_name)
279 : _root_data() {
280
282
284 DataIOBase::parent(data_parent);
285 DataIOBase::name(data_name);
286
289
290 _loggable = true;
291 }
292
293 template <typename T>
295 : _root_data() {
296
298
300 DataIOBase::parent(data_parent);
301
304
305 if(_type_id == POINTER || _type_id == UNDEFINED) {
306 _loggable = true;
307 } else {
308 _loggable = true;
309 }
310 }
311
312 template <typename T>
314 : _root_data() {
316
319
320 _loggable = true;
321 }
322
323 template <typename T>
325 return (T*)DataIOBase::read();
326 }
327
328#if CLOCKWERK_ALLOW_STD_STRING
329#if CLOCKWERK_ALLOW_VECTOR
330 template <typename T>
331 int16 DataIO<T>::log(void* logger) {
332 return ((SimLogger*)logger)->writeToBuffer(*getRootDataPointer());
333 }
334
335 template <typename T>
336 int16 DataIO<T>::header(void* logger) {
337 return ((SimLogger*)logger)->writeHeaders(*getRootDataPointer());
338 }
339#endif
340#endif
341
342 template <typename T>
343 int16 DataIO<T>::getValueAsString(char* retval, size_t size) {
344 return _asString(operator()(), retval, size);
345 }
346
347 template <typename T>
348 int16 DataIO<T>::setValueFromString(const char* value) {
349 int16 err = _fromString(value, _root_data);
350
351 if(err) {return err;}
352
354 return NO_ERROR;
355 }
356
357 template <typename T>
358 int16 DataIO<T>::_fromString(const char* setval, bool& retval) {
359 int64 tmp;
360 int16 err = numberFromString(setval, tmp);
361 if(err) {return err;}
362 retval = static_cast<bool>(tmp);
363
364 return NO_ERROR;
365 }
366 template <typename T>
367 int16 DataIO<T>::_fromString(const char* setval, int8& retval) {
368 int64 tmp;
369 int16 err = numberFromString(setval, tmp);
370 if(err) {return err;}
371 retval = static_cast<int8>(tmp);
372
373 return NO_ERROR;
374 }
375 template <typename T>
376 int16 DataIO<T>::_fromString(const char* setval, int16& retval) {
377 int64 tmp;
378 int16 err = numberFromString(setval, tmp);
379 if(err) {return err;}
380 retval = static_cast<int16>(tmp);
381
382 return NO_ERROR;
383 }
384 template <typename T>
385 int16 DataIO<T>::_fromString(const char* setval, int32& retval) {
386 int64 tmp;
387 int16 err = numberFromString(setval, tmp);
388 if(err) {return err;}
389 retval = static_cast<int32>(tmp);
390
391 return NO_ERROR;
392 }
393 template <typename T>
394 int16 DataIO<T>::_fromString(const char* setval, int64& retval) {
395 return numberFromString(setval, retval);
396 }
397 template <typename T>
398 int16 DataIO<T>::_fromString(const char* setval, uint8& retval) {
399 int64 tmp;
400 int16 err = numberFromString(setval, tmp);
401 if(err) {return err;}
402 retval = static_cast<uint8>(tmp);
403
404 return NO_ERROR;
405 }
406 template <typename T>
407 int16 DataIO<T>::_fromString(const char* setval, uint16& retval) {
408 int64 tmp;
409 int16 err = numberFromString(setval, tmp);
410 if(err) {return err;}
411 retval = static_cast<uint16>(tmp);
412
413 return NO_ERROR;
414 }
415 template <typename T>
416 int16 DataIO<T>::_fromString(const char* setval, uint32& retval) {
417 int64 tmp;
418 int16 err = numberFromString(setval, tmp);
419 if(err) {return err;}
420 retval = static_cast<uint32>(tmp);
421
422 return NO_ERROR;
423 }
424 template <typename T>
425 int16 DataIO<T>::_fromString(const char* setval, uint64& retval) {
426 uint64 tmp = atoi(setval);
427 retval = (T)tmp;
428
429 return NO_ERROR;
430 }
431
432 template <typename T>
433 int16 DataIO<T>::_fromString(const char* setval, float& retval) {
434 return numberFromString(setval, retval);
435 }
436
437 template <typename T>
438 int16 DataIO<T>::_fromString(const char* setval, double& retval) {
439 return numberFromString(setval, retval);
440 }
441
442 template <typename T>
443 int16 DataIO<T>::_fromString(const char* setval, void* retval) {
444 int64 tmp = atoi(setval);
445 retval = (void*)tmp;
446
447 return NO_ERROR;
448 }
449
450 template <typename T>
451 int16 DataIO<T>::_fromString(const char* setval, GraphTreeObject& retval) {
452 return retval.fromStr(setval);
453 }
454
455}
456
457#endif
DataIOBase()
Default constructor.
Definition DataIOBase.h:66
void * writePtr()
Function to write value to mapped location – root data or map.
Definition DataIOBase.cpp:20
void * read() const
Function to read value from mapped location – root data or map.
Definition DataIOBase.cpp:32
DataIOBase * _data
Definition DataIOBase.h:147
std::enable_if< std::is_integral< T >::value >::type _typeID(T var)
Overloaded functions to identify type held by DataIO.
Definition DataIOBase.h:168
void resetMap()
Definition DataIOBase.h:89
bool _root
Definition DataIOBase.h:159
bool _writeAllowed
Definition DataIOBase.h:155
void * _data_ptr
Definition DataIOBase.h:151
dataio_types_e _type_id
Definition DataIOBase.h:164
Class for inter-object communication.
Definition DataIO.hpp:60
int16 _asString(const GraphTreeObject &val, char *retval, size_t size)
Definition DataIO.hpp:153
int16 _asString(uint32 val, char *retval, size_t size)
Definition DataIO.hpp:142
int16 _asString(int64 val, char *retval, size_t size)
Definition DataIO.hpp:139
int16 _fromString(const char *setval, Matrix< R, C > &retval)
Definition DataIO.hpp:224
int16 _asString(bool val, char *retval, size_t size)
Definition DataIO.hpp:135
void resetMap()
Definition DataIO.hpp:98
int16 _asString(int32 val, char *retval, size_t size)
Definition DataIO.hpp:138
int16 _asString(double val, char *retval, size_t size)
Definition DataIO.hpp:134
virtual int16 setValueFromString(const char *value) override
Set the value held by the DataIO object from a string.
Definition DataIO.hpp:348
DataIO()
Definition DataIO.hpp:313
int16 _asString(uint8 val, char *retval, size_t size)
Definition DataIO.hpp:140
int16 _asString(char *val, char *retval, size_t size)
Definition DataIO.hpp:145
const T & operator()() const
Overloaded operator to return value of DataIO object.
Definition DataIO.hpp:257
int16 _asString(const std::array< Tn, N > &val, char *retval, size_t size)
Definition DataIO.hpp:155
void mapToPointer(T *data_source)
Function to map the DataIO object to a pointer, rather than another of its kind.
Definition DataIO.hpp:80
int16 _asString(const Matrix< R, C > &val, char *retval, size_t size)
Definition DataIO.hpp:194
int dataSize() override
Return the size of the value held by the dataio object.
Definition DataIO.hpp:76
int16 _asString(void *val, char *retval, size_t size)
Definition DataIO.hpp:144
int16 operator()(const T &new_value)
Function to set the value of the DataIO object.
Definition DataIO.hpp:243
T * getRootDataPointer()
Function to return a handle to the root data held in THIS object.
Definition DataIO.hpp:324
DataIO(GraphTreeObject *data_parent, const char *data_name, T initial_value)
Constructor for the DataIO object.
Definition DataIO.hpp:262
int16 _fromString(const char *setval, char *retval)
Definition DataIO.hpp:221
int16 _fromString(const char *setval, std::array< Tn, N > &retval)
Definition DataIO.hpp:228
int16 _fromString(const char *setval, bool &retval)
Definition DataIO.hpp:358
int16 _asString(int16 val, char *retval, size_t size)
Definition DataIO.hpp:137
int16 _asString(uint16 val, char *retval, size_t size)
Definition DataIO.hpp:141
void * tmp_ptr
Temporary pointer to hold our stuff internally.
Definition DataIO.hpp:131
int16 _asString(int8 val, char *retval, size_t size)
Definition DataIO.hpp:136
~DataIO()
Definition DataIO.hpp:72
int16 _asString(uint64 val, char *retval, size_t size)
Definition DataIO.hpp:143
T _root_data
Definition DataIO.hpp:128
virtual int16 getValueAsString(char *retval, size_t size) override
Function to log data to a logger.
Definition DataIO.hpp:343
Base class for object organization.
Definition GraphTreeObject.h:98
virtual int16 fromStr(const char *val)
Set value of graphtreeobject from string.
Definition GraphTreeObject.h:163
bool _loggable
Variable to indicate whether the selected object is loggable. Set to false by default.
Definition GraphTreeObject.h:273
GraphTreeObject * parent()
Functions to get object's parent/children.
Definition GraphTreeObject.h:107
virtual int16 str(char *output, size_t size) const
Get object represented as string.
Definition GraphTreeObject.h:157
const char * name() const
Getter and setter for object name.
Definition GraphTreeObject.h:135
Matrix math implementation.
Definition Matrix.hpp:55
int16 str(char *output, size_t size) const
Function to dump information on matrix.
Definition Matrix.hpp:299
int16 fromStr(const char *val)
Set value of matrix from string in same format as str().
Definition Matrix.hpp:341
#define NO_ERROR
Error code in the case where matrix math executed successfully.
Definition clockwerkerrors.h:34
#define ERROR_NULLPTR
Error code in case of a null pointer.
Definition clockwerkerrors.h:60
#define ERROR_MAX_MSG_SIZE
Definition clockwerkerrors.h:100
#define ERROR_DIMENSIONS
Definition clockwerkerrors.h:41
#define ERROR_WRITE_PERMISSION
Error code for attempting to write to a signal/DataIO object without permission.
Definition clockwerkerrors.h:116
#define ERROR_BUFFER_NOT_IMPLEMENTED
Variable to raise an error if an appropriate buffer is not in place.
Definition clockwerkerrors.h:126
Definition CircularBuffer.hpp:28
@ UNDEFINED
Definition DataIOBase.h:49
@ POINTER
Definition DataIOBase.h:47
int16 numberFromString(const char *s, uint8 &num)
Overloaded - convert string to number.
Definition stringutils.cpp:318
int16 numberToString(int64 num, char *out, size_t out_size)
Definition stringutils.cpp:156
size_t strnlen(const char *s, size_t maxlen)
Function to calculate the string length with a length bound.
Definition stringutils.cpp:428
int16 setArrayFromString(const char *s, T *array, size_t array_size)
Converts a bracket-enclosed comma-separated string to a float array.
Definition stringutils.hpp:230