Playing and controlling MP3s works great. \o/

This commit is contained in:
2019-08-06 20:50:11 +02:00
parent fcf0e8b7d3
commit 815f11591c
11 changed files with 428 additions and 193 deletions

View File

@ -1,14 +0,0 @@
#pragma once
#include "controller.h"
class Buttons {
private:
unsigned long _debounce_until = 0;
Controller* _controller;
void _debounce();
public:
Buttons(Controller* c) : _controller(c) {}
void setup();
void loop();
};

View File

@ -1,17 +1,18 @@
#pragma once
#include <Arduino.h>
#include "config.h"
#include "player.h"
#include "sd_card.h"
#include <MFRC522.h>
class Controller {
private:
MFRC522* _rfid;
bool _rfid_enabled = true;
void _check_rfid();
void _check_serial();
Player* _player;
SDCard* _sd_card;
public:
Controller(Player* p, SDCard* c) : _player(p), _sd_card(c) {}
void vol_up();
void vol_down();
void track_next();
void track_prev();
Controller(Player* p);
void loop();
};

View File

@ -1,29 +1,80 @@
#pragma once
#include "sd_card.h"
#include "config.h"
#include <SPI.h>
#include <SD.h>
#include <list>
#include <map>
#define SCI_MODE 0x00
#define SCI_STATUS 0x01
#define SCI_CLOCKF 0x03
#define SCI_DECODE_TIME 0x04
#define SCI_VOL 0x0B
#define SCI_WRAMADDR 0x07
#define SCI_WRAM 0x06
#define CMD_WRITE 0x02
#define CMD_READ 0x03
#define ADDR_ENDBYTE 0x1E06
#define SM_CANCEL 0x0008
#define SS_DO_NOT_JUMP 0x8000
#define XRESET PIN_VS1053_XRESET
#define DREQ PIN_VS1053_DREQ
#define XCS PIN_VS1053_XCS
#define XDCS PIN_VS1053_XDCS
class Player {
private:
SDCard* _sd_card;
enum state { uninitialized, idle, playing, stopping };
struct album_state {
uint8_t index;
uint32_t position;
};
void _reset();
void _init();
void _wait();
uint16_t _read_register(uint8_t address, uint32_t spi_speed, uint16_t t);//=SPI_CLOCK_DIV4);
void _write_register(uint8_t address, uint16_t value, uint32_t spi_speed);//=SPI_CLOCK_DIV2);
uint16_t _read_control_register(uint8_t address);
void _write_control_register(uint8_t address, uint16_t value);
void _write_data(uint8_t* data);
uint16_t _read_wram(uint16_t address);
state _state = state::uninitialized;
void _refill();
void _flush_and_cancel();
void _flush(uint bytes);
void _set_last_track(const char* album, uint8_t track, uint32_t position);
std::map<String, album_state> _last_tracks;
void _finish_playing();
void _finish_stopping();
void _mute();
void _unmute();
SPISettings _spi_settings_slow = SPISettings(250000, MSBFIRST, SPI_MODE0);
SPISettings _spi_settings_fast = SPISettings(4000000, MSBFIRST, SPI_MODE0);
SPISettings* _spi_settings = &_spi_settings_slow;
std::list<String> _files_in_dir(String dir);
File _file;
uint8_t _buffer[32];
String _playing_album;
uint8_t _playing_index;
uint _refills;
int8_t _end_byte;
uint8_t _volume;
uint16_t _stop_delay;
uint32_t _skip_to;
public:
Player(SDCard* c);
Player();
void vol_up();
void vol_down();
void track_next();
void track_prev();
bool play_album(String album);
bool play_song(String album, uint8_t song_index, uint32_t offset=0);
void stop();
bool loop();
void set_volume(uint8_t vol, bool save = true);
};

View File

@ -1,8 +0,0 @@
#pragma once
#include <SD.h>
#include "config.h"
class SDCard {
public:
SDCard();
};

View File

@ -1,5 +1,9 @@
#pragma once
#include <Arduino.h>
#include <SPI.h>
#include "config.h"
class SPIMaster {
public:
static void init() {
@ -16,9 +20,9 @@ public:
static void printStatus() {
Serial.printf("CS state: SD:%d, VS1053_XCS:%d, VS1053_XDCS:%d\n",
digitalRead(PIN_SD_CS),
digitalRead(PIN_VS1053_XCS),
digitalRead(PIN_VS1053_XDCS));
digitalRead(PIN_SD_CS),
digitalRead(PIN_VS1053_XCS),
digitalRead(PIN_VS1053_XDCS));
}
static void disable() {