Jubeat (ユビート Yubīto?), stylized as jubeat, is a series of arcade music video games developed by Konami Computer Entertainment Japan, and is a part of Konami's Bemani line of music video games. The series uses an arrangement of 16 buttons in a 4x4 grid for gameplay, a grid also used for the displaying of cues and part of the user interface.

Dependencies:   4DGL-uLCD-SE SDFileSystem TextLCD mbed-rtos mbed wave_player

Fork of ECE4180_Lab4 by Zhihan Jiang

VS1002.cpp

Committer:
ToHellWithGeorgi
Date:
2016-03-16
Revision:
0:c3c8793d0091

File content as of revision 0:c3c8793d0091:

#include "VS1002.h"
#include "mbed.h"
#include "SDFileSystem.h"

//Serial pc(USBTX, USBRX);
//TextLCD lcd(p30, p29, p17, p18, p19, p20);

/* ==================================================================
 * Constructor
 * =================================================================*/

VS1002::VS1002(PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name, PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs, PinName vol)
    : _sd(mmosi, mmiso, ssck, ccs, name), _spi(mosi, miso, sck), _CS(cs), _RST(rst), _DREQ(dreq), _DCS(dcs), _VOL(vol) {

    }    

/*===================================================================
 * Functions
 *==================================================================*/
 
void VS1002::cs_low(void)
{
    _CS = 0;                                
}
void VS1002::cs_high(void)
{
    _CS = 1;                                
}
void VS1002::dcs_low(void)
{
    _DCS = 0;
}
void VS1002::dcs_high(void)
{
    _DCS = 1;
}
void VS1002::sci_en(void)                    //SCI enable
{
    cs_high();
    dcs_high();
    cs_low();
}
void VS1002::sci_dis(void)                    //SCI disable
{
    cs_high();
}
void VS1002::sdi_en(void)                    //SDI enable
{
    dcs_high();
    cs_high();
    dcs_low();
}
void VS1002::sdi_dis(void)                    //SDI disable
{
    dcs_high();
}
void VS1002::reset(void)                    //hardware reset
{
    wait(0.01);
    _RST = 0;
    wait(0.01);
    _RST = 1;
    wait(0.10);
}
void VS1002::power_down(void)                //hardware and software reset
{
    cs_low();
    reset();
    sci_write(0x00, SM_PDOWN);
    wait(0.01);
    reset();
}
void VS1002::sci_initialise(void)
{
    _RST = 1;                                //no reset
    _spi.format(8,0);                        //spi 8bit interface, steady state low
    _spi.frequency(1000000);                //rising edge data record, freq. 1Mhz
    
    cs_low();
    for(int i=0; i<4; i++)
    {
    _spi.write(0xFF);                        //clock the chip a bit
    }
    cs_high();
    dcs_high();
    wait_us(5);
}
void VS1002::sdi_initialise(void)
{
    _spi.format(8,0);
    _spi.frequency(7000000);                //set to 7MHz
    
    cs_high();
    dcs_high();
}
void VS1002::sci_write(unsigned char address, unsigned short int data)
{
    sci_en();                                //enables SCI/disables SDI
    
    while(!_DREQ);                            //wait unitl data request is high
    _spi.write(0x02);                        //SCI write
    _spi.write(address);                    //register address
    _spi.write((data >> 8) & 0xFF);            //write out first half of data word
    _spi.write(data & 0xFF);                //write out second half of data word
    
    sci_dis();                                //enables SDI/disables SCI
    wait_us(5);
}
void VS1002::sdi_write(unsigned char datum)
{
    sdi_en();
    
    while(!_DREQ);
    _spi.write(datum);
    
    sci_dis();
}
unsigned short int VS1002::read(unsigned short int address)
{
    cs_low();                                //enables SCI/disables SDI
    
    while(!_DREQ);                            //wait unitl data request is high
    _spi.write(0x03);                        //SCI write
    _spi.write(address);                    //register address
    unsigned short int received = _spi.write(0x00);    //write out dummy byte
    received <<= 8;
    received += _spi.write(0x00);            //write out dummy byte
    
    cs_high();                                //enables SDI/disables SCI
    
    return received;                        //return received word
}
void VS1002::sine_test_activate(unsigned char wave)
{
    cs_high();                                //enables SDI/disables SCI
    
    while(!_DREQ);                            //wait unitl data request is high
    _spi.write(0x53);                        //SDI write
    _spi.write(0xEF);                        //SDI write
    _spi.write(0x6E);                        //SDI write
    _spi.write(wave);                        //SDI write
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte

    cs_low();                                //enables SCI/disables SDI
}
void VS1002::sine_test_deactivate(void)
{
    cs_high();
    
    while(!_DREQ);
    _spi.write(0x45);                        //SDI write
    _spi.write(0x78);                        //SDI write
    _spi.write(0x69);                        //SDI write
    _spi.write(0x74);                        //SDI write
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte
    _spi.write(0x00);                        //filler byte
}


void VS1002::volume(signed int left, signed int right)
{
    while(_DREQ == 0);
       
    unsigned short int _left = -left;       //convert the decibel values into a format
    unsigned short int _right = -right;     //readable by the chip cf. datasheet p.32 subsection 8.6.11
    _left *= 2;
    _right *= 2;
    unsigned short int attenuation = ((256 * _left) + _right);
    cs_low();
    sci_write(0x0B, attenuation);               //writeout these values
    cs_high();
}

void VS1002::play_song(int song_number)
{
    /*====== Song Select ======*/
    
    char str[16] = "/sd/music/";        //folder where the songs are located
    sprintf(str+10,"%d",song_number);   //appending song number to path of the file
    strcat(str,".mp3");                 //appending .mp3 to file name
    FILE *song;
    //pc.printf("%s",str);
    unsigned char array[512];           //array for reading data from file
    bool play_new=false;                // Variable to see if new_song has be assigned or not
        
    song = fopen(str, "r");    // Open the music file in read mode
    //pc.printf("end reading music");
    
    /* Printing to LCD the present status */
    // lcd.cls();
  if(pause)
   // lcd.printf("Paused ");
  if(mute)
  // lcd.printf("Muted");
  if(!mute && !pause)
  // lcd.printf("Playing"); 

  //lcd.printf("\n %d %s",new_song_number,song_name[new_song_number-1]);
   
    if(!song) 
    {
     //   lcd.printf("\n \n Error!!");
        exit(1);
    }
      while(!feof(song))
    {
            if(!pause)
           {
          
           fread(&array, 1, 512, song);           
           for(int i=0; i<512; i++)
           {
                sdi_write(array[i]);
           }
           volume(volume_set,volume_set);
           }
          if(new_song_number!=song_number)
           {
            play_new=true;
             break;
            }
             
             
          }
    
           fclose(song);                              //close the file

      if(!play_new)
      {
     new_song_number+=1;               // Goto Next song on completion of one song
     if(new_song_number==7)
      new_song_number=1; 
     play_new=false;                   
     }
}