Output the audio signal (*.bin) with filtering by IIR filter in the SD card using onboard CODEC. For *.wav file, F746_SD_WavPlayer and F746_SD_GraphicEqualiser are published on mbed. SD カードのオーディオ信号 (*.bin) を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.*.wav 形式のファイル用には,F746_SD_WavPlayer と F746_SD_GraphicEqualiser を mbed で公開している.

Dependencies:   BSP_DISCO_F746NG_patch_fixed F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed

Committer:
MikamiUitOpen
Date:
Sun Apr 17 08:44:43 2016 +0000
Revision:
5:4a99dabc9180
Parent:
4:76aa20fb326a
6

Who changed what in which revision?

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