2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <sys/types.h>
22 #include <asm/unistd.h>
24 #include <sys/syscall.h>
26 #include "stc_ipt_menu.h"
28 #define DEFAULT_MENU_MENU "m"
29 #define DEFAULT_MENU_PREV "p"
30 #define DEFAULT_MENU_QUIT "q"
31 #define DEFAULT_MENU_NONE "-"
38 struct menu_data *menu;
47 char key_buffer[MENU_DATA_SIZE];
48 int flag_pid_display = 1;
51 static void _show_prompt(void)
53 msgn("(%5d) >> ", get_tid());
56 static void _show_reserved_menu(void)
58 msg(LOG_DARKGRAY HR_SINGLE2 LOG_END);
59 msg(LOG_DARKGRAY " [ " LOG_END "%s" LOG_DARKGRAY
60 " ] " LOG_END "Previous Menu " , DEFAULT_MENU_PREV);
61 msg(LOG_DARKGRAY " [ " LOG_END "%s" LOG_DARKGRAY
62 " ] " LOG_END "Show Menu " , DEFAULT_MENU_MENU);
63 msg(LOG_DARKGRAY " [ " LOG_END "%s" LOG_DARKGRAY
64 " ] " LOG_END "Quit " , DEFAULT_MENU_QUIT);
67 static void _show_input_ok(void)
72 static void _show_menu(MManager *m, struct menu_data menu[])
76 struct menu_data *item;
77 char title_buf[256] = { 0, };
85 len = g_queue_get_length(m->title_stack);
86 msgn(LOG_YELLOW " Main");
88 for (i = 0; i < len; i++) {
89 msgn(LOG_END " >> " LOG_YELLOW "%s",
90 (char *)g_queue_peek_nth(m->title_stack, i));
101 if (item->key == NULL)
104 if (!g_strcmp0(item->key, "-")) {
106 } else if (!g_strcmp0(item->key, "_")) {
107 msg(LOG_DARKGRAY HR_SINGLE2 LOG_END);
110 item->callback(m, item);
115 } else if (!g_strcmp0(item->key, "*")) {
116 msg(" %s", item->title);
118 item->callback(m, item);
120 msgn(LOG_DARKGRAY " [" LOG_END "%3s"
121 LOG_DARKGRAY "] " LOG_END, item->key);
124 memset(title_buf, 0, 256);
126 snprintf(title_buf, MAX_TITLE, "%s", item->title);
128 if (strlen(item->title) >= MAX_TITLE) {
129 title_buf[MAX_TITLE - 2] = '.';
130 title_buf[MAX_TITLE - 1] = '.';
135 msg("%s " LOG_LIGHTBLUE "(%s)" LOG_END,
136 title_buf, item->data);
137 } else if (!g_strcmp0(item->key, "*")) {
140 msg("%s", title_buf);
144 msg("\e[1A\e[%dC >", (int)POS_MORE);
151 _show_reserved_menu();
158 static void _show_item_data_input_msg(struct menu_data *item)
162 msg(" Input [%s] data ", item->title);
164 msg(" current = [%s]", item->data);
168 static void _move_menu(MManager *mm, struct menu_data menu[], char *key)
170 struct menu_data *item;
176 if (!g_strcmp0(DEFAULT_MENU_PREV, key)) {
177 if (g_queue_get_length(mm->stack) > 0) {
178 mm->menu = g_queue_pop_tail(mm->stack);
179 g_queue_pop_tail(mm->title_stack);
182 _show_menu(mm, mm->menu);
183 mm->buf = key_buffer;
186 } else if (!g_strcmp0(DEFAULT_MENU_MENU, key)) {
187 _show_menu(mm, mm->menu);
189 } else if (!g_strcmp0(DEFAULT_MENU_QUIT, key)) {
190 g_main_loop_quit(mm->mainloop);
192 } else if (!g_strcmp0(DEFAULT_MENU_NONE, key)) {
198 int ret = RET_SUCCESS;
200 if (item->key == NULL)
203 if (!g_strcmp0(item->key, key)) {
204 if (item->callback) {
205 ret = item->callback(mm, item);
209 if (RET_SUCCESS == ret) {
210 if (item->sub_menu) {
211 g_queue_push_tail(mm->stack, mm->menu);
212 g_queue_push_tail(mm->title_stack, (gpointer *)item->title);
214 mm->menu = item->sub_menu;
215 _show_menu(mm, mm->menu);
216 mm->buf = key_buffer;
220 _show_item_data_input_msg(item);
221 mm->buf = item->data;
234 MManager *menu_manager_new(struct menu_data items[], GMainLoop *mainloop)
238 mm = calloc(sizeof(struct menu_manager), 1);
242 mm->stack = g_queue_new();
243 mm->title_stack = g_queue_new();
245 mm->mainloop = mainloop;
250 int menu_manager_run(MManager *mm)
252 _show_menu(mm, mm->menu);
254 mm->buf = key_buffer;
259 int menu_manager_set_user_data(MManager *mm, void *user_data)
264 mm->user_data = user_data;
269 void *menu_manager_ref_user_data(MManager *mm)
274 return mm->user_data;
277 gboolean on_menu_manager_keyboard(GIOChannel *src, GIOCondition con,
281 char local_buf[MENU_DATA_SIZE + 1] = { 0, };
283 if (fgets(local_buf, MENU_DATA_SIZE, stdin) == NULL)
286 if (strlen(local_buf) > 0) {
287 if (local_buf[strlen(local_buf) - 1] == '\n')
288 local_buf[strlen(local_buf) - 1] = '\0';
291 if (mm->buf == key_buffer) {
292 if (strlen(local_buf) < 1) {
297 _move_menu(mm, mm->menu, local_buf);
300 memset(mm->buf, 0, MENU_DATA_SIZE);
301 memcpy(mm->buf, local_buf, MENU_DATA_SIZE);
304 mm->buf = key_buffer;
305 _move_menu(mm, mm->menu, (char *)DEFAULT_MENU_MENU);
313 return syscall(__NR_gettid);
318 flag_pid_display = 0;
323 flag_pid_display = 1;
328 return flag_pid_display;
331 static void _hex_dump(const char *pad, int size, const void *data)
333 char buf[255] = {0, };
339 msg("%sno data", pad);
342 p = (unsigned char *)data;
344 snprintf(buf, 255, "%s%04X: ", pad, 0);
345 for (i = 0; i < size; i++) {
346 snprintf(hex, 4, "%02X ", p[i]);
347 strncat(buf, hex, 255 - strlen(buf) - 1);
349 if ((i + 1) % 8 == 0) {
350 if ((i + 1) % 16 == 0) {
353 snprintf(buf, 255, "%s%04X: ", pad, i + 1);
355 strncat(buf, TAB_SPACE, 255 - strlen(buf) - 1);
363 void menu_print_dump(int data_len, void *data)
369 msg(" \tlen=%d", data_len);
370 _hex_dump(" ", data_len, data);