0

I have an Arduino webserver that displays many buttons over a webpage (73 at the moment) that toggle different switches. I shortened up the button-drawing code with this function:

void displayButton(String toggleName, byte toggle, byte link1, EthernetClient & client, boolean last) {
  if (toggle == 0) client.print("<a href=\"/?");
  else client.print("<a class=\"linkSelected\" href=\"/?");
  client.print(link1);
  client.print("\">");
  client.print(toggleName);
  client.print("</a>");
  if (last) client.print("<br><br>");
}

And this is a shortened version of my loop function:

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean done = false;
    while (client.connected() && !done)
    {
      while (client.available () > 0 && !done)
        done = processIncomingByte (client.read ());
    }  // end of while client connected
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.print("<HTML><HEAD>");
      displayButton("F8", f8Toggle, 57, client, 0);
      displayButton("F9", f9Toggle, 58, client, 0);
      displayButton("F10", f10Toggle, 59, client, 1);
      client.println("</center></body></html>");
      delay(5); client.stop();
  } // end of "if client"
} // end of loop

I'm wondering if there's any way to have the displayButton function use the EthernetClient instance without it having to be passed every time. I'm interested in this in order to clean up my code a little (since I would be able to remove 73 instances of the word "client"), and also as a learning experience.

3
  • If client is global then it already knows about it.
    – Majenko
    Commented Oct 31, 2015 at 13:43
  • When I tried to remove the passed client, I was getting "'client' was not declared in this scope" for the displayButton function. Would it affect the webserver at all if I defined "EthernetClient client;" before the Setup and Loop functions? I just tested this out, and it seems to work, but I feel hesitant about it because I've never seen that in any other webserver code.
    – Jerry
    Commented Oct 31, 2015 at 14:12
  • As long as you remove the EthernetClient from before the client in loop().
    – Majenko
    Commented Oct 31, 2015 at 14:13

1 Answer 1

1

As Majenko has noted in the comments, the solution was to declare "EthernetClient client;" as a global variable, outside of the loop. Normally I would've tried something like this on my own, but was hesitant to do so because I had never seen anything like that in other code.

1
  • 1
    Using global variables is usually considered a sign of poor design (it can leaves you open to some kinds of errors that local variable are less subject to), is why you don't see it very often. The client variable in your program is one of the exceptions, where globalizing it probably reduces, rather than increases, the potential for errors.
    – JRobert
    Commented Dec 31, 2015 at 14:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.