diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/general.cpp | 14 | ||||
-rw-r--r-- | src/utils/general.hpp | 23 | ||||
-rw-r--r-- | src/utils/memory.hpp | 23 | ||||
-rw-r--r-- | src/utils/memory.tpp | 48 | ||||
-rw-r--r-- | src/utils/serial.cpp | 57 | ||||
-rw-r--r-- | src/utils/serial.hpp | 27 | ||||
-rw-r--r-- | src/utils/smart_string.cpp | 26 | ||||
-rw-r--r-- | src/utils/smart_string.hpp | 14 | ||||
-rw-r--r-- | src/utils/time.cpp | 37 | ||||
-rw-r--r-- | src/utils/time.hpp | 53 |
10 files changed, 322 insertions, 0 deletions
diff --git a/src/utils/general.cpp b/src/utils/general.cpp new file mode 100644 index 0000000..bbcd4dd --- /dev/null +++ b/src/utils/general.cpp @@ -0,0 +1,14 @@ +#include "general.hpp" + +void stop() +{ + while (true) {} +} + +unique_ptr<SmartString> floatToStr(float num, unsigned int width, unsigned int precision) +{ + auto str = make_unique<SmartString>(width + precision); + dtostrf(num, width, precision, str->c_str); + + return str; +} diff --git a/src/utils/general.hpp b/src/utils/general.hpp new file mode 100644 index 0000000..9ad0655 --- /dev/null +++ b/src/utils/general.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "memory.hpp" +#include "smart_string.hpp" + +/** + * Stops code execution. + */ +void stop(); + +/** + * Converts a floating point number to a string. + * + * @param num A floating point number + * @param width The desired float width + * @param precision The desired float precision + * @returns The float as a string. + */ +unique_ptr<SmartString> floatToStr( + float num, + unsigned int width = 3, + unsigned int precision = 2 +); diff --git a/src/utils/memory.hpp b/src/utils/memory.hpp new file mode 100644 index 0000000..81e3757 --- /dev/null +++ b/src/utils/memory.hpp @@ -0,0 +1,23 @@ +#pragma once + +template <typename memType> +memType *malloc_s(unsigned int size); + +template <class Target> +class unique_ptr +{ +public: + unique_ptr(Target *target); + ~unique_ptr(); + + Target operator *() const; + Target *operator ->() const; + +private: + Target *_target; +}; + +template<class Target, typename...Args> +unique_ptr<Target> make_unique(Args&... args); + +#include "memory.tpp" diff --git a/src/utils/memory.tpp b/src/utils/memory.tpp new file mode 100644 index 0000000..276b0b4 --- /dev/null +++ b/src/utils/memory.tpp @@ -0,0 +1,48 @@ +#include "memory.hpp" + +#include "Arduino.h" +#include "general.hpp" + +template <typename memType> +memType *malloc_s(unsigned int size) +{ + auto *mem = malloc(size); + + if (mem == nullptr) + { + Serial.println("Error: Memory allocation failed"); + while (true) {} + } + + return static_cast<memType *>(mem); +} + +template <class Target> +unique_ptr<Target>::unique_ptr(Target *target) +{ + this->_target = target; +} + +template <class Target> +unique_ptr<Target>::~unique_ptr() +{ + delete this->_target; +} + +template <class Target> +Target unique_ptr<Target>::operator*() const +{ + return *(this->_target); +} + +template <class Target> +Target *unique_ptr<Target>::operator->() const +{ + return this->_target; +} + +template <class Target, typename... Args> +unique_ptr<Target> make_unique(Args... args) +{ + return unique_ptr<Target>(new Target(args...)); +} diff --git a/src/utils/serial.cpp b/src/utils/serial.cpp new file mode 100644 index 0000000..11be550 --- /dev/null +++ b/src/utils/serial.cpp @@ -0,0 +1,57 @@ +#include "serial.hpp" + +#include "general.hpp" + +SerialStream::SerialStream(Serial_ serial, unsigned long baud_rate) +{ + this->_serial = serial; + + this->_serial.begin(baud_rate); + + while (!this->_serial) {} +} + +SerialStream::~SerialStream() +{ + Serial.end(); +} + +SerialStream &SerialStream::operator<<(const char *str) +{ + this->write(str); + return *this; +} + +SerialStream &SerialStream::operator<<(const SmartString &str) +{ + this->write(str.c_str); + return *this; +} + +SerialStream &SerialStream::operator<<(const float num) +{ + this->write(floatToStr(num)->c_str); + return *this; +} + +SerialStream &SerialStream::operator<<(void (*manipulator)(SerialStream *)) +{ + manipulator(this); + return *this; +} + +void SerialStream::write(const char *str) +{ + this->_serial.write(str); +} + +void SerialStream::flush() +{ + this->_serial.flush(); +} + +void endl(SerialStream *serial_stream) +{ + serial_stream->write("\n"); + serial_stream->flush(); +} diff --git a/src/utils/serial.hpp b/src/utils/serial.hpp new file mode 100644 index 0000000..f97e1d8 --- /dev/null +++ b/src/utils/serial.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "smart_string.hpp" + +#include <USBAPI.h> + +class SerialStream +{ +public: + SerialStream(Serial_ serial, unsigned long baud_rate); + ~SerialStream(); + + SerialStream &operator<<(const char *str); + SerialStream &operator<<(const SmartString &str); + SerialStream &operator<<(const float num); + + SerialStream &operator<<(void (*manipulator)(SerialStream *)); + + void write(const char *str); + + void flush(); + +private: + Serial_ _serial; +}; + +void endl(SerialStream *serial_stream); diff --git a/src/utils/smart_string.cpp b/src/utils/smart_string.cpp new file mode 100644 index 0000000..5258ffe --- /dev/null +++ b/src/utils/smart_string.cpp @@ -0,0 +1,26 @@ +#include "smart_string.hpp" + +#include "memory.hpp" + +#include <stdlib.h> + +SmartString::SmartString(char *c_string) +{ + this->c_str = c_string; +} + +SmartString::SmartString(unsigned int size) +{ + this->c_str = malloc_s<char>(size + 1); +} + +SmartString::~SmartString() +{ + if (this->c_str != nullptr) + free(this->c_str); +} + +SmartString::operator char *() const +{ + return this->c_str; +} diff --git a/src/utils/smart_string.hpp b/src/utils/smart_string.hpp new file mode 100644 index 0000000..fcaff98 --- /dev/null +++ b/src/utils/smart_string.hpp @@ -0,0 +1,14 @@ +#pragma once + +class SmartString +{ +public: + SmartString(char *c_str); + SmartString(unsigned int size); + + ~SmartString(); + + operator char *() const; + + char *c_str = nullptr; +}; diff --git a/src/utils/time.cpp b/src/utils/time.cpp new file mode 100644 index 0000000..adc33db --- /dev/null +++ b/src/utils/time.cpp @@ -0,0 +1,37 @@ +#include "time.hpp" +#include "Arduino.h" + +Time::Time(unsigned long time_micros) +{ + _time_micros = time_micros; +} + +void Time::update() +{ + _time_micros = micros(); +} + +Time Time::diff(Time prev_time) +{ + return Time(_time_micros - prev_time.microsecs()); +} + +unsigned long Time::microsecs() +{ + return _time_micros; +} + +unsigned long Time::millisecs() +{ + return _time_micros * 0.001; +} + +float Time::secs() +{ + return _time_micros * 0.000001; +} + +Time time_now() +{ + return Time(micros()); +} diff --git a/src/utils/time.hpp b/src/utils/time.hpp new file mode 100644 index 0000000..e0385ef --- /dev/null +++ b/src/utils/time.hpp @@ -0,0 +1,53 @@ +#ifndef TIME_HPP +#define TIME_HPP + +/** + * A representation of time. + */ +class Time +{ +public: + /** + * A representation of time. + * + * @param time_micros Time in microseconds + */ + Time(unsigned long time_micros); + + /** + * Updates the time to the current time. + */ + void update(); + + /** + * Returns the difference between two points in time. + * + * @param prev_time A previous point in time + */ + Time diff(Time prev_time); + + /** + * Returns the time in seconds. + */ + float secs(); + + /** + * Returns the time in milliseconds. + */ + unsigned long millisecs(); + + /** + * Returns the time in microseconds. + */ + unsigned long microsecs(); + +private: + unsigned long _time_micros; +}; + +/** + * Returns a time object for the time since the program started. + */ +Time time_now(); + +#endif |