Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
Server.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
6
8
9 /*
10 ********************************************************************************
11 *************************** Modbus::SplitSrcAcrossOutputs **********************
12 ********************************************************************************
13 */
14 template <typename MODBUS_REGISTER_DESCRIPTOR, typename SRC_TYPE>
15 void SplitSrcAcrossOutputs (const SRC_TYPE& s, typename MODBUS_REGISTER_DESCRIPTOR::NameType baseRegister,
16 Containers::Mapping<typename MODBUS_REGISTER_DESCRIPTOR::NameType, typename MODBUS_REGISTER_DESCRIPTOR::ValueType>* update)
17 {
18 using VT = typename MODBUS_REGISTER_DESCRIPTOR::ValueType;
19 constexpr size_t kNElts_ = sizeof (SRC_TYPE) / sizeof (VT);
20 static_assert (kNElts_ * sizeof (VT) == sizeof (SRC_TYPE), ""); // only works if divides evenly
21 RequireNotNull (update);
22 const VT* arr = reinterpret_cast<const VT*> (&s);
23 for (size_t i = 0; i < kNElts_; ++i) {
24 // high order addressed elements first - big endian (@todo - is there a better way to byte swap if needed - in general case)?
25 update->Add (baseRegister + i, arr[(Common::GetEndianness () == Common::Endian::eLittle) ? (kNElts_ - i - 1) : i]);
26 }
27 }
28
29}
#define RequireNotNull(p)
Definition Assertions.h:347
constexpr Endian GetEndianness()
returns native (std::endian::native) Endianness flag. Can be complicated (mixed, etc)....
Definition Endian.inl:25