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
FileSelectorWav.cpp@17:abfd6af9a236, 2017-03-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Mar 23 02:58:48 2017 +0000
- Revision:
- 17:abfd6af9a236
- Parent:
- 12:f73e11831c1c
18
Who changed what in which revision?
User | Revision | Line number | New 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 |