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
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?

UserRevisionLine numberNew 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