#pragma once #include "JDefines.h" #include #include #include #include "AdcChannelData.h" namespace Incart::Usb { // На каждый тип кадра по одному типу FrameDecoder // Обработка одного и того же кадра, двумя и более FrameDecoder - логическая ошибка class FrameDecoder { protected: std::string m_frameFormatName; uint32_t m_frameNumber; // Cnt bool m_hasButtonLabel = false; std::vector m_data; std::vector m_emptyData; public: FrameDecoder(const std::string& frameFormatName_) : m_frameFormatName(frameFormatName_) { } virtual ~FrameDecoder() = default; public: // покадровая распаковка bool exe(const std::vector& frame) { bool isCorrectFrame = isValidFrame(frame); if (isCorrectFrame) { m_frameNumber = getFrameNumber(frame) % 65535; m_hasButtonLabel = hasButtonLabel(frame); parseData(frame); } return isCorrectFrame; } std::string getFrameFormatName() { return m_frameFormatName; } uint32_t getFrameNumber() { return m_frameNumber; } bool hasButtonLabel() { return m_hasButtonLabel; } bool canHandleChannel(const DevicesInfo::DeviceChannelTypeInfo& channel) { for (size_t i = 0; i < m_data.size(); ++i) { if (m_data[i].getChannelTypeInfo() == channel) { return true; } } return false; } void setSignalCount(const DevicesInfo::DeviceChannelTypeInfo& channel, int8_t signalCount) { for (size_t i = 0; i < m_data.size(); ++i) { if (m_data[i].getChannelTypeInfo() == channel) { m_data[i].setSignalCount(signalCount); return; } } } std::vector& getAllData() { return m_data; } std::vector& getData(const DevicesInfo::DeviceChannelTypeInfo& channel) { for (size_t i = 0; i < m_data.size(); ++i) { if (m_data[i].getChannelTypeInfo() == channel) { return m_data[i].getData(); } } return m_emptyData; } protected: virtual bool isValidFrame(const std::vector& frame)=0; virtual uint32_t getFrameNumber(const std::vector& frame)=0; virtual bool hasButtonLabel(const std::vector& frame)=0; virtual void parseData(const std::vector& frame)=0; }; }; // namespace Incart::Usb