semaf

Dependencies:   Freetronics_16x2_LCD sd-driver

Fork of HelloWorld_CCA01M1_mbedOS45 by STarks

Committer:
vidica94
Date:
Fri Jan 26 15:52:57 2018 +0000
Revision:
16:5e8108b82891
Parent:
15:3624055fac29
wsdfghj

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:8d09369ca839 1 #include "mbed.h"
vidica94 12:d847a3c0cf76 2 #include "FATFileSystem.h"
vidica94 12:d847a3c0cf76 3 #include "SDBlockDevice.h"
vidica94 12:d847a3c0cf76 4 #include <stdio.h>
vidica94 12:d847a3c0cf76 5 #include <errno.h>
vidica94 12:d847a3c0cf76 6 #include "freetronicsLCDShield.h"
nikapov 0:8d09369ca839 7 /* Helper header files. */
nikapov 0:8d09369ca839 8 #include "DevI2C.h"
nikapov 0:8d09369ca839 9
nikapov 0:8d09369ca839 10 /* Component specific header files. */
davide.aliprandi@st.com 5:ac729170df5f 11 #include "STA350BW.h"
nikapov 0:8d09369ca839 12
nikapov 0:8d09369ca839 13 /* My song header file. */
nikapov 0:8d09369ca839 14 #include "my_song.h"
nikapov 0:8d09369ca839 15
vidica94 14:244ec24ee6dd 16 //SDBlockDevice bd(PB_5, PB_4, PB_3, PA_15);
vidica94 12:d847a3c0cf76 17 SDBlockDevice bd(PA_7, PA_6, PA_5, PA_8);
vidica94 12:d847a3c0cf76 18 FATFileSystem fs("fs");
vidica94 12:d847a3c0cf76 19 freetronicsLCDShield lcd(D8, D9, D4, D5, D6, D2, D3, A0);
vidica94 15:3624055fac29 20 Thread Leggi_SD_Thread;
vidica94 15:3624055fac29 21 Thread Suona_Thread;
vidica94 15:3624055fac29 22 argomento* arg=(argomento*) malloc(sizeof(argomento));
vidica94 15:3624055fac29 23
vidica94 16:5e8108b82891 24 Mutex mutex_ping;
vidica94 15:3624055fac29 25
vidica94 16:5e8108b82891 26 Semaphore SPAZIO_DISP(2);
vidica94 16:5e8108b82891 27 Semaphore MSG_DISP(2);
vidica94 16:5e8108b82891 28
vidica94 15:3624055fac29 29 void Leggi_SD(argomento * arg){
vidica94 15:3624055fac29 30
vidica94 15:3624055fac29 31 while(1){
vidica94 16:5e8108b82891 32 mutex_ping.lock();
vidica94 16:5e8108b82891 33 SPAZIO_DISP.wait();
vidica94 16:5e8108b82891 34 if ( arg->ping_r==0){
vidica94 16:5e8108b82891 35
vidica94 15:3624055fac29 36 fread(arg->ping,sizeof(int16_t), arg->size, arg->fd);
vidica94 16:5e8108b82891 37 arg->ping_r=1;
vidica94 16:5e8108b82891 38 //printf(" caricato ping\r\n");
vidica94 16:5e8108b82891 39
vidica94 16:5e8108b82891 40 }else if( arg->pong_r==0){
vidica94 16:5e8108b82891 41
vidica94 16:5e8108b82891 42 fread(arg->pong,sizeof(int16_t), arg->size, arg->fd);
vidica94 16:5e8108b82891 43 arg->pong_r=1;
vidica94 16:5e8108b82891 44 }
vidica94 16:5e8108b82891 45
vidica94 16:5e8108b82891 46 MSG_DISP.release();
vidica94 16:5e8108b82891 47 mutex_ping.unlock();
vidica94 16:5e8108b82891 48
vidica94 16:5e8108b82891 49 // printf(" caricato ping\r\n");
vidica94 16:5e8108b82891 50 /*
vidica94 16:5e8108b82891 51
vidica94 16:5e8108b82891 52 arg->mutex_pong.lock();
vidica94 16:5e8108b82891 53
vidica94 15:3624055fac29 54 fread(arg->pong, sizeof(int16_t), arg->size, arg->fd);
vidica94 16:5e8108b82891 55 arg->pong_r=1;
vidica94 16:5e8108b82891 56 arg->mutex_pong.unlock();
vidica94 16:5e8108b82891 57 printf(" caricato pong\r\n");
vidica94 16:5e8108b82891 58
vidica94 16:5e8108b82891 59
vidica94 16:5e8108b82891 60 arg->sel=!(arg->sel);
vidica94 16:5e8108b82891 61 */
vidica94 15:3624055fac29 62 }
vidica94 15:3624055fac29 63
vidica94 15:3624055fac29 64 }
vidica94 15:3624055fac29 65
vidica94 15:3624055fac29 66
nikapov 0:8d09369ca839 67
nikapov 0:8d09369ca839 68 #define PLAY_STOP_EVENT (0x1)
vidica94 14:244ec24ee6dd 69 int16_t buff[3000] = {0};
nikapov 0:8d09369ca839 70
nikapov 0:8d09369ca839 71 /* Variables -----------------------------------------------------------------*/
nikapov 0:8d09369ca839 72
nikapov 0:8d09369ca839 73 /* Initialization parameters. */
Davidroid 7:94e3191477c5 74 STA350BW_init_t init =
nikapov 0:8d09369ca839 75 {
vidica94 16:5e8108b82891 76 22000, /* Default Sampling Frequency [Hz]. */
nikapov 0:8d09369ca839 77 100 /* Default Volume. */
nikapov 0:8d09369ca839 78 };
nikapov 0:8d09369ca839 79
nikapov 0:8d09369ca839 80 /* Sound Terminal Component. */
nikapov 0:8d09369ca839 81 STA350BW *sound_terminal;
nikapov 0:8d09369ca839 82
nikapov 0:8d09369ca839 83 /* Thread to manage I2S peripherals. */
nikapov 0:8d09369ca839 84 static rtos::Thread i2s_bh_daemon;
nikapov 0:8d09369ca839 85
nikapov 0:8d09369ca839 86 /* Threads. */
nikapov 0:8d09369ca839 87 Thread *play_stop_thread;
nikapov 0:8d09369ca839 88
nikapov 0:8d09369ca839 89 /* User button handling. */
nikapov 0:8d09369ca839 90 InterruptIn event(USER_BUTTON);
nikapov 0:8d09369ca839 91
nikapov 0:8d09369ca839 92
nikapov 0:8d09369ca839 93 /* Functions -----------------------------------------------------------------*/
nikapov 0:8d09369ca839 94
nikapov 0:8d09369ca839 95 /**
nikapov 0:8d09369ca839 96 * @brief User button handler function.
nikapov 0:8d09369ca839 97 * @param None.
nikapov 0:8d09369ca839 98 * @retval None.
nikapov 0:8d09369ca839 99 */
nikapov 0:8d09369ca839 100 void pressed(void)
nikapov 0:8d09369ca839 101 {
nikapov 0:8d09369ca839 102 /* Signal to play/stop handler thread. */
nikapov 0:8d09369ca839 103 play_stop_thread->signal_set(PLAY_STOP_EVENT);
nikapov 0:8d09369ca839 104 }
nikapov 0:8d09369ca839 105
nikapov 0:8d09369ca839 106 /**
nikapov 0:8d09369ca839 107 * @brief Play/stop handler function.
nikapov 0:8d09369ca839 108 * @param None.
nikapov 0:8d09369ca839 109 * @retval None.
nikapov 0:8d09369ca839 110 */
vidica94 15:3624055fac29 111
davide.aliprandi@st.com 5:ac729170df5f 112 void play_stop_handler(void)
nikapov 0:8d09369ca839 113 {
nikapov 0:8d09369ca839 114 while (true)
nikapov 0:8d09369ca839 115 {
nikapov 0:8d09369ca839 116 static bool stop = true;
nikapov 0:8d09369ca839 117
vidica94 15:3624055fac29 118 // Waiting for play/stop events.
nikapov 0:8d09369ca839 119 play_stop_thread->signal_wait(PLAY_STOP_EVENT);
nikapov 0:8d09369ca839 120
nikapov 0:8d09369ca839 121 if (stop)
davide.aliprandi@st.com 5:ac729170df5f 122 sound_terminal->stop();
nikapov 0:8d09369ca839 123 else
vidica94 15:3624055fac29 124 // sound_terminal->play((int16_t *) my_song, (uint16_t) sizeof(my_song), true);
nikapov 0:8d09369ca839 125 printf("--> %s\r\n", stop ? "Stop." : "Playing...");
nikapov 0:8d09369ca839 126
nikapov 0:8d09369ca839 127 stop = !stop;
nikapov 0:8d09369ca839 128 }
vidica94 12:d847a3c0cf76 129 }
vidica94 12:d847a3c0cf76 130
vidica94 12:d847a3c0cf76 131
vidica94 12:d847a3c0cf76 132 void return_error(int ret_val){
vidica94 12:d847a3c0cf76 133 if (ret_val)
vidica94 12:d847a3c0cf76 134 printf("Failure. %d\r\n", ret_val);
vidica94 12:d847a3c0cf76 135 else
vidica94 12:d847a3c0cf76 136 printf("done.\r\n");
nikapov 0:8d09369ca839 137 }
nikapov 0:8d09369ca839 138
vidica94 12:d847a3c0cf76 139 void errno_error(void* ret_val){
vidica94 12:d847a3c0cf76 140 if (ret_val == NULL)
vidica94 12:d847a3c0cf76 141 printf(" Failure. %d \r\n", errno);
vidica94 12:d847a3c0cf76 142 else
vidica94 12:d847a3c0cf76 143 printf(" done.\r\n");
vidica94 12:d847a3c0cf76 144 }
vidica94 12:d847a3c0cf76 145
vidica94 15:3624055fac29 146 void Suona(argomento * arg){
vidica94 15:3624055fac29 147
vidica94 16:5e8108b82891 148 while(1){
vidica94 16:5e8108b82891 149 mutex_ping.lock();
vidica94 16:5e8108b82891 150 MSG_DISP.wait();
vidica94 16:5e8108b82891 151 if(arg->ping_r==1){
vidica94 16:5e8108b82891 152 sound_terminal->play((int16_t *) arg->ping, (uint16_t) sizeof(int16_t)*(arg->size), false);
vidica94 16:5e8108b82891 153 // printf(" suonato ping\r\n");
vidica94 16:5e8108b82891 154 arg->ping_r=0;
vidica94 16:5e8108b82891 155 }
vidica94 16:5e8108b82891 156 if(arg->pong_r==1){
vidica94 16:5e8108b82891 157
vidica94 16:5e8108b82891 158 sound_terminal->play((int16_t *) arg->pong, (uint16_t) sizeof(int16_t)*(arg->size), false);
vidica94 16:5e8108b82891 159 // printf(" suonato ping\r\n");
vidica94 16:5e8108b82891 160 arg->pong_r=0;
vidica94 16:5e8108b82891 161 }
vidica94 16:5e8108b82891 162
vidica94 16:5e8108b82891 163 mutex_ping.unlock();
vidica94 16:5e8108b82891 164 SPAZIO_DISP.release();
vidica94 15:3624055fac29 165 }
vidica94 15:3624055fac29 166 }
vidica94 15:3624055fac29 167
vidica94 12:d847a3c0cf76 168 int main() {
vidica94 12:d847a3c0cf76 169
vidica94 12:d847a3c0cf76 170 /*----- Initialization. -----*/
vidica94 16:5e8108b82891 171 //arg->sel=0;
vidica94 16:5e8108b82891 172 arg->size=9000;
vidica94 16:5e8108b82891 173 arg->ping_r=0;
vidica94 16:5e8108b82891 174 arg->pong_r=0;
nikapov 0:8d09369ca839 175
nikapov 0:8d09369ca839 176 /* Initializing I2C bus. */
Davidroid 4:6bb9e11d322b 177 DevI2C *dev_i2c = new DevI2C(PB_9, PB_8);
nikapov 0:8d09369ca839 178
nikapov 0:8d09369ca839 179 /* Initializing Sound Terminal Component. */
nikapov 0:8d09369ca839 180 #ifndef USE_I2S2
nikapov 0:8d09369ca839 181 sound_terminal = new STA350BW(PA_10, STA350BW_ADDRESS_1, *dev_i2c, PB_15, PB_13, PB_12, NC, PC_6);
nikapov 0:8d09369ca839 182 #else
nikapov 0:8d09369ca839 183 sound_terminal = new STA350BW(PA_10, STA350BW_ADDRESS_2, *dev_i2c, PC_12, PC_10, PA_4, NC, PC_7);
nikapov 0:8d09369ca839 184 #endif
davide.aliprandi@st.com 5:ac729170df5f 185 if (sound_terminal->init(&init) != COMPONENT_OK)
nikapov 0:8d09369ca839 186 {
nikapov 0:8d09369ca839 187 error("Initialization of the Sound Terminal Expansion Board failed.\r\n");
nikapov 0:8d09369ca839 188 exit(EXIT_FAILURE);
nikapov 0:8d09369ca839 189 }
nikapov 0:8d09369ca839 190
nikapov 0:8d09369ca839 191 /* Starting a thread to manage I2S peripherals. */
nikapov 0:8d09369ca839 192 Callback<void()> i2s_bh_task(&I2S::i2s_bh_queue, &events::EventQueue::dispatch_forever);
nikapov 0:8d09369ca839 193 i2s_bh_daemon.start(i2s_bh_task);
nikapov 0:8d09369ca839 194
nikapov 0:8d09369ca839 195 /* Scheduling the play/stop function. */
nikapov 0:8d09369ca839 196 play_stop_thread = new Thread();
davide.aliprandi@st.com 5:ac729170df5f 197 osStatus status = play_stop_thread->start(play_stop_handler);
nikapov 0:8d09369ca839 198 if (status != osOK)
nikapov 0:8d09369ca839 199 printf("Could not start the play/stop handler thread.\r\n");
nikapov 0:8d09369ca839 200 event.fall(&pressed);
nikapov 0:8d09369ca839 201
nikapov 0:8d09369ca839 202 /* Setting Sound Terminal Component's parameters. */
davide.aliprandi@st.com 5:ac729170df5f 203 sound_terminal->set_frequency(MY_SONG_AUDIO_FREQUENCY);
vidica94 16:5e8108b82891 204 sound_terminal->set_volume(STA350BW_CHANNEL_MASTER, 55);
nikapov 0:8d09369ca839 205
nikapov 0:8d09369ca839 206 /* Printing to the console. */
nikapov 0:8d09369ca839 207 printf("Sound Terminal Application Example\r\n\n");
nikapov 0:8d09369ca839 208
vidica94 12:d847a3c0cf76 209
vidica94 12:d847a3c0cf76 210
vidica94 12:d847a3c0cf76 211
vidica94 12:d847a3c0cf76 212
vidica94 12:d847a3c0cf76 213
vidica94 12:d847a3c0cf76 214
vidica94 12:d847a3c0cf76 215
vidica94 12:d847a3c0cf76 216
vidica94 12:d847a3c0cf76 217
vidica94 12:d847a3c0cf76 218 // turn on the back light (it's off by default)
vidica94 12:d847a3c0cf76 219 lcd.setBackLight(true);
vidica94 12:d847a3c0cf76 220
vidica94 12:d847a3c0cf76 221 int error = 0;
vidica94 12:d847a3c0cf76 222 printf("Welcome to the filesystem example.\r\n"
vidica94 12:d847a3c0cf76 223 "Formatting a FAT, RAM-backed filesystem. ");
vidica94 12:d847a3c0cf76 224 //error = FATFileSystem::format(&bd);
vidica94 12:d847a3c0cf76 225 return_error(error);
nikapov 0:8d09369ca839 226
vidica94 12:d847a3c0cf76 227 printf("Mounting the filesystem on \"/fs\". ");
vidica94 12:d847a3c0cf76 228 error = fs.mount(&bd);
vidica94 12:d847a3c0cf76 229 return_error(error);
vidica94 12:d847a3c0cf76 230
vidica94 12:d847a3c0cf76 231
vidica94 12:d847a3c0cf76 232 printf(" done.\r\n");
nikapov 0:8d09369ca839 233
vidica94 12:d847a3c0cf76 234 printf("Re-opening file read-only.");
vidica94 16:5e8108b82891 235 FILE* fd = fopen("/fs/marcia.wav", "r");
vidica94 12:d847a3c0cf76 236 errno_error(fd);
vidica94 15:3624055fac29 237 arg->fd=fd;
vidica94 15:3624055fac29 238 Leggi_SD_Thread.start(callback(Leggi_SD,arg));
vidica94 15:3624055fac29 239 Suona_Thread.start(callback(Suona,arg));
vidica94 15:3624055fac29 240
vidica94 15:3624055fac29 241
vidica94 12:d847a3c0cf76 242 printf("Dumping file to screen.\r\n");
vidica94 14:244ec24ee6dd 243
vidica94 12:d847a3c0cf76 244 while (!feof(fd)){
vidica94 14:244ec24ee6dd 245
vidica94 12:d847a3c0cf76 246 // printf("inizo file to screen.\r\n");
vidica94 14:244ec24ee6dd 247 //fscanf( fd , "%c%c" , & a ) ;
vidica94 14:244ec24ee6dd 248 //fscanf( fd , "%c" , & c) ;
vidica94 15:3624055fac29 249 //fread(buff,sizeof(int16_t),3000,fd);
vidica94 14:244ec24ee6dd 250 //int b=(((int)a*256)+((int )c));
vidica94 14:244ec24ee6dd 251 //b=b-32768;
vidica94 14:244ec24ee6dd 252 //printf("%d \r\n",b);
vidica94 12:d847a3c0cf76 253 //printf ( "%c-" , a[1]) ;printf ( "%c\r\n" , a[0]) ;
vidica94 12:d847a3c0cf76 254 //printf("--> Playing...\r\n");
vidica94 14:244ec24ee6dd 255 //printf ( "%d\r\n " , buff[i] ) ;
nikapov 0:8d09369ca839 256
vidica94 14:244ec24ee6dd 257 //buff[i]=a;
vidica94 12:d847a3c0cf76 258
vidica94 14:244ec24ee6dd 259
vidica94 14:244ec24ee6dd 260
vidica94 12:d847a3c0cf76 261 // int size = fread(&buff[0], 1, 159, fd);
vidica94 12:d847a3c0cf76 262 //fwrite(&buff[0], 1, size, stdout);
vidica94 12:d847a3c0cf76 263
vidica94 15:3624055fac29 264 //sound_terminal->play((int16_t *) buff, (uint16_t) sizeof(buff), true );
vidica94 12:d847a3c0cf76 265 }
vidica94 12:d847a3c0cf76 266 printf("EOF.\r\n");
vidica94 12:d847a3c0cf76 267
vidica94 12:d847a3c0cf76 268 printf("Closing file.");
vidica94 12:d847a3c0cf76 269 fclose(fd);
vidica94 12:d847a3c0cf76 270 printf(" done.\r\n");
nikapov 0:8d09369ca839 271
vidica94 12:d847a3c0cf76 272 printf("Opening root directory.");
vidica94 12:d847a3c0cf76 273 DIR* dir = opendir("/fs/");
vidica94 12:d847a3c0cf76 274 errno_error(fd);
vidica94 12:d847a3c0cf76 275
vidica94 12:d847a3c0cf76 276 struct dirent* de;
vidica94 12:d847a3c0cf76 277 printf("Printing all filenames:\r\n");
vidica94 12:d847a3c0cf76 278 while((de = readdir(dir)) != NULL){
vidica94 12:d847a3c0cf76 279 printf(" %s\r\n", &(de->d_name)[0]);
vidica94 12:d847a3c0cf76 280 }
vidica94 12:d847a3c0cf76 281
vidica94 12:d847a3c0cf76 282 printf("Closeing root directory. ");
vidica94 12:d847a3c0cf76 283 error = closedir(dir);
vidica94 12:d847a3c0cf76 284 return_error(error);
vidica94 12:d847a3c0cf76 285 printf("Filesystem Demo complete.\r\n");
vidica94 12:d847a3c0cf76 286
vidica94 12:d847a3c0cf76 287 while (true) {}
vidica94 12:d847a3c0cf76 288 }