18 #define UNUSED_VAR(x) (void)x; // Prevents from unereferenced variable when compiling in release
29 return static_cast<U16
>(*it) << 8 |
static_cast<U16
>(*(it + 1));
35 return static_cast<I16
>(
static_cast<U16
>(*it) << 8 |
static_cast<U16
>(*(it + 1)));
41 return static_cast<U32
>(*it) << 24 |
static_cast<U32
>(*(it + 1)) << 16 |
static_cast<U32
>(*(it + 2)) << 8 |
static_cast<U32
>(*(it + 3));
47 return static_cast<I32
>(
static_cast<U32
>(*it) << 24 |
static_cast<U32
>(*(it + 1)) << 16 |
static_cast<U32
>(*(it + 2)) << 8 |
static_cast<U32
>(*(it + 3)));
53 U32 l_swap =
static_cast<U32
>(it[0]) << 24 |
54 static_cast<U32
>(it[1]) << 16 |
55 static_cast<U32
>(it[2]) << 8 |
56 static_cast<U32
>(it[3]);
57 return *
reinterpret_cast<F32*
>(&l_swap);
63 U64 l_swap =
static_cast<U64
>(it[0]) << 56 |
64 static_cast<U64
>(it[1]) << 48 |
65 static_cast<U64
>(it[2]) << 40 |
66 static_cast<U64
>(it[3]) << 32 |
67 static_cast<U64
>(it[4]) << 24 |
68 static_cast<U64
>(it[5]) << 16 |
69 static_cast<U64
>(it[6]) << 8 |
70 static_cast<U64
>(it[7]);
71 return *
reinterpret_cast<F64*
>(&l_swap);
76 *it++ =
static_cast<U8
>(n >> 8);
77 *it++ =
static_cast<U8
>(n);
81 for (
auto & l_it : rna)
90 U64 l_swap =
static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[0]) << 56 |
91 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[1]) << 48 |
92 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[2]) << 40 |
93 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[3]) << 32 |
94 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[4]) << 24 |
95 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[5]) << 16 |
96 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[6]) << 8 |
97 static_cast<U64
>(
reinterpret_cast<U8*
>(&f)[7]);
98 std::memcpy(&*it, &l_swap,
sizeof(F64));
103 for (
auto & l_it : fa)
109 U32 l_swap =
static_cast<U32
>(
reinterpret_cast<U8*
>(&f)[0]) << 24 |
110 static_cast<U32
>(
reinterpret_cast<U8*
>(&f)[1]) << 16 |
111 static_cast<U32
>(
reinterpret_cast<U8*
>(&f)[2]) << 8 |
112 static_cast<U32
>(
reinterpret_cast<U8*
>(&f)[3]);
113 std::memcpy(&*it, &l_swap,
sizeof(F32));
118 for (
auto & l_it : fa)
125 U8
l_CRC(std::vector<U8>::const_iterator beg, std::vector<U8>::const_iterator end)
128 for (; beg != end; beg++)
141 if (!l_HeaderVersion(l_ROMVersion))
144 switch (l_ROMVersion)
149 l_ParseStaticHeader(m_StdandaloneHeader);
150 l_ParseParmInfo(m_StdandaloneHeader.
HEADER_LEN, m_ParmInfoMap);
156 l_ParseStaticHeader(m_EmbeddedHeader);
157 l_ParseParmInfo(m_EmbeddedHeader.
HEADER_LEN, m_ParmInfoMap);
175 switch (m_HeaderType)
178 rID = m_StdandaloneHeader.Identification;
189 CParmInfoMap::const_iterator l_it = m_ParmInfoMap.find(ParmNo);
190 if (m_ParmInfoMap.end() != l_it)
192 rParmAddress = l_it->second;
210 return m_StdandaloneHeader;
216 return m_EmbeddedHeader;
222 bool CPT2026PeripheralROM::Parser::l_ParseIdentification(
sIdentification & rId, std::vector<U8>::const_iterator Id_beg, std::vector<U8>::const_iterator Id_end)
229 rId.
ProtocolVersion =
static_cast<U16
>(
static_cast<U16
>(*Id_beg) << 8 | *(Id_beg + 1));
231 rId.
Model =
static_cast<U16
>(
static_cast<U16
>(*(Id_beg + 3)) << 8 |
static_cast<U16
>(*(Id_beg + 4)));
232 rId.
SN =
static_cast<U32
>(*(Id_beg + 5)) << 16 |
static_cast<U32
>(*(Id_beg + 6)) << 8 | *(Id_beg + 7);
233 rId.
Capabilities =
static_cast<U32
>(*(Id_beg + 8)) << 24 |
static_cast<U32
>(*(Id_beg + 9)) << 16 |
static_cast<U32
>(*(Id_beg + 10)) << 8 | *(Id_beg + 11);
242 bool CPT2026PeripheralROM::Parser::l_HeaderVersion(U16 & rVersion)
246 rVersion =
static_cast<U16
>(
static_cast<U16
>(*m_beg) << 8 | *(m_beg + 1));
255 bool CPT2026PeripheralROM::Parser::l_ParseStaticHeader(sStandaloneStaticHeader & rHeader)
268 rHeader.ROMCapacity =
static_cast<U16
>(
static_cast<U16
>(*(m_beg + 2)) << 8 | *(m_beg + 3));
269 rHeader.ROMSize =
static_cast<U16
>(
static_cast<U16
>(*(m_beg + 4)) << 8 | *(m_beg + 5));
271 if (!l_ParseIdentification(rHeader.Identification, m_beg + 16, m_end))
281 bool CPT2026PeripheralROM::Parser::l_ParseStaticHeader(sEmbeddedStaticHeader & rHeader)
294 rHeader.ROMCapacity =
static_cast<U16
>(
static_cast<U16
>(*(m_beg + 2)) << 8 | *(m_beg + 3));
295 rHeader.ROMSize =
static_cast<U16
>(
static_cast<U16
>(*(m_beg + 4)) << 8 | *(m_beg + 5));
305 bool CPT2026PeripheralROM::Parser::l_ParseParmInfo(
size_t HeaderLen, CParmInfoMap & rParmInfoMap)
309 std::vector<U8>::const_iterator l_beg = m_beg + HeaderLen;
312 U16 l_NoParms =
static_cast<U16
>(
static_cast<U16
>(*l_beg) << 8 | *(l_beg + 1));
315 for (U16 l_NoParsedParmInfo = 0; l_NoParsedParmInfo < l_NoParms; l_NoParsedParmInfo++, l_beg += 3)
316 rParmInfoMap.emplace(*l_beg,
static_cast<U16
>(*(l_beg + 1)) << 8 | *(l_beg + 2));
332 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
334 U16 l_ManDateLen =
static_cast<U16
>(
static_cast<U16
>(*l_it) << 8 | *(l_it + 1));
337 l_it += l_ManDateLen;
339 U16 l_DesLen =
static_cast<U16
>(
static_cast<U16
>(*l_it) << 8 | *(l_it + 1));
341 rManuInfo.
Designation = std::string(l_it, l_it + l_DesLen);
356 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
363 U8 l_NoHeads = l_it[0]; l_it +=
sizeof(l_NoHeads);
364 for (U8 HeadNo = 0; HeadNo < l_NoHeads; HeadNo++)
368 l_HeadInfo.
Info = l_it[1];
385 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
388 U8 l_NoHeads = l_it[0];
390 rHeadList =
tHeadList(l_it, l_it + l_NoHeads);
403 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
411 U8 l_NormalizationDateSize = l_it[0];
414 l_it += l_NormalizationDateSize;
415 U8 l_NbCorrections = l_it[0]; l_it +=
sizeof(l_NbCorrections);
416 for (U8 HeadNo = 0; HeadNo < l_NbCorrections; HeadNo++, l_it +=
sizeof(F32))
430 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
443 rPhysInfo.
DeadTime = l_it[0]; l_it += 1;
447 for (U16 l_PointNo = 0; l_PointNo < l_NoNoiseLevelElements; l_PointNo++, l_it +=
sizeof(U16))
452 for (U16 l_PointNo = 0; l_PointNo < l_NoTuningElements; l_PointNo++, l_it +=
sizeof(U16))
457 for (U16 l_PointNo = 0; l_PointNo < l_NoMatchingElements; l_PointNo++, l_it +=
sizeof(U16))
462 for (U16 l_PointNo = 0; l_PointNo < l_NoPulseWidthElements; l_PointNo++, l_it +=
sizeof(U16))
467 for (U16 l_PointNo = 0; l_PointNo < l_NoFreqStepElements; l_PointNo++, l_it +=
sizeof(U16))
483 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
485 U8 l_NoSets = l_it[0];
487 for (U8 SetNo = 0; SetNo < l_NoSets; SetNo++)
490 if (ParsePwPhysicalInfo(
static_cast<size_t>(l_it - m_beg), *pPwPhysInfo, l_it))
491 rPwPhysInfoSet.
Attach(pPwPhysInfo);
507 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
529 std::vector<U8>::const_iterator l_it = m_beg + ParmAddress;
534 rHallInfo.
State = *l_it; l_it += 1;
564 auto l_it = l_Raw.begin();
569 *l_it++ =
static_cast<U8
>(rId.
Model >> 8);
570 *l_it++ =
static_cast<U8
>(rId.
Model);
571 *l_it++ =
static_cast<U8
>(rId.
SN >> 16);
572 *l_it++ =
static_cast<U8
>(rId.
SN >> 8);
573 *l_it++ =
static_cast<U8
>(rId.
SN);
584 std::vector<U8> l_Raw;
587 l_Raw.push_back(rHallInfo.
State);
609 std::vector<U8> l_Raw;
621 std::vector<U8> l_Raw;
625 l_Raw.push_back(
static_cast<U8
>(rMultHeadInfo.
OffsetDAC >> 8));
626 l_Raw.push_back(
static_cast<U8
>(rMultHeadInfo.
OffsetDAC));
627 l_Raw.push_back(
static_cast<U8
>(rMultHeadInfo.
MultiHeadInfo.size()));
630 l_Raw.push_back(l_it.MUXcode);
631 l_Raw.push_back(l_it.Info);
632 l_Raw.push_back(l_it.PhysInfoSetIndex);
640 std::vector<U8> l_Raw;
642 l_Raw.push_back(
static_cast<U8
>(rHeadList.size()));
643 l_Raw.insert(l_Raw.end(), rHeadList.begin(), rHeadList.end());
650 std::vector<U8> l_Raw;
660 l_Raw.push_back(
static_cast<U8
>(l_NbNormElements));
668 std::vector<U8> l_Raw;
683 std::vector<U8> l_Raw;
695 l_Raw.push_back(rPwPhysInfo.
DeadTime);
696 U16 l_NbElements =
static_cast<U16
>(rPwPhysInfo.
NoiseLevelCurve.size());
698 if (0 != l_NbElements)
700 l_NbElements =
static_cast<U16
>(rPwPhysInfo.
TuningCurve.size());
702 if (0 != l_NbElements)
704 l_NbElements =
static_cast<U16
>(rPwPhysInfo.
MatchingCurve.size());
706 if (0 != l_NbElements)
710 if (0 != l_NbElements)
712 l_NbElements =
static_cast<U16
>(rPwPhysInfo.
FreqStepCurve.size());
714 if (0 != l_NbElements)
722 std::vector<U8> l_Raw;
724 l_Raw.push_back(
static_cast<U8
>(rPwPhysInfoSet.
size()));
727 std::vector<U8> l_RawPhPhysInfo = Raw(rPwPhysInfoSet[l_index]);
728 l_Raw.insert(l_Raw.end(), l_RawPhPhysInfo.begin(), l_RawPhPhysInfo.end());
738 for (
auto & l_it : rParmContent)
740 l_ParmInfo.insert(std::pair<U8, U16>(l_it.ParmNumber, BaseAddress));
741 BaseAddress +=
static_cast<U16
>(l_it.rParmData.size());
742 rParmDataSize += l_it.rParmData.size();
747 CPT2026PeripheralROM::CParmInfoMap CPT2026PeripheralROM::Builder::l_BuildParmInfo(
const tParmContentInfo & rParmContent, U16 BaseAddress, std::vector<U8> & rGeneratedParmData)
749 rGeneratedParmData.clear();
750 CParmInfoMap l_ParmInfo;
751 for (
auto & l_it : rParmContent)
753 l_ParmInfo.insert(std::pair<U8, U16>(l_it.ParmNumber, BaseAddress));
754 BaseAddress +=
static_cast<U16
>(l_it.rParmData.size());
755 rGeneratedParmData.insert(rGeneratedParmData.end(), l_it.rParmData.begin(), l_it.rParmData.end());
760 std::vector<U8> CPT2026PeripheralROM::Builder::l_Raw(
const sStandaloneStaticHeader & rHeader)
762 std::vector<U8> l_Raw;
764 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMVersion >> 8));
765 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMVersion));
766 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMCapacity >> 8));
767 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMCapacity));
768 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMSize >> 8));
769 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMSize));
771 std::vector<U8> l_RawId = CPT2026PeripheralROM::Builder::l_Raw(rHeader.Identification);
772 l_Raw.insert(l_Raw.end(), l_RawId.begin(), l_RawId.end());
773 l_Raw.push_back(
l_CRC(l_Raw.begin(), l_Raw.begin() + l_Raw.size()));
775 MTL_Assert(l_Raw.size() == rHeader.HEADER_LEN);
780 std::vector<U8> CPT2026PeripheralROM::Builder::l_Raw(
const sEmbeddedStaticHeader & rHeader)
782 std::vector<U8> l_Raw;
784 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMVersion >> 8));
785 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMVersion));
786 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMCapacity >> 8));
787 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMCapacity));
788 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMSize >> 8));
789 l_Raw.push_back(
static_cast<U8
>(rHeader.ROMSize));
791 l_Raw.push_back(
l_CRC(l_Raw.begin(), l_Raw.begin() + l_Raw.size()));
793 MTL_Assert(l_Raw.size() == rHeader.HEADER_LEN);
798 std::vector<U8> CPT2026PeripheralROM::Builder::l_Raw(
const CParmInfoMap & rParmInfo)
800 std::vector<U8> l_Raw;
803 for (
auto & l_it : rParmInfo)
805 l_Raw.push_back(l_it.first);
812 template <
typename HeaderType>
813 std::vector<U8> CPT2026PeripheralROM::Builder::l_BuildROM(HeaderType Header,
const tParmContentInfo & rParmContent)
816 size_t l_HeaderLen = Header.HEADER_LEN;
817 size_t l_ParmInfoLen, l_ParmDataLen;
818 l_ParmInfoLen = (l_Raw(l_BuildParmInfo(rParmContent, 0, l_ParmDataLen))).size();
821 Header.ROMVersion = Header.VERSION;
823 Header.ROMSize =
static_cast<U16
>(l_HeaderLen + l_ParmInfoLen + l_ParmDataLen);
824 Header.HeaderCRC = 0;
825 std::vector<U8> l_RawHeaderBuff = l_Raw(Header);
828 std::vector<U8> l_ParmDataBuff;
829 CParmInfoMap l_ParmInfoMap = l_BuildParmInfo(rParmContent,
static_cast<U16
>(l_HeaderLen + l_ParmInfoLen), l_ParmDataBuff);
830 std::vector<U8> l_RawParmInfoBuff = l_Raw(l_ParmInfoMap);
833 std::vector<U8> l_ROM;
834 l_ROM.insert(l_ROM.end(), l_RawHeaderBuff.begin(), l_RawHeaderBuff.end());
835 l_ROM.insert(l_ROM.end(), l_RawParmInfoBuff.begin(), l_RawParmInfoBuff.end());
836 l_ROM.insert(l_ROM.end(), l_ParmDataBuff.begin(), l_ParmDataBuff.end());
843 return CPT2026PeripheralROM::Builder::l_BuildROM(Header, rParmContent);
848 return CPT2026PeripheralROM::Builder::l_BuildROM(Header, rParmContent);
875 rOutputROM = BuildROM(l_Header, l_ParmInfo);
913 rOutputROM = BuildROM(l_Header, l_ParmInfo);