/** * The Participant class is the base class for either Buildings or ExerciseParticipants. * $Id$ * $HeadURL$ * $Author$ * Created by Hannes Baeuerle, SLSE, 2016-05-23 */ #pragma once #include "logger.h" #include #include #include #include namespace ParticipantManagement { class MainHandler; namespace Interface { class Dts; } namespace ParticipantHandling { class ParticipantHandler; class UnitPositionCalculator; class Participant { public: Participant(ParticipantHandler *participantHandler, UnitPositionCalculator *unitPosCalculator, const Database::PpmParticipant &data, const char *loggerName); virtual ~Participant(); int32_t id() const { return m_participantData.id(); } int32_t typeId() const { return m_participantData.typeId(); } int32_t superiorId() const { return m_participantData.superiorId(); } // return optional? int32_t equipmentNumber() const { return m_participantData.equipmentNumber().is_set() ? m_participantData.equipmentNumber().get() : 0; } int32_t partyId() const { return m_participantData.partyId(); } bool isDeleted() const { return m_participantData.isDeleted(); } ParticipantAssignState assignState() const { return m_participantData.assignState(); } const std::vector &inferiors() const { return m_participantData.inferiorIds(); } ParticipantPosition position() const { return m_positionPublished; } const DynamicParticipantData &dynamicParticipantData() const { return m_dynamicData; } const ParticipantManagement::Participant &participantData() const { return m_participantData; } void markAsDeleted(); bool isValidPosition(qint64 sampleTime, const Core::GeoPosition &pos, Core::PositionReportingSource repSource) const; bool setPosition(const TrainingAreaBase::EquipmentPosition &newPosition); bool setPosition(const ParticipantManagement::ParticipantPosition &newPosition, bool bForce = false); // returns true when the positionTime is newer than the old positionTime bool setCalculatedPosition(const Core::GeoPosition &pos, int64_t positionTime); bool setState(const TrainingAreaBase::EquipmentState &newState, int originatorId); bool setSpecialSensorData(const TrainingAreaBase::SpecialSensorData &data); bool setGear(const TrainingAreaBase::EquipmentGearAssignment &gearAssignment); bool setSanitationMaterial(int materialCount, const std::vector &materialStock, int abgSn, qint64 sampleTime, Qualification qualif, qint64 eqNo); bool setSanitation(qint64 sanitationProceduresTaken, TrainingAreaBase::SanitationResult sanitationResult, TrainingAreaBase::SanitationEvaluation sanitationEvaluation, int originatorId, TrainingAreaBase::Qualification qualification, qint64 sampleTime); bool setOperatorAction(int action, int originatorId, qint64 sampleTime); bool setEquipmentEvent(int event, qint64 sampleTime); bool setGearCharge(const TrainingAreaBase::GearCharge &charge, qint64 sampleTime); bool setGearCharge(const GearInformation &gearInfo); void setDynamicData(const DynamicParticipantData &data); void setMode(const ParticipantMode &data); bool isNewAssignStateValid(const ParticipantManagement::ParticipantAssignState &newAssignState, int32_t equipmentNumber) const; /** * @brief Method to set this participants data by a modify request and to * detect if the request really changes the data * @param data - participant data from a modify request * @return true if data differs from this participants data, otherwise false */ bool hasToBeChanged(const ParticipantManagement::Participant &data); bool hasToBeChanged(const ParticipantManagement::ParticipantBase &data); bool hasNewSuperiorId(int32_t superiorId); bool hasNewInferiorStructure(std::vector inferiorIds); bool setOperationalState(const TrainingAreaBase::EquipmentOperationalState &operationalState); RegisterParticipantRequest toRegisterParticipantRequest() const; virtual void removeFromDds(); virtual bool publishPosition(); virtual bool publishDynamicData(); virtual bool publishMode(); virtual bool publishParticipant(); Database::PpmParticipant toDbParticipant() const; static ParticipantManagement::Participant toDdsParticipant(const Database::PpmParticipant &data); protected: virtual bool updateEquipmentExerciseMapping(int oldEqId, int newEqId) = 0; bool setPosition(const TrainingAreaBase::EquipmentPosition &newPosition, int mountedToId); void unmountParticipantById(const TrainingAreaBase::EquipmentPosition &newPosition, int32_t id); void removeManipulation(int32_t equipmentFunctionId); void cleanManipulations(); bool gearHasCharge(int32_t gearId) const; int32_t indexByGearAndChargeId(int32_t gearId, int32_t chargeTypeId = -1) const; ParticipantHandler *particpantHandler() { return m_participantHandler; } const ParticipantHandler *particpantHandler() const { return m_participantHandler; } qint64 currentTimeMSec() const; std::shared_ptr dts() const; protected: // attributes ParticipantHandler *m_participantHandler; UnitPositionCalculator *m_unitPosCalculator; qint64 m_lastGearUsage; qint64 m_lastSanMatUsage{0}; qint64 m_lastManipulationReset; qint64 m_lastNbcState; qint64 m_lastSpecialSensorData; ParticipantPosition m_positionPublished; ParticipantPosition m_positionToPublish; DynamicParticipantData m_dynamicData; DynamicParticipantData m_dynamicDataPublished; ParticipantManagement::Participant m_participantData; ParticipantManagement::Participant m_participantPublished; ParticipantManagement::ParticipantMode m_participantMode; ParticipantManagement::ParticipantMode m_participantModePublished; bool m_bPublishPosition; // false for units QMutex m_mutex; LOGGER_T m_logger; }; // class ParticipantBase } // namespace ParticipantManagement } // namespace ParticipantHandling