Subversion Repositories HomeAutomation

Rev

Rev 1326 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
1309 runge 1
/*
2
 * Message.cpp
3
 *
4
 *  Created on: Jul 21, 2009
5
 *      Author: Mattias Runge
6
 */
7
 
8
#include "Message.h"
9
 
10
namespace atom {
11
 
1323 runge 12
Message::Message(Header header)
1309 runge 13
{
14
    LOG.setName("Message");
15
 
1323 runge 16
    this->myHeader = header;
1309 runge 17
 
1323 runge 18
    xml::Node messageNode = Protocol::getInstance()->getRootNode().selectFirst("messagetypes").selectFirst("messagetype", xml::Node::attributePair("name", this->myHeader.getMessageType()));
1309 runge 19
 
1323 runge 20
    // Load variables
1310 runge 21
    xml::Node::nodeList variableNodes = messageNode.select("variable");
1309 runge 22
 
1310 runge 23
    for (unsigned int n = 0; n < variableNodes.size(); n++)
24
    {
1323 runge 25
        Variable variable(variableNodes[n]);
1310 runge 26
        this->myVariables[variableNodes[n]["name"]] = variable;
27
    }
28
 
1323 runge 29
    // Load responses
1310 runge 30
    xml::Node::nodeList responseNodes = messageNode.select("response");
31
 
32
    for (unsigned int n = 0; n < responseNodes.size(); n++)
33
    {
34
        this->myResponses.push_back(responseNodes[n]["code"]); // TODO Validate the code
35
    }
36
 
1323 runge 37
    // Check if valid for this module
38
    xml::Node moduleNode = Protocol::getInstance()->getRootNode().selectFirst("modules").selectFirst("module", xml::Node::attributePair("name", this->myHeader.getModuleType()));
39
 
1326 runge 40
    if (moduleNode.selectFirst("in").select("message", xml::Node::attributePair("name", this->myHeader.getMessageType())).size() == 0 &&
41
        moduleNode.selectFirst("out").select("message", xml::Node::attributePair("name", this->myHeader.getMessageType())).size() == 0)
1323 runge 42
    {
43
        LOG.error("This message is not supported by this module type, something is wrong; protocol.xml is old, module code is old or a Atom is trying to send and illegal message.");
44
        // TODO throw exception
45
    }
1309 runge 46
}
47
 
48
Message::Message()
49
{
1323 runge 50
    LOG.setName("Message");
1309 runge 51
}
52
 
53
Message::~Message()
54
{
55
}
56
 
57
void Message::setOrigin(const void *origin)
58
{
59
    //LOG.debug("setOrigin(" + itos((unsigned long) origin) + ")");
60
    this->myOrigin = origin;
61
}
62
 
63
bool Message::isOrigin(const void *origin)
64
{
65
    //LOG.debug("isOrigin(" + itos((unsigned long)origin) + "==" + itos((unsigned long) this->myOrigin) + ")");
66
    return this->myOrigin == origin;
67
}
68
 
69
 
1323 runge 70
Header & Message::getHeader()
1309 runge 71
{
1323 runge 72
    return this->myHeader;
1309 runge 73
}
74
 
1323 runge 75
Variable & Message::getVariable(string name)
1309 runge 76
{
1323 runge 77
    return this->myVariables[name];
1309 runge 78
 
1323 runge 79
    // TODO Check if it does not exist, throw exception?
1309 runge 80
}
81
 
1326 runge 82
Message::variableMap & Message::getVariables()
83
{
84
    return this->myVariables;
85
}
86
 
1323 runge 87
Message::responseList Message::getResponses()
1309 runge 88
{
1323 runge 89
    return this->myResponses;
1309 runge 90
}
91
 
92
 
93
void Message::readBits(BitBuffer & buffer)
94
{
95
    for (variableMap::iterator iter = this->myVariables.begin(); iter != this->myVariables.end(); iter++)
96
    {
97
        iter->second.readBits(buffer);
98
    }
99
}
100
 
1323 runge 101
void Message::writeBits(BitBuffer & buffer)
1309 runge 102
{
1323 runge 103
    for (variableMap::iterator iter = this->myVariables.begin(); iter != this->myVariables.end(); iter++)
104
    {
105
        iter->second.writeBits(buffer);
106
    }
1309 runge 107
}
108
 
1326 runge 109
string Message::toString()
110
{
111
    string buffer = this->myHeader.toString() + "::Message(";
1323 runge 112
 
1326 runge 113
    for (variableMap::iterator iter = this->myVariables.begin(); iter != this->myVariables.end(); iter++)
114
    {
115
        buffer += iter->second.toString() + ",";
116
    }
117
 
118
    trim_if(buffer, is_any_of(","));
119
 
120
    buffer += ")";
121
 
122
    return buffer;
1309 runge 123
}
1326 runge 124
 
1403 runge 125
} // namespace atom