#pragma once #include "Common.hpp" #include "LogOutput.hpp" #include #include #include #include namespace sys { class Service; class ResponseMessage; class Message; enum class SystemMessageType{ Ping, SwitchPowerMode, Start, Exit }; using Message_t = std::shared_ptr; using MessageRet_t = std::pair>; MessageRet_t CreateMessageRet(ReturnCodes retCode,Message_t msg); class Message { public: enum class TransmissionType{ Unicast, Multicast, Broadcaast }; enum class Type{ System, Data, Response }; Message() { #ifdef UNIT_TESTS unitestsMsgInstancesCount++; #endif } Message(BusChannels chan) : channel(chan) { #ifdef UNIT_TESTS unitestsMsgInstancesCount++; #endif } virtual ~Message(){ #ifdef UNIT_TESTS unitestsMsgInstancesCount--; #endif } virtual Message_t Execute(Service* service) = 0; Type type; TransmissionType transType; BusChannels channel; std::string sender; uint64_t id; uint64_t uniID; #ifdef UNIT_TESTS static uint32_t unitestsMsgInstancesCount; #endif }; class SystemMessage : public Message { public: SystemMessage(SystemMessageType sysMsgType,ServicePowerMode pwrMode = ServicePowerMode::Active): Message(BusChannels ::System), sysMsgType(sysMsgType), powerMode(pwrMode) { type = Type::System; } Message_t Execute(Service* service) override; SystemMessageType sysMsgType; ServicePowerMode powerMode; }; class DataMessage : public Message { public: //This field must by provided by the class that inherits DataMessage uint32_t messageType = 0; DataMessage( uint32_t messageType ) : messageType{messageType} { type = Type::Data; } DataMessage(BusChannels channel): Message(channel) { type = Type::Data; } Message_t Execute(Service* service) override; }; class ResponseMessage : public Message { public: ResponseMessage(ReturnCodes retCode = ReturnCodes::Success,uint32_t responseTo=0): Message(),responseTo(responseTo),retCode(retCode) { type = Type::Response; } uint32_t responseTo; ReturnCodes retCode; Message_t Execute(Service* service) override; }; }