Library for Skeleton of SD card player. SD カードプレーヤのための骨組みとして使うためのライブラリ.このライブラリを登録した際のプログラム:「F746_SD_Player_Demo」

Dependencies:   SDFileSystem_Warning_Fixed

Dependents:   F746_SD_Player_Demo F746_SD_VarableFilter F746_SD_GraphicEqualizer F746_MySoundMachine ... more

Committer:
MikamiUitOpen
Date:
Sun Oct 02 03:26:52 2016 +0000
Revision:
2:511479736d6e
Parent:
0:d310bb78455d
Child:
3:dd3b8a21417b
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d310bb78455d 1 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 2 // FileSelector class
MikamiUitOpen 0:d310bb78455d 3 // SD カード内のファイル名の一覧を表示し,ファイルを選択する
MikamiUitOpen 0:d310bb78455d 4 //
MikamiUitOpen 2:511479736d6e 5 // 2016/10/02, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:d310bb78455d 6 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 7
MikamiUitOpen 0:d310bb78455d 8 #include "FileSelectorWav.hpp"
MikamiUitOpen 0:d310bb78455d 9
MikamiUitOpen 0:d310bb78455d 10 namespace Mikami
MikamiUitOpen 0:d310bb78455d 11 {
MikamiUitOpen 2:511479736d6e 12 FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
MikamiUitOpen 2:511479736d6e 13 int maxNameLength, SD_WavReader &reader)
MikamiUitOpen 2:511479736d6e 14 : X_(x0), Y_(y0),
MikamiUitOpen 2:511479736d6e 15 MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength),
MikamiUitOpen 2:511479736d6e 16 fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_),
MikamiUitOpen 2:511479736d6e 17 next_(50, 238, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24),
MikamiUitOpen 2:511479736d6e 18 pageLabel_(210, 250, Label::LEFT, Font16),
MikamiUitOpen 2:511479736d6e 19 lcd_(GuiBase::GetLcdPtr()), sdReader_(reader), page_(1)
MikamiUitOpen 2:511479736d6e 20 {
MikamiUitOpen 2:511479736d6e 21 Array<string> nonString(MAX_LIST_PAGE_, "");
MikamiUitOpen 2:511479736d6e 22 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_,
MikamiUitOpen 2:511479736d6e 23 nonString, 0, V_L_-W_H_, 1,
MikamiUitOpen 2:511479736d6e 24 -1, Font12, 0, GuiBase::ENUM_BACK,
MikamiUitOpen 2:511479736d6e 25 BASE_COLOR_, TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 26 rect_->EraseAll();
MikamiUitOpen 2:511479736d6e 27 next_.EraseAll();
MikamiUitOpen 2:511479736d6e 28
MikamiUitOpen 2:511479736d6e 29 // Label を生成
MikamiUitOpen 2:511479736d6e 30 for (int n=0; n<MAX_LIST_PAGE_; n++)
MikamiUitOpen 2:511479736d6e 31 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
MikamiUitOpen 2:511479736d6e 32 Label::LEFT, Font16, BASE_COLOR_);
MikamiUitOpen 2:511479736d6e 33 }
MikamiUitOpen 2:511479736d6e 34
MikamiUitOpen 2:511479736d6e 35 FileSelector::~FileSelector()
MikamiUitOpen 2:511479736d6e 36 {
MikamiUitOpen 2:511479736d6e 37 delete rect_;
MikamiUitOpen 2:511479736d6e 38 for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n];
MikamiUitOpen 2:511479736d6e 39 }
MikamiUitOpen 2:511479736d6e 40
MikamiUitOpen 0:d310bb78455d 41 bool FileSelector::CreateTable()
MikamiUitOpen 0:d310bb78455d 42 {
MikamiUitOpen 0:d310bb78455d 43 DIR* dp = opendir("/sd");
MikamiUitOpen 0:d310bb78455d 44 fileCount_ = 0;
MikamiUitOpen 0:d310bb78455d 45 if (dp != NULL)
MikamiUitOpen 0:d310bb78455d 46 {
MikamiUitOpen 0:d310bb78455d 47 dirent* entry;
MikamiUitOpen 0:d310bb78455d 48 for (int n=0; n<256; n++)
MikamiUitOpen 0:d310bb78455d 49 {
MikamiUitOpen 0:d310bb78455d 50 entry = readdir(dp);
MikamiUitOpen 0:d310bb78455d 51 if (entry == NULL) break;
MikamiUitOpen 0:d310bb78455d 52
MikamiUitOpen 0:d310bb78455d 53 string strName = entry->d_name;
MikamiUitOpen 0:d310bb78455d 54 if ( (strName.find(".wav") != string::npos) ||
MikamiUitOpen 0:d310bb78455d 55 (strName.find(".WAV") != string::npos) )
MikamiUitOpen 0:d310bb78455d 56 {
MikamiUitOpen 0:d310bb78455d 57 sdReader_.Open(strName); // ファイルオープン
MikamiUitOpen 0:d310bb78455d 58
MikamiUitOpen 0:d310bb78455d 59 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
MikamiUitOpen 0:d310bb78455d 60 if (sdReader_.IsWavFile())
MikamiUitOpen 0:d310bb78455d 61 fileNames_[fileCount_++] = strName;
MikamiUitOpen 0:d310bb78455d 62 sdReader_.Close();
MikamiUitOpen 0:d310bb78455d 63 }
MikamiUitOpen 0:d310bb78455d 64 if (fileCount_ >= MAX_FILES_) break;
MikamiUitOpen 0:d310bb78455d 65 }
MikamiUitOpen 0:d310bb78455d 66 closedir(dp);
MikamiUitOpen 0:d310bb78455d 67 }
MikamiUitOpen 0:d310bb78455d 68 else
MikamiUitOpen 0:d310bb78455d 69 return false;
MikamiUitOpen 0:d310bb78455d 70 if (fileCount_ == 0) return false;
MikamiUitOpen 0:d310bb78455d 71
MikamiUitOpen 2:511479736d6e 72 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 73 maxPage_ = (m.rem == 0) ? m.quot : m.quot+1;
MikamiUitOpen 2:511479736d6e 74 rect_->EraseAll();
MikamiUitOpen 0:d310bb78455d 75 return true;
MikamiUitOpen 0:d310bb78455d 76 }
MikamiUitOpen 0:d310bb78455d 77
MikamiUitOpen 0:d310bb78455d 78 // ファイルを選択する
MikamiUitOpen 0:d310bb78455d 79 bool FileSelector::Select(string &fileName)
MikamiUitOpen 0:d310bb78455d 80 {
MikamiUitOpen 2:511479736d6e 81 int m;
MikamiUitOpen 2:511479736d6e 82 if (next_.GetTouchedNumber(m))
MikamiUitOpen 2:511479736d6e 83 {
MikamiUitOpen 2:511479736d6e 84 if (m==0) page_--;
MikamiUitOpen 2:511479736d6e 85 else page_++;
MikamiUitOpen 2:511479736d6e 86 DisplayFileList(false);
MikamiUitOpen 2:511479736d6e 87 }
MikamiUitOpen 2:511479736d6e 88
MikamiUitOpen 0:d310bb78455d 89 int n;
MikamiUitOpen 0:d310bb78455d 90 if (rect_->GetTouchedNumber(n))
MikamiUitOpen 0:d310bb78455d 91 {
MikamiUitOpen 2:511479736d6e 92 int k = (page_ - 1)*MAX_LIST_PAGE_ + n;
MikamiUitOpen 2:511479736d6e 93 fileNameLabels_[n]->Draw(GetFileNameNoExt(k), TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 94 fileName = fileNames_[k];
MikamiUitOpen 0:d310bb78455d 95 return true;
MikamiUitOpen 0:d310bb78455d 96 }
MikamiUitOpen 0:d310bb78455d 97 else
MikamiUitOpen 0:d310bb78455d 98 return false;
MikamiUitOpen 0:d310bb78455d 99 }
MikamiUitOpen 0:d310bb78455d 100
MikamiUitOpen 0:d310bb78455d 101 // ファイルの一覧の表示
MikamiUitOpen 0:d310bb78455d 102 void FileSelector::DisplayFileList(bool sortEnable)
MikamiUitOpen 0:d310bb78455d 103 {
MikamiUitOpen 0:d310bb78455d 104 if (sortEnable)
MikamiUitOpen 0:d310bb78455d 105 std::sort((string *)fileNames_,
MikamiUitOpen 0:d310bb78455d 106 (string *)fileNames_+fileCount_);
MikamiUitOpen 0:d310bb78455d 107
MikamiUitOpen 0:d310bb78455d 108 Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_);
MikamiUitOpen 2:511479736d6e 109
MikamiUitOpen 2:511479736d6e 110 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 111 int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem;
MikamiUitOpen 2:511479736d6e 112 for (int n=0; n<count; n++) rect_->Draw(n);
MikamiUitOpen 2:511479736d6e 113 for (int n=0; n<count; n++)
MikamiUitOpen 2:511479736d6e 114 fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_));
MikamiUitOpen 2:511479736d6e 115
MikamiUitOpen 2:511479736d6e 116 // 前のページ,次のページの選択ボタンなどを表示する
MikamiUitOpen 2:511479736d6e 117 next_.ActivateAll();
MikamiUitOpen 2:511479736d6e 118 next_.DrawAll();
MikamiUitOpen 2:511479736d6e 119 if (page_ == 1) next_.Inactivate(0);
MikamiUitOpen 2:511479736d6e 120 if (page_ == maxPage_) next_.Inactivate(1);
MikamiUitOpen 2:511479736d6e 121 char page[6];
MikamiUitOpen 2:511479736d6e 122 sprintf(page, "%d/%d", page_, maxPage_);
MikamiUitOpen 2:511479736d6e 123 pageLabel_.Draw(page);
MikamiUitOpen 0:d310bb78455d 124 }
MikamiUitOpen 0:d310bb78455d 125
MikamiUitOpen 0:d310bb78455d 126 // ファイルの一覧の消去
MikamiUitOpen 0:d310bb78455d 127 void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
MikamiUitOpen 0:d310bb78455d 128 uint32_t color)
MikamiUitOpen 0:d310bb78455d 129 {
MikamiUitOpen 0:d310bb78455d 130 lcd_->SetTextColor(color);
MikamiUitOpen 0:d310bb78455d 131 lcd_->FillRect(x, y, width, height);
MikamiUitOpen 0:d310bb78455d 132 }
MikamiUitOpen 0:d310bb78455d 133
MikamiUitOpen 0:d310bb78455d 134 // 拡張子を削除した文字列を取得
MikamiUitOpen 0:d310bb78455d 135 string FileSelector::GetFileNameNoExt(int n)
MikamiUitOpen 0:d310bb78455d 136 {
MikamiUitOpen 0:d310bb78455d 137 string name = fileNames_[n];
MikamiUitOpen 0:d310bb78455d 138 name.erase(name.find("."));
MikamiUitOpen 0:d310bb78455d 139 return name.substr(0, MAX_NAME_LENGTH_);
MikamiUitOpen 0:d310bb78455d 140 }
MikamiUitOpen 0:d310bb78455d 141 }