SPKT
Dependencies: SDFileSystem_Warning_Fixed
Dependents: DISCO-F746_WAV_PLAYER WAV
FileSelectorWav.cpp@18:6631cd0fbbcd, 2019-06-04 (annotated)
- Committer:
- phungductung
- Date:
- Tue Jun 04 21:35:59 2019 +0000
- Revision:
- 18:6631cd0fbbcd
- Parent:
- 17:abfd6af9a236
WAV
Who changed what in which revision?
User | Revision | Line number | New 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 |