File: EspNetNode.h

package info (click to toggle)
ola 0.9.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 21,340 kB
  • ctags: 23,021
  • sloc: cpp: 129,922; python: 12,265; sh: 11,778; makefile: 2,288; ansic: 1,775; java: 518; xml: 214
file content (137 lines) | stat: -rw-r--r-- 4,661 bytes parent folder | download | duplicates (7)
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
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Library General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * EspNetNode.h
 * Header file for the EspNetNode class
 * Copyright (C) 2005 Simon Newton
 */

#ifndef PLUGINS_ESPNET_ESPNETNODE_H_
#define PLUGINS_ESPNET_ESPNETNODE_H_

#include <string>
#include <map>
#include "ola/Callback.h"
#include "ola/DmxBuffer.h"
#include "ola/network/IPV4Address.h"
#include "ola/network/Interface.h"
#include "ola/network/Socket.h"
#include "plugins/espnet/EspNetPackets.h"
#include "plugins/espnet/RunLengthDecoder.h"

namespace ola {
namespace plugin {
namespace espnet {

// the node types
typedef enum {
    ESPNET_NODE_TYPE_SINGLE_OUT = 0x0001,  // ip to dmx
    ESPNET_NODE_TYPE_SINGLE_IN = 0x0002,  // dmx to ip
    ESPNET_NODE_TYPE_RS232 = 0x0060,
    ESPNET_NODE_TYPE_IO = 0x0061,  // multi universe
    ESPNET_NODE_TYPE_LONWORKS = 0x0100,
} espnet_node_type;

enum { ESPNET_MAX_UNIVERSES = 512 };

class EspNetNode {
 public:
    explicit EspNetNode(const std::string &ip_address);
    virtual ~EspNetNode();

    bool Start();
    bool Stop();

    const ola::network::Interface &GetInterface() const {
      return m_interface;
    }

    void SetName(const std::string &name) { m_node_name = name; }
    void SetType(espnet_node_type type) { m_type = type; }
    void SetUniverse(uint8_t universe) { m_universe = universe; }

    // IO methods
    ola::network::UDPSocket* GetSocket() { return &m_socket; }
    void SocketReady();

    // DMX Receiving methods
    bool SetHandler(uint8_t universe, DmxBuffer *buffer,
                    ola::Callback0<void> *handler);
    bool RemoveHandler(uint8_t universe);

    // Sending methods
    bool SendPoll(bool full_poll = false);
    bool SendDMX(uint8_t universe, const ola::DmxBuffer &buffer);

 private:
    typedef struct {
      DmxBuffer *buffer;
      Callback0<void> *closure;
    } universe_handler;

    EspNetNode(const EspNetNode&);
    EspNetNode& operator=(const EspNetNode&);
    bool InitNetwork();
    void HandlePoll(const espnet_poll_t &poll, ssize_t length,
                    const ola::network::IPV4Address &source);
    void HandleReply(const espnet_poll_reply_t &reply,
                     ssize_t length,
                     const ola::network::IPV4Address &source);
    void HandleAck(const espnet_ack_t &ack, ssize_t length,
                   const ola::network::IPV4Address &source);
    void HandleData(const espnet_data_t &data, ssize_t length,
                    const ola::network::IPV4Address &source);

    bool SendEspPoll(const ola::network::IPV4Address &dst, bool full);
    bool SendEspAck(const ola::network::IPV4Address &dst,
                    uint8_t status,
                    uint8_t crc);
    bool SendEspPollReply(const ola::network::IPV4Address &dst);
    bool SendEspData(const ola::network::IPV4Address &dst,
                     uint8_t universe,
                     const DmxBuffer &buffer);
    bool SendPacket(const ola::network::IPV4Address &dst,
                    const espnet_packet_union_t &packet,
                    unsigned int size);

    bool m_running;
    uint8_t m_options;
    uint8_t m_tos;
    uint8_t m_ttl;
    uint8_t m_universe;
    espnet_node_type m_type;
    std::string m_node_name;
    std::string m_preferred_ip;
    std::map<uint8_t, universe_handler> m_handlers;
    ola::network::Interface m_interface;
    ola::network::UDPSocket m_socket;
    RunLengthDecoder m_decoder;

    static const char NODE_NAME[];
    static const uint8_t DEFAULT_OPTIONS = 0;
    static const uint8_t DEFAULT_TOS = 0;
    static const uint8_t DEFAULT_TTL = 4;
    static const uint8_t FIRMWARE_VERSION = 1;
    static const uint8_t SWITCH_SETTINGS = 0;
    static const uint16_t ESPNET_PORT = 3333;
    static const uint8_t DATA_RAW = 1;
    static const uint8_t DATA_PAIRS = 2;
    static const uint8_t DATA_RLE = 4;
    static const uint8_t START_CODE = 0;
};
}  // namespace espnet
}  // namespace plugin
}  // namespace ola
#endif  // PLUGINS_ESPNET_ESPNETNODE_H_