semaf
Dependencies: Freetronics_16x2_LCD sd-driver
Fork of HelloWorld_CCA01M1_mbedOS45 by
main.cpp@16:5e8108b82891, 2018-01-26 (annotated)
- Committer:
- vidica94
- Date:
- Fri Jan 26 15:52:57 2018 +0000
- Revision:
- 16:5e8108b82891
- Parent:
- 15:3624055fac29
wsdfghj
Who changed what in which revision?
User | Revision | Line number | New 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 | } |