revised version of F746_SD_GraphicEqualizer
Dependencies: BSP_DISCO_F746NG F746_GUI F746_SAI_IO FrequencyResponseDrawer LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed
Fork of F746_SD_GraphicEqualizer by
MyClasses_Functions/FileSelectorWav.hpp@12:87f6955b5a80, 2016-07-07 (annotated)
- Committer:
- edamame22
- Date:
- Thu Jul 07 05:58:52 2016 +0000
- Revision:
- 12:87f6955b5a80
- Parent:
- 10:fc6367c2ffcf
added highlighted line for track selection
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 8:12aa05f3cc24 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 8:12aa05f3cc24 | 2 | // FileSelector class |
MikamiUitOpen | 8:12aa05f3cc24 | 3 | // SD カード内のファイル名の一覧を表示し,ファイルを選択する |
MikamiUitOpen | 8:12aa05f3cc24 | 4 | // |
MikamiUitOpen | 8:12aa05f3cc24 | 5 | // 2016/04/18, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 8:12aa05f3cc24 | 6 | //-------------------------------------------------------------- |
MikamiUitOpen | 8:12aa05f3cc24 | 7 | |
MikamiUitOpen | 8:12aa05f3cc24 | 8 | #ifndef FILE_SELECTOR_HPP |
MikamiUitOpen | 8:12aa05f3cc24 | 9 | #define FILE_SELECTOR_HPP |
MikamiUitOpen | 8:12aa05f3cc24 | 10 | |
MikamiUitOpen | 8:12aa05f3cc24 | 11 | #include "mbed.h" |
MikamiUitOpen | 8:12aa05f3cc24 | 12 | #include "Label.hpp" |
MikamiUitOpen | 8:12aa05f3cc24 | 13 | #include "ButtonGroup.hpp" |
MikamiUitOpen | 8:12aa05f3cc24 | 14 | #include "SD_WavReader.hpp" |
MikamiUitOpen | 8:12aa05f3cc24 | 15 | #include "SDFileSystem.h" |
MikamiUitOpen | 8:12aa05f3cc24 | 16 | #include <algorithm> // sort() で使用 |
MikamiUitOpen | 8:12aa05f3cc24 | 17 | #include <string> |
MikamiUitOpen | 8:12aa05f3cc24 | 18 | |
edamame22 | 10:fc6367c2ffcf | 19 | |
MikamiUitOpen | 8:12aa05f3cc24 | 20 | namespace Mikami |
MikamiUitOpen | 8:12aa05f3cc24 | 21 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 22 | class FileSelector |
MikamiUitOpen | 8:12aa05f3cc24 | 23 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 24 | public: |
MikamiUitOpen | 8:12aa05f3cc24 | 25 | FileSelector(uint8_t x0, uint8_t y0, int maxFiles, |
MikamiUitOpen | 8:12aa05f3cc24 | 26 | int maxNameLength, SD_WavReader &reader) |
MikamiUitOpen | 8:12aa05f3cc24 | 27 | : X_(x0), Y_(y0), W_H_(24), V_L_(36), |
MikamiUitOpen | 8:12aa05f3cc24 | 28 | MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), |
edamame22 | 10:fc6367c2ffcf | 29 | BASE_COLOR_(0xFFDBAD17), TOUCHED_COLOR_(0xFFF8F8FB), |
MikamiUitOpen | 8:12aa05f3cc24 | 30 | fileNames_(new string[maxFiles]), |
MikamiUitOpen | 8:12aa05f3cc24 | 31 | sortedFileNames_(new string[maxFiles]), |
MikamiUitOpen | 8:12aa05f3cc24 | 32 | nonString_(NULL), rect_(NULL), fileNameLabels_(NULL), |
MikamiUitOpen | 8:12aa05f3cc24 | 33 | lcd_(GuiBase::GetLcdPtr()), |
MikamiUitOpen | 8:12aa05f3cc24 | 34 | sdReader_(reader), prevFileCount_(0), prev_(-1) {} |
MikamiUitOpen | 8:12aa05f3cc24 | 35 | |
MikamiUitOpen | 8:12aa05f3cc24 | 36 | ~FileSelector() |
MikamiUitOpen | 8:12aa05f3cc24 | 37 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 38 | for (int n=0; n<fileCount_; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 39 | delete fileNameLabels_[n]; |
MikamiUitOpen | 8:12aa05f3cc24 | 40 | delete[] fileNameLabels_; |
MikamiUitOpen | 8:12aa05f3cc24 | 41 | delete rect_; |
MikamiUitOpen | 8:12aa05f3cc24 | 42 | delete[] nonString_; |
MikamiUitOpen | 8:12aa05f3cc24 | 43 | delete[] sortedFileNames_; |
MikamiUitOpen | 8:12aa05f3cc24 | 44 | delete[] fileNames_; |
MikamiUitOpen | 8:12aa05f3cc24 | 45 | } |
edamame22 | 10:fc6367c2ffcf | 46 | // ren: show a string |
edamame22 | 10:fc6367c2ffcf | 47 | void ren_Msg(int pos, char msg[]) |
edamame22 | 10:fc6367c2ffcf | 48 | { int lin, y_pos[7]= {0,70,130,160,190,220,250}; |
edamame22 | 10:fc6367c2ffcf | 49 | if(pos<0) lin=0; |
edamame22 | 10:fc6367c2ffcf | 50 | else if (pos>6) lin=6; |
edamame22 | 10:fc6367c2ffcf | 51 | else lin=pos; |
edamame22 | 10:fc6367c2ffcf | 52 | Label renLabel(240, y_pos[lin], msg, Label::CENTER,Font20); |
edamame22 | 10:fc6367c2ffcf | 53 | } |
edamame22 | 10:fc6367c2ffcf | 54 | |
MikamiUitOpen | 8:12aa05f3cc24 | 55 | bool CreateTable() |
MikamiUitOpen | 8:12aa05f3cc24 | 56 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 57 | DIR* dp = opendir("/sd"); |
MikamiUitOpen | 8:12aa05f3cc24 | 58 | fileCount_ = 0; |
MikamiUitOpen | 8:12aa05f3cc24 | 59 | if (dp != NULL) |
MikamiUitOpen | 8:12aa05f3cc24 | 60 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 61 | dirent* entry; |
edamame22 | 10:fc6367c2ffcf | 62 | // ren: change n<256 to n<2560 |
edamame22 | 10:fc6367c2ffcf | 63 | for (int n=0; n<2560; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 64 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 65 | entry = readdir(dp); |
MikamiUitOpen | 8:12aa05f3cc24 | 66 | if (entry == NULL) break; |
MikamiUitOpen | 8:12aa05f3cc24 | 67 | |
MikamiUitOpen | 8:12aa05f3cc24 | 68 | string strName = entry->d_name; |
MikamiUitOpen | 8:12aa05f3cc24 | 69 | if ( (strName.find(".wav") != string::npos) || |
MikamiUitOpen | 8:12aa05f3cc24 | 70 | (strName.find(".WAV") != string::npos) ) |
MikamiUitOpen | 8:12aa05f3cc24 | 71 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 72 | sdReader_.Open(strName); // ファイルオープン |
edamame22 | 10:fc6367c2ffcf | 73 | /**{ |
edamame22 | 10:fc6367c2ffcf | 74 | char tmpmsg[500]; |
edamame22 | 10:fc6367c2ffcf | 75 | sprintf(tmpmsg, "1..found a file: %s", strName.c_str()); |
edamame22 | 10:fc6367c2ffcf | 76 | ren_Msg(1,tmpmsg); |
edamame22 | 10:fc6367c2ffcf | 77 | sprintf(tmpmsg, "2..fileCount_: %d", fileCount_); |
edamame22 | 10:fc6367c2ffcf | 78 | ren_Msg(2,tmpmsg); |
edamame22 | 10:fc6367c2ffcf | 79 | }**/ |
MikamiUitOpen | 8:12aa05f3cc24 | 80 | // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外 |
MikamiUitOpen | 8:12aa05f3cc24 | 81 | if (sdReader_.IsWavFile()) |
MikamiUitOpen | 8:12aa05f3cc24 | 82 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 83 | fileNames_[fileCount_] = strName; |
MikamiUitOpen | 8:12aa05f3cc24 | 84 | fileCount_++; |
MikamiUitOpen | 8:12aa05f3cc24 | 85 | } |
edamame22 | 10:fc6367c2ffcf | 86 | /**{ |
edamame22 | 10:fc6367c2ffcf | 87 | char tmpmsg[500]; |
edamame22 | 10:fc6367c2ffcf | 88 | sprintf(tmpmsg, "fileCount_: %d", fileCount_); |
edamame22 | 10:fc6367c2ffcf | 89 | ren_Msg(3, tmpmsg); |
edamame22 | 10:fc6367c2ffcf | 90 | }**/ |
MikamiUitOpen | 8:12aa05f3cc24 | 91 | sdReader_.Close(); |
MikamiUitOpen | 8:12aa05f3cc24 | 92 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 93 | |
MikamiUitOpen | 8:12aa05f3cc24 | 94 | |
MikamiUitOpen | 8:12aa05f3cc24 | 95 | if (fileCount_ >= MAX_FILES_) break; |
MikamiUitOpen | 8:12aa05f3cc24 | 96 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 97 | closedir(dp); |
MikamiUitOpen | 8:12aa05f3cc24 | 98 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 99 | else |
MikamiUitOpen | 8:12aa05f3cc24 | 100 | return false; |
MikamiUitOpen | 8:12aa05f3cc24 | 101 | |
MikamiUitOpen | 8:12aa05f3cc24 | 102 | if (fileCount_ == 0) return false; |
MikamiUitOpen | 8:12aa05f3cc24 | 103 | |
MikamiUitOpen | 8:12aa05f3cc24 | 104 | if (nonString_ == NULL) delete[] nonString_; |
MikamiUitOpen | 8:12aa05f3cc24 | 105 | nonString_ = new string[fileCount_]; |
MikamiUitOpen | 8:12aa05f3cc24 | 106 | for (int n=0; n<fileCount_; n++) nonString_[n] = ""; |
MikamiUitOpen | 8:12aa05f3cc24 | 107 | |
MikamiUitOpen | 8:12aa05f3cc24 | 108 | if (rect_ != NULL) delete rect_; |
MikamiUitOpen | 8:12aa05f3cc24 | 109 | rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_, |
MikamiUitOpen | 8:12aa05f3cc24 | 110 | nonString_, 0, V_L_-W_H_, 1, |
edamame22 | 10:fc6367c2ffcf | 111 | -1, true,Font12, 0, GuiBase::ENUM_BACK, |
MikamiUitOpen | 8:12aa05f3cc24 | 112 | BASE_COLOR_, TOUCHED_COLOR_); |
MikamiUitOpen | 8:12aa05f3cc24 | 113 | for (int n=0; n<fileCount_; n++) rect_->Erase(n); |
MikamiUitOpen | 8:12aa05f3cc24 | 114 | CreateLabels(); |
MikamiUitOpen | 8:12aa05f3cc24 | 115 | prevFileCount_ = fileCount_; |
edamame22 | 10:fc6367c2ffcf | 116 | |
MikamiUitOpen | 8:12aa05f3cc24 | 117 | return true; |
MikamiUitOpen | 8:12aa05f3cc24 | 118 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 119 | |
MikamiUitOpen | 8:12aa05f3cc24 | 120 | // ファイルを選択する |
edamame22 | 10:fc6367c2ffcf | 121 | bool Select(string fileList[],int *idx) |
MikamiUitOpen | 8:12aa05f3cc24 | 122 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 123 | int n; |
MikamiUitOpen | 8:12aa05f3cc24 | 124 | if (rect_->GetTouchedNumber(n)) |
MikamiUitOpen | 8:12aa05f3cc24 | 125 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 126 | fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_); |
MikamiUitOpen | 8:12aa05f3cc24 | 127 | if ((prev_ >= 0) && (prev_ != n)) |
MikamiUitOpen | 8:12aa05f3cc24 | 128 | fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_)); |
MikamiUitOpen | 8:12aa05f3cc24 | 129 | prev_ = n; |
edamame22 | 10:fc6367c2ffcf | 130 | *idx = n; |
edamame22 | 10:fc6367c2ffcf | 131 | for (int n=0; n<fileCount_; n++) fileList[n] = sortedFileNames_[n]; |
edamame22 | 10:fc6367c2ffcf | 132 | // fileName = sortedFileNames_[n]; |
edamame22 | 10:fc6367c2ffcf | 133 | //printf("\nSelected file : %s", fileName); |
MikamiUitOpen | 8:12aa05f3cc24 | 134 | return true; |
MikamiUitOpen | 8:12aa05f3cc24 | 135 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 136 | else |
MikamiUitOpen | 8:12aa05f3cc24 | 137 | return false; |
MikamiUitOpen | 8:12aa05f3cc24 | 138 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 139 | |
MikamiUitOpen | 8:12aa05f3cc24 | 140 | // ファイルの一覧の表示 |
edamame22 | 12:87f6955b5a80 | 141 | void DisplayFileList(int highlighted, bool sort = true) |
MikamiUitOpen | 8:12aa05f3cc24 | 142 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 143 | for (int n=0; n<fileCount_; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 144 | sortedFileNames_[n] = fileNames_[n]; |
MikamiUitOpen | 8:12aa05f3cc24 | 145 | if (sort) |
MikamiUitOpen | 8:12aa05f3cc24 | 146 | std::sort(sortedFileNames_, sortedFileNames_+fileCount_); |
MikamiUitOpen | 8:12aa05f3cc24 | 147 | |
MikamiUitOpen | 8:12aa05f3cc24 | 148 | Erase(X_, 0, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 288); |
MikamiUitOpen | 8:12aa05f3cc24 | 149 | rect_->DrawAll(); |
MikamiUitOpen | 8:12aa05f3cc24 | 150 | for (int n=0; n<fileCount_; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 151 | fileNameLabels_[n]->Draw(GetFileNameNoExt(n)); |
edamame22 | 12:87f6955b5a80 | 152 | if((highlighted>-1) && (highlighted < fileCount_)) |
edamame22 | 12:87f6955b5a80 | 153 | { |
edamame22 | 12:87f6955b5a80 | 154 | fileNameLabels_[highlighted]->Draw(GetFileNameNoExt(highlighted), TOUCHED_COLOR_); |
edamame22 | 12:87f6955b5a80 | 155 | prev_ = highlighted; |
edamame22 | 12:87f6955b5a80 | 156 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 157 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 158 | |
MikamiUitOpen | 8:12aa05f3cc24 | 159 | void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height, |
MikamiUitOpen | 8:12aa05f3cc24 | 160 | uint32_t color = GuiBase::ENUM_BACK) |
MikamiUitOpen | 8:12aa05f3cc24 | 161 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 162 | lcd_->SetTextColor(color); |
MikamiUitOpen | 8:12aa05f3cc24 | 163 | lcd_->FillRect(x, y, width, height); |
MikamiUitOpen | 8:12aa05f3cc24 | 164 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 165 | |
MikamiUitOpen | 8:12aa05f3cc24 | 166 | private: |
MikamiUitOpen | 8:12aa05f3cc24 | 167 | const uint8_t X_, Y_, W_H_, V_L_; |
MikamiUitOpen | 8:12aa05f3cc24 | 168 | const int MAX_FILES_; |
MikamiUitOpen | 8:12aa05f3cc24 | 169 | const int MAX_NAME_LENGTH_; |
MikamiUitOpen | 8:12aa05f3cc24 | 170 | const uint32_t BASE_COLOR_; |
MikamiUitOpen | 8:12aa05f3cc24 | 171 | const uint32_t TOUCHED_COLOR_; |
MikamiUitOpen | 8:12aa05f3cc24 | 172 | |
MikamiUitOpen | 8:12aa05f3cc24 | 173 | string *fileNames_; |
MikamiUitOpen | 8:12aa05f3cc24 | 174 | string *sortedFileNames_; |
MikamiUitOpen | 8:12aa05f3cc24 | 175 | string *nonString_; |
MikamiUitOpen | 8:12aa05f3cc24 | 176 | ButtonGroup *rect_; |
MikamiUitOpen | 8:12aa05f3cc24 | 177 | Label **fileNameLabels_; |
MikamiUitOpen | 8:12aa05f3cc24 | 178 | LCD_DISCO_F746NG *lcd_; |
MikamiUitOpen | 8:12aa05f3cc24 | 179 | SD_WavReader &sdReader_; |
MikamiUitOpen | 8:12aa05f3cc24 | 180 | int fileCount_, prevFileCount_; |
MikamiUitOpen | 8:12aa05f3cc24 | 181 | int prev_; |
MikamiUitOpen | 8:12aa05f3cc24 | 182 | |
MikamiUitOpen | 8:12aa05f3cc24 | 183 | // Label を生成 |
MikamiUitOpen | 8:12aa05f3cc24 | 184 | void CreateLabels() |
MikamiUitOpen | 8:12aa05f3cc24 | 185 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 186 | if (fileNameLabels_ != NULL) |
MikamiUitOpen | 8:12aa05f3cc24 | 187 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 188 | for (int n=0; n<prevFileCount_; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 189 | delete fileNameLabels_[n]; |
MikamiUitOpen | 8:12aa05f3cc24 | 190 | delete[] fileNameLabels_; |
MikamiUitOpen | 8:12aa05f3cc24 | 191 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 192 | fileNameLabels_ = new Label *[fileCount_+1]; |
MikamiUitOpen | 8:12aa05f3cc24 | 193 | for (int n=0; n<fileCount_; n++) |
MikamiUitOpen | 8:12aa05f3cc24 | 194 | fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "", |
MikamiUitOpen | 8:12aa05f3cc24 | 195 | Label::LEFT, Font16, |
MikamiUitOpen | 8:12aa05f3cc24 | 196 | BASE_COLOR_); |
MikamiUitOpen | 8:12aa05f3cc24 | 197 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 198 | |
MikamiUitOpen | 8:12aa05f3cc24 | 199 | // 拡張子を削除した文字列を取得 |
MikamiUitOpen | 8:12aa05f3cc24 | 200 | string GetFileNameNoExt(int n) |
MikamiUitOpen | 8:12aa05f3cc24 | 201 | { |
MikamiUitOpen | 8:12aa05f3cc24 | 202 | string name = sortedFileNames_[n]; |
MikamiUitOpen | 8:12aa05f3cc24 | 203 | name.erase(name.find(".")); |
MikamiUitOpen | 8:12aa05f3cc24 | 204 | return name.substr(0, MAX_NAME_LENGTH_); |
MikamiUitOpen | 8:12aa05f3cc24 | 205 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 206 | |
MikamiUitOpen | 8:12aa05f3cc24 | 207 | // disallow copy constructor and assignment operator |
MikamiUitOpen | 8:12aa05f3cc24 | 208 | FileSelector(const FileSelector&); |
MikamiUitOpen | 8:12aa05f3cc24 | 209 | FileSelector& operator=(const FileSelector&); |
MikamiUitOpen | 8:12aa05f3cc24 | 210 | }; |
MikamiUitOpen | 8:12aa05f3cc24 | 211 | } |
MikamiUitOpen | 8:12aa05f3cc24 | 212 | #endif // FILE_SELECTOR_HPP |