version 4.1.0

maybe fix hang on PIEthernet::interrupt()
replace piLetobe with piChangeEndian:
 * piChangeEndianBinary
 * piChangeBinary
 * piChangedBinary
PIDiagnostics::start now accept PISystemTime instead of number
add PITimer::start(PISystemTime, std::function<void()>) overload
This commit is contained in:
2024-08-28 11:56:36 +03:00
parent 33fc334077
commit e6c8714857
10 changed files with 113 additions and 66 deletions

View File

@@ -35,6 +35,7 @@
#define PIBASE_H
#include "pibase_macros.h"
#include "pimemoryblock.h"
#include "pip_export.h"
#include <string.h>
@@ -352,14 +353,6 @@ inline constexpr T piClamp(const T & v, const T & min, const T & max) {
return (v > max ? max : (v < min ? min : v));
}
//! \~\brief
//! \~english Function inverse byte order in memory block ([1..N] -> [N..1])
//! \~russian Метод для смены порядка байт в блоке памяти ([1..N] -> [N..1])
inline void piLetobe(void * data, int size) {
for (int i = 0; i < size / 2; i++)
piSwap<uchar>(((uchar *)data)[size - i - 1], ((uchar *)data)[i]);
}
//! \~\brief
//! \~english Function for compare two numeric values with epsilon
//! \~russian Метод для сравнения двух чисел с порогом
@@ -383,66 +376,104 @@ inline bool piCompare(const T & a, const T & b, const T & epsilon = std::numeric
return piAbs(a - b) <= epsilon;
}
// Endians
//! \~\brief
//! \~english Function inverse byte order in memory block ([1..N] -> [N..1])
//! \~russian Метод для смены порядка байт в блоке памяти ([1..N] -> [N..1])
inline void piChangeEndianBinary(void * data, size_t size) {
auto hs = size / 2;
for (size_t i = 0; i < hs; i++)
piSwap<uchar>(((uchar *)data)[size - i - 1], ((uchar *)data)[i]);
}
//! \~\brief
//! \~english Function inverse byte order in memory block ([1..N] -> [N..1])
//! \~russian Метод для смены порядка байт в блоке памяти ([1..N] -> [N..1])
inline void piChangeEndianBinary(PIMemoryBlock mem_blk) {
if (mem_blk.isNull()) return;
piChangeEndianBinary(mem_blk.data(), mem_blk.size());
}
//! \~\brief
//! \~english Templated function that inverse byte order of value "v"
//! \~russian Шаблонный метод, меняющий порядок байт в переменной "v"
template<typename T>
inline void piLetobe(T * v) {
piLetobe(v, sizeof(T));
}
inline void piChangeEndian(T & v);
//! \~\brief
//! \~english Templated function that returns "v" with inversed byte order
//! \~russian Шаблонный метод, возвращающий переменную "v" с измененным порядком байт
//! \~\details
//! \~english
//! This function used to convert values between little and big endian \n
//! There are some macros:
//! - \c piLetobes for "ushort"
//! - \c piLetobei for "uint"
//! - \c piLetobel for "ulong"
//! - \c piLetobell for "ullong"
//!
//! Example:
//! \snippet piincludes.cpp letobe
//! \~russian
//! Этот метод используется для изменения порядка байт между little и big endian
//! Есть несколько макросов:
//! - \c piLetobes для "ushort"
//! - \c piLetobei для "uint"
//! - \c piLetobel для "ulong"
//! - \c piLetobell для "ullong"
//!
//! Пример:
//! \snippet piincludes.cpp letobe
//! \~english Templated function that returns value "v" with inversed byte order
//! \~russian Шаблонный метод, возвращающий значение "v" с измененным порядком байт
template<typename T>
inline T piLetobe(const T & v) {
T tv(v);
piLetobe(&tv, sizeof(T));
return tv;
inline T piChangedEndian(const T & v);
template<typename T>
inline void piChangeEndian(T & v) {
piChangeEndianBinary(&v, sizeof(T));
}
// specialization
template<typename T>
inline T piChangedEndian(const T & v) {
T ret = v;
piChangeEndianBinary(&ret, sizeof(T));
return ret;
}
template<>
inline uint16_t piLetobe(const uint16_t & v) {
inline uint16_t piChangedEndian(const uint16_t & v) {
return (v << 8) | (v >> 8);
}
template<>
inline uint32_t piLetobe(const uint32_t & v) {
inline uint32_t piChangedEndian(const uint32_t & v) {
return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);
}
template<>
inline float piLetobe(const float & v) {
union _pletobe_f {
_pletobe_f(const float & f_) { f = f_; }
inline float piChangedEndian(const float & v) {
union {
float f;
uint32_t v;
};
_pletobe_f a(v);
a.v = (a.v >> 24) | ((a.v >> 8) & 0xFF00) | ((a.v << 8) & 0xFF0000) | ((a.v << 24) & 0xFF000000);
return a.f;
uint32_t i;
} u;
u.f = v;
u.i = piChangedEndian(u.i);
return u.f;
}
template<>
inline void piChangeEndian(uint16_t & v) {
v = piChangedEndian(v);
}
template<>
inline void piChangeEndian(uint32_t & v) {
v = piChangedEndian(v);
}
template<>
inline void piChangeEndian(float & v) {
v = piChangedEndian(v);
}
DEPRECATEDM("use piChangeEndianBinary()")
inline void piLetobe(void * data, int size) {
piChangeEndianBinary(data, size);
}
template<typename T>
DEPRECATEDM("use piChangeEndianBinary()")
inline void piLetobe(T * v) {
piChangeEndianBinary(v, sizeof(T));
}
template<typename T>
DEPRECATEDM("use piChangeEndian() or piChangedEndian()")
inline T piLetobe(const T & v) {
return piChangedEndian(v);
}
//! \~\brief
//! \~english Generic hash function, implements murmur3/32 algorithm
//! \~russian Хэш-функция общего назначения, по алгоритму murmur3/32

View File

@@ -36,10 +36,7 @@ struct PIMemoryBlock {
public:
//! \~english Constructs data block
//! \~russian Создает блок данных
PIMemoryBlock(void * data_ = 0, int size_ = 0) {
d = data_;
s = size_;
}
PIMemoryBlock() {}
//! \~english Constructs data block
//! \~russian Создает блок данных
@@ -71,6 +68,10 @@ public:
//! \~russian Размер данных в байтах
int size() const { return s; }
//! \~english Returns if this block points to nothing
//! \~russian Возвращает пустой ли указатель на данные
bool isNull() const { return d; }
private:
void * d;
int s;

View File

@@ -51,6 +51,7 @@ void PIWaitEvent::create() {
piCout << "Error with pipe:" << errorString();
} else {
fcntl(pipe_fd[ReadEnd], F_SETFL, O_NONBLOCK);
fcntl(pipe_fd[WriteEnd], F_SETFL, O_NONBLOCK);
}
#endif
}