#include #include #include #include #include #include #include "main.h" #include "config.h" #include "controller.h" #include "player.h" #include "spi_master.h" #include "http_server.h" #include "playlist_manager.h" #include "updater.h" Controller* controller; Player* player; PlaylistManager* pm; HTTPServer* http_server; uint8_t SPIMaster::state = 0; bool connect_to_wifi(String ssid, String pass) { TRACE("Connecting to wifi \"%s\"...\n", ssid.c_str()); WiFi.mode(WIFI_AP_STA); WiFi.begin(ssid.c_str(), pass.c_str()); if (WiFi.waitForConnectResult() != WL_CONNECTED) { DEBUG("Could not connect to wifi \"%s\".\n", ssid.c_str()); return false; } else { INFO("Connected to \"%s\". IP address: %s\n", ssid.c_str(), WiFi.localIP().toString().c_str()); } return true; } void wifi_connect() { bool connected = false; INFO("Connecting to WiFi...\n"); SPIMaster::select_sd(); if (SD.exists("/_wifis.txt")) { DEBUG("Reading /_wifis.txt\n"); File f = SD.open("/_wifis.txt", "r"); while (String line = f.readStringUntil('\n')) { if (line.length()==0 || line.startsWith("#") || line.indexOf('=')==-1) { continue; } String ssid = line.substring(0, line.indexOf('=')); String pass = line.substring(line.indexOf('=')+1); connected = connect_to_wifi(ssid, pass); if (connected) break; } f.close(); } else { File f = SD.open("/_wifis.txt", "w"); f.print("# WiFi definitions. Syntax: =. Lines starting with # are ignored. Example:\n# My WiFi=VerySecretPassword\n"); f.close(); } SPIMaster::select_sd(false); if (!connected) { #if defined(WIFI_SSID) and defined(WIFI_PASS) DEBUG("Trying hardcoded WiFi data...\n"); connected = connect_to_wifi(WIFI_SSID, WIFI_PASS); #else DEBUG("No hardcoded WiFi data set.\n"); #endif } if (!connected) { INFO("No WiFi connection!\n"); } } void setup() { delay(500); Serial.begin(74880); Serial.println("Starting..."); Serial.println("Started."); INFO("Starting.\n"); #ifdef VERSION INFO("ESMP3 version %s (OTA_VERSION %d)\n", VERSION, OTA_VERSION); #else INFO("ESMP3, version unknown (OTA_VERSION %d)\n", OTA_VERSION); #endif INFO("Initializing...\n"); DEBUG("Setting up SPI...\n"); SPI.begin(); SPI.setHwCs(false); SPIMaster::init(); SPIMaster* spi = new SPIMaster(); INFO("SPI initialized.\n"); DEBUG("Setting up SD card...\n"); spi->select_sd(); if (SD.begin(42, SPI, 25000000)) { INFO("SD card initialized.\n"); } else { ERROR("Could not initialize SD card.\n"); } spi->select_sd(false); DEBUG("Starting SPIFFS...\n"); uint16_t spiffs_version = 0; SPIFFS.begin(true); if (SPIFFS.exists("/_version.txt")) { File f = SPIFFS.open("/_version.txt", "r"); spiffs_version = f.readString().toInt(); f.close(); DEBUG("SPIFFS filesystem version is %d.\n", spiffs_version); } else { DEBUG("No SPIFFS filesystem version found - setting spiffs_version to 0.\n"); } DEBUG("Initializing PlaylistManager...\n"); pm = new PlaylistManager(); DEBUG("Initializing Player and Controller...\n"); player = new Player(spi); controller = new Controller(player, pm); INFO("Player and controller initialized.\n"); wifi_connect(); MDNS.begin("esmp3"); DEBUG("Setting up HTTP server...\n"); http_server = new HTTPServer(player, controller); controller->register_http_server(http_server); DEBUG("Starting NTP client...\n"); // Taken from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", "europe.pool.ntp.org"); struct tm time; if (getLocalTime(&time, 10000)) { char buffer[100]; strftime(buffer, 100, "%Y-%m-%d %H:%M:%S", &time); DEBUG("Got time: %s\n", buffer); } else { INFO("Could not fetch current time via NTP.\n"); } #ifdef OTA_UPDATE_URL if (spiffs_version < OTA_VERSION) { Updater::run(spiffs_version); } #endif INFO("Initialization completed.\n"); } void loop() { bool more_data_needed = player->loop(); if (more_data_needed) return; controller->loop(); }