/** * @file LimitViolationReporter.cpp * @brief This file defines the LimitViolationReporter class. * @date 17.07.2014 * @author baetz */ #include "LimitViolationReporter.h" #include "MonitoringIF.h" #include "ReceivesMonitoringReportsIF.h" #include "../objectmanager/ObjectManagerIF.h" #include "../serialize/SerializeAdapter.h" ReturnValue_t LimitViolationReporter::sendLimitViolationReport(const SerializeIF* data) { ReturnValue_t result = checkClassLoaded(); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } store_address_t storeId; uint8_t* dataTarget = NULL; size_t maxSize = data->getSerializedSize(); if (maxSize > MonitoringIF::VIOLATION_REPORT_MAX_SIZE) { return MonitoringIF::INVALID_SIZE; } result = ipcStore->getFreeElement(&storeId, maxSize, &dataTarget); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } size_t size = 0; result = data->serialize(&dataTarget, &size, maxSize, SerializeIF::Endianness::BIG); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } CommandMessage report; MonitoringMessage::setLimitViolationReport(&report, storeId); return MessageQueueSenderIF::sendMessage(reportQueue, &report); } ReturnValue_t LimitViolationReporter::checkClassLoaded() { if (reportQueue == 0) { ReceivesMonitoringReportsIF* receiver = objectManager->get< ReceivesMonitoringReportsIF>(reportingTarget); if (receiver == NULL) { return ObjectManagerIF::NOT_FOUND; } reportQueue = receiver->getCommandQueue(); } if (ipcStore == NULL) { ipcStore = objectManager->get(objects::IPC_STORE); if (ipcStore == NULL) { return HasReturnvaluesIF::RETURN_FAILED; } } return HasReturnvaluesIF::RETURN_OK; } //Lazy initialization. MessageQueueId_t LimitViolationReporter::reportQueue = 0; StorageManagerIF* LimitViolationReporter::ipcStore = NULL; object_id_t LimitViolationReporter::reportingTarget = 0;