SPKT

Dependencies:   SDFileSystem_Warning_Fixed

Dependents:   DISCO-F746_WAV_PLAYER WAV

Committer:
phungductung
Date:
Tue Jun 04 21:35:59 2019 +0000
Revision:
18:6631cd0fbbcd
Parent:
17:abfd6af9a236
WAV

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 18:6631cd0fbbcd 1
MikamiUitOpen 0:d310bb78455d 2 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 3
MikamiUitOpen 0:d310bb78455d 4 #include "FileSelectorWav.hpp"
MikamiUitOpen 0:d310bb78455d 5
MikamiUitOpen 0:d310bb78455d 6 namespace Mikami
MikamiUitOpen 0:d310bb78455d 7 {
MikamiUitOpen 2:511479736d6e 8 FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
MikamiUitOpen 2:511479736d6e 9 int maxNameLength, SD_WavReader &reader)
MikamiUitOpen 2:511479736d6e 10 : X_(x0), Y_(y0),
MikamiUitOpen 2:511479736d6e 11 MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength),
MikamiUitOpen 2:511479736d6e 12 fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_),
MikamiUitOpen 2:511479736d6e 13 next_(50, 238, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24),
MikamiUitOpen 2:511479736d6e 14 pageLabel_(210, 250, Label::LEFT, Font16),
MikamiUitOpen 17:abfd6af9a236 15 lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1),
MikamiUitOpen 17:abfd6af9a236 16 nOld_(-1), kOld_(-1)
MikamiUitOpen 2:511479736d6e 17 {
MikamiUitOpen 2:511479736d6e 18 Array<string> nonString(MAX_LIST_PAGE_, "");
MikamiUitOpen 2:511479736d6e 19 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_,
MikamiUitOpen 2:511479736d6e 20 nonString, 0, V_L_-W_H_, 1,
MikamiUitOpen 2:511479736d6e 21 -1, Font12, 0, GuiBase::ENUM_BACK,
MikamiUitOpen 2:511479736d6e 22 BASE_COLOR_, TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 23 rect_->EraseAll();
MikamiUitOpen 2:511479736d6e 24 next_.EraseAll();
MikamiUitOpen 2:511479736d6e 25
phungductung 18:6631cd0fbbcd 26 // Tạo Label
MikamiUitOpen 2:511479736d6e 27 for (int n=0; n<MAX_LIST_PAGE_; n++)
MikamiUitOpen 2:511479736d6e 28 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
MikamiUitOpen 2:511479736d6e 29 Label::LEFT, Font16, BASE_COLOR_);
MikamiUitOpen 2:511479736d6e 30 }
MikamiUitOpen 2:511479736d6e 31
MikamiUitOpen 2:511479736d6e 32 FileSelector::~FileSelector()
MikamiUitOpen 2:511479736d6e 33 {
MikamiUitOpen 2:511479736d6e 34 delete rect_;
MikamiUitOpen 2:511479736d6e 35 for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n];
MikamiUitOpen 2:511479736d6e 36 }
MikamiUitOpen 2:511479736d6e 37
phungductung 18:6631cd0fbbcd 38 // Lập danh sách các tập tin. Trả về false nếu tệp WAV không tồn tại
MikamiUitOpen 0:d310bb78455d 39 bool FileSelector::CreateTable()
MikamiUitOpen 0:d310bb78455d 40 {
MikamiUitOpen 0:d310bb78455d 41 DIR* dp = opendir("/sd");
MikamiUitOpen 0:d310bb78455d 42 fileCount_ = 0;
MikamiUitOpen 0:d310bb78455d 43 if (dp != NULL)
MikamiUitOpen 0:d310bb78455d 44 {
MikamiUitOpen 0:d310bb78455d 45 dirent* entry;
MikamiUitOpen 0:d310bb78455d 46 for (int n=0; n<256; n++)
MikamiUitOpen 0:d310bb78455d 47 {
MikamiUitOpen 0:d310bb78455d 48 entry = readdir(dp);
MikamiUitOpen 0:d310bb78455d 49 if (entry == NULL) break;
MikamiUitOpen 0:d310bb78455d 50
MikamiUitOpen 0:d310bb78455d 51 string strName = entry->d_name;
MikamiUitOpen 0:d310bb78455d 52 if ( (strName.find(".wav") != string::npos) ||
MikamiUitOpen 0:d310bb78455d 53 (strName.find(".WAV") != string::npos) )
MikamiUitOpen 0:d310bb78455d 54 {
phungductung 18:6631cd0fbbcd 55 sdReader_.Open(strName); // mở tập tin
MikamiUitOpen 0:d310bb78455d 56
phungductung 18:6631cd0fbbcd 57 // Loại trừ các tệp không phải PCM, âm thanh nổi 16 bit, tần số lấy mẫu 44,1 kHz
MikamiUitOpen 0:d310bb78455d 58 if (sdReader_.IsWavFile())
MikamiUitOpen 0:d310bb78455d 59 fileNames_[fileCount_++] = strName;
MikamiUitOpen 0:d310bb78455d 60 sdReader_.Close();
MikamiUitOpen 0:d310bb78455d 61 }
MikamiUitOpen 0:d310bb78455d 62 if (fileCount_ >= MAX_FILES_) break;
MikamiUitOpen 0:d310bb78455d 63 }
MikamiUitOpen 17:abfd6af9a236 64 closedir(dp);
MikamiUitOpen 0:d310bb78455d 65 }
MikamiUitOpen 0:d310bb78455d 66 else
phungductung 18:6631cd0fbbcd 67 return false; // nếu thẻ SD không được cài đặt
phungductung 18:6631cd0fbbcd 68 if (fileCount_ == 0) return false; //Nếu tệp WAV tương ứng không tồn tại
MikamiUitOpen 0:d310bb78455d 69
MikamiUitOpen 2:511479736d6e 70 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 71 maxPage_ = (m.rem == 0) ? m.quot : m.quot+1;
phungductung 18:6631cd0fbbcd 72 return true; //Khi tệp WAV tương ứng tồn tại
MikamiUitOpen 0:d310bb78455d 73 }
MikamiUitOpen 0:d310bb78455d 74
phungductung 18:6631cd0fbbcd 75 // chọn tập tin
MikamiUitOpen 0:d310bb78455d 76 bool FileSelector::Select(string &fileName)
MikamiUitOpen 0:d310bb78455d 77 {
MikamiUitOpen 2:511479736d6e 78 int m;
MikamiUitOpen 2:511479736d6e 79 if (next_.GetTouchedNumber(m))
MikamiUitOpen 2:511479736d6e 80 {
MikamiUitOpen 2:511479736d6e 81 if (m==0) page_--;
MikamiUitOpen 2:511479736d6e 82 else page_++;
MikamiUitOpen 2:511479736d6e 83 DisplayFileList(false);
MikamiUitOpen 17:abfd6af9a236 84 nOld_ = -1;
MikamiUitOpen 17:abfd6af9a236 85 wait_ms(300);
MikamiUitOpen 2:511479736d6e 86 }
MikamiUitOpen 2:511479736d6e 87
MikamiUitOpen 0:d310bb78455d 88 int n;
MikamiUitOpen 0:d310bb78455d 89 if (rect_->GetTouchedNumber(n))
MikamiUitOpen 0:d310bb78455d 90 {
MikamiUitOpen 2:511479736d6e 91 int k = (page_ - 1)*MAX_LIST_PAGE_ + n;
MikamiUitOpen 17:abfd6af9a236 92 fileNameLabels_[n]->Draw(GetFileNameNoExt(k),
MikamiUitOpen 17:abfd6af9a236 93 TOUCHED_COLOR_);
MikamiUitOpen 2:511479736d6e 94 fileName = fileNames_[k];
phungductung 18:6631cd0fbbcd 95 // Trả về màu của tên tệp đã chọn trước đó trên cùng một trang
MikamiUitOpen 17:abfd6af9a236 96 if (nOld_ != -1)
MikamiUitOpen 17:abfd6af9a236 97 fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_),
MikamiUitOpen 17:abfd6af9a236 98 BASE_COLOR_);
phungductung 18:6631cd0fbbcd 99 if (page_ == maxPage_) // xóa hình chữ nhật phụ trên trang cuối
MikamiUitOpen 17:abfd6af9a236 100 for (int j=fileCount_ % MAX_LIST_PAGE_ + 1;
MikamiUitOpen 17:abfd6af9a236 101 j < MAX_LIST_PAGE_; j++) rect_->Erase(j);
MikamiUitOpen 17:abfd6af9a236 102 nOld_ = n;
MikamiUitOpen 17:abfd6af9a236 103 kOld_ = k;
MikamiUitOpen 17:abfd6af9a236 104 wait_ms(300);
MikamiUitOpen 0:d310bb78455d 105 return true;
MikamiUitOpen 0:d310bb78455d 106 }
MikamiUitOpen 0:d310bb78455d 107 else
MikamiUitOpen 0:d310bb78455d 108 return false;
MikamiUitOpen 0:d310bb78455d 109 }
MikamiUitOpen 0:d310bb78455d 110
phungductung 18:6631cd0fbbcd 111 // Hiển thị danh sách các tập tin
MikamiUitOpen 0:d310bb78455d 112 void FileSelector::DisplayFileList(bool sortEnable)
MikamiUitOpen 0:d310bb78455d 113 {
MikamiUitOpen 0:d310bb78455d 114 if (sortEnable)
MikamiUitOpen 0:d310bb78455d 115 std::sort((string *)fileNames_,
MikamiUitOpen 0:d310bb78455d 116 (string *)fileNames_+fileCount_);
MikamiUitOpen 0:d310bb78455d 117
MikamiUitOpen 0:d310bb78455d 118 Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_);
MikamiUitOpen 2:511479736d6e 119
MikamiUitOpen 2:511479736d6e 120 div_t m = div(fileCount_, MAX_LIST_PAGE_);
MikamiUitOpen 2:511479736d6e 121 int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem;
MikamiUitOpen 2:511479736d6e 122 for (int n=0; n<count; n++) rect_->Draw(n);
MikamiUitOpen 2:511479736d6e 123 for (int n=0; n<count; n++)
MikamiUitOpen 2:511479736d6e 124 fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_));
phungductung 18:6631cd0fbbcd 125 // Hiển thị trang trước, nút chọn trang tiếp theo, v.v.
MikamiUitOpen 17:abfd6af9a236 126 next_.InactivateAll();
phungductung 18:6631cd0fbbcd 127 if (page_ > 1) next_.Activate(0); // "<" hợp lệ
phungductung 18:6631cd0fbbcd 128 if (page_ < maxPage_) next_.Activate(1); // ">" hợp lệ
MikamiUitOpen 2:511479736d6e 129 char page[6];
MikamiUitOpen 2:511479736d6e 130 sprintf(page, "%d/%d", page_, maxPage_);
MikamiUitOpen 2:511479736d6e 131 pageLabel_.Draw(page);
MikamiUitOpen 0:d310bb78455d 132 }
MikamiUitOpen 0:d310bb78455d 133
phungductung 18:6631cd0fbbcd 134 // xóa danh sách các tập tin
MikamiUitOpen 0:d310bb78455d 135 void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
MikamiUitOpen 11:c33c711a5712 136 uint32_t color)
MikamiUitOpen 0:d310bb78455d 137 {
MikamiUitOpen 12:f73e11831c1c 138 lcd_.SetTextColor(color);
MikamiUitOpen 12:f73e11831c1c 139 lcd_.FillRect(x, y, width, height);
MikamiUitOpen 0:d310bb78455d 140 }
MikamiUitOpen 0:d310bb78455d 141
phungductung 18:6631cd0fbbcd 142 // Lấy tên tệp với phần mở rộng bị xóa
MikamiUitOpen 0:d310bb78455d 143 string FileSelector::GetFileNameNoExt(int n)
MikamiUitOpen 0:d310bb78455d 144 {
MikamiUitOpen 0:d310bb78455d 145 string name = fileNames_[n];
MikamiUitOpen 3:dd3b8a21417b 146 int k = name.rfind(".");
MikamiUitOpen 11:c33c711a5712 147 if (k != string::npos)
MikamiUitOpen 11:c33c711a5712 148 return name.erase(k);
MikamiUitOpen 11:c33c711a5712 149 else
MikamiUitOpen 11:c33c711a5712 150 return name;
MikamiUitOpen 0:d310bb78455d 151 }
MikamiUitOpen 0:d310bb78455d 152 }
MikamiUitOpen 17:abfd6af9a236 153