Prototype working, please review code



  • Hello all!

    I just got my M5StickCPlus and made a little program to control the screen via a web server. Everything works fine, but I wanted to see if folks had any feedback on the code. I am writing this with the Arduino IDE.

    Thanks for any feedback!

    #include <esp_http_server.h>
    // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/esp_http_server.html?highlight=webserver#overview
    #include <HTTP_Method.h>
    #include <Uri.h>
    #include <WiFi.h>
    #include <WiFiMulti.h>
    #include <M5StickCPlus.h>
    
    esp_err_t green_handler(httpd_req_t *req) {
        const char resp[] = "ok";
        httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
        M5.Lcd.fillScreen(GREEN);
        
        return ESP_OK;
    }
    httpd_uri_t uri_green = {
        .uri      = "/green",
        .method   = HTTP_GET,
        .handler  = green_handler,
        .user_ctx = NULL
    };
    
    
    esp_err_t red_handler(httpd_req_t *req) {
        const char resp[] = "ok";
        httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
        M5.Lcd.fillScreen(RED);
        M5.Lcd.setTextColor(BLACK, RED);
        M5.Lcd.setCursor(0, 0);
        M5.Lcd.print("\nIN MEETING\n");    
        return ESP_OK;
    }
    httpd_uri_t uri_red = {
        .uri      = "/red",
        .method   = HTTP_GET,
        .handler  = red_handler,
        .user_ctx = NULL
    };
    
    
    esp_err_t off_handler(httpd_req_t *req) {
        const char resp[] = "ok";
        httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
        M5.Lcd.fillScreen(BLACK);
        M5.Lcd.setTextColor(WHITE, BLACK);
        // TODO: actually turn off screen: https://forum.m5stack.com/topic/1025/m5stickc-turn-off-screen-completely/11
    
        return ESP_OK;
    }
    httpd_uri_t uri_off = {
        .uri      = "/off",
        .method   = HTTP_GET,
        .handler  = off_handler,
        .user_ctx = NULL
    };
    
    httpd_handle_t start_webserver(void) {
        httpd_config_t config = HTTPD_DEFAULT_CONFIG();
        httpd_handle_t server = NULL;
    
        if (httpd_start(&server, &config) == ESP_OK) {
            httpd_register_uri_handler(server, &uri_green);
            httpd_register_uri_handler(server, &uri_red);
            httpd_register_uri_handler(server, &uri_off);
        }
        return server;
    }
    
    httpd_handle_t server;
    WiFiMulti wifiMulti;
    bool wifi_connected_ran;
    
    void setup(){
      M5.begin();
    
      M5.Lcd.setRotation(3);
      M5.Lcd.setTextSize(3);
      wifiMulti.addAP("Station_slow", "...");
      M5.Lcd.print("\nConnecting Wifi...\n");
    }
    
    void showIP() {
        M5.Lcd.fillScreen(BLACK);
        M5.Lcd.setTextColor(WHITE, BLACK);
        M5.Lcd.setCursor(0, 0);
        if (wifi_connected_ran) {
          M5.Lcd.print(WiFi.localIP());
        } else {
          M5.Lcd.print("no wifi (yet?)\n");
        }
        M5.Lcd.print("\n");
    }
    
    void loop() {
      M5.update();
      if (M5.BtnA.wasReleased())
        showIP();
      if ((wifiMulti.run() == WL_CONNECTED)) {
        if (!wifi_connected_ran) { // is this the best way to do this?
          wifi_connected_ran = true;
          server = start_webserver();
          showIP();
        }
      }
      delay(1000); // should I do this?
    }