209 lines
4.7 KiB
C++
209 lines
4.7 KiB
C++
|
|
||
|
#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?
|