~aleteoryx/muditaos

ref: 0823d82e5141f44812c54debf07245d0ca746124 muditaos/module-sys/Service/Message.hpp -rw-r--r-- 2.9 KiB
0823d82e — Radoslaw Wicik [EGD-3743] Update copyrights in fies - add empty line after license 5 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#pragma once

#include "Common.hpp"
#include "MessageType.hpp"
#include <memory>
#include <stdint.h>
#include <string>
#include <vector>

namespace sys
{

    class Service;
    class ResponseMessage;
    class Message;

    enum class SystemMessageType
    {
        Ping,
        SwitchPowerMode,
        Start,
        Timer,
        Exit
    };

    using Message_t    = std::shared_ptr<Message>;
    using MessageRet_t = std::pair<ReturnCodes, std::shared_ptr<Message>>;

    MessageRet_t CreateMessageRet(ReturnCodes retCode, Message_t msg);

    class Message
    {

      public:
        enum class TransmissionType
        {
            Unicast,
            Multicast,
            Broadcast
        };

        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;

        virtual operator std::string() const
        {
            return "{}";
        }

#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
        MessageType messageType = MessageType::MessageTypeUninitialized;

        DataMessage(MessageType messageType) : messageType{messageType}
        {
            type = Type::Data;
        }

        DataMessage(BusChannels channel) : Message(channel)
        {
            type = Type::Data;
        }

        Message_t Execute(Service *service) override final;
    };

    class ResponseMessage : public Message
    {
      public:
        ResponseMessage(ReturnCodes retCode    = ReturnCodes::Success,
                        MessageType responseTo = MessageType::MessageTypeUninitialized)
            : Message(), responseTo(responseTo), retCode(retCode)
        {
            type = Type::Response;
        }
        MessageType responseTo;
        ReturnCodes retCode;

        Message_t Execute(Service *service) override;
    };

} // namespace sys