#include "controller.h" #include "spi_master.h" Controller::Controller(Player* p, MCP* m) { _player = p; _mcp = m; _rfid = new MFRC522(PIN_RC522_CS, MFRC522::UNUSED_PIN); SPIMaster::enable(PIN_MCP); _mcp->pinMode(1, INPUT); _mcp->pullupMode(1, HIGH); _mcp->pinMode(2, INPUT); _mcp->pullupMode(2, HIGH); _mcp->pinMode(3, INPUT); _mcp->pullupMode(3, HIGH); _mcp->pinMode(4, INPUT); _mcp->pullupMode(4, HIGH); SPIMaster::enable(PIN_RC522_CS); DEBUG("Initializing RC522..."); _rfid->PCD_Init(); #ifdef SHOW_DEBUG _rfid->PCD_DumpVersionToSerial(); #endif SPIMaster::disable(); INFO("RC522 initialized.\n"); for (uint8_t i=0; iPICC_ReadCardSerial()) { if (!_rfid->PICC_IsNewCardPresent()) { return 0; } if (!_rfid->PICC_ReadCardSerial()) { return 0; } } uint32_t uid = _rfid->uid.uidByte[0]<<24 | _rfid->uid.uidByte[1]<<16 | _rfid->uid.uidByte[2]<<8 | _rfid->uid.uidByte[3]; SPIMaster::disable(); return uid; } void Controller::_check_rfid() { uint32_t uid = _get_rfid_card_uid(); if (uid != _last_rfid_card_uid) { if (uid > 0) { INFO("New RFID card uid: %08x\n", uid); String s_uid = String(uid, HEX); _player->play_album(s_uid); } else { INFO("No more RFID card."); _player->stop(); } _last_rfid_card_uid = uid; } } void Controller::_check_serial() { if (Serial.available() > 0) { char c = Serial.read(); Serial.printf("%c", c); if (c==10 || c==13) { if (_serial_buffer.length()>0) { _execute_serial_command(_serial_buffer); _serial_buffer = String(); } } else { _serial_buffer.concat(c); } } } void Controller::_execute_serial_command(String cmd) { DEBUG("Executing command: %s", cmd.c_str()); if (cmd.equals("ls")) { _execute_command_ls("/"); } else if (cmd.startsWith("ls ")) { _execute_command_ls(cmd.substring(3)); } else if (cmd.startsWith("play ")) { _player->play_album(cmd.substring(5)); } else if (cmd.startsWith("sys ")) { _player->play_system_sound(cmd.substring(4)); } else if (cmd.equals("stop")) { _player->stop(); } else if (cmd.equals("help")) { _execute_command_help(); } else if (cmd.equals("-")) { _player->vol_down(); } else if (cmd.equals("+")) { _player->vol_up(); } else if (cmd.equals("p")) { _player->track_prev(); } else if (cmd.equals("n")) { _player->track_next(); } else { ERROR("Unknown command: %s\n", cmd.c_str()); } return; } void Controller::_execute_command_ls(String path) { INFO("Listing contents of %s:\n", path.c_str()); std::list files = _player->ls(path); for(std::list::iterator it=files.begin(); it!=files.end(); it++) { INFO(" %s\n", (*it).c_str()); } } void Controller::_execute_command_help() { INFO("Valid commands are:"); INFO(" help - Displays this help\n"); INFO(" ls [dir] - Lists the contents of [dir] or, if not given, of /\n"); INFO(" play [id] - Plays the album with the given id\n"); INFO(" sys [file]- Plays the file as system sound\n"); INFO(" stop - Stops playback\n"); INFO(" - / + - Decrease or increase the volume\n"); INFO(" p / n - Previous or next track\n"); } void Controller::_check_buttons() { SPIMaster::enable(PIN_MCP); SPI.beginTransaction(SPISettings(250000, MSBFIRST, SPI_MODE0)); /*if (millis()%100==0) { Serial.printf("Buttons: %d %d %d %d\n", _mcp->digitalRead(1), _mcp->digitalRead(2), _mcp->digitalRead(3), _mcp->digitalRead(4)); }*/ if (_check_button(0)) { _player->track_prev(); } else if (_check_button(1)) { _player->vol_up(); } else if (_check_button(2)) { _player->vol_down(); } else if (_check_button(3)) { _player->track_next(); } SPI.endTransaction(); SPIMaster::disable(); } bool Controller::_check_button(uint8_t index) { if (index >= NUM_BUTTONS) return false; bool ret = false; uint8_t sum = 0; while (1) { sum = 0; for (int i=0; i<8; i++) { sum += _mcp->digitalRead(index + 1) == HIGH ? 1 : 0; } if (sum==0 || sum==8) break; } if (sum == 0) { if (_button_last_pressed_at[index] + DEBOUNCE_MILLIS < millis()) { DEBUG("Button %d pressed.\n", index); ret = true; } _button_last_pressed_at[index] = millis(); } return ret; }