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:
Mon May 09 08:54:09 2016 +0000
Revision:
8:12aa05f3cc24
Child:
10:fc6367c2ffcf
8

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