]> AND Private Git Repository - Cipher_code.git/blob - Arduino/libraries/Firmata/utility/EthernetClientStream.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/Cipher_code
[Cipher_code.git] / Arduino / libraries / Firmata / utility / EthernetClientStream.h
1 /*
2   EthernetClientStream.h
3   An Arduino-Stream that wraps an instance of Client reconnecting to
4   the remote-ip in a transparent way. A disconnected client may be
5   recognized by the returnvalues -1 from calls to peek or read and
6   a 0 from calls to write.
7
8   Copyright (C) 2013 Norbert Truchsess. All rights reserved.
9
10   This library is free software; you can redistribute it and/or
11   modify it under the terms of the GNU Lesser General Public
12   License as published by the Free Software Foundation; either
13   version 2.1 of the License, or (at your option) any later version.
14
15   See file LICENSE.txt for further informations on licensing terms.
16
17   Last updated June 18th, 2016
18  */
19
20 #ifndef ETHERNETCLIENTSTREAM_H
21 #define ETHERNETCLIENTSTREAM_H
22
23 #include <inttypes.h>
24 #include <Stream.h>
25
26 //#define SERIAL_DEBUG
27 #include "firmataDebug.h"
28
29 #define MILLIS_RECONNECT 5000
30
31 class EthernetClientStream : public Stream
32 {
33   public:
34     EthernetClientStream(Client &client, IPAddress localip, IPAddress ip, const char* host, uint16_t port);
35     int available();
36     int read();
37     int peek();
38     void flush();
39     size_t write(uint8_t);
40     void maintain(IPAddress localip);
41
42   private:
43     Client &client;
44     IPAddress localip;
45     IPAddress ip;
46     const char* host;
47     uint16_t port;
48     bool connected;
49     uint32_t time_connect;
50     bool maintain();
51     void stop();
52 };
53
54
55 /*
56  * EthernetClientStream.cpp
57  * Copied here as a hack to linker issues with 3rd party board packages that don't properly
58  * implement the Arduino network APIs.
59  */
60 EthernetClientStream::EthernetClientStream(Client &client, IPAddress localip, IPAddress ip, const char* host, uint16_t port)
61   : client(client),
62     localip(localip),
63     ip(ip),
64     host(host),
65     port(port),
66     connected(false)
67 {
68 }
69
70 int
71 EthernetClientStream::available()
72 {
73   return maintain() ? client.available() : 0;
74 }
75
76 int
77 EthernetClientStream::read()
78 {
79   return maintain() ? client.read() : -1;
80 }
81
82 int
83 EthernetClientStream::peek()
84 {
85   return maintain() ? client.peek() : -1;
86 }
87
88 void EthernetClientStream::flush()
89 {
90   if (maintain())
91     client.flush();
92 }
93
94 size_t
95 EthernetClientStream::write(uint8_t c)
96 {
97   return maintain() ? client.write(c) : 0;
98 }
99
100 void
101 EthernetClientStream::maintain(IPAddress localip)
102 {
103   // ensure the local IP is updated in the case that it is changed by the DHCP server
104   if (this->localip != localip) {
105     this->localip = localip;
106     if (connected)
107       stop();
108   }
109 }
110
111 void
112 EthernetClientStream::stop()
113 {
114   client.stop();
115   connected = false;
116   time_connect = millis();
117 }
118
119 bool
120 EthernetClientStream::maintain()
121 {
122   if (client && client.connected())
123     return true;
124
125   if (connected) {
126     stop();
127   }
128   // if the client is disconnected, attempt to reconnect every 5 seconds
129   else if (millis() - time_connect >= MILLIS_RECONNECT) {
130     connected = host ? client.connect(host, port) : client.connect(ip, port);
131     if (!connected) {
132       time_connect = millis();
133       DEBUG_PRINTLN("Connection failed. Attempting to reconnect...");
134     } else {
135       DEBUG_PRINTLN("Connected");
136     }
137   }
138   return connected;
139 }
140
141 #endif /* ETHERNETCLIENTSTREAM_H */