SMART WAV audio processor connected together with the SMART GPU graphics processor, a \"windows media player\" application is demostrated, be sure to download demo\'s used files to the microSD card. http://vizictechnologies.com/#/software-demos-sw/4560115377
Dependencies: SMARTGPU mbed SMARTWAV
Diff: main.cpp
- Revision:
- 0:a38a3a6a3724
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Feb 12 01:36:34 2012 +0000 @@ -0,0 +1,266 @@ +/**************************************************************************************/ +/*SMARTWAV intelligent embedded Audio processor unit + those examples are for use the SMARTWAV with the mbed microcontoller, just connect tx,rx,and reset + Board: + http://vizictechnologies.com/#/smart-wav/4559021187 + + This example requires pre-loaded content to the micro SD card, Audio .WAV files! + + www.vizictechnologies.com + Vizic Technologies copyright 2012 */ +/**************************************************************************************/ +/**************************************************************************************/ + +#include "mbed.h" +#include "SMARTWAV.h" +#include "SMARTGPU.h" + +SMARTWAV sWav(p13,p14,p15); //(TX,RX,Reset); +SMARTGPU lcd(p28,p27,p29); //(TX,RX,Reset); + +//Each times we use the touchscreen we must define a int array that stores the X and Y readed or touched coordinates. +int touch[2]; +//Each times we use the touchicon we must define a char array that stores the name of the touched icon. +char icon[3]; + +//Global Variables +char playList[500]; //an array for storing the retrieved list of Audio files +char dirList[500]; //an array for storing the retrieved list of Folders/Dirs +char songName[9]; // 8 characters + null character +char times[6]={0}; //array to store the times +unsigned char audioItems=0; //variable storing the total of audio files on the 'playlist' array +unsigned char dirItems=0; //variable storing the total of Folders/Dirs on the 'dirList' array +unsigned char totalAudioItems=0; +unsigned char songPointer=0; +unsigned char minutes=0,seconds=0; +unsigned int progress=0; //to draw song progress + +/************************************************************************************************/ +//Simple function to count the number of items on a list +/************************************************************************************************/ +unsigned char getListItems(char *list){ // returns the number of audio files on current folder/Dir, if none or fails returns 0 + unsigned int i=0; + unsigned char counter=0; + + while(1){ + if(list[i]==','){ + counter ++; + } + if(list[i]==0x00){ + return counter; + } + i++; + } +} + +/************************************************************************************************/ +//Simple function that returns the name of a given item number of a list +/************************************************************************************************/ +unsigned char getListNameItem(char *list, unsigned char itemNo, char *name){ // returns the name of the sWav file number 'Item' on the given 'name' buffer; on current buffer, fails or end of items return 0, succesfull returns 1; + unsigned int i=0; + unsigned char counter=0,x=0; + + while(1){ + if(counter==itemNo){ + break; + } + while(1){ + if(list[i]==','){ + i++; + counter ++; + break; + } + if(list[i]==0x00){ + return 0; + } + i++; + } + } + while(1){ + name[x]=list[i]; + i++; + x++; + if(list[i]==','){ + name[x]=0x00; + return 1; + } + if(x>7){ + return 0; + } + } +} + +/************************************************************************************************/ +/************************************************************************************************/ +//This function gets the existing folders and songs on the microSD root, and displays them +void getData(){ + unsigned char x; + char name[9]={0}; + + wait_ms(50); + sWav.getFolderList(dirList); + wait_ms(50); + sWav.getFileList(playList); + audioItems=getListItems(playList); + dirItems=getListItems(dirList); + + if(dirItems>8){ //Show up to 8 Folders/Dirs + dirItems=8; + } + + if(audioItems>8){ //Show up to 8 audio Items + audioItems=8; + } + //display the folder items + for(x=0;x<dirItems;x++){ + getListNameItem(dirList,x,name); + lcd.string(15,70+(x*20),319,239,YELLOW,FONT3,UNFILL,name); + } + //display the audio items + for(x=0;x<audioItems;x++){ + getListNameItem(playList,x,name); + lcd.string(170,70+(x*20),319,239,YELLOW,FONT3,UNFILL,name); + } + //get true total items + audioItems=getListItems(playList); + totalAudioItems=audioItems; + dirItems=getListItems(dirList); +} + +/************************************************************************************************/ +/************************************************************************************************/ +//This function search for a song and play it, also displays the song artwork. +void searchSong(){ + char name[9]={0}; + + if(songPointer>=totalAudioItems){//if we reached the end of items + songPointer=0; + } + while(1){ + getListNameItem(playList,songPointer,name); //get a song file name + if(sWav.playTrackName(name)=='O'){ + lcd.imageSD(80,25,name); + lcd.drawRectangle(10,8,75,22,0x0926,FILL); //erase previous song name + lcd.string(10,8,319,239,WHITE,FONT3,FILL,name); //draw song name + lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times + lcd.drawLine(0,204,319,204,BLACK); //draw progress line + lcd.imageSD(146,208,"pause"); + minutes=0; + seconds=0; + progress=0; + songPointer++; //increase song pointer + break; + }else{ + songPointer++; //increase song pointer + wait_ms(100); + } + } +} + +/**************************************************/ +/****************** MAIN LOOP *********************/ +/**************************************************/ +/**************************************************/ +/***************************************************/ +int main() { + unsigned int tick=0; //counter to advance seconds + + //Those two functions must always be called for SMARTGPU support + lcd.reset(); //configure the serial and pinout of arduino board for SMARTGPU support + lcd.start(); //initialize the SMARTGPU processor + //Those two functions must always be called for SMARTWAV support + sWav.reset(); //perform an initial reset + sWav.init(); //initialize the SMARTWAV processor + + lcd.baudChange(2000000); //set high baud for advanced applications + + //load main playlist + lcd.imageSD(0,0,"List"); + lcd.string(5,5,239,239,GREEN,FONT3,UNFILL,"Library Play List:"); + lcd.string(5,40,239,239,GREEN,FONT3,UNFILL,"Folders/Dirs:"); + lcd.string(160,40,319,239,GREEN,FONT3,UNFILL,"Songs/Audio Files:"); + getData(); //get folders and songs and display them + + //wait_ms for a touch on screen to start playing songs + while(lcd.touchScreen(touch)==0); + lcd.imageSD(0,0,"player"); + lcd.drawLine(230,222,271,222,YELLOW); + lcd.imageSD(266,217,"ball"); + lcd.setTextBackground(0x0926); + + while(1){ + // search for a song and play it + show artwork + searchSong(); + + while(1){ + //wait_ms for a touch on screen to perform something + while(lcd.touchScreen(touch)==0 | touch[YCOORD]<200){ + tick++; + if(tick > 500){ //if about 1 second have passed- this isn't accurate, the best way to achieve 1 second is by timesr interrupts + tick=0; //reset counter + seconds++; + progress++; + if(seconds>59){ + minutes++; + seconds=0; + } + times[0]=(minutes/10)+0x30; //get the tens of the minutes and convert them to ascii + times[1]=(minutes%10)+0x30; //get the ones of the minutes and convert them to ascii + times[2]=':'; + times[3]=(seconds/10)+0x30; //get the tens of the seconds and convert them to ascii + times[4]=(seconds%10)+0x30; //get the ones of the seconds and convert them to ascii + lcd.string(265,8,319,239,WHITE,FONT2,FILL,times); //draw the time + lcd.drawLine(0,204,progress,204,YELLOW); //draw progress line + + if(sWav.getStatus()!=0x01){ //if no song is being played-means end of song + wait_ms(500); + sWav.stopTrack(); + wait_ms(500); + searchSong(); //play next songpointer song + } + } + } + + //decode touch into buttons + if(touch[XCOORD]>90 & touch[XCOORD]<117){//touch on STOP button + sWav.stopTrack(); + lcd.imageSD(146,208,"play"); + lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times + lcd.drawLine(0,204,319,204,BLACK); //draw progress line + wait_ms(1000); + //wait_ms for a touch on play button to resume song play-back + while(lcd.touchScreen(touch)==0 | !(touch[XCOORD]>144 & touch[XCOORD]<173)); + break; + }else if(touch[XCOORD]>116 & touch[XCOORD]<145){//touch on REWIND button + sWav.rewindTrack(); + lcd.string(265,8,319,239,WHITE,FONT2,FILL,"00:00"); //draw the times + lcd.drawLine(0,204,319,204,BLACK); //draw progress line + minutes=0; + seconds=0; + progress=0; + }else if(touch[XCOORD]>144 & touch[XCOORD]<173){//touch on PAUSE/PLAY button + sWav.pausePlay(); + lcd.imageSD(146,208,"play"); + wait_ms(1000); + //wait_ms for a touch on pausePlay button to resume song play-back + while(lcd.touchScreen(touch)==0 | !(touch[XCOORD]>144 & touch[XCOORD]<173)); + sWav.pausePlay(); + lcd.imageSD(146,208,"pause"); + }else if(touch[XCOORD]>172 & touch[XCOORD]<202){//touch on NEXT button + sWav.stopTrack(); + wait_ms(200); + break; + }else if(touch[XCOORD]>229 & touch[XCOORD]<272){//touch on VOLUME + lcd.drawLine(touch[XCOORD],222,271,222,BLACK); + lcd.drawLine(230,222,touch[XCOORD],222,YELLOW); + lcd.imageSD(touch[XCOORD]-4,217,"ball"); + sWav.volume(214+ (touch[XCOORD]-230)); + } + wait_ms(200); + } + } +} + + + +