This program plays QuickTime movies on GR-Peach
Dependencies: AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP TLV320_RBSP mbed-rtos mbed
Requirements
- GR-Peach
- GR-Peach Audio Camera Shield or I²S compatible audio DAC
- GR-Peach LCD Shield
- USB memory stick
How to play movie files
- Encode movie files
encode movies with ffmpeg
$ ffmpeg -i <input -ar 44100 -acodec pcm_s16le -s 480x270 -vcodec mjpeg -q:v 3 -movflags faststart -threads 4 -vf fps=30 <output>.mov
- Copy movies to the root directory of USB memory
- Build and upload this program
- Run it
main.cpp@1:3e638b9e91cd, 2017-03-12 (annotated)
- Committer:
- mtkrtk
- Date:
- Sun Mar 12 02:01:46 2017 +0000
- Revision:
- 1:3e638b9e91cd
- Parent:
- 0:d0f130e27d32
fixed lcd contrast pin
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mtkrtk | 0:d0f130e27d32 | 1 | #include "mbed.h" |
mtkrtk | 0:d0f130e27d32 | 2 | #include "USBHostMSD.h" |
mtkrtk | 0:d0f130e27d32 | 3 | #include "usb_host_setting.h" |
mtkrtk | 0:d0f130e27d32 | 4 | #include "LCD.hpp" |
mtkrtk | 0:d0f130e27d32 | 5 | #include "MovFile.hpp" |
mtkrtk | 0:d0f130e27d32 | 6 | #include "TLV320_RBSP.h" |
mtkrtk | 0:d0f130e27d32 | 7 | #include "MovPlayer.hpp" |
mtkrtk | 0:d0f130e27d32 | 8 | #include "AsciiFont.h" |
mtkrtk | 0:d0f130e27d32 | 9 | #include "BinaryImage_RZ_A1H.h" |
mtkrtk | 0:d0f130e27d32 | 10 | #include "CppStandardHelper.hpp" |
mtkrtk | 0:d0f130e27d32 | 11 | |
mtkrtk | 0:d0f130e27d32 | 12 | #define USE_TLV320 |
mtkrtk | 0:d0f130e27d32 | 13 | |
mtkrtk | 0:d0f130e27d32 | 14 | static constexpr int FRAME_BUFFER_BYTE_PER_PIXEL = 2; |
mtkrtk | 0:d0f130e27d32 | 15 | static constexpr int FRAME_BUFFER_STRIDE = ((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u; |
mtkrtk | 0:d0f130e27d32 | 16 | static uint8_t MBED_ALIGN(32) user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]; |
mtkrtk | 0:d0f130e27d32 | 17 | |
mtkrtk | 0:d0f130e27d32 | 18 | static constexpr int FileNameBufferNum = 16; |
mtkrtk | 0:d0f130e27d32 | 19 | static constexpr int FileNameBufferLength = 32; |
mtkrtk | 0:d0f130e27d32 | 20 | static char filenameBuffer[FileNameBufferNum][FileNameBufferLength]; |
mtkrtk | 0:d0f130e27d32 | 21 | |
mtkrtk | 0:d0f130e27d32 | 22 | static rtos::Semaphore touchSemaphore(0); |
mtkrtk | 0:d0f130e27d32 | 23 | |
mtkrtk | 0:d0f130e27d32 | 24 | #ifdef ONLINE_COMPILER |
mtkrtk | 0:d0f130e27d32 | 25 | namespace TouchAction { |
mtkrtk | 0:d0f130e27d32 | 26 | #endif |
mtkrtk | 0:d0f130e27d32 | 27 | ENUM TouchAction { |
mtkrtk | 0:d0f130e27d32 | 28 | None, |
mtkrtk | 0:d0f130e27d32 | 29 | Play0, |
mtkrtk | 0:d0f130e27d32 | 30 | Play1, |
mtkrtk | 0:d0f130e27d32 | 31 | Play2, |
mtkrtk | 0:d0f130e27d32 | 32 | ScrollUp, |
mtkrtk | 0:d0f130e27d32 | 33 | ScrollDown |
mtkrtk | 0:d0f130e27d32 | 34 | }; |
mtkrtk | 0:d0f130e27d32 | 35 | #ifdef ONLINE_COMPILER |
mtkrtk | 0:d0f130e27d32 | 36 | } |
mtkrtk | 0:d0f130e27d32 | 37 | #endif |
mtkrtk | 0:d0f130e27d32 | 38 | |
mtkrtk | 0:d0f130e27d32 | 39 | namespace Menu { |
mtkrtk | 0:d0f130e27d32 | 40 | const graphics_image_t *top = menu; |
mtkrtk | 0:d0f130e27d32 | 41 | const graphics_image_t *one = menu1; |
mtkrtk | 0:d0f130e27d32 | 42 | const graphics_image_t *two = menu2; |
mtkrtk | 0:d0f130e27d32 | 43 | const graphics_image_t *three = menu3; |
mtkrtk | 0:d0f130e27d32 | 44 | const graphics_image_t *down = menud; |
mtkrtk | 0:d0f130e27d32 | 45 | const graphics_image_t *up = menuu; |
mtkrtk | 0:d0f130e27d32 | 46 | const graphics_image_t *upx = menuux; |
mtkrtk | 0:d0f130e27d32 | 47 | const graphics_image_t *downx = menudx; |
mtkrtk | 0:d0f130e27d32 | 48 | } |
mtkrtk | 0:d0f130e27d32 | 49 | |
mtkrtk | 0:d0f130e27d32 | 50 | static void dcache_clean(void * p_buf, uint32_t size) { |
mtkrtk | 0:d0f130e27d32 | 51 | uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0; |
mtkrtk | 0:d0f130e27d32 | 52 | uint32_t end_addr = (uint32_t)p_buf + size; |
mtkrtk | 0:d0f130e27d32 | 53 | uint32_t addr; |
mtkrtk | 0:d0f130e27d32 | 54 | |
mtkrtk | 0:d0f130e27d32 | 55 | /* Data cache clean */ |
mtkrtk | 0:d0f130e27d32 | 56 | for (addr = start_addr; addr < end_addr; addr += 0x20) { |
mtkrtk | 0:d0f130e27d32 | 57 | __v7_clean_dcache_mva((void *)addr); |
mtkrtk | 0:d0f130e27d32 | 58 | } |
mtkrtk | 0:d0f130e27d32 | 59 | } |
mtkrtk | 0:d0f130e27d32 | 60 | |
mtkrtk | 0:d0f130e27d32 | 61 | static void touchCallback() |
mtkrtk | 0:d0f130e27d32 | 62 | { |
mtkrtk | 0:d0f130e27d32 | 63 | touchSemaphore.release(); |
mtkrtk | 0:d0f130e27d32 | 64 | } |
mtkrtk | 0:d0f130e27d32 | 65 | |
mtkrtk | 0:d0f130e27d32 | 66 | #ifdef ONLINE_COMPILER |
mtkrtk | 0:d0f130e27d32 | 67 | static TouchAction::TouchAction readTouch(LCD *lcd, TouckKey_LCD_shield *touch, const graphics_image_t *currentImage) |
mtkrtk | 0:d0f130e27d32 | 68 | #else |
mtkrtk | 0:d0f130e27d32 | 69 | static TouchAction readTouch(LCD *lcd, TouckKey_LCD_shield *touch, const graphics_image_t *currentImage) |
mtkrtk | 0:d0f130e27d32 | 70 | #endif |
mtkrtk | 0:d0f130e27d32 | 71 | { |
mtkrtk | 0:d0f130e27d32 | 72 | TouchKey::touch_pos_t touchPos; |
mtkrtk | 0:d0f130e27d32 | 73 | printf("waiting for touch\n"); |
mtkrtk | 0:d0f130e27d32 | 74 | touchSemaphore.wait(); |
mtkrtk | 0:d0f130e27d32 | 75 | printf("touch detected\n"); |
mtkrtk | 0:d0f130e27d32 | 76 | touch->GetCoordinates(1, &touchPos); |
mtkrtk | 0:d0f130e27d32 | 77 | #ifdef ONLINE_COMPILER |
mtkrtk | 0:d0f130e27d32 | 78 | TouchAction::TouchAction ret = TouchAction::None; |
mtkrtk | 0:d0f130e27d32 | 79 | #else |
mtkrtk | 0:d0f130e27d32 | 80 | TouchAction ret = TouchAction::None; |
mtkrtk | 0:d0f130e27d32 | 81 | #endif |
mtkrtk | 0:d0f130e27d32 | 82 | const graphics_image_t *image = nullptr; |
mtkrtk | 0:d0f130e27d32 | 83 | int touchNum = 1; |
mtkrtk | 0:d0f130e27d32 | 84 | if (40 <= touchPos.x && touchPos.x <= 360) { |
mtkrtk | 0:d0f130e27d32 | 85 | if (35 <= touchPos.y && touchPos.y <= 70) { |
mtkrtk | 0:d0f130e27d32 | 86 | ret = TouchAction::Play0; |
mtkrtk | 0:d0f130e27d32 | 87 | image = Menu::one; |
mtkrtk | 0:d0f130e27d32 | 88 | } else if (115 <= touchPos.y && touchPos.y <= 155) { |
mtkrtk | 0:d0f130e27d32 | 89 | ret = TouchAction::Play1; |
mtkrtk | 0:d0f130e27d32 | 90 | image = Menu::two; |
mtkrtk | 0:d0f130e27d32 | 91 | } else if (195 <= touchPos.y && touchPos.y <= 235) { |
mtkrtk | 0:d0f130e27d32 | 92 | ret = TouchAction::Play2; |
mtkrtk | 0:d0f130e27d32 | 93 | image = Menu::three; |
mtkrtk | 0:d0f130e27d32 | 94 | } |
mtkrtk | 0:d0f130e27d32 | 95 | } else if (409 <= touchPos.x && touchPos.x <= 460) { |
mtkrtk | 0:d0f130e27d32 | 96 | if (22 <= touchPos.y && touchPos.y <= 68) { |
mtkrtk | 0:d0f130e27d32 | 97 | ret = TouchAction::ScrollUp; |
mtkrtk | 0:d0f130e27d32 | 98 | image = Menu::up; |
mtkrtk | 0:d0f130e27d32 | 99 | } else if (202 <= touchPos.y && touchPos.y <= 248) { |
mtkrtk | 0:d0f130e27d32 | 100 | ret = TouchAction::ScrollDown; |
mtkrtk | 0:d0f130e27d32 | 101 | image = Menu::down; |
mtkrtk | 0:d0f130e27d32 | 102 | } |
mtkrtk | 0:d0f130e27d32 | 103 | } |
mtkrtk | 0:d0f130e27d32 | 104 | if (lcd && image) { |
mtkrtk | 0:d0f130e27d32 | 105 | lcd->drawImage(image); |
mtkrtk | 0:d0f130e27d32 | 106 | } |
mtkrtk | 0:d0f130e27d32 | 107 | while (touchNum) { |
mtkrtk | 0:d0f130e27d32 | 108 | touchSemaphore.wait(); |
mtkrtk | 0:d0f130e27d32 | 109 | touchNum = touch->GetCoordinates(1, &touchPos); |
mtkrtk | 0:d0f130e27d32 | 110 | } |
mtkrtk | 0:d0f130e27d32 | 111 | if (lcd) { |
mtkrtk | 0:d0f130e27d32 | 112 | lcd->drawImage(currentImage); |
mtkrtk | 0:d0f130e27d32 | 113 | } |
mtkrtk | 0:d0f130e27d32 | 114 | return ret; |
mtkrtk | 0:d0f130e27d32 | 115 | } |
mtkrtk | 0:d0f130e27d32 | 116 | |
mtkrtk | 0:d0f130e27d32 | 117 | int main(int MBED_UNUSED argc, const char MBED_UNUSED * argv[]) |
mtkrtk | 0:d0f130e27d32 | 118 | { |
mtkrtk | 0:d0f130e27d32 | 119 | DigitalOut usb1en(P3_8); |
mtkrtk | 0:d0f130e27d32 | 120 | USBHostMSD msd("usb"); |
mtkrtk | 0:d0f130e27d32 | 121 | usb1en = 1; |
mtkrtk | 0:d0f130e27d32 | 122 | rtos::Thread::wait(5); |
mtkrtk | 0:d0f130e27d32 | 123 | usb1en = 0; |
mtkrtk | 0:d0f130e27d32 | 124 | |
mtkrtk | 0:d0f130e27d32 | 125 | DigitalOut led(LED1); |
mtkrtk | 0:d0f130e27d32 | 126 | while (! msd.connect()) { |
mtkrtk | 0:d0f130e27d32 | 127 | printf("not connected\n"); |
mtkrtk | 0:d0f130e27d32 | 128 | rtos::Thread::wait(500); |
mtkrtk | 0:d0f130e27d32 | 129 | led = ! led; |
mtkrtk | 0:d0f130e27d32 | 130 | } |
mtkrtk | 0:d0f130e27d32 | 131 | led = 0; |
mtkrtk | 0:d0f130e27d32 | 132 | |
mtkrtk | 0:d0f130e27d32 | 133 | LCD *lcd = LCD::singleton(); |
mtkrtk | 0:d0f130e27d32 | 134 | lcd->start(); |
mtkrtk | 0:d0f130e27d32 | 135 | |
mtkrtk | 0:d0f130e27d32 | 136 | #ifdef USE_TLV320 |
mtkrtk | 0:d0f130e27d32 | 137 | TLV320_RBSP audio(P10_13, I2C_SDA, I2C_SCL, P4_4, P4_5, P4_7, P4_6, |
mtkrtk | 0:d0f130e27d32 | 138 | 0x80, MovPlayer::BufferLength - 1, 0); |
mtkrtk | 0:d0f130e27d32 | 139 | audio.power(0x02); |
mtkrtk | 0:d0f130e27d32 | 140 | audio.format(16); |
mtkrtk | 0:d0f130e27d32 | 141 | audio.frequency(44100); |
mtkrtk | 0:d0f130e27d32 | 142 | MovPlayer::AudioCallback callback(&audio, &TLV320_RBSP::write); |
mtkrtk | 0:d0f130e27d32 | 143 | #else |
mtkrtk | 0:d0f130e27d32 | 144 | R_BSP_Ssif audio(P2_4, P2_5, P2_7, P2_6, 0x80, MovPlayer::BufferLength - 1, 0); |
mtkrtk | 0:d0f130e27d32 | 145 | ssif_channel_cfg_t ssif_cfg; |
mtkrtk | 0:d0f130e27d32 | 146 | ssif_cfg.enabled = true; |
mtkrtk | 0:d0f130e27d32 | 147 | ssif_cfg.int_level = 0x78; |
mtkrtk | 0:d0f130e27d32 | 148 | ssif_cfg.slave_mode = false; |
mtkrtk | 0:d0f130e27d32 | 149 | ssif_cfg.sample_freq = 44100u; |
mtkrtk | 0:d0f130e27d32 | 150 | ssif_cfg.clk_select = SSIF_CFG_CKS_AUDIO_X1; |
mtkrtk | 0:d0f130e27d32 | 151 | ssif_cfg.multi_ch = SSIF_CFG_MULTI_CH_1; |
mtkrtk | 0:d0f130e27d32 | 152 | ssif_cfg.data_word = SSIF_CFG_DATA_WORD_16; |
mtkrtk | 0:d0f130e27d32 | 153 | ssif_cfg.system_word = SSIF_CFG_SYSTEM_WORD_16; |
mtkrtk | 0:d0f130e27d32 | 154 | ssif_cfg.bclk_pol = SSIF_CFG_FALLING; |
mtkrtk | 0:d0f130e27d32 | 155 | ssif_cfg.ws_pol = SSIF_CFG_WS_HIGH; |
mtkrtk | 0:d0f130e27d32 | 156 | ssif_cfg.padding_pol = SSIF_CFG_PADDING_LOW; |
mtkrtk | 0:d0f130e27d32 | 157 | ssif_cfg.serial_alignment = SSIF_CFG_DATA_FIRST; |
mtkrtk | 0:d0f130e27d32 | 158 | ssif_cfg.parallel_alignment = SSIF_CFG_LEFT; |
mtkrtk | 0:d0f130e27d32 | 159 | ssif_cfg.ws_delay = SSIF_CFG_NO_DELAY; |
mtkrtk | 0:d0f130e27d32 | 160 | ssif_cfg.noise_cancel = SSIF_CFG_ENABLE_NOISE_CANCEL; |
mtkrtk | 0:d0f130e27d32 | 161 | ssif_cfg.tdm_mode = SSIF_CFG_DISABLE_TDM; |
mtkrtk | 0:d0f130e27d32 | 162 | ssif_cfg.romdec_direct.mode = SSIF_CFG_DISABLE_ROMDEC_DIRECT; |
mtkrtk | 0:d0f130e27d32 | 163 | ssif_cfg.romdec_direct.p_cbfunc = NULL; |
mtkrtk | 0:d0f130e27d32 | 164 | audio.ConfigChannel(&ssif_cfg); |
mtkrtk | 0:d0f130e27d32 | 165 | MovPlayer::AudioCallback callback(&audio, &R_BSP_Ssif::write); |
mtkrtk | 0:d0f130e27d32 | 166 | #endif |
mtkrtk | 0:d0f130e27d32 | 167 | |
mtkrtk | 0:d0f130e27d32 | 168 | DisplayBase Display; |
mtkrtk | 0:d0f130e27d32 | 169 | memset(user_frame_buffer, 0, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 170 | dcache_clean(user_frame_buffer, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 171 | DisplayBase::rect_t rect; |
mtkrtk | 0:d0f130e27d32 | 172 | rect.vs = 0; |
mtkrtk | 0:d0f130e27d32 | 173 | rect.vw = LCD_PIXEL_HEIGHT; |
mtkrtk | 0:d0f130e27d32 | 174 | rect.hs = 0; |
mtkrtk | 0:d0f130e27d32 | 175 | rect.hw = LCD_PIXEL_WIDTH; |
mtkrtk | 0:d0f130e27d32 | 176 | Display.Graphics_Read_Setting(DisplayBase::GRAPHICS_LAYER_1, (void *)user_frame_buffer, |
mtkrtk | 0:d0f130e27d32 | 177 | FRAME_BUFFER_STRIDE, DisplayBase::GRAPHICS_FORMAT_ARGB4444, |
mtkrtk | 0:d0f130e27d32 | 178 | DisplayBase::WR_RD_WRSWA_32_16BIT, &rect); |
mtkrtk | 0:d0f130e27d32 | 179 | Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_1); |
mtkrtk | 0:d0f130e27d32 | 180 | |
mtkrtk | 0:d0f130e27d32 | 181 | AsciiFont ascii(user_frame_buffer, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, |
mtkrtk | 0:d0f130e27d32 | 182 | FRAME_BUFFER_STRIDE, FRAME_BUFFER_BYTE_PER_PIXEL); |
mtkrtk | 0:d0f130e27d32 | 183 | |
mtkrtk | 0:d0f130e27d32 | 184 | TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL); |
mtkrtk | 0:d0f130e27d32 | 185 | touch.SetCallback(touchCallback); |
mtkrtk | 0:d0f130e27d32 | 186 | touch.Reset(); |
mtkrtk | 0:d0f130e27d32 | 187 | |
mtkrtk | 0:d0f130e27d32 | 188 | MovFile *mov = MovFile::sharedFile(); |
mtkrtk | 0:d0f130e27d32 | 189 | MovPlayer *player = MovPlayer::defaultPlayer(); |
mtkrtk | 0:d0f130e27d32 | 190 | |
mtkrtk | 0:d0f130e27d32 | 191 | memset(filenameBuffer, 0, FileNameBufferNum * FileNameBufferLength); |
mtkrtk | 0:d0f130e27d32 | 192 | DIR *directory = opendir("/usb/"); |
mtkrtk | 0:d0f130e27d32 | 193 | struct dirent *file = NULL; |
mtkrtk | 0:d0f130e27d32 | 194 | int numOfMovies = 0; |
mtkrtk | 0:d0f130e27d32 | 195 | while (numOfMovies < FileNameBufferNum && (file = readdir(directory))) { |
mtkrtk | 0:d0f130e27d32 | 196 | size_t length = strlen(file->d_name); |
mtkrtk | 0:d0f130e27d32 | 197 | if (file->d_name[0] == '.') { |
mtkrtk | 0:d0f130e27d32 | 198 | continue; |
mtkrtk | 0:d0f130e27d32 | 199 | } |
mtkrtk | 0:d0f130e27d32 | 200 | if (memcmp(&file->d_name[length - 4], ".mov", 4)) { |
mtkrtk | 0:d0f130e27d32 | 201 | continue; |
mtkrtk | 0:d0f130e27d32 | 202 | } |
mtkrtk | 0:d0f130e27d32 | 203 | strcpy(filenameBuffer[numOfMovies], "/usb/"); |
mtkrtk | 0:d0f130e27d32 | 204 | strcat(filenameBuffer[numOfMovies], file->d_name); |
mtkrtk | 0:d0f130e27d32 | 205 | ++numOfMovies; |
mtkrtk | 0:d0f130e27d32 | 206 | } |
mtkrtk | 0:d0f130e27d32 | 207 | closedir(directory); |
mtkrtk | 0:d0f130e27d32 | 208 | |
mtkrtk | 0:d0f130e27d32 | 209 | int fileIndex = 0; |
mtkrtk | 0:d0f130e27d32 | 210 | const graphics_image_t *currentImage = Menu::upx; |
mtkrtk | 0:d0f130e27d32 | 211 | lcd->drawImage(Menu::upx); |
mtkrtk | 0:d0f130e27d32 | 212 | constexpr uint32_t black = 0x000000f0; |
mtkrtk | 0:d0f130e27d32 | 213 | |
mtkrtk | 0:d0f130e27d32 | 214 | while (1) { |
mtkrtk | 0:d0f130e27d32 | 215 | ascii.DrawStr(&filenameBuffer[fileIndex][5], 0, 30, black, 2); |
mtkrtk | 0:d0f130e27d32 | 216 | ascii.DrawStr(&filenameBuffer[fileIndex + 1][5], 0, 110, black, 2); |
mtkrtk | 0:d0f130e27d32 | 217 | ascii.DrawStr(&filenameBuffer[fileIndex + 2][5], 0, 190, black, 2); |
mtkrtk | 0:d0f130e27d32 | 218 | dcache_clean(user_frame_buffer, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 219 | #ifdef ONLINE_COMPILER |
mtkrtk | 0:d0f130e27d32 | 220 | TouchAction::TouchAction action = readTouch(lcd, &touch, currentImage); |
mtkrtk | 0:d0f130e27d32 | 221 | #else |
mtkrtk | 0:d0f130e27d32 | 222 | TouchAction action = readTouch(lcd, &touch, currentImage); |
mtkrtk | 0:d0f130e27d32 | 223 | #endif |
mtkrtk | 0:d0f130e27d32 | 224 | char *path = nullptr; |
mtkrtk | 0:d0f130e27d32 | 225 | switch (action) { |
mtkrtk | 0:d0f130e27d32 | 226 | case TouchAction::Play0: |
mtkrtk | 0:d0f130e27d32 | 227 | path = filenameBuffer[fileIndex]; |
mtkrtk | 0:d0f130e27d32 | 228 | break; |
mtkrtk | 0:d0f130e27d32 | 229 | |
mtkrtk | 0:d0f130e27d32 | 230 | case TouchAction::Play1: |
mtkrtk | 0:d0f130e27d32 | 231 | path = filenameBuffer[fileIndex + 1]; |
mtkrtk | 0:d0f130e27d32 | 232 | break; |
mtkrtk | 0:d0f130e27d32 | 233 | |
mtkrtk | 0:d0f130e27d32 | 234 | case TouchAction::Play2: |
mtkrtk | 0:d0f130e27d32 | 235 | path = filenameBuffer[fileIndex + 2]; |
mtkrtk | 0:d0f130e27d32 | 236 | break; |
mtkrtk | 0:d0f130e27d32 | 237 | |
mtkrtk | 0:d0f130e27d32 | 238 | case TouchAction::ScrollUp: |
mtkrtk | 0:d0f130e27d32 | 239 | fileIndex -= 3; |
mtkrtk | 0:d0f130e27d32 | 240 | if (fileIndex <= 0) { |
mtkrtk | 0:d0f130e27d32 | 241 | fileIndex = 0; |
mtkrtk | 0:d0f130e27d32 | 242 | currentImage = Menu::upx; |
mtkrtk | 0:d0f130e27d32 | 243 | } else { |
mtkrtk | 0:d0f130e27d32 | 244 | currentImage = Menu::top; |
mtkrtk | 0:d0f130e27d32 | 245 | } |
mtkrtk | 0:d0f130e27d32 | 246 | lcd->drawImage(currentImage); |
mtkrtk | 0:d0f130e27d32 | 247 | ascii.Erase(); |
mtkrtk | 0:d0f130e27d32 | 248 | dcache_clean(user_frame_buffer, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 249 | break; |
mtkrtk | 0:d0f130e27d32 | 250 | |
mtkrtk | 0:d0f130e27d32 | 251 | case TouchAction::ScrollDown: |
mtkrtk | 0:d0f130e27d32 | 252 | fileIndex += 3; |
mtkrtk | 0:d0f130e27d32 | 253 | if (fileIndex + 3 >= numOfMovies) { |
mtkrtk | 0:d0f130e27d32 | 254 | fileIndex = numOfMovies - 3; |
mtkrtk | 0:d0f130e27d32 | 255 | if (fileIndex < 0) { |
mtkrtk | 0:d0f130e27d32 | 256 | fileIndex = 0; |
mtkrtk | 0:d0f130e27d32 | 257 | } |
mtkrtk | 0:d0f130e27d32 | 258 | currentImage = Menu::downx; |
mtkrtk | 0:d0f130e27d32 | 259 | } else { |
mtkrtk | 0:d0f130e27d32 | 260 | currentImage = Menu::top; |
mtkrtk | 0:d0f130e27d32 | 261 | } |
mtkrtk | 0:d0f130e27d32 | 262 | lcd->drawImage(currentImage); |
mtkrtk | 0:d0f130e27d32 | 263 | ascii.Erase(); |
mtkrtk | 0:d0f130e27d32 | 264 | dcache_clean(user_frame_buffer, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 265 | break; |
mtkrtk | 0:d0f130e27d32 | 266 | |
mtkrtk | 0:d0f130e27d32 | 267 | default: |
mtkrtk | 0:d0f130e27d32 | 268 | break; |
mtkrtk | 0:d0f130e27d32 | 269 | } |
mtkrtk | 0:d0f130e27d32 | 270 | if (path && *path) { |
mtkrtk | 0:d0f130e27d32 | 271 | ascii.Erase(); |
mtkrtk | 0:d0f130e27d32 | 272 | dcache_clean(user_frame_buffer, sizeof(user_frame_buffer)); |
mtkrtk | 0:d0f130e27d32 | 273 | FILE *file = fopen(path, "r"); |
mtkrtk | 0:d0f130e27d32 | 274 | printf("start playing %s\n", path); |
mtkrtk | 0:d0f130e27d32 | 275 | mov->start(file); |
mtkrtk | 0:d0f130e27d32 | 276 | player->play(mov, lcd, callback); |
mtkrtk | 0:d0f130e27d32 | 277 | fclose(file); |
mtkrtk | 0:d0f130e27d32 | 278 | printf("finished playing\n"); |
mtkrtk | 0:d0f130e27d32 | 279 | } else { |
mtkrtk | 0:d0f130e27d32 | 280 | continue; |
mtkrtk | 0:d0f130e27d32 | 281 | } |
mtkrtk | 0:d0f130e27d32 | 282 | touch.Reset(); |
mtkrtk | 0:d0f130e27d32 | 283 | while (touchSemaphore.wait(0) > 0) ; |
mtkrtk | 0:d0f130e27d32 | 284 | readTouch(nullptr, &touch, nullptr); |
mtkrtk | 0:d0f130e27d32 | 285 | lcd->drawImage(currentImage); |
mtkrtk | 0:d0f130e27d32 | 286 | } |
mtkrtk | 0:d0f130e27d32 | 287 | |
mtkrtk | 0:d0f130e27d32 | 288 | return 0; |
mtkrtk | 0:d0f130e27d32 | 289 | } |
mtkrtk | 0:d0f130e27d32 | 290 |