#include #include #include #include #include #include "config.h" #include "controller.h" #include "player.h" #include "spi_master.h" #include "http_server.h" #include "mqtt_client.h" #include "playlist_manager.h" Controller* controller; Player* player; PlaylistManager* pm; HTTPServer* http_server; MQTTClient* mqtt_client; unsigned long last_mqtt_report = 0; void setup() { delay(500); Serial.begin(74880); Serial.println("Starting..."); Serial.println("Started."); INFO("Starting.\n"); #ifdef VERSION INFO("ESMP3 version %s\n", VERSION); #else INFO("ESMP3, version unknown\n"); #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)) { 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("done.\n"); DEBUG("Initializing Player and Controller...\n"); player = new Player(spi); controller = new Controller(player, pm); INFO("Player and controller initialized.\n"); DEBUG("Connecting to wifi \"%s\"...\n", WIFI_SSID); WiFi.mode(WIFI_AP_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); if (WiFi.waitForConnectResult() != WL_CONNECTED) { ERROR("Could not connect to Wifi. Rebooting."); delay(1000); ESP.restart(); } INFO("WiFi connected. IP address: %s\n", WiFi.localIP().toString().c_str()); mqtt_client = new MQTTClient(); MDNS.begin("esmp3"); controller->set_mqtt_client(mqtt_client); 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"); } INFO("Initialization completed.\n"); } void loop() { bool more_data_needed = player->loop(); if (more_data_needed) return; controller->loop(); mqtt_client->loop(); if ((last_mqtt_report + 10000 < millis()) || last_mqtt_report > millis()) { last_mqtt_report = millis(); mqtt_client->publish_status(controller->json()); } }