Program Listing for File DPIFaultObject.cpp

Return to documentation for file (src/vendor/ra/powerFlex525/DPIFaultObject.cpp)

//
// Created by Aleksey Timin on 12/11/19.
//


#include "DPIFaultObject.h"
#include "utils/Buffer.h"


namespace eipScanner {
namespace vendor {
namespace ra {
namespace powerFlex525 {

    using namespace cip;
    using utils::Buffer;

    enum DPIFaultObjectAttributeIds : CipUsint {
        FULL_INFORMATION = 0
    };

    enum FaultTimeStampFlags : CipUint {
        VALID_DATA = 1,
        REAL_TIME = 1 << 1
    };

    DPIFaultObject::DPIFaultObject(CipUint instanceId, const SessionInfoIf::SPtr &si)
            : DPIFaultObject(instanceId, si, std::make_shared<MessageRouter>()) {

    }

    const DPIFaultObject::FullInformation &DPIFaultObject::getFullInformation() const {
        return _fullInformation;
    }

    DPIFaultObject::DPIFaultObject(CipUint instanceId, const SessionInfoIf::SPtr &si,
                                   const MessageRouter::SPtr& messageRouter)
            : BaseObject(CLASS_ID, instanceId)
            , _fullInformation{} {

        auto response = messageRouter->sendRequest(si, ServiceCodes::GET_ATTRIBUTE_SINGLE,
                                                   EPath(CLASS_ID, instanceId, DPIFaultObjectAttributeIds::FULL_INFORMATION));

        if (response.getGeneralStatusCode() == GeneralStatusCodes::SUCCESS) {
            Buffer buffer(response.getData());
            std::vector<uint8_t> faultText(16);
            buffer >> _fullInformation.faultCode
                   >> _fullInformation.dsiPort
                   >> _fullInformation.dsiDeviceObject
                   >> faultText
                   >> _fullInformation.timerValue;

            _fullInformation.faultText = CipString(faultText);

            cip::CipUint flags;
            buffer >> flags;
            _fullInformation.isValidData = flags & VALID_DATA;
            _fullInformation.isRealTime = flags & REAL_TIME;
        } else {
            logGeneralAndAdditionalStatus(response);
            throw std::runtime_error("Failed to read FULL_INFORMATION attribute");
        }
    }
}
}
}
}