seeing i robot - with all the file systems and complete code

Dependencies:   mbed SRF05 Servo CMPS03

Committer:
sowmy87
Date:
Fri Dec 17 22:55:25 2010 +0000
Revision:
1:2bac7b6f3840
Parent:
0:ee786e500a3c
Sensor 1 edited

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sowmy87 0:ee786e500a3c 1 #include "VS1002.h"
sowmy87 0:ee786e500a3c 2 #include "mbed.h"
sowmy87 0:ee786e500a3c 3
sowmy87 0:ee786e500a3c 4
sowmy87 0:ee786e500a3c 5
sowmy87 0:ee786e500a3c 6 /* ==================================================================
sowmy87 0:ee786e500a3c 7 * Constructor
sowmy87 0:ee786e500a3c 8 * =================================================================*/
sowmy87 0:ee786e500a3c 9 VS1002::VS1002(
sowmy87 0:ee786e500a3c 10 PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name,
sowmy87 0:ee786e500a3c 11 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
sowmy87 0:ee786e500a3c 12 PinName dreq, PinName dcs, PinName vol)
sowmy87 0:ee786e500a3c 13 :
sowmy87 0:ee786e500a3c 14 _sd(mmosi, mmiso, ssck, ccs, name),
sowmy87 0:ee786e500a3c 15 _spi(mosi, miso, sck),
sowmy87 0:ee786e500a3c 16 _CS(cs),
sowmy87 0:ee786e500a3c 17 _RST(rst),
sowmy87 0:ee786e500a3c 18 _DREQ(dreq),
sowmy87 0:ee786e500a3c 19 _DCS(dcs),
sowmy87 0:ee786e500a3c 20 _VOL(vol) {
sowmy87 0:ee786e500a3c 21
sowmy87 0:ee786e500a3c 22 }
sowmy87 0:ee786e500a3c 23
sowmy87 0:ee786e500a3c 24 /*===================================================================
sowmy87 0:ee786e500a3c 25 * Functions
sowmy87 0:ee786e500a3c 26 *==================================================================*/
sowmy87 0:ee786e500a3c 27
sowmy87 0:ee786e500a3c 28 void VS1002::cs_low(void)
sowmy87 0:ee786e500a3c 29 {
sowmy87 0:ee786e500a3c 30 _CS = 0;
sowmy87 0:ee786e500a3c 31 }
sowmy87 0:ee786e500a3c 32 void VS1002::cs_high(void)
sowmy87 0:ee786e500a3c 33 {
sowmy87 0:ee786e500a3c 34 _CS = 1;
sowmy87 0:ee786e500a3c 35 }
sowmy87 0:ee786e500a3c 36 void VS1002::dcs_low(void)
sowmy87 0:ee786e500a3c 37 {
sowmy87 0:ee786e500a3c 38 _DCS = 0;
sowmy87 0:ee786e500a3c 39 }
sowmy87 0:ee786e500a3c 40 void VS1002::dcs_high(void)
sowmy87 0:ee786e500a3c 41 {
sowmy87 0:ee786e500a3c 42 _DCS = 1;
sowmy87 0:ee786e500a3c 43 }
sowmy87 0:ee786e500a3c 44 void VS1002::sci_en(void) //SCI enable
sowmy87 0:ee786e500a3c 45 {
sowmy87 0:ee786e500a3c 46 cs_high();
sowmy87 0:ee786e500a3c 47 dcs_high();
sowmy87 0:ee786e500a3c 48 cs_low();
sowmy87 0:ee786e500a3c 49 }
sowmy87 0:ee786e500a3c 50 void VS1002::sci_dis(void) //SCI disable
sowmy87 0:ee786e500a3c 51 {
sowmy87 0:ee786e500a3c 52 cs_high();
sowmy87 0:ee786e500a3c 53 }
sowmy87 0:ee786e500a3c 54 void VS1002::sdi_en(void) //SDI enable
sowmy87 0:ee786e500a3c 55 {
sowmy87 0:ee786e500a3c 56 dcs_high();
sowmy87 0:ee786e500a3c 57 cs_high();
sowmy87 0:ee786e500a3c 58 dcs_low();
sowmy87 0:ee786e500a3c 59 }
sowmy87 0:ee786e500a3c 60 void VS1002::sdi_dis(void) //SDI disable
sowmy87 0:ee786e500a3c 61 {
sowmy87 0:ee786e500a3c 62 dcs_high();
sowmy87 0:ee786e500a3c 63 }
sowmy87 0:ee786e500a3c 64 void VS1002::reset(void) //hardware reset
sowmy87 0:ee786e500a3c 65 {
sowmy87 0:ee786e500a3c 66 wait(0.01);
sowmy87 0:ee786e500a3c 67 _RST = 0;
sowmy87 0:ee786e500a3c 68 wait(0.01);
sowmy87 0:ee786e500a3c 69 _RST = 1;
sowmy87 0:ee786e500a3c 70 wait(0.10);
sowmy87 0:ee786e500a3c 71 }
sowmy87 0:ee786e500a3c 72 void VS1002::power_down(void) //hardware and software reset
sowmy87 0:ee786e500a3c 73 {
sowmy87 0:ee786e500a3c 74 cs_low();
sowmy87 0:ee786e500a3c 75 reset();
sowmy87 0:ee786e500a3c 76 sci_write(0x00, SM_PDOWN);
sowmy87 0:ee786e500a3c 77 wait(0.01);
sowmy87 0:ee786e500a3c 78 reset();
sowmy87 0:ee786e500a3c 79 }
sowmy87 0:ee786e500a3c 80 void VS1002::sci_initialise(void)
sowmy87 0:ee786e500a3c 81 {
sowmy87 0:ee786e500a3c 82 _RST = 1; //no reset
sowmy87 0:ee786e500a3c 83 _spi.format(8,0); //spi 8bit interface, steady state low
sowmy87 0:ee786e500a3c 84 _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
sowmy87 0:ee786e500a3c 85
sowmy87 0:ee786e500a3c 86 cs_low();
sowmy87 0:ee786e500a3c 87 for(int i=0; i<4; i++)
sowmy87 0:ee786e500a3c 88 {
sowmy87 0:ee786e500a3c 89 _spi.write(0xFF); //clock the chip a bit
sowmy87 0:ee786e500a3c 90 }
sowmy87 0:ee786e500a3c 91 cs_high();
sowmy87 0:ee786e500a3c 92 dcs_high();
sowmy87 0:ee786e500a3c 93 wait_us(5);
sowmy87 0:ee786e500a3c 94 // fprintf(stderr, "Timeout waiting for v1.x card\n");
sowmy87 0:ee786e500a3c 95
sowmy87 0:ee786e500a3c 96 }
sowmy87 0:ee786e500a3c 97 void VS1002::sdi_initialise(void)
sowmy87 0:ee786e500a3c 98 {
sowmy87 0:ee786e500a3c 99 _spi.format(8,0);
sowmy87 0:ee786e500a3c 100 _spi.frequency(7000000); //set to 7MHz
sowmy87 0:ee786e500a3c 101
sowmy87 0:ee786e500a3c 102 cs_high();
sowmy87 0:ee786e500a3c 103 dcs_high();
sowmy87 0:ee786e500a3c 104 }
sowmy87 0:ee786e500a3c 105 void VS1002::sci_write(unsigned char address, unsigned short int data)
sowmy87 0:ee786e500a3c 106 {
sowmy87 0:ee786e500a3c 107 sci_en(); //enables SCI/disables SDI
sowmy87 0:ee786e500a3c 108
sowmy87 0:ee786e500a3c 109 while(!_DREQ); //wait unitl data request is high
sowmy87 0:ee786e500a3c 110 _spi.write(0x02); //SCI write
sowmy87 0:ee786e500a3c 111 _spi.write(address); //register address
sowmy87 0:ee786e500a3c 112 _spi.write((data >> 8) & 0xFF); //write out first half of data word
sowmy87 0:ee786e500a3c 113 _spi.write(data & 0xFF); //write out second half of data word
sowmy87 0:ee786e500a3c 114
sowmy87 0:ee786e500a3c 115 sci_dis(); //enables SDI/disables SCI
sowmy87 0:ee786e500a3c 116 wait_us(5);
sowmy87 0:ee786e500a3c 117 }
sowmy87 0:ee786e500a3c 118 void VS1002::sdi_write(unsigned char datum)
sowmy87 0:ee786e500a3c 119 {
sowmy87 0:ee786e500a3c 120 sdi_en();
sowmy87 0:ee786e500a3c 121
sowmy87 0:ee786e500a3c 122 while(!_DREQ);
sowmy87 0:ee786e500a3c 123 _spi.write(datum);
sowmy87 0:ee786e500a3c 124
sowmy87 0:ee786e500a3c 125 sci_dis();
sowmy87 0:ee786e500a3c 126 }
sowmy87 0:ee786e500a3c 127 unsigned short int VS1002::read(unsigned short int address)
sowmy87 0:ee786e500a3c 128 {
sowmy87 0:ee786e500a3c 129 cs_low(); //enables SCI/disables SDI
sowmy87 0:ee786e500a3c 130
sowmy87 0:ee786e500a3c 131 while(!_DREQ); //wait unitl data request is high
sowmy87 0:ee786e500a3c 132 _spi.write(0x03); //SCI write
sowmy87 0:ee786e500a3c 133 _spi.write(address); //register address
sowmy87 0:ee786e500a3c 134 unsigned short int received = _spi.write(0x00); //write out dummy byte
sowmy87 0:ee786e500a3c 135 received <<= 8;
sowmy87 0:ee786e500a3c 136 received += _spi.write(0x00); //write out dummy byte
sowmy87 0:ee786e500a3c 137
sowmy87 0:ee786e500a3c 138 cs_high(); //enables SDI/disables SCI
sowmy87 0:ee786e500a3c 139
sowmy87 0:ee786e500a3c 140 return received; //return received word
sowmy87 0:ee786e500a3c 141 }
sowmy87 0:ee786e500a3c 142 void VS1002::sine_test_activate(unsigned char wave)
sowmy87 0:ee786e500a3c 143 {
sowmy87 0:ee786e500a3c 144 cs_high(); //enables SDI/disables SCI
sowmy87 0:ee786e500a3c 145
sowmy87 0:ee786e500a3c 146 while(!_DREQ); //wait unitl data request is high
sowmy87 0:ee786e500a3c 147 _spi.write(0x53); //SDI write
sowmy87 0:ee786e500a3c 148 _spi.write(0xEF); //SDI write
sowmy87 0:ee786e500a3c 149 _spi.write(0x6E); //SDI write
sowmy87 0:ee786e500a3c 150 _spi.write(wave); //SDI write
sowmy87 0:ee786e500a3c 151 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 152 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 153 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 154 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 155
sowmy87 0:ee786e500a3c 156 cs_low(); //enables SCI/disables SDI
sowmy87 0:ee786e500a3c 157 }
sowmy87 0:ee786e500a3c 158 void VS1002::sine_test_deactivate(void)
sowmy87 0:ee786e500a3c 159 {
sowmy87 0:ee786e500a3c 160 cs_high();
sowmy87 0:ee786e500a3c 161
sowmy87 0:ee786e500a3c 162 while(!_DREQ);
sowmy87 0:ee786e500a3c 163 _spi.write(0x45); //SDI write
sowmy87 0:ee786e500a3c 164 _spi.write(0x78); //SDI write
sowmy87 0:ee786e500a3c 165 _spi.write(0x69); //SDI write
sowmy87 0:ee786e500a3c 166 _spi.write(0x74); //SDI write
sowmy87 0:ee786e500a3c 167 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 168 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 169 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 170 _spi.write(0x00); //filler byte
sowmy87 0:ee786e500a3c 171 }
sowmy87 0:ee786e500a3c 172 void VS1002::volume(void)
sowmy87 0:ee786e500a3c 173 {
sowmy87 0:ee786e500a3c 174 #ifdef FIXED_VOL
sowmy87 0:ee786e500a3c 175 unsigned char volumize = (0 * 255); // FIXED VOL (not support volume input)
sowmy87 0:ee786e500a3c 176 #else
sowmy87 0:ee786e500a3c 177 unsigned char volumize = (0 * 255);
sowmy87 0:ee786e500a3c 178 #endif
sowmy87 0:ee786e500a3c 179 while(!_DREQ);
sowmy87 0:ee786e500a3c 180
sowmy87 0:ee786e500a3c 181 unsigned short int attenuation = ((256 * volumize) + volumize);
sowmy87 0:ee786e500a3c 182 sci_write(0x0B, attenuation);
sowmy87 0:ee786e500a3c 183 }
sowmy87 0:ee786e500a3c 184
sowmy87 0:ee786e500a3c 185 void VS1002::play_song(int song_number)
sowmy87 0:ee786e500a3c 186 {
sowmy87 0:ee786e500a3c 187 /*====== Song Select ======*/
sowmy87 0:ee786e500a3c 188
sowmy87 0:ee786e500a3c 189 // char list[10000] = {0};
sowmy87 0:ee786e500a3c 190 char list[1000] = {0};
sowmy87 0:ee786e500a3c 191 char str[16] = {"/sd/"};
sowmy87 0:ee786e500a3c 192 unsigned int startplace = 0;
sowmy87 0:ee786e500a3c 193 unsigned int endplace = 0;
sowmy87 0:ee786e500a3c 194 unsigned int play = 0;
sowmy87 0:ee786e500a3c 195 num_of_files = 0;
sowmy87 0:ee786e500a3c 196
sowmy87 0:ee786e500a3c 197 DIR *d;
sowmy87 0:ee786e500a3c 198 struct dirent *p;
sowmy87 0:ee786e500a3c 199 d = opendir("/sd");
sowmy87 0:ee786e500a3c 200 if(d != NULL)
sowmy87 0:ee786e500a3c 201 {
sowmy87 0:ee786e500a3c 202 while((p = readdir(d)) != NULL)
sowmy87 0:ee786e500a3c 203 {
sowmy87 0:ee786e500a3c 204 strcat(list, "*");
sowmy87 0:ee786e500a3c 205 strcat(list, p->d_name);
sowmy87 0:ee786e500a3c 206 fprintf(stderr,"\n\rFilename:%s", p->d_name);
sowmy87 0:ee786e500a3c 207 num_of_files++;
sowmy87 0:ee786e500a3c 208 }
sowmy87 0:ee786e500a3c 209 }
sowmy87 0:ee786e500a3c 210 else
sowmy87 0:ee786e500a3c 211 {
sowmy87 0:ee786e500a3c 212 perror("Could not open directory!");
sowmy87 0:ee786e500a3c 213 }
sowmy87 0:ee786e500a3c 214 strcat(list, "*"); //terminating *
sowmy87 0:ee786e500a3c 215 if(num_of_files < song_number)
sowmy87 0:ee786e500a3c 216 {
sowmy87 0:ee786e500a3c 217 return;
sowmy87 0:ee786e500a3c 218 }
sowmy87 0:ee786e500a3c 219 while(play != song_number)
sowmy87 0:ee786e500a3c 220 {
sowmy87 0:ee786e500a3c 221 char symbol = list[startplace];
sowmy87 0:ee786e500a3c 222 startplace++;
sowmy87 0:ee786e500a3c 223 if(symbol == 0x2A) //0x2A = "*"
sowmy87 0:ee786e500a3c 224 {
sowmy87 0:ee786e500a3c 225 play++;
sowmy87 0:ee786e500a3c 226 }
sowmy87 0:ee786e500a3c 227 }
sowmy87 0:ee786e500a3c 228 play = 0;
sowmy87 0:ee786e500a3c 229 while(play != (song_number+1))
sowmy87 0:ee786e500a3c 230 {
sowmy87 0:ee786e500a3c 231 char symbol = list[endplace];
sowmy87 0:ee786e500a3c 232 endplace++;
sowmy87 0:ee786e500a3c 233 if(symbol == 0x2A) //0x2A = "*"
sowmy87 0:ee786e500a3c 234 {
sowmy87 0:ee786e500a3c 235 play++;
sowmy87 0:ee786e500a3c 236 }
sowmy87 0:ee786e500a3c 237 }
sowmy87 0:ee786e500a3c 238
sowmy87 0:ee786e500a3c 239 strncat(str, &list[startplace], endplace-startplace);
sowmy87 0:ee786e500a3c 240 str[(endplace-startplace)+3] = '\0';
sowmy87 0:ee786e500a3c 241
sowmy87 0:ee786e500a3c 242 //printf("list: %s\r\n",list); //debug
sowmy87 0:ee786e500a3c 243
sowmy87 0:ee786e500a3c 244 /*====== File Transfer ======*/
sowmy87 0:ee786e500a3c 245
sowmy87 0:ee786e500a3c 246 // return if not MP3 file
sowmy87 0:ee786e500a3c 247 if (!((strstr(str,"MP3")!=NULL)||(strstr(str,"mp3")!=NULL))) return;
sowmy87 0:ee786e500a3c 248 // display filename.mp3
sowmy87 0:ee786e500a3c 249 fprintf(stderr, "\n\rNow Playing: %s\r\n",str);
sowmy87 0:ee786e500a3c 250
sowmy87 0:ee786e500a3c 251 FILE *song;
sowmy87 0:ee786e500a3c 252 unsigned char array[512];
sowmy87 0:ee786e500a3c 253
sowmy87 0:ee786e500a3c 254 song = fopen(str, "rb");
sowmy87 0:ee786e500a3c 255
sowmy87 0:ee786e500a3c 256 if(!song)
sowmy87 0:ee786e500a3c 257 {
sowmy87 0:ee786e500a3c 258 exit(1);
sowmy87 0:ee786e500a3c 259 }
sowmy87 0:ee786e500a3c 260
sowmy87 0:ee786e500a3c 261 while(!feof(song))
sowmy87 0:ee786e500a3c 262 {
sowmy87 0:ee786e500a3c 263 fread(&array, 1, 512, song);
sowmy87 0:ee786e500a3c 264 for(int i=0; i<512; i++)
sowmy87 0:ee786e500a3c 265 {
sowmy87 0:ee786e500a3c 266 #ifndef FS_ONLY
sowmy87 0:ee786e500a3c 267 sdi_write(array[i]);
sowmy87 0:ee786e500a3c 268 // printf(".");
sowmy87 0:ee786e500a3c 269 #endif
sowmy87 0:ee786e500a3c 270 }
sowmy87 0:ee786e500a3c 271 #ifndef FS_ONLY
sowmy87 0:ee786e500a3c 272 volume();
sowmy87 0:ee786e500a3c 273 #endif
sowmy87 0:ee786e500a3c 274 }
sowmy87 0:ee786e500a3c 275 for(int n=0; n<2048; n++)
sowmy87 0:ee786e500a3c 276 {
sowmy87 0:ee786e500a3c 277 #ifndef FS_ONLY
sowmy87 0:ee786e500a3c 278 sdi_write(0x00);
sowmy87 0:ee786e500a3c 279 #endif
sowmy87 0:ee786e500a3c 280 }
sowmy87 0:ee786e500a3c 281 fclose(song); //close the file
sowmy87 0:ee786e500a3c 282 }