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:
MikamiUitOpen
Date:
Sun May 01 02:44:30 2016 +0000
Revision:
2:2a5c93bf729a
Parent:
0:e953eb392151
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:e953eb392151 1 //--------------------------------------------------------------
MikamiUitOpen 0:e953eb392151 2 // FileSelector class
MikamiUitOpen 0:e953eb392151 3 // SD カード内のファイル名の一覧を表示し,ファイルを選択する
MikamiUitOpen 0:e953eb392151 4 //
MikamiUitOpen 0:e953eb392151 5 // 2016/04/18, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:e953eb392151 6 //--------------------------------------------------------------
MikamiUitOpen 0:e953eb392151 7
MikamiUitOpen 0:e953eb392151 8 #ifndef FILE_SELECTOR_HPP
MikamiUitOpen 0:e953eb392151 9 #define FILE_SELECTOR_HPP
MikamiUitOpen 0:e953eb392151 10
MikamiUitOpen 0:e953eb392151 11 #include "mbed.h"
MikamiUitOpen 0:e953eb392151 12 #include "Label.hpp"
MikamiUitOpen 0:e953eb392151 13 #include "ButtonGroup.hpp"
MikamiUitOpen 0:e953eb392151 14 #include "SD_WavReader.hpp"
MikamiUitOpen 0:e953eb392151 15 #include "SDFileSystem.h"
MikamiUitOpen 0:e953eb392151 16 #include <algorithm> // sort() で使用
MikamiUitOpen 0:e953eb392151 17 #include <string>
MikamiUitOpen 0:e953eb392151 18
MikamiUitOpen 0:e953eb392151 19 namespace Mikami
MikamiUitOpen 0:e953eb392151 20 {
MikamiUitOpen 0:e953eb392151 21 class FileSelector
MikamiUitOpen 0:e953eb392151 22 {
MikamiUitOpen 0:e953eb392151 23 public:
MikamiUitOpen 0:e953eb392151 24 FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
MikamiUitOpen 0:e953eb392151 25 int maxNameLength, SD_WavReader &reader)
MikamiUitOpen 0:e953eb392151 26 : X_(x0), Y_(y0), W_H_(24), V_L_(36),
MikamiUitOpen 0:e953eb392151 27 MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength),
MikamiUitOpen 0:e953eb392151 28 BASE_COLOR_(0xFF80FFA0), TOUCHED_COLOR_(0xFF80FFFF),
MikamiUitOpen 0:e953eb392151 29 fileNames_(new string[maxFiles]),
MikamiUitOpen 0:e953eb392151 30 sortedFileNames_(new string[maxFiles]),
MikamiUitOpen 0:e953eb392151 31 nonString_(NULL), rect_(NULL), fileNameLabels_(NULL),
MikamiUitOpen 0:e953eb392151 32 lcd_(GuiBase::GetLcdPtr()),
MikamiUitOpen 0:e953eb392151 33 sdReader_(reader), prevFileCount_(0), prev_(-1) {}
MikamiUitOpen 0:e953eb392151 34
MikamiUitOpen 0:e953eb392151 35 ~FileSelector()
MikamiUitOpen 0:e953eb392151 36 {
MikamiUitOpen 0:e953eb392151 37 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 0:e953eb392151 38 delete fileNameLabels_[n];
MikamiUitOpen 0:e953eb392151 39 delete[] fileNameLabels_;
MikamiUitOpen 0:e953eb392151 40 delete rect_;
MikamiUitOpen 0:e953eb392151 41 delete[] nonString_;
MikamiUitOpen 0:e953eb392151 42 delete[] sortedFileNames_;
MikamiUitOpen 0:e953eb392151 43 delete[] fileNames_;
MikamiUitOpen 0:e953eb392151 44 }
MikamiUitOpen 0:e953eb392151 45
MikamiUitOpen 0:e953eb392151 46 bool CreateTable()
MikamiUitOpen 0:e953eb392151 47 {
MikamiUitOpen 0:e953eb392151 48 DIR* dp = opendir("/sd");
MikamiUitOpen 0:e953eb392151 49 fileCount_ = 0;
MikamiUitOpen 0:e953eb392151 50 if (dp != NULL)
MikamiUitOpen 0:e953eb392151 51 {
MikamiUitOpen 0:e953eb392151 52 dirent* entry;
MikamiUitOpen 0:e953eb392151 53 for (int n=0; n<256; n++)
MikamiUitOpen 0:e953eb392151 54 {
MikamiUitOpen 0:e953eb392151 55 entry = readdir(dp);
MikamiUitOpen 0:e953eb392151 56 if (entry == NULL) break;
MikamiUitOpen 0:e953eb392151 57
MikamiUitOpen 0:e953eb392151 58 string strName = entry->d_name;
MikamiUitOpen 0:e953eb392151 59 if ( (strName.find(".wav") != string::npos) ||
MikamiUitOpen 0:e953eb392151 60 (strName.find(".WAV") != string::npos) )
MikamiUitOpen 0:e953eb392151 61 {
MikamiUitOpen 0:e953eb392151 62 sdReader_.Open(strName); // ファイルオープン
MikamiUitOpen 0:e953eb392151 63
MikamiUitOpen 0:e953eb392151 64 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
MikamiUitOpen 0:e953eb392151 65 if (sdReader_.IsWavFile())
MikamiUitOpen 0:e953eb392151 66 {
MikamiUitOpen 0:e953eb392151 67 fileNames_[fileCount_] = strName;
MikamiUitOpen 0:e953eb392151 68 fileCount_++;
MikamiUitOpen 0:e953eb392151 69 }
MikamiUitOpen 0:e953eb392151 70 sdReader_.Close();
MikamiUitOpen 0:e953eb392151 71 }
MikamiUitOpen 0:e953eb392151 72
MikamiUitOpen 0:e953eb392151 73
MikamiUitOpen 0:e953eb392151 74 if (fileCount_ >= MAX_FILES_) break;
MikamiUitOpen 0:e953eb392151 75 }
MikamiUitOpen 0:e953eb392151 76 closedir(dp);
MikamiUitOpen 0:e953eb392151 77 }
MikamiUitOpen 0:e953eb392151 78 else
MikamiUitOpen 0:e953eb392151 79 return false;
MikamiUitOpen 0:e953eb392151 80
MikamiUitOpen 0:e953eb392151 81 if (fileCount_ == 0) return false;
MikamiUitOpen 0:e953eb392151 82
MikamiUitOpen 0:e953eb392151 83 if (nonString_ == NULL) delete[] nonString_;
MikamiUitOpen 0:e953eb392151 84 nonString_ = new string[fileCount_];
MikamiUitOpen 0:e953eb392151 85 for (int n=0; n<fileCount_; n++) nonString_[n] = "";
MikamiUitOpen 0:e953eb392151 86
MikamiUitOpen 0:e953eb392151 87 if (rect_ != NULL) delete rect_;
MikamiUitOpen 0:e953eb392151 88 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_,
MikamiUitOpen 0:e953eb392151 89 nonString_, 0, V_L_-W_H_, 1,
MikamiUitOpen 0:e953eb392151 90 -1, Font12, 0, GuiBase::ENUM_BACK,
MikamiUitOpen 0:e953eb392151 91 BASE_COLOR_, TOUCHED_COLOR_);
MikamiUitOpen 0:e953eb392151 92 for (int n=0; n<fileCount_; n++) rect_->Erase(n);
MikamiUitOpen 0:e953eb392151 93 CreateLabels();
MikamiUitOpen 0:e953eb392151 94 prevFileCount_ = fileCount_;
MikamiUitOpen 0:e953eb392151 95 return true;
MikamiUitOpen 0:e953eb392151 96 }
MikamiUitOpen 0:e953eb392151 97
MikamiUitOpen 0:e953eb392151 98 // ファイルを選択する
MikamiUitOpen 0:e953eb392151 99 bool Select(string &fileName)
MikamiUitOpen 0:e953eb392151 100 {
MikamiUitOpen 0:e953eb392151 101 int n;
MikamiUitOpen 0:e953eb392151 102 if (rect_->GetTouchedNumber(n))
MikamiUitOpen 0:e953eb392151 103 {
MikamiUitOpen 0:e953eb392151 104 fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_);
MikamiUitOpen 0:e953eb392151 105 if ((prev_ >= 0) && (prev_ != n))
MikamiUitOpen 0:e953eb392151 106 fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_));
MikamiUitOpen 0:e953eb392151 107 prev_ = n;
MikamiUitOpen 0:e953eb392151 108 fileName = sortedFileNames_[n];
MikamiUitOpen 0:e953eb392151 109 return true;
MikamiUitOpen 0:e953eb392151 110 }
MikamiUitOpen 0:e953eb392151 111 else
MikamiUitOpen 0:e953eb392151 112 return false;
MikamiUitOpen 0:e953eb392151 113 }
MikamiUitOpen 0:e953eb392151 114
MikamiUitOpen 0:e953eb392151 115 // ファイルの一覧の表示
MikamiUitOpen 0:e953eb392151 116 void DisplayFileList(bool sort = true)
MikamiUitOpen 0:e953eb392151 117 {
MikamiUitOpen 0:e953eb392151 118 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 0:e953eb392151 119 sortedFileNames_[n] = fileNames_[n];
MikamiUitOpen 0:e953eb392151 120 if (sort)
MikamiUitOpen 0:e953eb392151 121 std::sort(sortedFileNames_, sortedFileNames_+fileCount_);
MikamiUitOpen 0:e953eb392151 122
MikamiUitOpen 2:2a5c93bf729a 123 Erase(X_, 0, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 288);
MikamiUitOpen 0:e953eb392151 124 rect_->DrawAll();
MikamiUitOpen 0:e953eb392151 125 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 0:e953eb392151 126 fileNameLabels_[n]->Draw(GetFileNameNoExt(n));
MikamiUitOpen 0:e953eb392151 127 }
MikamiUitOpen 0:e953eb392151 128
MikamiUitOpen 2:2a5c93bf729a 129 void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
MikamiUitOpen 0:e953eb392151 130 uint32_t color = GuiBase::ENUM_BACK)
MikamiUitOpen 0:e953eb392151 131 {
MikamiUitOpen 0:e953eb392151 132 lcd_->SetTextColor(color);
MikamiUitOpen 2:2a5c93bf729a 133 lcd_->FillRect(x, y, width, height);
MikamiUitOpen 0:e953eb392151 134 }
MikamiUitOpen 0:e953eb392151 135
MikamiUitOpen 0:e953eb392151 136 private:
MikamiUitOpen 0:e953eb392151 137 const uint8_t X_, Y_, W_H_, V_L_;
MikamiUitOpen 0:e953eb392151 138 const int MAX_FILES_;
MikamiUitOpen 0:e953eb392151 139 const int MAX_NAME_LENGTH_;
MikamiUitOpen 0:e953eb392151 140 const uint32_t BASE_COLOR_;
MikamiUitOpen 0:e953eb392151 141 const uint32_t TOUCHED_COLOR_;
MikamiUitOpen 0:e953eb392151 142
MikamiUitOpen 0:e953eb392151 143 string *fileNames_;
MikamiUitOpen 0:e953eb392151 144 string *sortedFileNames_;
MikamiUitOpen 0:e953eb392151 145 string *nonString_;
MikamiUitOpen 0:e953eb392151 146 ButtonGroup *rect_;
MikamiUitOpen 0:e953eb392151 147 Label **fileNameLabels_;
MikamiUitOpen 0:e953eb392151 148 LCD_DISCO_F746NG *lcd_;
MikamiUitOpen 0:e953eb392151 149 SD_WavReader &sdReader_;
MikamiUitOpen 0:e953eb392151 150 int fileCount_, prevFileCount_;
MikamiUitOpen 0:e953eb392151 151 int prev_;
MikamiUitOpen 0:e953eb392151 152
MikamiUitOpen 0:e953eb392151 153 // Label を生成
MikamiUitOpen 0:e953eb392151 154 void CreateLabels()
MikamiUitOpen 0:e953eb392151 155 {
MikamiUitOpen 0:e953eb392151 156 if (fileNameLabels_ != NULL)
MikamiUitOpen 0:e953eb392151 157 {
MikamiUitOpen 0:e953eb392151 158 for (int n=0; n<prevFileCount_; n++)
MikamiUitOpen 0:e953eb392151 159 delete fileNameLabels_[n];
MikamiUitOpen 0:e953eb392151 160 delete[] fileNameLabels_;
MikamiUitOpen 0:e953eb392151 161 }
MikamiUitOpen 0:e953eb392151 162 fileNameLabels_ = new Label *[fileCount_+1];
MikamiUitOpen 0:e953eb392151 163 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 0:e953eb392151 164 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
MikamiUitOpen 0:e953eb392151 165 Label::LEFT, Font16,
MikamiUitOpen 0:e953eb392151 166 BASE_COLOR_);
MikamiUitOpen 0:e953eb392151 167 }
MikamiUitOpen 0:e953eb392151 168
MikamiUitOpen 0:e953eb392151 169 // 拡張子を削除した文字列を取得
MikamiUitOpen 0:e953eb392151 170 string GetFileNameNoExt(int n)
MikamiUitOpen 0:e953eb392151 171 {
MikamiUitOpen 0:e953eb392151 172 string name = sortedFileNames_[n];
MikamiUitOpen 0:e953eb392151 173 name.erase(name.find("."));
MikamiUitOpen 0:e953eb392151 174 return name.substr(0, MAX_NAME_LENGTH_);
MikamiUitOpen 0:e953eb392151 175 }
MikamiUitOpen 0:e953eb392151 176
MikamiUitOpen 0:e953eb392151 177 // disallow copy constructor and assignment operator
MikamiUitOpen 0:e953eb392151 178 FileSelector(const FileSelector&);
MikamiUitOpen 0:e953eb392151 179 FileSelector& operator=(const FileSelector&);
MikamiUitOpen 0:e953eb392151 180 };
MikamiUitOpen 0:e953eb392151 181 }
MikamiUitOpen 0:e953eb392151 182 #endif // FILE_SELECTOR_HPP