#include #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 debug_enabled = true; bool trace_enabled = false; Preferences prefs; void wifi_connect() { INFO("Connecting to WiFi...\n"); WiFiMulti wifi; 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) { break; } else if (line.startsWith("#") || line.indexOf('=')==-1) { continue; } String ssid = line.substring(0, line.indexOf('=')); String pass = line.substring(line.indexOf('=')+1); wifi.addAP(ssid.c_str(), pass.c_str()); } 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 defined(WIFI_SSID) and defined(WIFI_PASS) wifi.addAP(WIFI_SSID, WIFI_PASS); #endif if (wifi.run() == WL_CONNECTED) { DEBUG("Connected to WiFi \"%s\".\n", WiFi.SSID().c_str()); } else { DEBUG("No WiFi connection!\n"); } } void setup() { // Small delay to give the Serial console a bit of time to connect. delay(1000); Serial.begin(115200); 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"); prefs.begin("esmp3"); debug_enabled = prefs.getBool("debug_enabled", true); trace_enabled = prefs.getBool("trace_enabled", false); PIN_SPEAKER_L_SETUP(); PIN_SPEAKER_R_SETUP(); PIN_SPEAKER_L(LOW); PIN_SPEAKER_R(LOW); 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("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 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("Initialization completed.\n"); } void loop() { bool more_data_needed = player->loop(); if (more_data_needed) return; controller->loop(); }