From 8f9f1c3341b70cc45e87bbefc7cfc12774096265 Mon Sep 17 00:00:00 2001 From: Vincent-FK Date: Thu, 10 Jun 2021 08:10:13 +0200 Subject: [PATCH] added files for funkey menu --- include/menu.h | 48 +++ root@192.168.137.145 | Bin 0 -> 50616 bytes src/menu.c | 742 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 790 insertions(+) create mode 100644 include/menu.h create mode 100755 root@192.168.137.145 create mode 100644 src/menu.c diff --git a/include/menu.h b/include/menu.h new file mode 100644 index 0000000..855f41a --- /dev/null +++ b/include/menu.h @@ -0,0 +1,48 @@ +#ifndef MENU_H +#define MENU_H + +void init_menu_SDL(); +void deinit_menu_SDL(); +void init_menu_zones(); +void init_menu_system_values(); +void run_menu_loop(); + +typedef enum{ + MENU_TYPE_VOLUME, + MENU_TYPE_BRIGHTNESS, + MENU_TYPE_SAVE, + MENU_TYPE_LOAD, + MENU_TYPE_ASPECT_RATIO, + MENU_TYPE_EXIT, + MENU_TYPE_POWERDOWN, + NB_MENU_TYPES, +} ENUM_MENU_TYPE; + +////------ Defines to be shared ------- +#define STEP_CHANGE_VOLUME 10 +#define STEP_CHANGE_BRIGHTNESS 10 +#define NOTIF_SECONDS_DISP 2 + +////------ Menu commands ------- +#define SHELL_CMD_VOLUME_GET "volume get" +#define SHELL_CMD_VOLUME_SET "volume set" +#define SHELL_CMD_BRIGHTNESS_GET "brightness get" +#define SHELL_CMD_BRIGHTNESS_SET "brightness set" +#define SHELL_CMD_NOTIF "notif_set" +#define SHELL_CMD_NOTIF_CLEAR "notif_clear" +#define SHELL_CMD_WRITE_QUICK_LOAD_CMD "write_args_quick_load_file" +#define SHELL_CMD_TURN_AMPLI_ON "start_audio_amp 1" +#define SHELL_CMD_TURN_AMPLI_OFF "start_audio_amp 0" +#define SHELL_CMD_CANCEL_SCHED_POWERDOWN "cancel_sched_powerdown" +#define SHELL_CMD_INSTANT_PLAY "instant_play" +#define SHELL_CMD_SHUTDOWN_FUNKEY "shutdown_funkey" +#define SHELL_CMD_KEYMAP_DEFAULT "keymap default" +#define SHELL_CMD_KEYMAP_RESUME "keymap resume" + +////------ Global variables ------- +extern int volume_percentage; +extern int brightness_percentage; + +extern int stop_menu_loop; + +#endif //MENU_H diff --git a/root@192.168.137.145 b/root@192.168.137.145 new file mode 100755 index 0000000000000000000000000000000000000000..297116d72395332b0ae653c4ea013391bfca3559 GIT binary patch literal 50616 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≫(^sdf*gcmV*85755^84Wd&F$Ddx_>IXXq+>{c&4xV=x&4i z8H0O=iT5^f?Pn-YsfmBZ#Iaj_+Bci{K_;&K4B;Pa;y0Lh9}{0poSw`6b!(tA-^VXP zuG{d_-uv$irN6Ps{C5Cx2cCT`|9d#x3%#Q43S>gKzjJVrA5=GY>zR}P4sE6Xm~`!1 z*k_OYwGrbpQkiMndSsxx?Kx!u@~FEbS`S2$%hQ;yvS6#kRo zYuxy>xKn&7dF~l^Tx&6O3kTi#Zl6Sf|D8xR-HJE{gTXZ6!Pyf1Tqd z5}t{x#Vx@#;~vJT9@+<0*>_U5&Wt5*7Pbo!z;v#Cm6yrh zPF#C7Q;yYoYf82VnWLWmogI~R9qBrc=;6?)2lkwyaWynE89GiI-nQ%)W?$T ztNlAMzOBe}A3Ss7;IgL~k!)*kQ?f1Ht#wf}#ySE0t@Xkr*7(xnve$KIU;A=a-j0#H z8U8uPc&pTeIhQSonQ$55ekQE_LXW!XJ(b!EFG=H?c|Rm)b*-mowVI1?c+c2-Eq>s=A;cQWlVUv;#4&LZGX0e>F2$NmQA?E|FydEcU6 z7v#HRlX$~L;cp;r6wakF1R4)Q1G^ymM2LQZwEIc>Fa#e3d=+r!?QZ;x27Wtm?dQ8? zi~+tJxbB|n?8owV7x6UwEXO^JTaSAK=jIiEi^;n@L{q#q08h58$!Q*P^N7D%(zLJc z!o}Yl;0r@=@mC3)@!FwhZlwc;)0V}A?OkC8Tu1yNBo;RVm&Pr}WpHj8NoY-mmgXqk zZPaswZu)rACy@Tn5PTx=bAan!ri(ub`02oPZ^?z113v}$wh(+8@S(tUH%n(ymjBVj zTj6y#u0L{`z)i$ehGbU!A4UElA-dxGaNwe;dXj3x zT>St0E$mL?o7{h;I(LX){UN zMp{^|D}nzBcv!Bhfo}mGmg{-Ie*;`{?b5FW{wi?IuR71PeefoHRKw>I+-h74?qysn z&do30*OUKOdHDV@@QLj4ZVaV~_a{huHUt;%-vz!d1Q+iQ0e>n47w>C;KL*^N&&@j^ z3eb(;0ao@1HaBh>t`;X^#0{rd}JPy1G_}4=4GT_$(|4Ilx z7?lO9=nTj`7t&q8QnQ~~h95p3Ds#?< z%Jy?U^b~c{e3Wl3UwamOupe?J_D}pM!t93(IS8NmyHIsC>;LdtKA8vqL)voDGhOTd z($HDW_&j+!$g_+*Wd^s*oYmNJ!)HVn=b`a?XsmL|wdYydyU{xO5+~0XQ@2;i^RSyI z#OoD#@;pbL_2lvQ3$WFYlj0cXY;kkW_9xQabGFxsOP0F!W09wLrY#<0|C@I?L?X?; z9L8j?A=ljJDe*S&z28H?+pwZ_#q-<=+VC3hlDI2ZD42Pt^HYh}+PIg|Cb|1AW!Sw~ z?YCa-@IBtt^$u{<4mx+TeQftzZzJsuza4nDFXhMnns`_5>r(r3oZOdt;K=CEw7ysn$^5X$

    IU#v4<0sT_!WwI&CE}(rP#3RXPwu|Nk zlh3c1R997fM*R2&8pWHOnqODHIG(DnuVdNec@63Mn#R=dbZyn*RDDHlYEI*@^n$rz zczw;>c|k&V{DtWNJB(jlcin<~bVR>mWd1yU8J&sYa%@6(xXQ69@K8V7RAd;-N6!l? zW&QY|v*KTvK8edh0etA$)iw30*^Q~{ikkUzudu+`3+wAs3mPk~t6I!6WM0GU`c!Ix z%~LUln8{x;H`Q3dqkNrdiZ6EJ*VT08OV`ymrcxEN>gLbt#BTuKDXkM;vw$+I8d4Rt zHP@yZy69J@^21fGMRj>wFsplc!ZWan`BiXkI$eB(aXWc%GZ_3%KJui6^Vu@Oc`UpW zKWLy%o;vYEaMhtYRaI^CSJyO%t4{fwHm_#EbSsobR?efF!>~zJ^>aIc25-is>E*s? znz(3MG~v8y`_i1!IY7H` zRquRopSGLO$?ud4&Yx(AJN!y@^vUH>}z=QJY?ps_&*t#Ag`h z)9VCw)oI40OD0UoQ~z-c*;IY^b`jltaG$oD(8=$(3165tVTw=1z~K>$-BJ-x@ zuS1Zpt4J#YwjTauU~3to>!;aT=1a4+%$H`1)O;|fwrc+TR4^X|;jVcghSr*UyQW#gTC%PRK9n)xZj*QQHaEDrhJZvA>$WBXUab%XpFJ5X2EKslvT9+)2zNXg zSYUE=$2%nt-l#mV&*g!gng@1T9@ywSu+#IvMkIV74bq**k!e$%ec?fs_Js%4+7}*F zZC`j$y?x<96)k*zYQaJo30KuEq&vE|aVV`@Ti2xjs)4nFqyhGS0( zC1pH{qczIm|sP&V1-Z6LW6q8 z&odflNPN!11+&G?ka+E|5j8tVS}&QD(b5i z%uQ8b(7NdXU-Q$Aivv=&EZ<%ajcqC4h7c?uY9!OGgR#ZKGV7OT(!z4?&b!@sG&YVu zUmG?ppEghDLeKKx*hK*?^?3knP`{gS=VWW*79LuBnbe_Y+quzSeHm!y#O%g3G26JE zlx^IdWFgdv7hZ5#{O}^g!aFB(Q$Q!&EIKqtGL8Ah#dS5+jq~DX#}n}rPKeJ-$sAYA zw&Se2keoopq7Bupl+!a^Jm-0M@;X0M@;X0M@;X0A|Xd&${FiGemKE4X>i6 zfyQq@6AvafB)(`!eDO)%@zrM>Urk%rpX?E4Q)ejp$=?^~BqJI_&+h7XLvQHWopK?0 z6%Kn1>@C#Rc4h5?qj4N?7kqAARS3UgLFziC`(wi|BcSic12+8fx+>(P&ra3WR`^zH zfa8yg5X_onMqbo!VO=9wSjPw!o_7T^y@5rU-DLbd&ld39pyzRKiVH9No-6P; zr}yK64T(g&e|)mH?$N@C$G)hyy_epn$SHph9<0TGAG+KT^VkRW*aP-|h5Fx6z*TbI zum^LzTf#d8$Gu&zwUl=t;cvk|6rZyZk9}I-$NL}sis9A%mQk<&Q{4IE#+?x#eD1=U z+Uoi`jJ1)8k%?i6k;6_K$}Vc-;*;VmVMY#1czN+gj2L>#s1ZZwj+pbg(`QwmGHcZ6 zPW-WF&{|cgs#!HW+DWkJw4r0Y9wj};7Dsv&loXW~92)H#=@&UHa(H3?$bf=@k)sQa zjeIsTq+ooZH>_b^Lt}ko)husVjkbT%-mtj~77m+-aq11LUc8`T@%+GVtoMf1r)mWY z0_oaD<*DJnF|~;QIYdaR(^A?SmYT;hSBqXBr=qI99xKAfv0>r)Bh#d{3=GE}B$XP-xuQpXF~T0Frz>jjt^Xc#SWYKgCZqc<174JaVz#AE(08n3OL(p4;`? zMdMw1W6{BZ4k7CQEM19}co1GN2Elju6Q0}zoW1q?9TD;kWsiNQ3(u;eZ?MkzF!mY#c zysM8Ved#@yAMcCcs9g136uf92Jd(WSIJKSdq|=JQ+f7)qrk~1Gf82qy^rT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/constant.h" +#include "../include/misc.h" +#include "../include/menu.h" + + +/// -------------- DEFINES -------------- +//#define MENU_DEBUG +#define MENU_ERROR + +#ifdef MENU_DEBUG +#define MENU_DEBUG_PRINTF(...) printf(__VA_ARGS__); +#else +#define MENU_DEBUG_PRINTF(...) +#endif //MENU_DEBUG + +#ifdef MENU_ERROR +#define MENU_ERROR_PRINTF(...) printf(__VA_ARGS__); +#else +#define MENU_ERROR_PRINTF(...) +#endif //MENU_ERROR + + +#define SCROLL_SPEED_PX 30 +#define FPS_MENU 50 +#define ARROWS_PADDING 8 + +#define MENU_ZONE_WIDTH HW_SCREEN_WIDTH +#define MENU_ZONE_HEIGHT HW_SCREEN_HEIGHT +#define MENU_BG_SQUARE_WIDTH 180 +#define MENU_BG_SQUARE_HEIGHT 140 + +#define MENU_FONT_NAME_TITLE "/usr/games/menu_resources/OpenSans-Bold.ttf" +#define MENU_FONT_SIZE_TITLE 22 +#define MENU_FONT_NAME_INFO "/usr/games/menu_resources/OpenSans-Bold.ttf" +#define MENU_FONT_SIZE_INFO 16 +#define MENU_FONT_NAME_SMALL_INFO "/usr/games/menu_resources/OpenSans-Regular.ttf" +#define MENU_FONT_SIZE_SMALL_INFO 13 +#define MENU_PNG_BG_PATH "/usr/games/menu_resources/zone_bg.png" +#define MENU_PNG_ARROW_TOP_PATH "/usr/games/menu_resources/arrow_top.png" +#define MENU_PNG_ARROW_BOTTOM_PATH "/usr/games/menu_resources/arrow_bottom.png" + +#define GRAY_MAIN_R 85 +#define GRAY_MAIN_G 85 +#define GRAY_MAIN_B 85 +#define WHITE_MAIN_R 236 +#define WHITE_MAIN_G 236 +#define WHITE_MAIN_B 236 + +#define MAX_SAVE_SLOTS 9 + +#define MAXPATHLEN 512 + + +/// -------------- STATIC VARIABLES -------------- +extern SDL_Surface * hw_screen; +static SDL_Surface * backup_hw_screen = NULL; +static SDL_Surface * draw_screen = NULL; + +static int backup_key_repeat_delay, backup_key_repeat_interval; + +static TTF_Font *menu_title_font = NULL; +static TTF_Font *menu_info_font = NULL; +static TTF_Font *menu_small_info_font = NULL; +static SDL_Surface *img_arrow_top = NULL; +static SDL_Surface *img_arrow_bottom = NULL; +static SDL_Surface ** menu_zone_surfaces = NULL; +static int * idx_menus = NULL; +static int nb_menu_zones = 0; +static int menuItem = 0; +int stop_menu_loop = 0; + +static SDL_Color text_color = {GRAY_MAIN_R, GRAY_MAIN_G, GRAY_MAIN_B}; +static int padding_y_from_center_menu_zone = 18; +static uint16_t width_progress_bar = 100; +static uint16_t height_progress_bar = 20; +static uint16_t x_volume_bar = 0; +static uint16_t y_volume_bar = 0; +static uint16_t x_brightness_bar = 0; +static uint16_t y_brightness_bar = 0; + +int volume_percentage = 0; +int brightness_percentage = 0; + +/// -------------- STATIC FUNCTIONS DECLARATION -------------- + +/// -------------- FUNCTIONS IMPLEMENTATION -------------- +void init_menu_SDL(){ + MENU_DEBUG_PRINTF("Init Menu\n"); + + /// ----- Loading the fonts ----- + menu_title_font = TTF_OpenFont(MENU_FONT_NAME_TITLE, MENU_FONT_SIZE_TITLE); + if(!menu_title_font){ + MENU_ERROR_PRINTF("ERROR in init_menu_SDL: Could not open menu font %s, %s\n", MENU_FONT_NAME_TITLE, SDL_GetError()); + } + menu_info_font = TTF_OpenFont(MENU_FONT_NAME_INFO, MENU_FONT_SIZE_INFO); + if(!menu_info_font){ + MENU_ERROR_PRINTF("ERROR in init_menu_SDL: Could not open menu font %s, %s\n", MENU_FONT_NAME_INFO, SDL_GetError()); + } + menu_small_info_font = TTF_OpenFont(MENU_FONT_NAME_SMALL_INFO, MENU_FONT_SIZE_SMALL_INFO); + if(!menu_small_info_font){ + MENU_ERROR_PRINTF("ERROR in init_menu_SDL: Could not open menu font %s, %s\n", MENU_FONT_NAME_SMALL_INFO, SDL_GetError()); + } + + /// ----- Copy hw_screen at init ------ + backup_hw_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, + hw_screen->w, hw_screen->h, 16, 0, 0, 0, 0); + + draw_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, + hw_screen->w, hw_screen->h, 16, 0, 0, 0, 0); + if(draw_screen == NULL){ + MENU_ERROR_PRINTF("ERROR Could not create draw_screen: %s\n", SDL_GetError()); + } + + /// ------ Load arrows imgs ------- + img_arrow_top = IMG_Load(MENU_PNG_ARROW_TOP_PATH); + if(!img_arrow_top) { + MENU_ERROR_PRINTF("ERROR IMG_Load: %s\n", IMG_GetError()); + } + img_arrow_bottom = IMG_Load(MENU_PNG_ARROW_BOTTOM_PATH); + if(!img_arrow_bottom) { + MENU_ERROR_PRINTF("ERROR IMG_Load: %s\n", IMG_GetError()); + } + + /// ------ Init menu zones ------ + init_menu_zones(); +} + +void deinit_menu_SDL(){ + MENU_DEBUG_PRINTF("End Menu \n"); + + /// ------ Close font ------- + TTF_CloseFont(menu_title_font); + TTF_CloseFont(menu_info_font); + TTF_CloseFont(menu_small_info_font); + + /// ------ Free Surfaces ------- + for(int i=0; i < nb_menu_zones; i++){ + SDL_FreeSurface(menu_zone_surfaces[i]); + } + + if(backup_hw_screen != NULL){ + SDL_FreeSurface(backup_hw_screen); + } + if(draw_screen != NULL){ + SDL_FreeSurface(draw_screen); + } + + SDL_FreeSurface(img_arrow_top); + SDL_FreeSurface(img_arrow_bottom); + + /// ------ Free Menu memory and reset vars ----- + if(idx_menus){ + free(idx_menus); + } + idx_menus=NULL; + nb_menu_zones = 0; +} + + +void draw_progress_bar(SDL_Surface * surface, uint16_t x, uint16_t y, uint16_t width, + uint16_t height, uint8_t percentage, uint16_t nb_bars){ + + /// ------ Init Variables ------ + uint16_t line_width = 1; //px + uint16_t padding_bars_ratio = 3; + uint16_t nb_full_bars = 0; + + /// ------ Check values ------ + percentage = (percentage > 100)?100:percentage; + x = (x > (surface->w-1))?(surface->w-1):x; + y = (y > surface->h-1)?(surface->h-1):y; + width = (width < line_width*2+1)?(line_width*2+1):width; + width = (width > surface->w-x-1)?(surface->w-x-1):width; + height = (height < line_width*2+1)?(line_width*2+1):height; + height = (height > surface->h-y-1)?(surface->h-y-1):height; + uint16_t nb_bars_max = ( width * padding_bars_ratio / (line_width*2+1) + 1 ) / (padding_bars_ratio+1); + nb_bars = (nb_bars > nb_bars_max)?nb_bars_max:nb_bars; + uint16_t bar_width = (width / nb_bars)*padding_bars_ratio/(padding_bars_ratio+1)+1; + uint16_t bar_padding_x = bar_width/padding_bars_ratio; + nb_full_bars = nb_bars*percentage/100; + + /// ------ draw full bars ------ + for (int i = 0; i < nb_full_bars; ++i) + { + /// ---- draw one bar ---- + //MENU_DEBUG_PRINTF("Drawing filled bar %d\n", i); + SDL_Rect rect = {x+ i*(bar_width +bar_padding_x), + y, bar_width, height}; + SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, GRAY_MAIN_R, GRAY_MAIN_G, GRAY_MAIN_B)); + } + + /// ------ draw full bars ------ + for (int i = 0; i < (nb_bars-nb_full_bars); ++i) + { + /// ---- draw one bar ---- + //MENU_DEBUG_PRINTF("Drawing empty bar %d\n", i); + SDL_Rect rect = {x+ i*(bar_width +bar_padding_x) + nb_full_bars*(bar_width +bar_padding_x), + y, bar_width, height}; + SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, GRAY_MAIN_R, GRAY_MAIN_G, GRAY_MAIN_B)); + + SDL_Rect rect2 = {x+ i*(bar_width +bar_padding_x) + line_width + nb_full_bars*(bar_width +bar_padding_x), + y + line_width, bar_width - line_width*2, height - line_width*2}; + SDL_FillRect(surface, &rect2, SDL_MapRGB(surface->format, WHITE_MAIN_R, WHITE_MAIN_R, WHITE_MAIN_R)); + } + + +} + + +void add_menu_zone(ENUM_MENU_TYPE menu_type){ + /// ------ Increase nb of menu zones ------- + nb_menu_zones++; + + /// ------ Realoc idx Menus array ------- + if(!idx_menus){ + idx_menus = malloc(nb_menu_zones*sizeof(int)); + menu_zone_surfaces = malloc(nb_menu_zones*sizeof(SDL_Surface*)); + } + else{ + int *temp = realloc(idx_menus, nb_menu_zones*sizeof(int)); + idx_menus = temp; + menu_zone_surfaces = realloc(menu_zone_surfaces, nb_menu_zones*sizeof(SDL_Surface*)); + } + idx_menus[nb_menu_zones-1] = menu_type; + + /// ------ Reinit menu surface with height increased ------- + menu_zone_surfaces[nb_menu_zones-1] = IMG_Load(MENU_PNG_BG_PATH); + if(!menu_zone_surfaces[nb_menu_zones-1]) { + MENU_ERROR_PRINTF("ERROR IMG_Load: %s\n", IMG_GetError()); + } + /// --------- Init Common Variables -------- + SDL_Surface *text_surface = NULL; + SDL_Surface *surface = menu_zone_surfaces[nb_menu_zones-1]; + SDL_Rect text_pos; + + /// --------- Add new zone --------- + switch(menu_type){ + case MENU_TYPE_VOLUME: + MENU_DEBUG_PRINTF("Init MENU_TYPE_VOLUME\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "VOLUME", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 - padding_y_from_center_menu_zone; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + + x_volume_bar = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - width_progress_bar)/2; + y_volume_bar = surface->h - MENU_ZONE_HEIGHT/2 - height_progress_bar/2 + padding_y_from_center_menu_zone; + draw_progress_bar(surface, x_volume_bar, y_volume_bar, + width_progress_bar, height_progress_bar, 0, 100/STEP_CHANGE_VOLUME); + break; + case MENU_TYPE_BRIGHTNESS: + MENU_DEBUG_PRINTF("Init MENU_TYPE_BRIGHTNESS\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "BRIGHTNESS", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 - padding_y_from_center_menu_zone; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + + x_brightness_bar = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - width_progress_bar)/2; + y_brightness_bar = surface->h - MENU_ZONE_HEIGHT/2 - height_progress_bar/2 + padding_y_from_center_menu_zone; + draw_progress_bar(surface, x_brightness_bar, y_brightness_bar, + width_progress_bar, height_progress_bar, 0, 100/STEP_CHANGE_BRIGHTNESS); + break; + case MENU_TYPE_SAVE: + MENU_DEBUG_PRINTF("Init MENU_TYPE_SAVE\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "SAVE", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 - padding_y_from_center_menu_zone*2; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + break; + case MENU_TYPE_LOAD: + MENU_DEBUG_PRINTF("Init MENU_TYPE_LOAD\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "LOAD", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 - padding_y_from_center_menu_zone*2; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + break; + case MENU_TYPE_ASPECT_RATIO: + MENU_DEBUG_PRINTF("Init MENU_TYPE_ASPECT_RATIO\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "ASPECT RATIO", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 - padding_y_from_center_menu_zone; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + break; + case MENU_TYPE_EXIT: + MENU_DEBUG_PRINTF("Init MENU_TYPE_EXIT\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "EXIT GAME", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + break; + case MENU_TYPE_POWERDOWN: + MENU_DEBUG_PRINTF("Init MENU_TYPE_POWERDOWN\n"); + /// ------ Text ------ + text_surface = TTF_RenderText_Blended(menu_title_font, "POWERDOWN", text_color); + text_pos.x = (surface->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = surface->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2; + SDL_BlitSurface(text_surface, NULL, surface, &text_pos); + break; + default: + MENU_DEBUG_PRINTF("Warning - In add_menu_zone, unknown MENU_TYPE: %d\n", menu_type); + break; + } + + /// ------ Free Surfaces ------- + SDL_FreeSurface(text_surface); +} + +void init_menu_zones(){ + /// Init Volume Menu + add_menu_zone(MENU_TYPE_VOLUME); + /// Init Brightness Menu + add_menu_zone(MENU_TYPE_BRIGHTNESS); + /// Init Exit Menu + add_menu_zone(MENU_TYPE_EXIT); + /// Init Powerdown Menu + //add_menu_zone(MENU_TYPE_POWERDOWN); +} + + +void init_menu_system_values(){ + FILE *fp; + char res[100]; + + /// ------- Get system volume percentage -------- + fp = popen(SHELL_CMD_VOLUME_GET, "r"); + if (fp == NULL) { + MENU_ERROR_PRINTF("Failed to run command %s\n", SHELL_CMD_VOLUME_GET ); + volume_percentage = 50; ///wrong value: setting default to 50 + } + else{ + fgets(res, sizeof(res)-1, fp); + pclose(fp); + + /// Check if Volume is a number (at least the first char) + if(res[0] < '0' || res[0] > '9'){ + MENU_ERROR_PRINTF("Wrong return value: %s for volume cmd: %s\n",res, SHELL_CMD_VOLUME_GET); + volume_percentage = 50; ///wrong value: setting default to 50 + } + else{ + volume_percentage = atoi(res); + MENU_DEBUG_PRINTF("System volume = %d%%\n", volume_percentage); + } + } + + /// ------- Get system brightness percentage ------- + fp = popen(SHELL_CMD_BRIGHTNESS_GET, "r"); + if (fp == NULL) { + MENU_ERROR_PRINTF("Failed to run command %s\n", SHELL_CMD_BRIGHTNESS_GET ); + brightness_percentage = 50; ///wrong value: setting default to 50 + } + else{ + fgets(res, sizeof(res)-1, fp); + pclose(fp); + + /// Check if brightness is a number (at least the first char) + if(res[0] < '0' || res[0] > '9'){ + MENU_ERROR_PRINTF("Wrong return value: %s for volume cmd: %s\n",res, SHELL_CMD_BRIGHTNESS_GET); + brightness_percentage = 50; ///wrong value: setting default to 50 + } + else{ + brightness_percentage = atoi(res); + MENU_DEBUG_PRINTF("System brightness = %d%%\n", brightness_percentage); + } + } + + /// ------ Save prev key repeat params and set new Key repeat ------- + SDL_GetKeyRepeat(&backup_key_repeat_delay, &backup_key_repeat_interval); + if(SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL)){ + MENU_ERROR_PRINTF("ERROR with SDL_EnableKeyRepeat: %s\n", SDL_GetError()); + } +} + +void menu_screen_refresh(int menuItem, int prevItem, int scroll, uint8_t menu_confirmation, uint8_t menu_action){ + /// --------- Vars --------- + int print_arrows = (scroll==0)?1:0; + + /// --------- Clear HW screen ---------- + //SDL_FillRect(draw_screen, NULL, SDL_MapRGB(draw_screen->format, 255, 0, 0)); + if(SDL_BlitSurface(backup_hw_screen, NULL, draw_screen, NULL)){ + MENU_ERROR_PRINTF("ERROR Could not Clear draw_screen: %s\n", SDL_GetError()); + } + + /// --------- Setup Blit Window ---------- + SDL_Rect menu_blit_window; + menu_blit_window.x = 0; + menu_blit_window.w = HW_SCREEN_WIDTH; + + /// --------- Blit prev menu Zone going away ---------- + menu_blit_window.y = scroll; + menu_blit_window.h = HW_SCREEN_HEIGHT; + if(SDL_BlitSurface(menu_zone_surfaces[prevItem], &menu_blit_window, draw_screen, NULL)){ + MENU_ERROR_PRINTF("ERROR Could not Blit surface on draw_screen: %s\n", SDL_GetError()); + } + + /// --------- Blit new menu Zone going in (only during animations) ---------- + if(scroll>0){ + menu_blit_window.y = HW_SCREEN_HEIGHT-scroll; + menu_blit_window.h = HW_SCREEN_HEIGHT; + if(SDL_BlitSurface(menu_zone_surfaces[menuItem], NULL, draw_screen, &menu_blit_window)){ + MENU_ERROR_PRINTF("ERROR Could not Blit surface on draw_screen: %s\n", SDL_GetError()); + } + } + else if(scroll<0){ + menu_blit_window.y = HW_SCREEN_HEIGHT+scroll; + menu_blit_window.h = HW_SCREEN_HEIGHT; + if(SDL_BlitSurface(menu_zone_surfaces[menuItem], &menu_blit_window, draw_screen, NULL)){ + MENU_ERROR_PRINTF("ERROR Could not Blit surface on draw_screen: %s\n", SDL_GetError()); + } + } + /// --------- No Scroll ? Blitting menu-specific info + else{ + SDL_Surface * text_surface = NULL; + char text_tmp[40]; + SDL_Rect text_pos; + char fname[MAXPATHLEN]; + memset(fname, 0, MAXPATHLEN); + + switch(idx_menus[menuItem]){ + case MENU_TYPE_VOLUME: + draw_progress_bar(draw_screen, x_volume_bar, y_volume_bar, + width_progress_bar, height_progress_bar, volume_percentage, 100/STEP_CHANGE_VOLUME); + break; + + case MENU_TYPE_BRIGHTNESS: + draw_progress_bar(draw_screen, x_volume_bar, y_volume_bar, + width_progress_bar, height_progress_bar, brightness_percentage, 100/STEP_CHANGE_BRIGHTNESS); + break; + + case MENU_TYPE_EXIT: + case MENU_TYPE_POWERDOWN: + if(menu_confirmation){ + sprintf(text_tmp, "Are you sure ?"); + text_surface = TTF_RenderText_Blended(menu_info_font, text_tmp, text_color); + text_pos.x = (draw_screen->w - MENU_ZONE_WIDTH)/2 + (MENU_ZONE_WIDTH - text_surface->w)/2; + text_pos.y = draw_screen->h - MENU_ZONE_HEIGHT/2 - text_surface->h/2 + 2*padding_y_from_center_menu_zone; + SDL_BlitSurface(text_surface, NULL, draw_screen, &text_pos); + } + break; + default: + break; + } + + /// ------ Free Surfaces ------- + if(text_surface) + SDL_FreeSurface(text_surface); + } + + /// --------- Print arrows -------- + if(print_arrows){ + /// Top arrow + SDL_Rect pos_arrow_top; + pos_arrow_top.x = (draw_screen->w - img_arrow_top->w)/2; + pos_arrow_top.y = (draw_screen->h - MENU_BG_SQUARE_HEIGHT)/4 - img_arrow_top->h/2; + SDL_BlitSurface(img_arrow_top, NULL, draw_screen, &pos_arrow_top); + + /// Bottom arrow + SDL_Rect pos_arrow_bottom; + pos_arrow_bottom.x = (draw_screen->w - img_arrow_bottom->w)/2; + pos_arrow_bottom.y = draw_screen->h - + (draw_screen->h - MENU_BG_SQUARE_HEIGHT)/4 - img_arrow_bottom->h/2; + SDL_BlitSurface(img_arrow_bottom, NULL, draw_screen, &pos_arrow_bottom); + } + + /// --------- Screen Rotate -------- + //SDL_Rotate_270(hw_screen, draw_screen); + //SDL_BlitSurface(draw_screen, NULL, hw_screen, NULL); + + /// ---- Fast blit ---- + memcpy(hw_screen->pixels, draw_screen->pixels, hw_screen->h*hw_screen->w*sizeof(uint16_t)); + + /// --------- Render Screen ---------- + SDL_Flip(hw_screen); +} + + +void run_menu_loop() +{ + MENU_DEBUG_PRINTF("Launch Menu\n"); + + SDL_Event event; + uint32_t prev_ms = SDL_GetTicks(); + uint32_t cur_ms = SDL_GetTicks(); + int scroll=0; + int start_scroll=0; + uint8_t screen_refresh = 1; + char shell_cmd[100]; + uint8_t menu_confirmation = 0; + stop_menu_loop = 0; + char fname[MAXPATHLEN]; + + /// ------ Load default keymap ------ + system(SHELL_CMD_KEYMAP_DEFAULT); + + /// ------ Get init values ------- + init_menu_system_values(); + int prevItem=menuItem; + + /// ------ Copy currently displayed screen ------- + memcpy(backup_hw_screen->pixels, (uint16_t *)hw_screen->pixels, + HW_SCREEN_WIDTH * HW_SCREEN_HEIGHT * sizeof(uint16_t)); + + /* Stop Ampli */ + system(SHELL_CMD_TURN_AMPLI_OFF); + + /// -------- Main loop --------- + while (!stop_menu_loop) + { + /// -------- Handle Keyboard Events --------- + if(!scroll){ + while (SDL_PollEvent(&event)) + switch(event.type) + { + case SDL_QUIT: + stop_menu_loop = 1; + exit_game = true; + break; + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_b: + if(menu_confirmation){ + /// ------ Reset menu confirmation ------ + menu_confirmation = 0; + /// ------ Refresh screen ------ + screen_refresh = 1; + } + /*else{ + stop_menu_loop = 1; + }*/ + break; + + case SDLK_q: + case SDLK_ESCAPE: + stop_menu_loop = 1; + break; + + case SDLK_d: + case SDLK_DOWN: + MENU_DEBUG_PRINTF("DOWN\n"); + + /// ------ Start scrolling to new menu ------- + menuItem++; + if (menuItem>=nb_menu_zones) menuItem=0; + start_scroll=1; + + /// ------ Reset menu confirmation ------ + menu_confirmation = 0; + + /// ------ Refresh screen ------ + screen_refresh = 1; + break; + + case SDLK_u: + case SDLK_UP: + MENU_DEBUG_PRINTF("UP\n"); + + /// ------ Start scrolling to new menu ------- + menuItem--; + if (menuItem<0) menuItem=nb_menu_zones-1; + start_scroll=-1; + + /// ------ Reset menu confirmation ------ + menu_confirmation = 0; + + /// ------ Refresh screen ------ + screen_refresh = 1; + break; + + case SDLK_l: + case SDLK_LEFT: + //MENU_DEBUG_PRINTF("LEFT\n"); + if(idx_menus[menuItem] == MENU_TYPE_VOLUME){ + MENU_DEBUG_PRINTF("Volume DOWN\n"); + /// ----- Compute new value ----- + volume_percentage = (volume_percentage < STEP_CHANGE_VOLUME)? + 0:(volume_percentage-STEP_CHANGE_VOLUME); + + /// ----- Shell cmd ---- + sprintf(shell_cmd, "%s %d", SHELL_CMD_VOLUME_SET, volume_percentage); + system(shell_cmd); + + /// ------ Refresh screen ------ + screen_refresh = 1; + } + else if(idx_menus[menuItem] == MENU_TYPE_BRIGHTNESS){ + MENU_DEBUG_PRINTF("Brightness DOWN\n"); + /// ----- Compute new value ----- + brightness_percentage = (brightness_percentage < STEP_CHANGE_BRIGHTNESS)? + 0:(brightness_percentage-STEP_CHANGE_BRIGHTNESS); + + /// ----- Shell cmd ---- + sprintf(shell_cmd, "%s %d", SHELL_CMD_BRIGHTNESS_SET, brightness_percentage); + system(shell_cmd); + + /// ------ Refresh screen ------ + screen_refresh = 1; + } + break; + + case SDLK_r: + case SDLK_RIGHT: + //MENU_DEBUG_PRINTF("RIGHT\n"); + if(idx_menus[menuItem] == MENU_TYPE_VOLUME){ + MENU_DEBUG_PRINTF("Volume UP\n"); + /// ----- Compute new value ----- + volume_percentage = (volume_percentage > 100 - STEP_CHANGE_VOLUME)? + 100:(volume_percentage+STEP_CHANGE_VOLUME); + + /// ----- Shell cmd ---- + sprintf(shell_cmd, "%s %d", SHELL_CMD_VOLUME_SET, volume_percentage); + system(shell_cmd); + + /// ------ Refresh screen ------ + screen_refresh = 1; + } + else if(idx_menus[menuItem] == MENU_TYPE_BRIGHTNESS){ + MENU_DEBUG_PRINTF("Brightness UP\n"); + /// ----- Compute new value ----- + brightness_percentage = (brightness_percentage > 100 - STEP_CHANGE_BRIGHTNESS)? + 100:(brightness_percentage+STEP_CHANGE_BRIGHTNESS); + + /// ----- Shell cmd ---- + sprintf(shell_cmd, "%s %d", SHELL_CMD_BRIGHTNESS_SET, brightness_percentage); + system(shell_cmd); + + /// ------ Refresh screen ------ + screen_refresh = 1; + } + break; + + case SDLK_a: + case SDLK_RETURN: + if(idx_menus[menuItem] == MENU_TYPE_EXIT){ + MENU_DEBUG_PRINTF("Exit game\n"); + if(menu_confirmation){ + MENU_DEBUG_PRINTF("Exit game - confirmed\n"); + + /// ----- Exit game and back to launcher ---- + exit_game = true; + stop_menu_loop = 1; + } + else{ + MENU_DEBUG_PRINTF("Exit game - asking confirmation\n"); + menu_confirmation = 1; + /// ------ Refresh screen ------ + screen_refresh = 1; + } + } + else if(idx_menus[menuItem] == MENU_TYPE_POWERDOWN){ + if(menu_confirmation){ + MENU_DEBUG_PRINTF("Powerdown - confirmed\n"); + /// ----- Shell cmd ---- + execlp(SHELL_CMD_SHUTDOWN_FUNKEY, SHELL_CMD_SHUTDOWN_FUNKEY, NULL); + MENU_ERROR_PRINTF("Failed to run command %s\n", SHELL_CMD_SHUTDOWN_FUNKEY); + exit(0); + } + else{ + MENU_DEBUG_PRINTF("Powerdown - asking confirmation\n"); + menu_confirmation = 1; + /// ------ Refresh screen ------ + screen_refresh = 1; + } + } + break; + + default: + //MENU_DEBUG_PRINTF("Keydown: %d\n", event.key.keysym.sym); + break; + } + break; + } + } + + /// --------- Handle Scroll effect --------- + if ((scroll>0) || (start_scroll>0)){ + scroll+=MIN(SCROLL_SPEED_PX, MENU_ZONE_HEIGHT-scroll); + start_scroll = 0; + screen_refresh = 1; + } + else if ((scroll<0) || (start_scroll<0)){ + scroll-=MIN(SCROLL_SPEED_PX, MENU_ZONE_HEIGHT+scroll); + start_scroll = 0; + screen_refresh = 1; + } + if (scroll>=MENU_ZONE_HEIGHT || scroll<=-MENU_ZONE_HEIGHT) { + prevItem=menuItem; + scroll=0; + screen_refresh = 1; + } + + /// --------- Handle FPS --------- + cur_ms = SDL_GetTicks(); + if(cur_ms-prev_ms < 1000/FPS_MENU){ + SDL_Delay(1000/FPS_MENU - (cur_ms-prev_ms)); + } + prev_ms = SDL_GetTicks(); + + + /// --------- Refresh screen + if(screen_refresh){ + menu_screen_refresh(menuItem, prevItem, scroll, menu_confirmation, 0); + } + + /// --------- reset screen refresh --------- + screen_refresh = 0; + } + + /// ------ Restore last keymap ------ + system(SHELL_CMD_KEYMAP_RESUME); + + /// ------ Reset prev key repeat params ------- + if(SDL_EnableKeyRepeat(backup_key_repeat_delay, backup_key_repeat_interval)){ + MENU_ERROR_PRINTF("ERROR with SDL_EnableKeyRepeat: %s\n", SDL_GetError()); + } + + /* Start Ampli */ + system(SHELL_CMD_TURN_AMPLI_ON); + + /// ------ Reset last screen ------ + SDL_BlitSurface(backup_hw_screen, NULL, hw_screen, NULL); + SDL_Flip(hw_screen); +} +