Lab_interaccio/2012/Edgard/Vdossier01/WiFly/WiFlyClient.cpp

209 lines
4.7 KiB
C++
Raw Normal View History

2025-02-25 21:29:42 +01:00
#include "WiFly.h"
#include "WiFlyClient.h"
WiFlyClient::WiFlyClient(uint8_t *ip, uint16_t port) :
_WiFly (WiFly) {
//stream (ParsedStream(SpiSerial)) {
// TODO: Find out why neither of the following work as expected.
// (The result of `read()` is always -1. )
//stream (ParsedStream(_WiFly.uart)) {
//stream (ParsedStream(WiFly.uart)) {
/*
*/
_ip = ip;
_port = port;
_domain = NULL;
isOpen = false;
}
WiFlyClient::WiFlyClient(const char* domain, uint16_t port) :
_WiFly (WiFly) {
//stream (ParsedStream(SpiSerial)) {
// TODO: Find out why neither of the following work as expected.
// (The result of `read()` is always -1. )
//stream (ParsedStream(_WiFly.uart)) {
//stream (ParsedStream(WiFly.uart)) {
/*
*/
_ip = NULL;
_port = port;
_domain = domain;
isOpen = false;
}
size_t WiFlyClient::write(byte value) {
/*
*/
_WiFly.uart->write(value);
return 1;
}
size_t WiFlyClient::write(const uint8_t *buffer, size_t size) {
/*
*/
while(size--)
_WiFly.uart->write(*buffer++);
return size;
}
boolean WiFlyClient::connect() {
/*
*/
stream.begin(_WiFly.uart);
// Handle case when Null object returned from Server.available()
if (!this) {
return false;
}
// TODO: Implement this better
stream.reset();
if ((_ip == NULL) && (_domain == NULL)) {
// This is a connection started by the Server class
// so the connection is already established.
} else {
// TODO: Track state more?
_WiFly.enterCommandMode();
_WiFly.sendCommand("open ", true, "" /* TODO: Remove this dummy value */);
if (_ip != NULL) {
for (int index = 0; /* break inside loop*/ ; index++) {
_WiFly.uart->print(_ip[index], DEC);
if (index == 3) {
break;
}
_WiFly.uart->print('.');
}
} else if (_domain != NULL) {
_WiFly.uart->print(_domain);
} else {
while (1) {
// This should never happen
}
}
_WiFly.uart->print(" ");
_WiFly.uart->print(_port, DEC);
_WiFly.sendCommand("", false, "*OPEN*");
// TODO: Handle connect failure
}
isOpen = true;
return true;
}
int WiFlyClient::available() {
/*
*/
if (!isOpen) {
return 0;
}
return stream.available();
}
int WiFlyClient::read() {
/*
*/
if (!isOpen) {
return -1;
}
return stream.read();
}
int WiFlyClient::peek() {
if (!isOpen) {
return -1;
}
return stream.peek();
}
void WiFlyClient::flush(void) {
/*
*/
if (!isOpen) {
return;
}
while (stream.available() > 0) {
stream.read();
}
}
bool WiFlyClient::connected() {
/*
*/
// TODO: Set isOpen to false once we know the stream is closed?
return isOpen && !stream.closed();
}
void WiFlyClient::stop() {
/*
*/
// TODO: Work out if there's some unintended compatibility issues
// related to interactions between `stop()`, `connected()` and
// `available()`.
// This stop implementation is suboptimal. We need to handle the case
// of a server connection differently to a client connection.
// We also need to handle better detecting if the connection is already
// closed.
// In the interests of getting something out the door--that somewhat
// works--this is what we're going with at the moment.
_WiFly.enterCommandMode();
_WiFly.uart->println("close");
// We ignore the response which could be "*CLOS*" or could be an
// error if the connection is no longer open.
_WiFly.uart->println("exit"); // TODO: Fix this hack which is a workaround for the fact the closed connection isn't detected properly, it seems. Even with this there's a delay between reconnects needed.
_WiFly.findInResponse("EXIT",1000);
//_WiFly.skipRemainderOfResponse();
// As a result of this, unwanted data gets sent to /dev/null rather than
// confusing the WiFly which tries to interpret it as commands.
stream.reset();
_WiFly.uart->flush();
// This doesn't really work because the object gets copied in the
// WeWiFlyClient example code.
isOpen = false;
// _port = 0;
// So instead we mark any server connection as inactive.
// TODO: Only do this if this was a server client connection
_WiFly.serverConnectionActive = false;
}
WiFlyClient::operator bool() {
/*
*/
// NOTE: In keeping with the Ethernet WiFlyClient class
// we use _ip == NULL, _domain == NULL, _port = 0 to
// indicate Server.available() found no connection.
// We use _ip == NULL, _domain == NULL, _port !=0 to
// indicate a server connection from a client.
return !((_ip == NULL) && (_domain == NULL) && (_port == 0));
}
// TODO: Add == and != operators for compatibility with Ethernet WiFlyClient?