SPKT
Dependencies: SDFileSystem_Warning_Fixed
Dependents: DISCO-F746_WAV_PLAYER WAV
FileSelectorWav.cpp@11:c33c711a5712, 2017-03-15 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Mar 15 23:45:48 2017 +0000
- Revision:
- 11:c33c711a5712
- Parent:
- 5:7c8f0fc9dfb6
- Child:
- 12:f73e11831c1c
12
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 | 5:7c8f0fc9dfb6 | 5 | // 2016/11/08, 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 | 5:7c8f0fc9dfb6 | 87 | wait_ms(200); |
MikamiUitOpen | 2:511479736d6e | 88 | } |
MikamiUitOpen | 2:511479736d6e | 89 | |
MikamiUitOpen | 0:d310bb78455d | 90 | int n; |
MikamiUitOpen | 0:d310bb78455d | 91 | if (rect_->GetTouchedNumber(n)) |
MikamiUitOpen | 0:d310bb78455d | 92 | { |
MikamiUitOpen | 2:511479736d6e | 93 | int k = (page_ - 1)*MAX_LIST_PAGE_ + n; |
MikamiUitOpen | 2:511479736d6e | 94 | fileNameLabels_[n]->Draw(GetFileNameNoExt(k), TOUCHED_COLOR_); |
MikamiUitOpen | 2:511479736d6e | 95 | fileName = fileNames_[k]; |
MikamiUitOpen | 0:d310bb78455d | 96 | return true; |
MikamiUitOpen | 0:d310bb78455d | 97 | } |
MikamiUitOpen | 0:d310bb78455d | 98 | else |
MikamiUitOpen | 0:d310bb78455d | 99 | return false; |
MikamiUitOpen | 0:d310bb78455d | 100 | } |
MikamiUitOpen | 0:d310bb78455d | 101 | |
MikamiUitOpen | 0:d310bb78455d | 102 | // ファイルの一覧の表示 |
MikamiUitOpen | 0:d310bb78455d | 103 | void FileSelector::DisplayFileList(bool sortEnable) |
MikamiUitOpen | 0:d310bb78455d | 104 | { |
MikamiUitOpen | 0:d310bb78455d | 105 | if (sortEnable) |
MikamiUitOpen | 0:d310bb78455d | 106 | std::sort((string *)fileNames_, |
MikamiUitOpen | 0:d310bb78455d | 107 | (string *)fileNames_+fileCount_); |
MikamiUitOpen | 0:d310bb78455d | 108 | |
MikamiUitOpen | 0:d310bb78455d | 109 | Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_); |
MikamiUitOpen | 2:511479736d6e | 110 | |
MikamiUitOpen | 2:511479736d6e | 111 | div_t m = div(fileCount_, MAX_LIST_PAGE_); |
MikamiUitOpen | 2:511479736d6e | 112 | int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem; |
MikamiUitOpen | 2:511479736d6e | 113 | for (int n=0; n<count; n++) rect_->Draw(n); |
MikamiUitOpen | 2:511479736d6e | 114 | for (int n=0; n<count; n++) |
MikamiUitOpen | 2:511479736d6e | 115 | fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_)); |
MikamiUitOpen | 2:511479736d6e | 116 | |
MikamiUitOpen | 2:511479736d6e | 117 | // 前のページ,次のページの選択ボタンなどを表示する |
MikamiUitOpen | 2:511479736d6e | 118 | next_.ActivateAll(); |
MikamiUitOpen | 2:511479736d6e | 119 | next_.DrawAll(); |
MikamiUitOpen | 2:511479736d6e | 120 | if (page_ == 1) next_.Inactivate(0); |
MikamiUitOpen | 2:511479736d6e | 121 | if (page_ == maxPage_) next_.Inactivate(1); |
MikamiUitOpen | 2:511479736d6e | 122 | char page[6]; |
MikamiUitOpen | 2:511479736d6e | 123 | sprintf(page, "%d/%d", page_, maxPage_); |
MikamiUitOpen | 2:511479736d6e | 124 | pageLabel_.Draw(page); |
MikamiUitOpen | 0:d310bb78455d | 125 | } |
MikamiUitOpen | 0:d310bb78455d | 126 | |
MikamiUitOpen | 0:d310bb78455d | 127 | // ファイルの一覧の消去 |
MikamiUitOpen | 0:d310bb78455d | 128 | void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height, |
MikamiUitOpen | 11:c33c711a5712 | 129 | uint32_t color) |
MikamiUitOpen | 0:d310bb78455d | 130 | { |
MikamiUitOpen | 0:d310bb78455d | 131 | lcd_->SetTextColor(color); |
MikamiUitOpen | 0:d310bb78455d | 132 | lcd_->FillRect(x, y, width, height); |
MikamiUitOpen | 0:d310bb78455d | 133 | } |
MikamiUitOpen | 0:d310bb78455d | 134 | |
MikamiUitOpen | 11:c33c711a5712 | 135 | // 拡張子を削除したファイル名を取得 |
MikamiUitOpen | 0:d310bb78455d | 136 | string FileSelector::GetFileNameNoExt(int n) |
MikamiUitOpen | 0:d310bb78455d | 137 | { |
MikamiUitOpen | 0:d310bb78455d | 138 | string name = fileNames_[n]; |
MikamiUitOpen | 3:dd3b8a21417b | 139 | int k = name.rfind("."); |
MikamiUitOpen | 11:c33c711a5712 | 140 | if (k != string::npos) |
MikamiUitOpen | 11:c33c711a5712 | 141 | return name.erase(k); |
MikamiUitOpen | 11:c33c711a5712 | 142 | else |
MikamiUitOpen | 11:c33c711a5712 | 143 | return name; |
MikamiUitOpen | 0:d310bb78455d | 144 | } |
MikamiUitOpen | 0:d310bb78455d | 145 | } |