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 不韋 呂

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?

UserRevisionLine numberNew 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