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:
Thu Mar 23 02:58:48 2017 +0000
Revision:
17:abfd6af9a236
Parent:
12:f73e11831c1c
18

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 17:abfd6af9a236 5 // 2017/03/23, Copyright (c) 2017 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 17:abfd6af9a236 19 lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1),
MikamiUitOpen 17:abfd6af9a236 20 nOld_(-1), kOld_(-1)
MikamiUitOpen 2:511479736d6e 21 {
MikamiUitOpen 2:511479736d6e 22 Array<string> nonString(MAX_LIST_PAGE_, "");
MikamiUitOpen 2:511479736d6e 23 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_,
MikamiUitOpen 2:511479736d6e 24 nonString, 0, V_L_-W_H_, 1,
MikamiUitOpen 2:511479736d6e 25 -1, Font12, 0, GuiBase::ENUM_BACK,
MikamiUitOpen 2:511479736d6e 26 BASE_COLOR_, TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 27 rect_->EraseAll();
MikamiUitOpen 2:511479736d6e 28 next_.EraseAll();
MikamiUitOpen 2:511479736d6e 29
MikamiUitOpen 2:511479736d6e 30 // Label を生成
MikamiUitOpen 2:511479736d6e 31 for (int n=0; n<MAX_LIST_PAGE_; n++)
MikamiUitOpen 2:511479736d6e 32 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
MikamiUitOpen 2:511479736d6e 33 Label::LEFT, Font16, BASE_COLOR_);
MikamiUitOpen 2:511479736d6e 34 }
MikamiUitOpen 2:511479736d6e 35
MikamiUitOpen 2:511479736d6e 36 FileSelector::~FileSelector()
MikamiUitOpen 2:511479736d6e 37 {
MikamiUitOpen 2:511479736d6e 38 delete rect_;
MikamiUitOpen 2:511479736d6e 39 for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n];
MikamiUitOpen 2:511479736d6e 40 }
MikamiUitOpen 2:511479736d6e 41
MikamiUitOpen 17:abfd6af9a236 42 // ファイルの一覧表を作る.WAV ファイルが存在しない場合は false を返す
MikamiUitOpen 0:d310bb78455d 43 bool FileSelector::CreateTable()
MikamiUitOpen 0:d310bb78455d 44 {
MikamiUitOpen 0:d310bb78455d 45 DIR* dp = opendir("/sd");
MikamiUitOpen 0:d310bb78455d 46 fileCount_ = 0;
MikamiUitOpen 0:d310bb78455d 47 if (dp != NULL)
MikamiUitOpen 0:d310bb78455d 48 {
MikamiUitOpen 0:d310bb78455d 49 dirent* entry;
MikamiUitOpen 0:d310bb78455d 50 for (int n=0; n<256; n++)
MikamiUitOpen 0:d310bb78455d 51 {
MikamiUitOpen 0:d310bb78455d 52 entry = readdir(dp);
MikamiUitOpen 0:d310bb78455d 53 if (entry == NULL) break;
MikamiUitOpen 0:d310bb78455d 54
MikamiUitOpen 0:d310bb78455d 55 string strName = entry->d_name;
MikamiUitOpen 0:d310bb78455d 56 if ( (strName.find(".wav") != string::npos) ||
MikamiUitOpen 0:d310bb78455d 57 (strName.find(".WAV") != string::npos) )
MikamiUitOpen 0:d310bb78455d 58 {
MikamiUitOpen 0:d310bb78455d 59 sdReader_.Open(strName); // ファイルオープン
MikamiUitOpen 0:d310bb78455d 60
MikamiUitOpen 0:d310bb78455d 61 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
MikamiUitOpen 0:d310bb78455d 62 if (sdReader_.IsWavFile())
MikamiUitOpen 0:d310bb78455d 63 fileNames_[fileCount_++] = strName;
MikamiUitOpen 0:d310bb78455d 64 sdReader_.Close();
MikamiUitOpen 0:d310bb78455d 65 }
MikamiUitOpen 0:d310bb78455d 66 if (fileCount_ >= MAX_FILES_) break;
MikamiUitOpen 0:d310bb78455d 67 }
MikamiUitOpen 17:abfd6af9a236 68 closedir(dp);
MikamiUitOpen 0:d310bb78455d 69 }
MikamiUitOpen 0:d310bb78455d 70 else
MikamiUitOpen 17:abfd6af9a236 71 return false; // SD カードが装着されていない場合
MikamiUitOpen 17:abfd6af9a236 72 if (fileCount_ == 0) return false; // 該当する WAV ファイルが存在しない場合
MikamiUitOpen 0:d310bb78455d 73
MikamiUitOpen 2:511479736d6e 74 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 75 maxPage_ = (m.rem == 0) ? m.quot : m.quot+1;
MikamiUitOpen 17:abfd6af9a236 76 return true; // 該当する WAV ファイルが存在する場合
MikamiUitOpen 0:d310bb78455d 77 }
MikamiUitOpen 0:d310bb78455d 78
MikamiUitOpen 0:d310bb78455d 79 // ファイルを選択する
MikamiUitOpen 0:d310bb78455d 80 bool FileSelector::Select(string &fileName)
MikamiUitOpen 0:d310bb78455d 81 {
MikamiUitOpen 2:511479736d6e 82 int m;
MikamiUitOpen 2:511479736d6e 83 if (next_.GetTouchedNumber(m))
MikamiUitOpen 2:511479736d6e 84 {
MikamiUitOpen 2:511479736d6e 85 if (m==0) page_--;
MikamiUitOpen 2:511479736d6e 86 else page_++;
MikamiUitOpen 2:511479736d6e 87 DisplayFileList(false);
MikamiUitOpen 17:abfd6af9a236 88 nOld_ = -1;
MikamiUitOpen 17:abfd6af9a236 89 wait_ms(300);
MikamiUitOpen 2:511479736d6e 90 }
MikamiUitOpen 2:511479736d6e 91
MikamiUitOpen 0:d310bb78455d 92 int n;
MikamiUitOpen 0:d310bb78455d 93 if (rect_->GetTouchedNumber(n))
MikamiUitOpen 0:d310bb78455d 94 {
MikamiUitOpen 2:511479736d6e 95 int k = (page_ - 1)*MAX_LIST_PAGE_ + n;
MikamiUitOpen 17:abfd6af9a236 96 fileNameLabels_[n]->Draw(GetFileNameNoExt(k),
MikamiUitOpen 17:abfd6af9a236 97 TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 98 fileName = fileNames_[k];
MikamiUitOpen 17:abfd6af9a236 99 // 同じページで以前に選択されているファイル名の色を戻す
MikamiUitOpen 17:abfd6af9a236 100 if (nOld_ != -1)
MikamiUitOpen 17:abfd6af9a236 101 fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_),
MikamiUitOpen 17:abfd6af9a236 102 BASE_COLOR_);
MikamiUitOpen 17:abfd6af9a236 103 if (page_ == maxPage_) // 最後のページで余分な四角形を消去
MikamiUitOpen 17:abfd6af9a236 104 for (int j=fileCount_ % MAX_LIST_PAGE_ + 1;
MikamiUitOpen 17:abfd6af9a236 105 j < MAX_LIST_PAGE_; j++) rect_->Erase(j);
MikamiUitOpen 17:abfd6af9a236 106 nOld_ = n;
MikamiUitOpen 17:abfd6af9a236 107 kOld_ = k;
MikamiUitOpen 17:abfd6af9a236 108 wait_ms(300);
MikamiUitOpen 0:d310bb78455d 109 return true;
MikamiUitOpen 0:d310bb78455d 110 }
MikamiUitOpen 0:d310bb78455d 111 else
MikamiUitOpen 0:d310bb78455d 112 return false;
MikamiUitOpen 0:d310bb78455d 113 }
MikamiUitOpen 0:d310bb78455d 114
MikamiUitOpen 0:d310bb78455d 115 // ファイルの一覧の表示
MikamiUitOpen 0:d310bb78455d 116 void FileSelector::DisplayFileList(bool sortEnable)
MikamiUitOpen 0:d310bb78455d 117 {
MikamiUitOpen 0:d310bb78455d 118 if (sortEnable)
MikamiUitOpen 0:d310bb78455d 119 std::sort((string *)fileNames_,
MikamiUitOpen 0:d310bb78455d 120 (string *)fileNames_+fileCount_);
MikamiUitOpen 0:d310bb78455d 121
MikamiUitOpen 0:d310bb78455d 122 Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_);
MikamiUitOpen 2:511479736d6e 123
MikamiUitOpen 2:511479736d6e 124 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 125 int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem;
MikamiUitOpen 2:511479736d6e 126 for (int n=0; n<count; n++) rect_->Draw(n);
MikamiUitOpen 2:511479736d6e 127 for (int n=0; n<count; n++)
MikamiUitOpen 2:511479736d6e 128 fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_));
MikamiUitOpen 2:511479736d6e 129
MikamiUitOpen 2:511479736d6e 130 // 前のページ,次のページの選択ボタンなどを表示する
MikamiUitOpen 17:abfd6af9a236 131 next_.InactivateAll();
MikamiUitOpen 17:abfd6af9a236 132 if (page_ > 1) next_.Activate(0); // "<" 有効
MikamiUitOpen 17:abfd6af9a236 133 if (page_ < maxPage_) next_.Activate(1); // ">" 有効
MikamiUitOpen 2:511479736d6e 134 char page[6];
MikamiUitOpen 2:511479736d6e 135 sprintf(page, "%d/%d", page_, maxPage_);
MikamiUitOpen 2:511479736d6e 136 pageLabel_.Draw(page);
MikamiUitOpen 0:d310bb78455d 137 }
MikamiUitOpen 0:d310bb78455d 138
MikamiUitOpen 0:d310bb78455d 139 // ファイルの一覧の消去
MikamiUitOpen 0:d310bb78455d 140 void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
MikamiUitOpen 11:c33c711a5712 141 uint32_t color)
MikamiUitOpen 0:d310bb78455d 142 {
MikamiUitOpen 12:f73e11831c1c 143 lcd_.SetTextColor(color);
MikamiUitOpen 12:f73e11831c1c 144 lcd_.FillRect(x, y, width, height);
MikamiUitOpen 0:d310bb78455d 145 }
MikamiUitOpen 0:d310bb78455d 146
MikamiUitOpen 11:c33c711a5712 147 // 拡張子を削除したファイル名を取得
MikamiUitOpen 0:d310bb78455d 148 string FileSelector::GetFileNameNoExt(int n)
MikamiUitOpen 0:d310bb78455d 149 {
MikamiUitOpen 0:d310bb78455d 150 string name = fileNames_[n];
MikamiUitOpen 3:dd3b8a21417b 151 int k = name.rfind(".");
MikamiUitOpen 11:c33c711a5712 152 if (k != string::npos)
MikamiUitOpen 11:c33c711a5712 153 return name.erase(k);
MikamiUitOpen 11:c33c711a5712 154 else
MikamiUitOpen 11:c33c711a5712 155 return name;
MikamiUitOpen 0:d310bb78455d 156 }
MikamiUitOpen 0:d310bb78455d 157 }
MikamiUitOpen 17:abfd6af9a236 158