+ if (row == (select_idx - MAX_ITEMS_ROW) && col == NEXT_ITEM_COL)
+ {
+ text_style(bm, STYLEF_INVERT, STYLEF_INVERT);
+ select_node = item;
+ }
+ }
+
+ text_xprintf(bm, row, col, TEXT_NORMAL, "%s", item->file_name);
+ row++;
+ }
+
+ lcd_hx8347_blitBitmap(bm);
+
+ return select_node;
+}
+
+static void play_menu(Bitmap *bm)
+{
+ List file_list;
+ LIST_INIT(&file_list);
+ int file_list_size = 0;
+ gfx_bitmapClear(bm);
+
+ memcpy (&item_nodes[0].file_name, "<- Return..", sizeof(item_nodes[0].file_name));
+ ADDTAIL(&file_list, &item_nodes[0].n);
+
+ if (SD_CARD_PRESENT())
+ {
+ timer_delay(10);
+
+ bool sd_ok = sd_init(&sd, NULL, 0);
+ FRESULT result;
+
+ if (sd_ok)
+ {
+ kprintf("Mount FAT filesystem.\n");
+ result = f_mount(0, &fs);
+ if (result != FR_OK)
+ {
+ kprintf("Mounting FAT volumes error[%d]\n", result);
+ sd_ok = false;
+ }
+
+ if (sd_ok)
+ {
+ FILINFO fno;
+ DIR dir;
+
+ kputs("open dir\n");
+ /* Open the directory */
+ result = f_opendir(&dir, "/");
+ if (result == FR_OK)
+ {
+ // First element is reserved for "return" label
+ for (int i = 1;; i++)
+ {
+ /* Read a directory item */
+ result = f_readdir(&dir, &fno);
+ if (result != FR_OK || fno.fname[0] == 0)
+ break; /* Break on error or end of dir */
+ if (fno.fname[0] == '.')
+ continue; /* Ignore dot entry */
+ if (fno.fattrib & AM_DIR)
+ continue;
+ else
+ {
+ if (i < MAX_ITEM_NODES)
+ {
+ memcpy (&item_nodes[i].file_name, fno.fname, sizeof(item_nodes[i].file_name));
+ ADDTAIL(&file_list, &item_nodes[i].n);
+ file_list_size++;
+ kprintf("%s\n", item_nodes[i].file_name);
+ }
+ else
+ {
+ kputs("No enought space to store items in list\n");
+ break;
+ }
+ }
+ }
+ }
+ }
+ f_mount(0, NULL);
+ kprintf("Umount\n");
+ }
+ }
+ else
+ {
+ kputs("No card insert..\n");
+ text_xprintf(bm, 5, 0, TEXT_CENTER | TEXT_FILL, "%s", "No card insert..");
+ }
+
+ int idx = 0;
+ FileItemNode *selected_node = NULL;
+ select_item(bm, &file_list, idx);
+ while (1)
+ {
+ keymask_t key = kbd_peek();
+ if (key & K_LEFT)
+ {
+ idx++;
+ if (idx > file_list_size)
+ idx = 0;
+
+ selected_node = select_item(bm, &file_list, idx);
+ }
+ if (key & K_RIGHT)
+ {
+ if (idx == 0)
+ break;
+
+ if (!is_playing)
+ start_play(selected_node->file_name);
+ else
+ stop_play();
+ }
+
+ cpu_relax();
+ }
+}
+
+
+static void rec_menu(Bitmap *bm)
+{
+ gfx_bitmapClear(bm);
+ text_style(bm, STYLEF_BOLD | STYLEF_UNDERLINE, STYLEF_BOLD | STYLEF_UNDERLINE);
+ text_xprintf(bm, 0, 0, TEXT_CENTER | TEXT_FILL, "Microphone recorder.");
+ text_style(bm, 0, STYLEF_MASK);
+ text_xprintf(bm, 2, 0, TEXT_NORMAL, "Press RIGHT button to start recording");
+ text_xprintf(bm, 3, 0, TEXT_NORMAL, "and to stop it re-press RIGHT button.");
+ lcd_hx8347_blitBitmap(bm);
+
+ ticks_t start= 0;
+ while (1)
+ {
+ keymask_t key = kbd_peek();
+ if (key & K_LEFT)
+ {
+ break;
+ }
+ if (key & K_RIGHT)
+ {
+ char file_name[13];
+ memset(file_name, 0, sizeof(file_name));
+ sprintf(file_name, "REC%d.WAV", recorderd_file_idx);
+ kprintf("rec %s\n", file_name);
+
+ if (!is_recording)
+ {
+ start_rec(file_name);
+ text_xprintf(bm, 5, 0, TEXT_CENTER | TEXT_FILL, "Start recording on file: %s", file_name);
+ lcd_hx8347_blitBitmap(bm);
+ start = timer_clock();
+ }
+ else
+ {
+ stop_rec();
+ recorderd_file_idx++;
+ text_xprintf(bm, 5, 0, TEXT_CENTER | TEXT_FILL, "Stop recording: %s", file_name);
+ mtime_t elaps = ticks_to_ms(timer_clock() - start);
+ text_xprintf(bm, 6, 0, TEXT_CENTER | TEXT_FILL, "Recorded: %ld.%ldsec", elaps / 1000, elaps % 1000);
+ lcd_hx8347_blitBitmap(bm);
+ }
+ }
+
+ cpu_relax();
+ }
+}
+
+
+
+/*
+ * Lcd
+ */
+static void setBrightness(Bitmap *bm)
+{
+ while (1)
+ {
+ gfx_bitmapClear(bm);
+ text_xprintf(bm, 1, 0, TEXT_FILL | TEXT_CENTER, "Brightness: %d", lcd_brightness);
+ text_xprintf(bm, 3, 0, TEXT_FILL | TEXT_CENTER, "RIGHT key: change");
+ text_xprintf(bm, 4, 0, TEXT_FILL | TEXT_CENTER, "LEFT key: back ");
+ lcd_hx8347_blitBitmap(bm);
+
+ keymask_t mask = kbd_get();
+
+ if (mask & K_LEFT)
+ break;
+ else if (mask & K_RIGHT)
+ {
+ if (++lcd_brightness > LCD_BACKLIGHT_MAX)
+ lcd_brightness = 0;
+ lcd_setBacklight(lcd_brightness);