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:
Sat Apr 16 13:53:53 2016 +0000
Revision:
4:76aa20fb326a
Child:
5:4a99dabc9180
4

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 4:76aa20fb326a 34 bool CreateTable()
MikamiUitOpen 4:76aa20fb326a 35 {
MikamiUitOpen 4:76aa20fb326a 36 DIR* dp = opendir("/sd");
MikamiUitOpen 4:76aa20fb326a 37 fileCount_ = 0;
MikamiUitOpen 4:76aa20fb326a 38 if (dp != NULL)
MikamiUitOpen 4:76aa20fb326a 39 {
MikamiUitOpen 4:76aa20fb326a 40 dirent* entry;
MikamiUitOpen 4:76aa20fb326a 41 for (int n=0; n<256; n++)
MikamiUitOpen 4:76aa20fb326a 42 {
MikamiUitOpen 4:76aa20fb326a 43 entry = readdir(dp);
MikamiUitOpen 4:76aa20fb326a 44 if (entry == NULL) break;
MikamiUitOpen 4:76aa20fb326a 45
MikamiUitOpen 4:76aa20fb326a 46 string strName = entry->d_name;
MikamiUitOpen 4:76aa20fb326a 47 if ( (strName.find(".bin") != string::npos) ||
MikamiUitOpen 4:76aa20fb326a 48 (strName.find(".BIN") != string::npos) )
MikamiUitOpen 4:76aa20fb326a 49 {
MikamiUitOpen 4:76aa20fb326a 50 sdReader_.Open(strName); // ファイルオープン
MikamiUitOpen 4:76aa20fb326a 51 // 小さすぎるファイルは除外
MikamiUitOpen 4:76aa20fb326a 52 if ((sdReader_.ReadSize()) > 4096)
MikamiUitOpen 4:76aa20fb326a 53 {
MikamiUitOpen 4:76aa20fb326a 54 fileNames_[fileCount_] = strName;
MikamiUitOpen 4:76aa20fb326a 55 fileCount_++;
MikamiUitOpen 4:76aa20fb326a 56 }
MikamiUitOpen 4:76aa20fb326a 57 sdReader_.Close();
MikamiUitOpen 4:76aa20fb326a 58 }
MikamiUitOpen 4:76aa20fb326a 59 if (fileCount_ >= MAX_FILES_) break;
MikamiUitOpen 4:76aa20fb326a 60 }
MikamiUitOpen 4:76aa20fb326a 61 closedir(dp);
MikamiUitOpen 4:76aa20fb326a 62 }
MikamiUitOpen 4:76aa20fb326a 63 else
MikamiUitOpen 4:76aa20fb326a 64 return false;
MikamiUitOpen 4:76aa20fb326a 65
MikamiUitOpen 4:76aa20fb326a 66 if (fileCount_ == 0) return false;
MikamiUitOpen 4:76aa20fb326a 67
MikamiUitOpen 4:76aa20fb326a 68 nonString_ = new string[fileCount_];
MikamiUitOpen 4:76aa20fb326a 69 for (int n=0; n<fileCount_; n++) nonString_[n] = "";
MikamiUitOpen 4:76aa20fb326a 70 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_,
MikamiUitOpen 4:76aa20fb326a 71 nonString_, 0, V_L_-W_H_, 1,
MikamiUitOpen 4:76aa20fb326a 72 -1, Font12, 0, GuiBase::ENUM_BACK,
MikamiUitOpen 4:76aa20fb326a 73 BASE_COLOR_, TOUCHED_COLOR_);
MikamiUitOpen 4:76aa20fb326a 74 for (int n=0; n<fileCount_; n++) rect_->Erase(n);
MikamiUitOpen 4:76aa20fb326a 75 CreateLabels();
MikamiUitOpen 4:76aa20fb326a 76
MikamiUitOpen 4:76aa20fb326a 77 return true;
MikamiUitOpen 4:76aa20fb326a 78 }
MikamiUitOpen 4:76aa20fb326a 79
MikamiUitOpen 4:76aa20fb326a 80 // ファイルを選択する
MikamiUitOpen 4:76aa20fb326a 81 bool Select(string &fileName)
MikamiUitOpen 4:76aa20fb326a 82 {
MikamiUitOpen 4:76aa20fb326a 83 int n;
MikamiUitOpen 4:76aa20fb326a 84 if (rect_->GetTouchedNumber(n))
MikamiUitOpen 4:76aa20fb326a 85 {
MikamiUitOpen 4:76aa20fb326a 86 fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_);
MikamiUitOpen 4:76aa20fb326a 87 if ((prev_ >= 0) && (prev_ != n))
MikamiUitOpen 4:76aa20fb326a 88 fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_));
MikamiUitOpen 4:76aa20fb326a 89 prev_ = n;
MikamiUitOpen 4:76aa20fb326a 90 fileName = sortedFileNames_[n];
MikamiUitOpen 4:76aa20fb326a 91 return true;
MikamiUitOpen 4:76aa20fb326a 92 }
MikamiUitOpen 4:76aa20fb326a 93 else
MikamiUitOpen 4:76aa20fb326a 94 return false;
MikamiUitOpen 4:76aa20fb326a 95 }
MikamiUitOpen 4:76aa20fb326a 96
MikamiUitOpen 4:76aa20fb326a 97 // ファイルの一覧の表示
MikamiUitOpen 4:76aa20fb326a 98 void DisplayFileList(bool sort = true)
MikamiUitOpen 4:76aa20fb326a 99 {
MikamiUitOpen 4:76aa20fb326a 100 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 4:76aa20fb326a 101 sortedFileNames_[n] = fileNames_[n];
MikamiUitOpen 4:76aa20fb326a 102 if (sort)
MikamiUitOpen 4:76aa20fb326a 103 std::sort(sortedFileNames_, sortedFileNames_+fileCount_);
MikamiUitOpen 4:76aa20fb326a 104
MikamiUitOpen 4:76aa20fb326a 105 Erase(MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 270-Y_);
MikamiUitOpen 4:76aa20fb326a 106 rect_->DrawAll();
MikamiUitOpen 4:76aa20fb326a 107 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 4:76aa20fb326a 108 fileNameLabels_[n]->Draw(GetFileNameNoExt(n));
MikamiUitOpen 4:76aa20fb326a 109 }
MikamiUitOpen 4:76aa20fb326a 110
MikamiUitOpen 4:76aa20fb326a 111 void Erase(uint16_t width, uint16_t height,
MikamiUitOpen 4:76aa20fb326a 112 uint32_t color = GuiBase::ENUM_BACK)
MikamiUitOpen 4:76aa20fb326a 113 {
MikamiUitOpen 4:76aa20fb326a 114 lcd_->SetTextColor(color);
MikamiUitOpen 4:76aa20fb326a 115 lcd_->FillRect(X_, Y_, width, height);
MikamiUitOpen 4:76aa20fb326a 116 }
MikamiUitOpen 4:76aa20fb326a 117
MikamiUitOpen 4:76aa20fb326a 118 private:
MikamiUitOpen 4:76aa20fb326a 119 const uint8_t X_, Y_, W_H_, V_L_;
MikamiUitOpen 4:76aa20fb326a 120 const int MAX_FILES_;
MikamiUitOpen 4:76aa20fb326a 121 const int MAX_NAME_LENGTH_;
MikamiUitOpen 4:76aa20fb326a 122 const uint32_t BASE_COLOR_;
MikamiUitOpen 4:76aa20fb326a 123 const uint32_t TOUCHED_COLOR_;
MikamiUitOpen 4:76aa20fb326a 124
MikamiUitOpen 4:76aa20fb326a 125 string *fileNames_;
MikamiUitOpen 4:76aa20fb326a 126 string *sortedFileNames_;
MikamiUitOpen 4:76aa20fb326a 127 string *nonString_;
MikamiUitOpen 4:76aa20fb326a 128 ButtonGroup *rect_;
MikamiUitOpen 4:76aa20fb326a 129 Label **fileNameLabels_;
MikamiUitOpen 4:76aa20fb326a 130 LCD_DISCO_F746NG *lcd_;
MikamiUitOpen 4:76aa20fb326a 131 SD_BinaryReader &sdReader_;
MikamiUitOpen 4:76aa20fb326a 132 int fileCount_;
MikamiUitOpen 4:76aa20fb326a 133 int prev_;
MikamiUitOpen 4:76aa20fb326a 134
MikamiUitOpen 4:76aa20fb326a 135 // Label を生成
MikamiUitOpen 4:76aa20fb326a 136 void CreateLabels()
MikamiUitOpen 4:76aa20fb326a 137 {
MikamiUitOpen 4:76aa20fb326a 138 fileNameLabels_ = new Label *[fileCount_+1];
MikamiUitOpen 4:76aa20fb326a 139 for (int n=0; n<fileCount_; n++)
MikamiUitOpen 4:76aa20fb326a 140 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
MikamiUitOpen 4:76aa20fb326a 141 Label::LEFT, Font16,
MikamiUitOpen 4:76aa20fb326a 142 BASE_COLOR_);
MikamiUitOpen 4:76aa20fb326a 143 }
MikamiUitOpen 4:76aa20fb326a 144
MikamiUitOpen 4:76aa20fb326a 145 // 拡張子を削除した文字列を取得
MikamiUitOpen 4:76aa20fb326a 146 string GetFileNameNoExt(int n)
MikamiUitOpen 4:76aa20fb326a 147 {
MikamiUitOpen 4:76aa20fb326a 148 string name = sortedFileNames_[n];
MikamiUitOpen 4:76aa20fb326a 149 name.erase(name.find("."));
MikamiUitOpen 4:76aa20fb326a 150 return name.substr(0, MAX_NAME_LENGTH_);
MikamiUitOpen 4:76aa20fb326a 151 }
MikamiUitOpen 4:76aa20fb326a 152
MikamiUitOpen 4:76aa20fb326a 153 // disallow copy constructor and assignment operator
MikamiUitOpen 4:76aa20fb326a 154 FileSelector(const FileSelector&);
MikamiUitOpen 4:76aa20fb326a 155 FileSelector& operator=(const FileSelector&);
MikamiUitOpen 4:76aa20fb326a 156 };
MikamiUitOpen 4:76aa20fb326a 157 }
MikamiUitOpen 4:76aa20fb326a 158 #endif // FILE_SELECTOR_HPP