2022-05-04
#include "mbed.h" /* UART通信オブジェクト生成 */ Serial MP3(PA_0,PA_1); Serial pc(USBTX,USBRX); /* プロトタイプ宣言 */ int get_number_of_tracks(void); void set_number_of_tracks(uint8_t number); void set_number_of_directory(uint8_t number); void control_tracks(char control); void set_volume(uint8_t val); void quiet_mode(bool val); int confirm(void); ///////////// /* メイン関数 */ ///////////// int main() { /* 初期設定 */ wait_ms(100); MP3.baud(38400); pc.baud(9600); int sum = get_number_of_tracks(); // 総トラック数を取得 pc.printf("Number of all Tracks:%d\r\n",sum); // シリアルモニタに総トラック数を表示 set_volume(200); // 音量セット quiet_mode(false); // クワイエットモードOFF /* メインループ */ while(1) { /* PCのターミナルで曲を指定する */ int i = 0; pc.printf("Set track number:"); pc.scanf("%d",&i); // 入力(ターミナルのローカルエコーをオンにする) set_number_of_tracks(i); pc.printf("\r\nTrack:%d\r\n\r\n",i); } } /////////////////////////////// /* 総トラック数(曲数)を取得する関数 */ /////////////////////////////// int get_number_of_tracks(void){ MP3.putc('S'); MP3.putc('1'); char track[5]; int count = 1; int i = 2; /* 待機 */ while(MP3.readable() == 0); track[0] = MP3.getc(); // '='を取得 /* 他ラック数をASCII文字で取得 */ while(MP3.readable() == 0); track[1] = MP3.getc(); while(count <= 1000){ if(MP3.readable() == 1){ track[i] = MP3.getc(); track[i+1]='\0'; i++; } count++; wait_ms(1); } /* ASCII文字を数値に変換 */ for(i = 1; i<= 3; i++){ switch(track[i]){ case '0': track[i] = 0; break; case '1': track[i] = 1; break; case '2': track[i] = 2; break; case '3': track[i] = 3; break; case '4': track[i] = 4; break; case '5': track[i] = 5; break; case '6': track[i] = 6; break; case '7': track[i] = 7; break; case '8': track[i] = 8; break; case '9': track[i] = 9; break; default: break; } } /* 位(桁)を合わせる */ if(track[2]=='\0'){ return track[1]; } else if(track[3]=='\0'){ return (10*track[1] + track[2]); } else if(track[4]=='\0'){ return (100*track[1] + 10*track[2] + track[3]); } else{ return 999; // 受信エラー } } //////////////////////////////////// /* トラックナンバーを指定して曲を流す関数 */ //////////////////////////////////// void set_number_of_tracks(uint8_t number){ MP3.putc('t'); MP3.putc(number); } /////////////////////////////////////// /* ディレクトリのn番目を指定して曲を流す関数 */ /////////////////////////////////////// void set_number_of_directory(uint8_t number){ MP3.putc('p'); MP3.putc(number); } ////////////////////////////////////////////////////////////////////////////////// /* 音楽を再生・停止したり、次・前の曲に変える関数('O':再生・停止, 'F':次へ進む, 'R':前に戻る) */ ////////////////////////////////////////////////////////////////////////////////// void control_tracks(char control){ MP3.putc(control); } /////////////////////////////// /* 音量を変える関数(0最小~255最大) */ /////////////////////////////// void set_volume(uint8_t val){ MP3.putc('v'); MP3.putc(255 - val); } ////////////////////////////////////////////////////////////// /* クワイエットモードをOn(true)/off(false)する関数(デフォルトはoff) */ ////////////////////////////////////////////////////////////// void quiet_mode(bool val){ MP3.putc('Q'); if(val == true){ MP3.putc('1');//on } else{ MP3.putc('0');//off(default) } } /////////////////////////////////////////////////////////////////////////////// /* 曲の再生の終了を確認する関数 戻り値(自然終了:1,強制終了:2,終了していない:0,エラー:999) */ /////////////////////////////////////////////////////////////////////////////// int confirm(void){ wait_ms(200); if(MP3.readable() == 1){ char val = MP3.getc(); switch(val){ case 'X': // 自然終了したとき return 1; break; case 'x': // 強制終了したとき return 2; break; case 'E': // トラックが存在しないとき return 3; break; default: return 999; break; } } else{ return 0; } }