Hi, Guys
I have a simple issue where if my code does not receive any input from client.read() every second the session will disconnect because of a TCP timeout protocol. I want to fix this issue by recycling the last input from client.read() if no new input is present. Does anyone know how I could possibly accomplish this?
PS. I have done alot of research into threads for arduino however, am unsure how to implement.
/*
2012/2013 Capstone Project
Wireless Smart Lighting
Arduino Submodule
Circuit:
* WiFi shield attached
*/
#include <SPI.h>
#include <WiFi.h>
#define MAX_CMD_LENGTH 25
const int ledPin = 6; // the number of the LED pin
String cmd;
WiFiClient client;
boolean connected = false;
int values[] = {0,10,20,30,40,50,60,70,80,90,100};
char ssid[] = "S3"; // your network SSID (name)
char pass[] = "zxcvzxcv"; // your network password (use for WPA, or use as key for WEP)
//int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(23);
boolean alreadyConnected = false; // whether or not the client was connected previously
void setup() {
// initialize the pushbutton pin as an input:
pinMode(ledPin, OUTPUT);
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while(true);
}
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid,pass);
// wait 10 seconds for connection:
delay(1000);
}
// start the server:
server.begin();
// you're connected now, so print out the status:
printWifiStatus();
}
void loop() {
// wait for a new client:
WiFiClient client = server.available();
// when the client sends the first byte, say hello:
if (client) {
if (!alreadyConnected) {
// clead out the input buffer:
client.flush();
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
while (client.available() > 0) {
readTelnetcommand(client.read());
}
}
}
void readTelnetcommand(char c){
if(cmd.length() == MAX_CMD_LENGTH) {
cmd = "";
}
cmd+=c;
if(c == '\n') {
if(cmd.length() > 2) {
// remove \r and \n from the string
cmd = cmd.substring(0,cmd.length() - 2);
parseCommand();
}
}
}
void parseCommand() {
int value = cmd.toInt();
int n;
if(cmd.equals("quit")) {
client.stop();
connected = false;
} else if(cmd.equals("help")) {
server.println("--- Telnet Server Help ---");
server.println("on : switch on the Main Power");
server.println("off : switch off the Main Power");
server.println("quit : close the connection");
} else if(cmd.equals("on")) {
analogWrite(ledPin, 255);
server.print("\t");
server.println("LED on.");
} else if(cmd.equals("off")) {
analogWrite(ledPin, 0);
server.print("\t");
server.println("LED off.");
} else if(cmd.equals("fade")){
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
} else {
for (n=0;n<11;n++){
if(value==values[n]){
int fadeamount =value*2.5;
analogWrite(ledPin,fadeamount);
server.print("\t");
server.write("Diming Level(0-100): ");
server.print(values[n]);
server.println();
}
}
}
cmd = "";
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}