From e8c00c0f9ee89d450ff736fff240a442b1523d29 Mon Sep 17 00:00:00 2001 From: MarcoMartins86 Date: Tue, 26 Feb 2019 00:39:06 +0000 Subject: [PATCH 1/4] prototype on how ftp could show info --- bftps/include/bftps.h | 35 +++++++++++++++ bftps/lib/libbftps.a | Bin 0 -> 68988 bytes source/menus/menu_ftp.c | 96 ++++++++++++++++++++++++++++++++-------- 3 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 bftps/include/bftps.h create mode 100644 bftps/lib/libbftps.a diff --git a/bftps/include/bftps.h b/bftps/include/bftps.h new file mode 100644 index 0000000..19a63c1 --- /dev/null +++ b/bftps/include/bftps.h @@ -0,0 +1,35 @@ +#ifndef BFTPS_H +#define BFTPS_H + +#include +#define MAX_PATH PATH_MAX + +#ifdef __cplusplus +extern "C" { +#endif + typedef enum { + FILE_SENDING, + FILE_RECEIVING, + } bftps_file_transfer_mode_t; + + typedef struct _bftps_file_transfer_t { + bftps_file_transfer_mode_t mode; + unsigned int fileSize; // This is only valid for sending files + unsigned int filePosition; + struct _bftps_file_transfer_t* next; + char name[MAX_PATH]; + } bftps_file_transfer_t; + + extern int bftps_start(); + extern int bftps_stop(); + extern const char* bftps_name(); + + extern const bftps_file_transfer_t* bftps_file_transfer_retrieve(); + extern void bftps_file_transfer_cleanup(const bftps_file_transfer_t* file_transfer); + +#ifdef __cplusplus +} +#endif + +#endif /* BFTPS_H */ + diff --git a/bftps/lib/libbftps.a b/bftps/lib/libbftps.a new file mode 100644 index 0000000000000000000000000000000000000000..4ec6ff176090d6f15267f894730ab55e4f5c80f5 GIT binary patch literal 68988 zcmdqK4}4VBnLm8yPhc1$4iIgOV|$6gMnxDPVpOUF1dVN!5rRg`HVGscYDlI@P~2s^ z0|cQKmRQlHt^Sy{w6AS>cX?fYu0MacjY2KkV#`+A(yrT`Ka3*U-L%VgY3nY(@Av$< zbLNt$+xG2e-}fYUp8K5hoaa2}InViX&pG$psq@P(j`r3Q?S9SKacC7Ae zUA4Nqn>U?31FZuOCOhASX0+h$)%^pb`P-~lB8gFGwAaesHEY^?I$Bq*Ns9T2#3Hd| zQS%b9w0ZFo(RAz5W^r57(gtyR6Yf+F41G`Mx`Eb?_JQ`+WN)95!36eqf@5E2f3mly zzq574+EvK1Cw>Wun7;t&&2MU2EEYB_ONfPcHHd~qO^d|Mi{>|r#zjpDaa%+4ZQ{0% zG*BQ&wYXuCxP9^Bgjk$tUMdpvm&%_zMPl)iW^u=|Tbq#&&@H*GK`gob<|X)PUM!a0 zde0(c4J?trWn$^wplH4ud0yJQWSLmDbkP!#K+2^V?dx3Gx%&Q20hM;PuI_DppttWn z6yQKtUuQcr+1@cm&;xy|2a3`92ip4vO39U1DcJ+51=4qm9@6qG;COdmtS3c0; zAzsFP*}51&@8ub$qX72QzX>YjT& zaobm}>`Z!NCVRWPJ#;I3dwM!o4v5bCS#7Cx6tY5?vbuxmyZ5q0m3OHgOAN`RLMw6a zdrh;^)4s;dtF$9FESjuy-Rgm2cBGY>Vr=an=R%0UEST$YWcegmm2issWed58rf>7 z+Biz6Y7s^Y9y>&qw3f1jrO*wPwp5LMymxhvnCTsIlny}7!RqE3uePv9I&?8JdS`ll zsSSFEX|A|2(H(begAvTESPTOj_jm4GjCZc%phvp4@SiPey4mORVThxgPt=McCd3Ja zl-0@LT5+BTi(qVbVJNU6^PgwWo{BHHK!{rwF1+5U?dZJ!zSRTsm)z#`b;7jzJDqD{ zS2*=EX3vO;`7;r}y|aDAYT=uP+p@VI5#uI=d=q?O|KwnW??T`E0+qgteO11w@BRL2 zTLL4Og8U7NpPwyaLIg@AChoU`fd@QzP+(wTxghd|k)7)kbnkc*5aT@fcrj7?L;xp4 zqKhpG`UzPmD@9GasOgZ19;x)-zj7&uEX}fqlX6_j#AozBxMrYz1>iuRf?eir0D}QB zLpIejR`mCa8PM+xdd{#$Kr>i-&}fPoD1jO61E}~b)(&*`TXMbI?Ij?f=1p!@nHOW3 zQkkmhj8?~@`ylA3=XaxvX?}LPQit%TGo>*d_Y-i%anYq95c%^W4KLo$$3k2VN+&*Le z3?s(K;;Y{f@pM)Ur}O?dQn^^@rv+bII_rG0+P z^6r2_~nYpnlnSt#;&q57)9+y&SBa*ab9bN&fS^YfhTg>vz! z%+*dh03C;Y@aw?+O-_1>uY6LzFP5HiHF%`Nr2GTJxChTT?#1x-!a9vRz=Od1G#(-C zKG5z<2ST_HS+qgmeHnyhnBJs(1Yw4+5BRzW!XoKFMFw*1+g_+dc+H93g#*Js%udYg z$V4OXtJqzrMR*M^2jR!R@KV+n*^wFf(#u)2iElR5KUNT8Q>H1jxeyZ%<>)7%j}yq> zyx5b4qhC0fJ$l(o*|1oWJumV~W|T0$(%qfS(XVviRtxIQ3t z{#~u-$vzQop0m3Ui0#NEk#6;QgSo~jy9zH#W;cb%<_rgZ!;D!F!mRxyk zQ-(G$S%`;a+DLc2lg@@B=`7P{y5~pI`LL7D3z5!KuYu&2%=kEXe`GM{Pj1OIMh+Ej zbq*Dp)@?2{9o?QA+420zPm@;Pudi16YN|w;#L`(GY|VdhyDXC?*_0_4n_k}^c@cVfyl?EZsfE}?+ zSnu}0pZH4Hclq$3sJ>yFzcF*LY}|0l-;qh@xB7M$wmyQmLS$G*6GS4*a`K67Ioc~| z3!R871mmXsezDEJYB-%IkDtHg%ZUhdf60cNFP6&9FaH?I1aXF6C@e+VwUeN0$m2u$ z9|yhx;b_yV`cQ@eZ4Z>QF>0l!+%?*~njE^wto3_>g z{f8X1E713T@bX`o&Kmoz#=Wg`Q`UDu-`gBz7wd4}bn>x63S*jy!=FMO+>seC{`%xZ z@u}B?k!^*Lv#r4LJrA-n?F8ssKx^vEEZ}0q$$#UsBeLm?qB98MdIB0u;Ht;94h>rj z*BL1NIIa{(Qz=|=^kuk@1Ez%#TXA7RMKt4zpFMlF8+xbSQkmOx)t79_O@yBO(7Vxj z0J{FmvuCT;WYYO0bX@KXLVi{6s;}CZV_DKZf{4=?d9kn;vbKX3c7eLNO@_lRa@4_^ zGI=6g~yL??OD)wha|Nfcpcn54d`H^FN^% z$REsHT_{IC!Sd`{Smssbv=KTJR88LNZX5-XN znIP(F0{neLA}7S%`EVpXso~Mxg$D4M;G`${f|0z>Nu$)!hM|l?pV^w3uwiS)k22jl zYg6X38(H^0mXA2w3vBPt1YXXLRKJ|PAAM;#+QD&X4}(@-{|vI6pF+RvfL|<~H|-|d z%n?WRKg{=0=jAV)x$NaHFyGWW!-d#hU_9d|+7dbFIxNsnFr82YWnQTy!S**V z?ZrvtP~U&Tcr1TE`T_DXJWyrAk}ft>I1lAL6?g!0`=CD~-$}HCyk~ovLAyhG*n}&G zp{M^L&{76NZ)pD>Hf!h%-;mD#PQ-z{l0UF9rEz7WrB5TXXK1~B8pAPLvA zxVGW?Dy}A6m!n-hj`ngSj`k#x&JLg*iL`Cci6rEJEM<^W${0`N@QhYf30vnlh~vzP zczQ|&{0vQyIzSyMNB)eTNF;LQ@pJ&={BR8IK6$e37s&f~@Gb|xGQ?A96w{*~2UsUk z&!4QNd>BvrQ>cS&sJBVj@(^t6?o@6OVn! z#W;zwQbymiC|9%(iO{DDUql?==Ld65wVyAHN4yD|hPWSniRgH-5QBV8U7tofxFr8E z&<9eDx&IKA`3+1DeegK+!FVnU`%yocXTMILVH_JSfDFtt?M3PX<1?u%$k&E2-&JUT z5y!97j#Xm(T90uMpD(&L6>_K(&GoOyG3`IW#+W~2qinx0Zab&WF)gOC6>YFxhu5Q> zR%tV@7(YX1yG?0h+s{0pO=+=cZP~qXOj^@DX+_3}@5+uccy<)oPhzZTWXNFrXypAz z)Q{%+e~@~367eQ@^nkv2Og%gSp0*waEWY0Y-?8%4<%u`Xis#jdlv$U35N!p^zX7&d z3m%c!CTSZJ>c0uQ+L1XH$*6vyO|=!qE+Vn*xd3?3R$0Gf-kn5l7VN~2K8W@g1iTz@ zCfXCy1<`Mk&Zql+-Urdnn0jo=2R4`$;?Dd>5LZMHuKPTV-OkJ;SEUphI*RZ<;pjcBEULz}U`X?_%ji27~^5O6xw#S*DZkmj<&l7Faw-z z`A)z#T$Q*Izz0F!i0j{Qf74Aj$weCS;A-2n70$FyXWHEkaDCr+{j}SNie{|zeP~+$ z4ZL5v`j2tn-Q5A~w%(4_s~-H&w7aLRnbt9_aoTOumP(pLXWyC+fp*#Lx3?<>I4^{Rfz$6(}m#{XXVsF^6F}HOCsm zz)`uNh~j3zpqP=Z#y$O%n*)V4laCW1c9Ozd~mgO2xlot#grZX z%7gpeyr}T7#-pH{4Ewl3;|b_wGVEc#hyGR%&UV!}rr+hk@Au$;>cMw;@FzX^7d`m@ z^58%4;6L@?daX&MA=_lw(?5B_L%N7)50haJmsmx{{9NY2ulL~dJ@{Q7yw!uR^5EVD zKrYLf6`mPQ3unaye(U%n@2=t99R6I(pSk?0=g)QgnKeuP@@KZZla#Y$^jR{(Eaflb z&63P!)sH3uR@~dWv7Fl8kA*g}lbmPE`&rkC+vm@ibxrKL*eFrY-6PYVL`O8RO5D3f zu7R)VT(dIypuj@ZDv7tYcJ}r4^u7zL(Sqex8ZOMT0|!5Dh*7JY=dSwpcdS|2dT-}| zk^#isojs+*rAyIVb{5?6qKW$T&IHef1>GHD3xln{QsasJXRy{(`1O zt)d=vAv#+<^G4^OAAxNWA0(_(6;v8#{?g-il!g|!50Q^{ous9;( zgm@TgAjIgUkr3;VO@!qbixHlWaTOt&z!pL@eMv%8x&cDats|Ty#CpQX80!&YwyqX! zVRWu)zoO`H8&FT9*I}$jc)gnMB#beC=x|#I=LykGh=Ey(@J95jgx8{fBD_h>rAFh( zC-V#b^9bidUcv=v+cdsj;~ZZy{0YK^=m)j`5kjPULWfKJEx+_Q!!L@FTng{0Py2*Ard}xe4D7y%2r?de{DJAfNW% zr~MCW|C8E35>Rw?gwTW3e-q>-4t+@dLmyKAvhj~axIuwEHP|VWtSpv@Nc10W)-BAoShXK)qV&teU(tZq=&2JFA*ftnv7gCzh@RDuGSOXtKI}4eD}PDDD}*1|O40<)2AzpRKhn?%^}sck0jzGvk09h6YG zdqzGc{z!ZZeY}V~Qa}sJIipjY2PPC6`V7R}6y}dOFMA4e*?E@^_n3E=acVKYUW>UT z&adwiuVAe{l}n1Vulcb?UE%EByiXi_#4pkt_BjVPy#MUXtb?R4K*gjC{s~y;3~@~( zk%wLUB!cw-&WHKqdOjTfFr(+7;p`^_*Adf!2!z{uB+!UR0~U8Ku+ji&UZ7fb2kKH)^+&NTlGvPM9PBYs<&X7*T7-pAK4y&w z`3×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 #include +#include #include "C2D_helper.h" #include "common.h" #include "config.h" #include "dirbrowse.h" #include "fs.h" -#include "ftp.h" +//#include "ftp.h" +#include "bftps.h" #include "menu_main.h" #include "status_bar.h" #include "textures.h" #include "touch.h" #include "utils.h" +const char* my_basename(const char* path) { + const char *pLastSlash = path; + while (*path != '\0') { + if (*path == '/') + pLastSlash = path+1; + path++; + } + return pLastSlash; +} + void Menu_DisplayFTP(void) { - ftp_init(); + + bftps_start(); Result ret = 0; - char buf[137], hostname[128]; - u32 wifi_status = 0; + char buf[137], buf2[512]; + u32 wifiStatus = 0; - int pBar = 0, xlim = 270; + int position = 0, progress = 0, xlim = 270; - ret = gethostname(hostname, sizeof(hostname)); + //ret = gethostname(hostname, sizeof(hostname)); if (R_SUCCEEDED(gspLcdInit())) { GSPLCD_PowerOffBacklight(GSPLCD_SCREEN_TOP); @@ -30,7 +43,7 @@ void Menu_DisplayFTP(void) { } while(MENU_STATE == MENU_STATE_FTP) { - ftp_loop(); + //ftp_loop(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); C2D_TargetClear(RENDER_BOTTOM, config.dark_theme? BLACK_BG : WHITE); @@ -42,15 +55,56 @@ void Menu_DisplayFTP(void) { Menu_DrawMenuBar(); - if ((wifi_status != 0) && R_SUCCEEDED(ret)) { - Draw_Text(((320 - Draw_GetTextWidth(0.42f, "FTP initialized")) / 2), 37, 0.42f, WHITE, "FTP initialized"); - snprintf(buf, 137, "IP: %s:5000", R_FAILED(ret)? "Failed to get IP" : hostname); - - if (strlen(ftp_accepted_connection) != 0) - Draw_Text(((320 - Draw_GetTextWidth(0.42f, ftp_accepted_connection)) / 2), 77, 0.42f, WHITE, ftp_accepted_connection); - - Draw_Text(((320 - Draw_GetTextWidth(0.42f, "File browser cannot be accesed at this time.")) / 2), 97, 0.42f, WHITE, "File browser cannot be accesed at this time."); - + if ((wifiStatus != 0) && R_SUCCEEDED(ret)) { + Draw_Text(((320 - Draw_GetTextWidth(0.48f, "FTP initialized")) / 2), 40, 0.48f, WHITE, "FTP initialized"); + //snprintf(buf, 137, "IP: %s:5000", R_FAILED(ret)? "Failed to get IP" : hostname); + snprintf(buf, 137, "%s", bftps_name()); + + /* for now I still don't have a list of conected clients + if (strlen(ftp_accepted_connection) != 0) + Draw_Text(((320 - Draw_GetTextWidth(0.48f, ftp_accepted_connection)) / 2), 80, 0.48f, WHITE, ftp_accepted_connection); + */ + + Draw_Text(((320 - Draw_GetTextWidth(0.48f, "File browser cannot be accessed at this time.")) / 2), 100, 0.48f, WHITE, "File browser cannot be accesed at this time."); + + const bftps_file_transfer_t* transfersInfo = bftps_file_transfer_retrieve(); + if (transfersInfo) { + const bftps_file_transfer_t* file = transfersInfo; + // while (file) { for now only show the first file on the list + if (file->mode == FILE_SENDING) { + float fraction = ((float) file->filePosition / (float) file->fileSize); + snprintf(buf2, 512, "Sending %.2f%%", fraction * (float) 100); + //file name should have an elipsis when is to longer + Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150, 0.45f, WHITE, buf2); + Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170, 0.35f, WHITE, my_basename(file->name)); + position = 0; + progress = round(fraction * (float)xlim); + } + else { + snprintf(buf2, 512, "Receiving %.2fMB", + ((float) file->filePosition / ((float) 1024 * (float) 1024))); + //file name should have an elipsis when is to longer + Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150, 0.45f, WHITE, buf2); + Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170, 0.35f, WHITE, my_basename(file->name)); + progress = 40; + position += 4; + if (position >= xlim) + position = 34; + } + //aux = aux->next; + //} + bftps_file_transfer_cleanup(transfersInfo); + + Draw_Rect(50, 140, 220, 3, config.dark_theme? STATUS_BAR_DARK : STATUS_BAR_LIGHT); + Draw_Rect(position, 140, progress, 3, WHITE); + + // Boundary stuff + Draw_Rect(0, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); + Draw_Rect(270, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); + + } + + /* if (strlen(ftp_file_transfer) != 0) Draw_Text(((320 - Draw_GetTextWidth(0.42f, ftp_file_transfer)) / 2), 147, 0.42f, WHITE, ftp_file_transfer); @@ -66,6 +120,7 @@ void Menu_DisplayFTP(void) { if (pBar >= xlim) pBar = 34; } + */ } else { Draw_Text(((320 - Draw_GetTextWidth(0.42f, "Failed to initialize FTP.")) / 2), 37, 0.42f, WHITE, "Failed to initialize FTP."); @@ -82,11 +137,14 @@ void Menu_DisplayFTP(void) { if (((kDown & KEY_TOUCH) && (TouchInRect(73, 0, 97, 20))) || (kDown & KEY_SELECT)) break; + // so CPU is not doing unneeded extra work, 100ms should made the UI responsive enough, probably we could increase this to 150 mss + usleep(100000); } - memset(ftp_accepted_connection, 0, 20); // Empty accepted connection address - memset(ftp_file_transfer, 0, 50); // Empty transfer status - ftp_exit(); + //memset(ftp_accepted_connection, 0, 20); // Empty accepted connection address + //memset(ftp_file_transfer, 0, 50); // Empty transfer status + //ftp_exit(); + bftps_stop(); if (R_SUCCEEDED(gspLcdInit())) { GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_TOP); From f488652c41a7fa6033e212236d79be9b5e5bf51c Mon Sep 17 00:00:00 2001 From: MarcoMartins86 Date: Sun, 10 Mar 2019 13:35:12 +0000 Subject: [PATCH 2/4] Fixed WinSCP connection --- bftps/lib/libbftps.a | Bin 68988 -> 69188 bytes source/menus/menu_ftp.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bftps/lib/libbftps.a b/bftps/lib/libbftps.a index 4ec6ff176090d6f15267f894730ab55e4f5c80f5..2d76e9b4f2c919206e204cd22a4dd1b75fdee1fc 100644 GIT binary patch delta 2700 zcmb7GZ%k8H6hE(hh0;_lEz+VzAE1bvN=0y>GV9!2x8T6VOq?c`A#P+9D#JwMT$woa zgD846GX}#mTNbuC1q&OX44BJsP8YT;n^{~&+cdIGx0|tJQzYXwBp{g-f}Y+%f!o^M)x= z*NWDoi7_T|aZ!FDix_h(`BQ<0E?HrMjJRSyE z8xowd<#eem&|Hi9RIeOL1UX<@~~O+md$4j9lcNsy`yJgy zY%Hpa*@U7|r5g-1HZk$Lgh6khGX;$<2Cp2rjkX;|0XE~-U&8&gA^OKZa*H!pRaASb zHcR!j(yLYVQe|yTO;u%mb#0AQU9+WjlEJ_3+(Lml%SYIO4kz=j7c=V7T^*@ljZPJm zz>X-fQ|)Q&?0PdB?QqP_K+U}WR!Ml~0P6XZQi8|vS4F!fhPV`N0z2nx6>f$Cc0Y5b?CYnyG^}!N&O*&do3b z7R1>L;&}E$oGp3Jz#^SFx&_z$FSNeR`2=b7{?@qznJiEM;V1LP1c$3h6Pp%QL?joWu1 zYNvs6VYJhI>TR*FLPrXSh|Mbjm5wo>(g7wcC;c(>5MqLILQFuN*q;YD!|emy zewFZ90D1+;FM_C@129gQ!H>2?ZS+O^Y5bmk^}0l-6u3Et#*kPthSIiBHqrBh6x zbc#W!Q*Fk(4-7&f`}45`R(3(}@9S|0Ozuhd-|j6HP=917Yks#$y=T}fex6j(Bd$Tg z8u62)4yr>!4-30~$0Q7}j*C|2xopx=Jr4Hv<*c;J7zzJ?B2fg2MtGF1*lS_p-jw7+ z$dXW;C^W9KHGS5poj8llG>)8VvlO@EEOz~9Osz(=MKk;q7lA$tIclx*li3~2aW`%S z9h-|*B>x?kW1Ow{+-j!#5L=ThutP(s#WvK%76i%a&kwb1Mu`@*JkEU#c_*dwEscv{ z!w4?)qzEZ75!`VR+B5+4d5sRrL}O!IJU7OpmxJP^qC_j&t;S=e{YkocsB|jZ*~0Gj&(XNdEOQ`RIKj5WK9=q>D(!MQR2PWjsg km+ND>cqKPI%8v|M{be`5F>>zD7&~d<^Unqog$ufW0r((5#Q*>R delta 2581 zcmb7GZERCz6h61T-3lqJ>&7}=r)7*$U}GH&86Sfp7zz&8ANw&QKeouoVg^*B$&AJh z78w$T(^mxzao30u0|8n2$_TLq4Ii0i5)w5*v$ix&SV&3G@B^IBx%Vx(Y53z^-}~I> zobx{CocDcu*Y6Li4?a@|%JS;!7A;w{@WjkUB@*u@${km(6aC-urC?Hl_F|if z4-LFjke%8-_+h@ur9QKyzCmOhzDQRw@nx&m!ADgzn=4l{xdl_)#=w# z6-WA@r6o$8dy=ZRKdJir(};`QCJLqI5e?URwUpA(m!#NOih8sZ4S+kflyyu?6ojHjLqJ`bTHVPZo&xD zj$|l!EPXQcQ^MkXf2?(+H=WrPPu%ZWA4uFll5kURIv>^Pl?Sv0cSzw~wo9l!Yd3dl z#0{kHO-|nGb|}-%thUoMWW}FPpq~T6>e~MD$NfsVy5+Twj*qt~ZoCX?!~xZ$_ZjPu54Cv~;`A^sBI2H`c>m}Nz1TQ!?1zaw*pf;{ z#PPZFEJM8HY%j-_W--8aa6Ye|02Yt8+q2r(B^Kb_@~kA<#JGxRGviXCFynHf9*Mgd z5jVhyI6iJ1r!h9lLe~=cm;>t>xe-P*sOO1*wXy-nUr+EX(MQZt)geakvvR^^MhM)H z_KdXS+p7zf@(OwJ%s3MrOY|{T$imkVP4GOf2KERiD8>U<)XIni-Ha&jC?ota=^tTy zj%ZxkGe9f8+xHofxRQnOJ=HsXo(N6rjkPi21=Ga{{kJ9VC7Q2ys<8nbAC(ThQzX_q zMPb~j)hkwxtrP?2X5&Cj5kteJ(f5W6l<28*&5EU75&OQXs3~rjds*TXUeBVc$a2nn9T5**Gl%(r2fB{UGPE>ZppTxN-oNy0A5Zw^c12Y=Cov-VneJ- z@rYMra}>My6!#_(kIk|46pCAL1Vv$dj%BP+EQ?p!R^WJS6&>+emT&C)_f1nugcf&N zM(kpNqiWg%I7hL+l_+k3Xm^z5jZDM;GK-i#SYZjc#Jmf0vp;H-ad$L)VU^v?N3PbE YXMX@G<4K3fH}rRJk%^ws?8+hAfB5_BmjD0& diff --git a/source/menus/menu_ftp.c b/source/menus/menu_ftp.c index c9c2b71..64b63b5 100644 --- a/source/menus/menu_ftp.c +++ b/source/menus/menu_ftp.c @@ -78,7 +78,7 @@ void Menu_DisplayFTP(void) { Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150, 0.45f, WHITE, buf2); Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170, 0.35f, WHITE, my_basename(file->name)); position = 0; - progress = round(fraction * (float)xlim); + progress = 40+round(fraction * (float)(xlim-40)); } else { snprintf(buf2, 512, "Receiving %.2fMB", From fdb9d5f605f3f65a7032013ff515dcfdd2fde7a7 Mon Sep 17 00:00:00 2001 From: Marco Martins Date: Sun, 14 Jun 2020 20:02:30 +0100 Subject: [PATCH 3/4] added new library --- Makefile | 2 +- bftps/lib/libbftps.a | Bin 69188 -> 0 bytes {bftps => libs}/include/bftps.h | 0 libs/lib/libbftps.a | Bin 0 -> 68464 bytes source/menus/menu_ftp.c | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 bftps/lib/libbftps.a rename {bftps => libs}/include/bftps.h (100%) create mode 100644 libs/lib/libbftps.a diff --git a/Makefile b/Makefile index 518fc0b..cceca88 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 ASFLAGS := -g $(ARCH) LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -LIBS := -lcurl -lmbedtls -lmbedx509 -lmbedcrypto -larchive -lbz2 -llzma -lz \ +LIBS := -lbftps -lcurl -lmbedtls -lmbedx509 -lmbedcrypto -larchive -lbz2 -llzma -lz \ -lcitro2d -lcitro3d -lctru -lm #--------------------------------------------------------------------------------- diff --git a/bftps/lib/libbftps.a b/bftps/lib/libbftps.a deleted file mode 100644 index 2d76e9b4f2c919206e204cd22a4dd1b75fdee1fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69188 zcmdqK4}4VBnLm8)%ml(1aR|}IIJTD<+-MO8j2M;b06}9Lb%dZ%*(QMmLk-E81jQ}8 zJ4jG!VTl#HwACMDOZ&53-d$dopUcl5Zlh4kw%W3lwzTVZ=MSTZb~o+1UD~?K`~99j zcg|cAb=$uE?E9YN&U2r0p7WgNJm)!o?m6e4J7a$5z{;L$!k4&9e|{p-4O=fvi!7#(3DM7I#-$AqZZfBH3hOo;!^*S5n#OmyvR7J}DTGQZjNLR<*{ z^{vN+_^)2C9~WZ0>utzB&gGOR1+JmhYr5M9d%L@nV#TVVIKxg0Js_udIuGItW zt5)~+@}|3QsD0@EWcPc}j2GOydT?kwf1CA6Bry(+_FCD$W=&^bSNqB}NwFZ2SS*$- zZe1dlw%)u%wA`??RovLJv`O65f;*K1L*LiEZm7MhbEvaD**{=pFoA>J;5g7dnC$Nx z>~3GNb``Shi(f(_7A!=13tC!k7K@seCB&lJnncs$mc`<_#S2r#>b{kb#MAX)DV5=)qjnDtB9do|hE{uzPu!pE?rUFpUzd+~Wp6(c zoyb4gIe72*5!Q^)i1svY1S;Pbu%^EYb*tM`h!)@0k@f;nyVh4kJp$8(7mSr-uH;D zXeNk0G_V@^e)r@Dx)s&9ELQe*clNC{N?_vxv+e3$$&x>e*S<+g{5|%-| zFU}BQ5sK|Bj087i{`1tS6Y+&-332_RMOV4?UETNIy?SWDk{jKDZkX0!w|jZ)BDZn& z+}Sa);8Miz?CxB#S~xRtTQ=`wV$zgyXNnUJREDaYvz-qFtDSS58Yk*}Fi>ktpd_<> zLgHtql&|^?mPjl_Pz3B?;6WcA66Ga6A><1qJI^oV-SH+UCi(EmVygCu09J~SIMq`E0=P}(kgp6DaZLteD>h|Ylb>k01gc(*kkU7Fc=WCW$QhA z#o(Zr4gJoh=WJ^PG@G>tji#855}4gNgo?jn?NIliCD(i1o(BTz+2mH0c`=qLgBhC6 zXmujGKL8!|{9bf1&CgC(>Ja{PrZi^ZehRKQF1i#1B7a__;l=v}xF{?6(lz0_K;Eez zhVl9+F36TtzCzrE8xx0qq@g3UEoukwQCyUT4+l(_@)9?B#jR*V#CqOnXZTG6Zqsc> zz#WDN(9m6~9!YdvMJ+bZESFg|TGeh@uN&uGsoRkEuGdFDC=>MRb(NSdZkoMdwh?3O z=1blX@pM*Ss z5IPP!@aw|;wQhR4Q!y<+5KB+L1Uyn=TK>LK+=FKv_hNKwVV%ZZ;341x8jp~64`}zK zgXOp{w`fDa2QmoDFuiH{2*M0s2l%=O!XoKlRR(hH*;=SZc-^s`h5e&H$WF~{%S0pa ztJ+zpM|d4B7vV>rd@<`pwq?e?^l}z$;+rjvj}?U2m}x2BREUWObMzC?$1&t@e(Z_D z;U^Dd4`1+NHY}E8&xpK|Sti8S0+Bm1!PvJmO|h+oIMO(A?Y7)u7j(N`R&=pfGJh|` zv*`e=YHwekA}M@-M3gS3)JONga;)QOt%*k=o8T@{o%|Blvk zr6a3&#ruOQMx$E6m3a(g^cU_d{=$1;vJ-gXGaCRW}P_81jF+&@u z6yjl-HqxE!rnBXdbe8Ee-7_QUeArFrg-GYA*I@FY%;Y$De{47xNIsNnjvOr9;2tcr ztlLy*IlMJDw(Ys&pC+xoUtg>A)l!WziKVj+Y%OqZr!12e;eS zK2z8m`Chg;wlP=XZp>7Ojj!*Gya2s?wy+;`E#;3D_RZN@aNIzqY&4Y%!j4!btarQM zPkbfpyJB=$)Ly+M(409?Hfb~!=*pz?o1LA7&5t0i5E+)y6p_fXoE)(wM|%Zrp&N09 zVBAz7AhrZnji&SD@w2y_oQOd8=WWP2u~cqB#m7-5h%@?pVJXtCp9Wn+9tY`v0{8}m zqfM_FKp6(LJy6c($bmuy%VKm(ZY)AsmSoF7cb{9NgN=AJS6luvKEkMP+FBR%U+$t^ zfxh>GSK#7w*4S???roi$vc3)a-r_2|Scm(TCY#PEI)f0d$DzRlu0~wz(6GgDorKbl z;!1%umBJNAUxxcQU|I;V8P_^ot+?W+PMzw7-l?}#=B8Zjc^h+6p{D@!Zgd`muK)7X zshTyJbUq0kSGdEFU)8(X4?mD&S<*g2h|?T-p|BgWc7hgmfx5XxhQls$)WMoGc#Np@ zRQSeRbNWD`_Pi~*AmXzunQjR5%_GkjJ_Wt+Ks?p9jTAnF`~9&Gd3t&CKcN@MAIe-( zs6ao#_L{U6sF$I!CytF>f5{t88+f5kx70sY=wV+XmS)-Ktbr{A?nj?f|HDE8;bmw) zzTc4!<~q{T*`CqPgCZ^4TGqj@1K*E!tE?lHn*@JT<_xS!AWQjLsnk@6tbL|Lci>SUo4$B?IzpIF<13J z%=cmU=?AVZDIZi^_P33>i_BSu>#ZBZ; z-+#<_EdK!d0rE0DP-ViBE;dp)1LZvfco1?s(4Ud-INCwpv%Soq-61_}!jr?$)Bhl7 zDTARmw0{qqHFSn=xz7J~#DTn$Kf^X#X&gYj@yZ7M*lBXMT5`5%9zR8V*?||&@v4H-LfvdiF!;u zkQei0^uTf!C?}RRj5o}(-vB!H!L$?FMmfd|l2I@I60Uu?w&40I zt`=MuqFp_T_Hrza_9T(c4xt^1bZpIuB;#8YV$)1w}TSSM1?9j~W+ z7*7XMsDmA-w@KLY2yE;2RBlTB_X|fco-B7?KpXHteoFl}3NO{|EW|c{Lyo-y?jx@U z(`eIT>FmO*Q@L5t)yb{{SrPkDfq7*aig-GE5#&RAlSLb&Wa&uc&?nc_eiHQ+<0Q&T z8J&G7SF{g_@=q7Oh&av{hI1|TUnopQyeXQ7cmREg=z5_LgM2MLpGG^lB>!>H2UE?t z{}9#r4NMPx@FeuXcrFVEP(PXHfKH!b92+i#49qj_Md}0NGpQ@c*MTtS!)SjIC!o`g zRb%|xh;a~~FM2i>a;OunjjzZt?LWcBm_K8qY`-vWJFU(!EvB&?n|@`13QAk2aMB86w6R5&2>M?5i7_yFZXoxTM1nQfAT`(E64ilx&d z%s+6}^?>+PASgansp2LOm-?b!s596zY`P3OM2GRFX~S+px)lkG?R@rb!Z{YU?V}ar zXvrTkU(2{?ulP*kkAIF({dvL{zsZV!DdLS{JWQ8D+s^j74e;O5cGm%BfU_;%4%mUK z8dn1NFzB0c{TuGDz4ltUNJAc6ZJW8mo!RZqyxj$^@0+ihc_UHLij}^P%pAO$_e)p* z5$=0?yMW!;-?e(x{U4cm`^+^nyJj}eym97INt5UvSo0CkF1zW5w%J_t_(*JKZ~xU| z=E~Fm+?l;=-I;^(A6#9g@zKsccaA&f$}3{7xcOseaym$G5@j}i*7kMY+qt^8b472r z4465n!WXGU4y+QnD+c=S?(TED)(&8i!8KFMAd}0A;Ink7b7-xOx3aVE4~AS$al4!h zboF8h_$a;$JG6GIKjfv{RDpIy&f6J$9&VZxg5Rlv2GVHZaojJr@Wr_A zvT)4F2rPbUH&rBXr%fMsQw8REtU2bXg83V^@&nX!oO3SCznL9XBtgt{mWG$hIp``c z!E!mLxX0r-RdnEfuZ6F|{b395#r;zjK7ji}7S3nWeHQNB;wFgZt5lw_l&7eVu=o?u zz3oMs>fP}s2+fqnuaIp3!{$Rr0fcjo{T(lV6=E0gde7*limw4Lw{YhD9bC#yEt#Vy z$7gg1i@*VHyCBNTp3`Uf*)AwB61Q9smW1a}>6%bfTocG!;StlzQBjy=EK{4_$nXnUjXE? zoLS+S-Lhy-OyIYHKl1K!-d)C@EBG^yKaKpkl0S3i$Y1`Mwp}gWxP3( z*__7lM8JxBXD^mhI|s4QMs||(TzNm|N^#SI*>f(BT^SoE>gjuA29xNBhE|EY*2p#R zHQj4gChr$mh*~A__V(_9fxiCtU^QN_+)BfRS$5#y#|<%RmGksf-@&dmE8Fkt9#S%Z zxVO8nl(=*$n#<0DJ6<%=px&9_+ryx{L+om>w$D%&B2I3`}Hk1FI>>le)DzLEnVE&-nw96%i?y? zh`JD+tDbqIm!ThlZ4w_QY*6E<=;fGWB#v+wV=LkuYmx3Hv=M}js5?RUu?}HzM8pa4 zFw{hd(MvNS)+1X8D=-!#JQL$8LNtMGglPJbgs5~wgrHkTI8BK4gq0ZU5n{Hk9&KTC zo@&3M=y01*Por02tVej2n(rixF@NZA+X&|i(MyPdS&Hx)^s9tdpnoE~R?VeG^JUQUSkNkW9L zCq%lOuOQtaLdcmRM0p%1gq-Y;gEinscpmr>q5*FtJRfoseh_*g{1Ei6{n^GxuS59| zLJzHk;GZId9=8yJ|Kotc3!pFJkYkt-184T*l;bTz$X($8-heSTAqFb!3!;lvA0YEZ zd=ciL36Z}v;R5JM<3}|9Dk13J*8b8C@laJ4Q1p$2h~GvC{z>h>ju7!i2p2*=?Y~F+ zAJYEEwSOe2=o$#22dV!S$V(jhkot!{r2c6a^oKr12^Z+{SftBiA;tmp2R+M!<;FfU ziUq56gormnh%noExkO<0LD z{9^Fsy-7EYdyWT4-ms%jTCxV8SrbbO2%_E}P#D@T*5e@*^L^@2j}C`Hi6uNyE=L!}`nc zu=$O$ErcKWA&STEhq$--ji4`LUuB%(_X<30eq-QwSj$&|FeBd>?#T~bpL8#w&ssze z?MO%Tl!lav?kx0S7pPnLOB!C~_<^k?P0(D>nK<+#4ILqxGS78^j%^2keC}kr5Jl#} z*dB>nKY+H)ifH&zPd42s`i^Q7h%j@js;VC9U{lz8?HQTda7BaKX7b*9M&7=K5(;n6 z$j8MWicg`B7m-H_XhAt=bb|B1ghE5dK+H{H{)qFkCoq?t_vmnsd3PD79`ozM8 zVHZD+U_F5IVS%`w4~IX@=vinudyn8cVmcVX+&t&7$V<+5ArJJc5SP4>MEt;&;Mw?S zp%7lcHvm9#%$@p`}2`QIwJ9930y5LQo-r6Sk9)~Ww zpaWj5xT^IPxG0q?um2v`)$#*x0L@0Y4QqpC)Pz0n{teUJtnIBv7S(muyT}-StCL| z!@G4}sFPhvCvSGJoM0?gdI%=@D^j0VUsL|IXh)A? zuL0I|i+c{RX9~mF@P6j!T-C0yZZQtah<4LbzOjH|1iJg-%ns1io`Jmr9ixRZ)E#5T z-#6`tRlitoY+LDqj>(s0z&hB5a1)>Ux5JvOum)ckb#LP7w(iXg%3&|`JB+Ib7i}*A z$a+Kl*Wt2t`L23Ip3$9q^=F4ppSnOFA^*H{m2 z9kD*m*YQ=k$^Q9G=GjkIrRjc(_B^Tc+6LH!i}`1s#}*XZ4DQu=uYBW?%CnzxtjE(9 zxOT2&N#tQGHO^+NJvZ(spdZbLU|*zRUn*&miQHo7B#5xUmBVrmNv!^W)DQd5$*yU$ z)q0`gdn?zXYg*QUr+7%&Ybue$<6@ZYtBF&A^}BM|9P9ZnQAZ|s9D3d8nC+t3w?IF+ zCuM_PvsPoAHxK)Cc+iw9;`-z4_R*#%pf&51Y=7+X>6w7OLa2V0wr|rnTJ-+_TQ+oT zi)}jH*1pO7a{osNWq(MQ{VqVRyR8SL?L(*1=I#E1@u+j!7|YG>cd3IAbWR&&JO3vi zQtbig;ZJ8+}+cM!a_6>uM{Li2r8vbYpJ^_Bl-`E}72ekWP*sG*B z`!eWHSq**I;A%L_3Wj0&1Z{F_ z{s+LF#!blQt@+lT1BI*Mzx{dif#Mw5KW=$`=h^5dBiut8fFJwNl(Q2}*S5%d)Tt2s zSZ+fzcAgCw!3tIWI`HV31ASq9#y**L5`q7Rpx3r6_FQJRWy-|XHxh`C_3}a_gFR}a z&=vAVUS`}=hqj)3d+ATVI?yv*`rj<;=Lv?<)>yy&VGhdB(Pj8J@_7)pbv&ce{|WAy z@7Cr6g`=z|9m@U!qmY5^1Z6?F9R?lxs(chy7?RU9YmYUc`?paZpPJts~J}U zSBrIVAJk@CDb`h7L%5Q-I`q{FI3Jgbi_fjcP?rwl>eAQy8AH4VU9%pdKFdBJ=ps)y zq;jqvgPD3brSV9CeZr*Jf&7%lg9Qiin0Hx^FgB{*G!E*GNwd0%_?rre&h zzW&;VKO4?fW3Sn>;*jhoBH&eDzTLCqWuPZd+wTteMX1Xp_M@?0x#=v!y*>o#VxFdE zO7)S#v+hxp;fDOvmwx@VDb)uHQB5}xKlNHD_7M7mhp;E)A?#Ios8EG#-<)r%Ho&T{ zE^K%x_Ajs1)fL;jQ0yO3pO$i;GwW-17G#_aybib%`?(DJ73}Re>2VWit^(G6)j+MB>WU?bNN$aNHcq&M+et$2F; z;K^vy#Vk5Ke(>n3U~8|!UiRZUfcss5DO@eMIChnLf8(fAt5Z3SMQKwkTai?Z)B+b`JKbSJi{68%$n7TT^dlr#3dbB}FsHs0X~rqYgsJ%&zX zQNfA7a*XZU+sH5X5-$R+8E-I8Y**XCN5qcG@+wcKr-eq+)3EGOa{=~=okCm@Pe1C! z(;LI0E$hUGgDhh}JRY$v<$j%C748}N`fId>3hYUkz;P|^ELKj=+i#>E!yS`y%~pajBE4NW8616m*MAW zk8LP}8QX9#oS&BVX!EVm>3l??aBQ?L8M{Vw97r|e3iDR(Foq{5zl8G zac359emUUx@Jk;;n=+EgR-`i7aO}~{8SWP|!T6(@K;ny;DPkGMq^%B?-yU{izbI6s zw`ZI^U(V1rIKLxpE%JlH88g5GwiX**0J}e22+!d-Y+C-}OCQK$UZ5s{{85i5(O)u; z>?;xX#C-TKx?1fK9s3IQpzCnm_nx3$#*6nk<<4z_E~rQ3@4xhH^xtJ}A!f~obXj9e z>b1;;4$%kD7NnlhR-nARXF6~02>uvE)dVgY&P{3jo@~Ed)VC>(FBI6Ow!$8bU3H-j z#b8I|7e^R*GtAhx9bS)cW7njMYP&WxY*RlDyKV%00ni2HGn;uvrTx-I9c{x#J{Nm) z>tH*h3Ct~`ot<(113Au5Qr>dx-w#}*+8D|>$vs^MY#VFO8_uyFa=*XP4F-eW+)$6s zn;Gld&#SaWJ71)UtGr2jWL{0YnD%EH)Q26W^>Jb^9v+q>@6EU_M*d@f++!F8e7 z#=Y;Oj3ZVV+jAdGJBYA|o+IS@Yp9oDe;N1s%Gl0pgDyiu!#o{c__DNtvG~hbGY4YA zS;ou*%a~>B0*+~$mG9P|U2=5a$?+J=o4Vq2b2;`-YPQvO#;;QU8_M#4d zSI^b&N3Pebe2g*Q(jG9^1Nj`SFXw7i-e!!A^24(X=0_veI}@0@xeRv3eb{fscNX4? zq0YwfJRErd?~~CmiwaIk;%naTi z8AUqaN4qPJ;oaf*FrFLbnueS+DjPajm~`x5Ve-L)a=d74$nfb!IrBM-Wz2Zw&2itS zMLPel=o^XKZ4zmklr6kT8jRVzxs(`q!LFsvk`5i%M&eNDewq*7+Ts4 zWRve3($B7+W$=Fr?|u0FcOXBZ*ym73)H?>3aa|8(7K(4mOpZ5YSU%DC)&kn&8kQSO z<;15UGwq@Rb2+ovCS&d+u|CGj~XHypR z`_rd19y*(IkCac!h5Y>xdgc2Qc;Dv4t9XCo)k;-wNGHo7oydIwvKl#}BU^J((1#%( z-%Bz60(3V+C!8+{!{3XKG`1qXr&E+G%Mo+sVZNKBhSX_?X4yn3^c?8JzY~bz(vBtau z^Nk$mVXgz|NPQqa>cq2N-2^?$4#xTHpMfv^QEwzYfcn3KA8OR>TyjL7^6l~*6{;5me2ehol|Kp&i-K|1gfx7o| z=)WwMo>q~3;_O+_BW-Ci>gdn@^HkVz{}tg&^1no#c4AHNUz)}E=;6unMVWZydD+%X zsXkOVhIf8VdC#*<4QDY}Yu~ zhPAR273r;os{qSsYuXmLR!e;~Fg*E00dtrqM7;PeTSa_p;S%_DpmK8m1qKxY58=}7 zMMIOubp&lR`}$tM2rllm*PL+;U}8`AKgrdzM^5seRPe2a$LHGEvd zT^jDzaIc2@H9V-{OBx>0kotrg#SkF=<-Qgs$vI67*X3S7*pZmo<>IveKF(~Uq2HnLzmwC~ zKje10*t&~T$NC5Em+@BNrJe3BiqM6FjE1^hp0tFJiy3dEg&~ls~t+Jn+xOseLXF{d0NfAAVYwxH$RG z<;j2eX}#Iyp?~1QV-5MU3_nZog989v9sua_>_4|{5kzaFY;BaGja=KnhuLm0*%phr z7u&_=Z=Sm5${pacOzao8SOQb%w3iqLy+YUbeF%VV1RQp96nVZKhj8%C&#>uTZR zo+U;a0513Cd&Wf{))MM9p`NgV0QvpR7v z&mJW-$9Cdg9@r4u)g@ zV%+cIokQ-kEV@wf7I%CnuQVJZcFXadywY&?az)2?Z)eN3srCOfpdSl~HUv`!d*mM{J+8J}~Q%FPm+ zaMLqk{Mo+vvt|5ZD}aHp<$|#G()`9G{g}r;CO!>%?n6+nO+12|T^9c5z;|2t6TtUb z_?Li>Sol|g^SMB|Ht|=u;q!sP{}*nG``_Ed{{hbD1?Aer^SBwd@NWViweXjLAGL55 zPyGh*7C>o!=gRyR?QO124*P8I(Kkr?dXImDcm*+v`f3wD0{)g4?zh)@K7R8gzobWx z7n3X(#EgHbyp58+*j_h^e**nUFTOv$t9=!;3H|ntc44B)?*N4jl2LUWeC)jRNXj zHN~e*?#($iA^+=q{I8Szi}uPdCxDe^LTJjWQGd~~o#s8=;K6{&@ z3t~q{X?iV^zSv&1h*?OlYr^zy^2NW&m)=dq#BdkHZp6~`5|W;KoRmw5xw!9{Fuf(d z_)BE`b!8_05;^x{=1JJ!UITt+9*B4oa5Ha0{G-6l{0niuSDCcZzZLkfg)ax5w(!ys zRY0sjI324r&m<@f4~lzqxBw5@|DO;iKaJzgb3yDJFOAk;lC+;&0ax0JuXJ-FQ_2md?7Uub?62;mtC&uN^5?57TCoK>7>9K7rc#|8)K zRCu{~tppE?H#M&KSBNoR{Ge_tRrpj3f6|9P<-`9< z<2|6Q#FGiu)tq8uI^^#$%FxuK2FTo2C2>;)sv_AAGpu zwJnO@Bp-gJ4?ow3U*N+p_Th^(&M{r3m?xTj;Wzv6+kJSi#v5e*8pS;tXFpkqr=NQ@ zuIy{R_#Nxx8h)))R2jW@{jo5bJv!vDgD?>F?4 z-*w`7jjQr%7B80I9~Ix$xUz>9`93+K%IC~Vag+GI4(GWCmFVAoq;b;F9x@u|+1 zB7Wfu|FsW4$Lq^f{15u@3w`(;AAW-mx6a+bcWmtAPSp7#Ja9ywTp|xHktdeOqe|qd zCF&RxNqE}9C-!kC>Yx*K#EFWd4n2{PaD)jDHBm>K$k4gcf3EbuO!-TCeej9oHdpeW zD|yb9vRx*RMY&9dUZ#8`&1I72GRfhxE5tzGssS9B(l}2hb(u`+GMQ9^OsYY$X^;#W zB(nyUf61mnvT2ZUFPAiz%UGAoSeGk$$+JQ7y!IW6+zNNf9gSNGj*X&o$2|IUf;6H28=*XUDpz*Zff!#UD5 zcWa%tmYg_4JxuV8m5C0c5%S!dHJw-_S}F8NJ-#nD$qZ==kTb+`dRTp}$DBs@t?SVKh>KQE=$F4Tl|d%OIWNPBPB>U&`ZYQ|n$NAU|jT#B0T zGgJ_$^jIN&rVC4J@@rIp=F>{LV0_=j8SL)FnLX4xzv3gPmCm6xodd>RjE(9qIN^g# z;~(oIA7#&fP7UGD|N7~WKVb)8&{cDh!5L}} zGFYqn9LB5HbhAi@Nm}-0^sgrTd)5Du561yK2Sxhpcu`EM#7T!vp6Nxuk7qDK&~GRF zfyxJQ%1eHSb@*|@AL0l7DZ?uWp%+)Im*^e&Ya$&sp)DuG zAnbsElMx{FZGgvh7Sv(zsV;d68lkk2WEMh|u52RY^w z=Cq!n*IwY%>k$2+cj}Ay2ytx>#P<*fy^#~FB;BikK@{3C!i%+jA=emjK))Vj`GT0~ zMhn{RUeopHbyaVoD5OISe?#$Q{>d+jaFz$<6RnGukq~~->vce z8b6}(3}CPY=@CNiw={fP!;>1mqhX0&(au2CQXg#^vYdknU7um^UBscE3LPHNc!_?% zCl3E8Ao&o=a``Ft$Pfp7OT!T4ARg6F<{!8Szz_PU17x|yHRN1s@HU(;MF{4c+YDkF z;T^&|5D#r$@J`q{A%y2#WDt|a6@-5XJ14}UIaP%1C|5$%rzj!lU5(cff}V4c44*}a zcrn5bloKK1H|p^Dgq@I+5c=VBXmADWlMwQ>5Q0yF5b;|zPW_!$?-1YUvw`7by59W^ z@rl2v_4#w%?)|H-e{XC1`ZrbYqrX6YsaLe?2}0L8#pV9ubC-M`}yR>6M&_@a3&pGhmYUqtH2E7q}0{YT$zJ@GU`ZsA9)%rjb5&flZ z_kN}8&#!epP=B`Q^mh;fmvW=t?9={-wEtm3_#fB)w146eq(?cWyogUbqd(=MKcA<` zH=+G|w0{zi<;yh*=4-u%DGfJkxJAP%<^%ldtb7IUDYj>u>5qIJ1f-oG)9@V)**?&Y zDhQD-%agd|>+g3?>GlxqUx$v*`pWWIukjRd}FzLf|_H!FP|w_XCpeK|&<{5+U?uYMZqoePG+a);Ur_c#{$0co?|t#ZVn`$C z*&nVaMEMRAq8?Fy(Qhif5zi1uKE?>4Z`wKWYC_;KjnAhZLa;x=FG5~I$kjp^Lp!P= z^ASbmr~)3H1~~{(uZ9WnA*&HWl#^`FknbbJ0pHS4*7xa-tk3ix4Imuy9417*juRqZ z0_`^Q!G47KV1Gb7P6#@->!j<|{_6=rH=^-9gb?yDA>_?yJcK+F=UNc!>wH4+<9Uzd z&v`M*vz`!kz%_&D*^W3y2)efkL04Y}hImjPi@M(-c3BLk9g#Q!$ z2w)8gX$$eEATQxp(Jv5w4fT+)1MMu~U!c7pq*22KVAM!n1YSltYP^E*yUK1DUPb(G zRsAC#C4N{4mk@Xz;rEn%6Q_L#jzYgWyn*l^)cBg=^NGKz+9l#m#9vVDAMqCA|0qO) z5O^zLR<$?8mlHpz?3{QP@w|F2BHl~7ya&=2c1 zakdN0FCB4XcM*+OYv^kD+nkqa=Abx7R6L|o&X^TZxp}UL${DjFD(B9MsGKq@qH@z- z5iQPAan8Z_sqcx%N+!t6_j%tJv7IOGa4bfW6K6$K?p3r<%$yZ5IVV;`<-AuBm0KB$ zsNBhDp_uowFn(g(Lb<+K{S|NES$imugj=Kc@h!#a)bQMyL{ZdUjF4e49<4`>Ro6098QD)c>p zp__&KDY)Xe=!ULU{O`m)X?QWc7F;&JChZR(o#EFE%;vY=;zwBwKk~Qvkw4Qh&hWz{ zZ3(|&iy!F?zfa)a=GO{*JbtTu{I*#9!WO^#ef*XKA5VX4ef+jt{77%)+w9}lGXcM0 zAHT;fep4-ef9~TqGy%Uyef)M={MaWL`M%=gmjXT?mvN+{`ywv8e0N*?DiLP*VaQWb z9{Yi_jEyt={tg~CzrEl`xo96%xC}o$>Xz{1xOfzP#u zZ`;cuAW4K9XZW!{w)s`W)mV%C*q0i9m-_hed7gF9IK%J5K7LJc#fSWAa2bBwKZAd- z{_;6n)^+&N8Gcv!_$`kM;Ub*;qPPsd8-4uJ;MdFqv@`r}@bOz8S7S5s`yejE?@k}T z<7klfYF-3}-)%mARSVSElKfmv$9nn+AHT=J0KIzWaUr zxDGsCd93yEdlmdxuH;u|@!Ra<_bT|cz|S}%AD^pi`Q8RU)_wB35SNkf&wc#rC#$if zpWmZCe(M(skpdC<)#Eb!zU<={rBYGG#u@pZ^znNK{EmW%{4U02`0e%cL*v+Em}xqq zdwl$kEGpKIS(=Wb9PsfQ20zwsXf_;p>U)*Q%hp2cq};)2x6?@2V?OwTwYUl??@JvUrm%rDy` zBj5QxezEE5*~ajr4bYwI+_!H@h}Eq?#uR0SUw#?>Ax#&PRCu=$%r4OP1f=05*TbwK1d#~>sTy|wlecr%*@9!Jz zIzy&b)*wMW-d#IKoqODYvka0rlcG753rx%8BcgaNCC+ZFcJ=ucyl=q$f5h;8VVtJ` z(+eBgF`Pm0^pYd!o|k1Y{`^`1=Rj=wz=N4tn%C2F5q3Myqjw&B-MI+oq|Es2>##(g zHTGki1DKQN{(@Qc#7yYLF9WK*lzks$r`*p}9@&8NWIpd)iEoL|c2#l= zuB470qmHsDwr|-w0uSdIt)qQfN6)NKI-(56kl&~;zlV_DS6D{ijkHltOS3rt)Yu^D3u(2lu3>Y__aC%cB5(q=z2DPC3rH)ZfV9nThh-4pvx|FHD{b z1$#4c@;lTh@)&Vheqo+1Q!a+(`EC_He|(`)`bV@s<%?*)D$B1*`&CCe2BtsB`=*asL(Zc%5lERePQsEy0Oy^ z;Vd88K^4AhBF}mOEze9c{?(TMKU@A$%OB@t*6(9;p4GL(sRFy_qbJ4ZdkH6DmuQ$ zT^c^A7>GN*$6Xp;?h6n5!o$As3SW4IFMO&m91m5N<9pnt=||+(M|(Xbv1cthzSnKL zpqO5K&k1q(o(-R2jbrR93<5~}4}AC{AI>qGaink4NL=!tB>GGsAj5|=&bb?YoAjX) zJS@JTagH(hEzhSkepKR9<$eI|CHWmR2q5`?&xij|BF&f z>^X*G$<=ejg&BC54}NOA{l5NzySoS4hkE#NOKc$R>=NDg;;@hQ`*1Rbz8&Zu>>d*Q zf@b?*Z+CZ6d((4#Hunvz9_seOaM;GckYa7fl~*a5OwbT?bz_5T|NTPC^@;w~eL7VW zB6klP^3{D1R&OO%;;Um-Oni-*z1!n&X03*rqIf=QA_US!i01>AX%s!?TZ9-C`RSJH z@DalE)!HTLDo_UG$9WF=vmDNczk#e(46h>uQ`$ITj1Y8j4ciE7)u5JenD_;1K9F#? z#z!?gL0lsdWf{N-}>`@0>w+Ud-FbO%nlFj7)Cb(7w<6^kZvM66rWsYc`rKJ z)@kXQ#1IyesVG~tpMN`mz$Co20MeD?T868HACUMs{B8lA&2KZ1M)+0XV((@6eG>OJ zKkj3rsTpVFyAK{VzfmBRhx`Z)za6-@`ElN1Jbv3jXY)H`@ni33_&wv}w;TMJ595q{ zPs79JcNj=D{3svmz2WCypE(A8M-gtE;rDm&u=yPa(hNWHWAAJDy^ec3zx!bj>{E<0 z{POUy`NfdQ4)~ED+b6^CSGZ?%+6`S}+4#@h*s4JrO)4rp=Y!6~p`Q_f5Lxsb_w($5 z2d3@3bs?rt*}%_p^HHeWgJGPx^*?uyARpLX?r{ z&Swao)2hEYhVDO+M_y{=_x12RA;-OV<}!FI1PDNJr%plFfJr=W@L8iC>0-VQTH&)4 zo|)q5zeX89iy4$WpC76_wg%8O)s*A8!AarSVMLuZItenS;P)0}Jh|azPezRE&=Wr9 zo#6^Q!J#u5`JBTscs-s|l6X!rvi&lk#Hpu|gG|dw5RhuOKVV{LJzE*NRciL+K28eXQ`JB?rD|;XOCJ zhI{jjWn`xge-B4Ld36G*p}zf$sd_G063V(@*Bat>?I0eK_10qm91oFlpP2G9HD6(T zhG0D_x=E6r`<9ebxWQO!(e+D5PJFlDc6{crT@W?+V(qaWkYo6SMZmQ0^x-Qt9)}Ek zcYd8O{7-!N!#Jn?Y$74zoJd!Mh8VZ6)8{mCJ`{bheh zp1ydS%nTajOH+K=EZN;XAYV2c>{&b1)qh`~Na9FD*^fpcAlq-k<%DR+dI9-PR6_fA z5TX!Mgb3fF;STM;pAeP#Fd-XI=q-vusv-ovtKn}pPP3KQjy$jK?;C7i-N%viV7K1D zWsmDh=#46V>w(g5GfuKC-rW1gNsUmO?VvL0V)*5~d9o%Q?btZOZx%f4el&pq7k+4P zVe!R&v;+4xzrDcYCNWJ1AZ@|s$Fn$S59BxAIEix7y$xO$s9X6<*1U#s!K9MX6F(n7 zwKZ|*XG9>hYc$tLlknto{8_k|mk2I@zq}93X^+Mke*S)W6b!Z-B0xi@t)_c$5cc&x zzV|!t%7(`G+b=h;PFVf&g<_`nU5UW$m~GZz}+ye0ZmhB?i{InpQa%_!tk@`zY{Ht$LAV16`#?>Lbb zvdFnioeug~^l#|r5{<(JJ1)*JK0z9kLzv(9t;hF$IoAoZ|C^OX@fjkFKrc%K_5wc!-r!Cvht4eAt0`<77I>GvhgCs{Q1Hx$4wIxe(4SFURBM(vLh&tn2l{3~QIyRN0IGc!LQ1U>OG&@c}5%zMg0 zJ=4#QPn>Z?#|XY(QjEuMD4BS(#)(H=^Bc|NOCFSi-(GtQx}~1^eTW7?>Y8Vdk5S)v z{)j?XtZ^V6Y6!Jh8e&+?>;W!R`70}<}41av1A(@^| z-B9m=B-e7L=b@wN_`Y6{?Nb$KBQD1L&@IcC-xuI_eWi@hGuD-#MSBzGcNF-{gZ2x2 zr{(YINKcP~ZxHwB4{HKg4@3J=Q^mCf$Wg^O^+*$In3v!lYkE8*zow#NI@%mjGYxW} zZ#H@W6)>I&;ZNY@XR4{a_W^fv@z ziCh!SVhDxDEo$B6s&5*d}xi%E8#)Lx8($?nb-IHaP-im7Pd?Og1p((|fabxt

G=i`<0pHuA0IZoFEi{c%<#yh9j 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 Y=`WIKKj8+(FF&WZQiw4l0vp|b0I8U8H2?qr diff --git a/bftps/include/bftps.h b/libs/include/bftps.h similarity index 100% rename from bftps/include/bftps.h rename to libs/include/bftps.h diff --git a/libs/lib/libbftps.a b/libs/lib/libbftps.a new file mode 100644 index 0000000000000000000000000000000000000000..03597d3bb6c1b3b8cd6320ec6528a18a5372a1b7 GIT binary patch literal 68464 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 UZsNW3^s?i63=@MM3E$)W53b8)bpQYW literal 0 HcmV?d00001 diff --git a/source/menus/menu_ftp.c b/source/menus/menu_ftp.c index 64b63b5..f39ae67 100644 --- a/source/menus/menu_ftp.c +++ b/source/menus/menu_ftp.c @@ -51,7 +51,7 @@ void Menu_DisplayFTP(void) { Draw_Rect(0, 0, 320, 20, config.dark_theme? STATUS_BAR_DARK : STATUS_BAR_LIGHT); // Status bar Draw_Rect(0, 20, 320, 220, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); // Menu bar - ret = ACU_GetWifiStatus(&wifi_status); + ret = ACU_GetWifiStatus(&wifiStatus); Menu_DrawMenuBar(); From d3c7af605f1128822156cb5aa9b1e1755e37b5b2 Mon Sep 17 00:00:00 2001 From: Marco Martins Date: Sun, 14 Jun 2020 21:51:48 +0100 Subject: [PATCH 4/4] show two file transfers --- source/menus/menu_ftp.c | 136 ++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/source/menus/menu_ftp.c b/source/menus/menu_ftp.c index f39ae67..9b8850d 100644 --- a/source/menus/menu_ftp.c +++ b/source/menus/menu_ftp.c @@ -33,7 +33,7 @@ void Menu_DisplayFTP(void) { char buf[137], buf2[512]; u32 wifiStatus = 0; - int position = 0, progress = 0, xlim = 270; + int position = 0, xlim = 270, heigth = 0; //ret = gethostname(hostname, sizeof(hostname)); @@ -56,76 +56,74 @@ void Menu_DisplayFTP(void) { Menu_DrawMenuBar(); if ((wifiStatus != 0) && R_SUCCEEDED(ret)) { - Draw_Text(((320 - Draw_GetTextWidth(0.48f, "FTP initialized")) / 2), 40, 0.48f, WHITE, "FTP initialized"); - //snprintf(buf, 137, "IP: %s:5000", R_FAILED(ret)? "Failed to get IP" : hostname); - snprintf(buf, 137, "%s", bftps_name()); - - /* for now I still don't have a list of conected clients - if (strlen(ftp_accepted_connection) != 0) - Draw_Text(((320 - Draw_GetTextWidth(0.48f, ftp_accepted_connection)) / 2), 80, 0.48f, WHITE, ftp_accepted_connection); - */ - - Draw_Text(((320 - Draw_GetTextWidth(0.48f, "File browser cannot be accessed at this time.")) / 2), 100, 0.48f, WHITE, "File browser cannot be accesed at this time."); - - const bftps_file_transfer_t* transfersInfo = bftps_file_transfer_retrieve(); - if (transfersInfo) { - const bftps_file_transfer_t* file = transfersInfo; - // while (file) { for now only show the first file on the list - if (file->mode == FILE_SENDING) { - float fraction = ((float) file->filePosition / (float) file->fileSize); - snprintf(buf2, 512, "Sending %.2f%%", fraction * (float) 100); - //file name should have an elipsis when is to longer - Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150, 0.45f, WHITE, buf2); - Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170, 0.35f, WHITE, my_basename(file->name)); - position = 0; - progress = 40+round(fraction * (float)(xlim-40)); - } - else { - snprintf(buf2, 512, "Receiving %.2fMB", - ((float) file->filePosition / ((float) 1024 * (float) 1024))); - //file name should have an elipsis when is to longer - Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150, 0.45f, WHITE, buf2); - Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170, 0.35f, WHITE, my_basename(file->name)); - progress = 40; - position += 4; - if (position >= xlim) - position = 34; - } - //aux = aux->next; - //} - bftps_file_transfer_cleanup(transfersInfo); - - Draw_Rect(50, 140, 220, 3, config.dark_theme? STATUS_BAR_DARK : STATUS_BAR_LIGHT); - Draw_Rect(position, 140, progress, 3, WHITE); - - // Boundary stuff - Draw_Rect(0, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); - Draw_Rect(270, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); - - } + Draw_Text(((320 - Draw_GetTextWidth(0.42f, "FTP initialized")) / 2), 37, 0.42f, WHITE, "FTP initialized"); + //snprintf(buf, 137, "IP: %s:5000", R_FAILED(ret)? "Failed to get IP" : hostname); + snprintf(buf, 137, "%s", bftps_name()); + + /* for now I still don't have a list of conected clients, is this really necessary? + if (strlen(ftp_accepted_connection) != 0) + Draw_Text(((320 - Draw_GetTextWidth(0.42f, ftp_accepted_connection)) / 2), 77, 0.42f, WHITE, ftp_accepted_connection); + */ + + Draw_Text(((320 - Draw_GetTextWidth(0.42f, "File browser cannot be accessed at this time.")) / 2), 97, 0.42f, WHITE, "File browser cannot be accesed at this time."); + + const bftps_file_transfer_t* transfersInfo = bftps_file_transfer_retrieve(); + if (transfersInfo) { + const bftps_file_transfer_t* file = transfersInfo; + heigth = 0; + while (file) { // should be limited to the amount of information that can be shown (for now working on two simultaneous) + if (file->mode == FILE_SENDING) { + float fraction = ((float) file->filePosition / (float) file->fileSize); + snprintf(buf2, 512, "Sending: %.2f%%", fraction * (float) 100); + //file name should have an elipsis when is to longer + Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150 + heigth, 0.45f, WHITE, buf2); + Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170 + heigth, 0.35f, WHITE, my_basename(file->name)); + int progress = round(fraction * (float) (xlim - 50)); + Draw_Rect(50, 140 + heigth, 220, 3, config.dark_theme ? STATUS_BAR_DARK : STATUS_BAR_LIGHT); + Draw_Rect(50, 140 + heigth, progress, 3, WHITE); + } else { + snprintf(buf2, 512, "Receiving: %.2fMB", + ((float) file->filePosition / ((float) 1024 * (float) 1024))); + //file name should have an elipsis when is to longer + Draw_Text(((320 - Draw_GetTextWidth(0.45f, buf2)) / 2), 150 + heigth, 0.45f, WHITE, buf2); + Draw_Text(((320 - Draw_GetTextWidth(0.35f, my_basename(file->name))) / 2), 170 + heigth, 0.35f, WHITE, my_basename(file->name)); - /* - if (strlen(ftp_file_transfer) != 0) - Draw_Text(((320 - Draw_GetTextWidth(0.42f, ftp_file_transfer)) / 2), 147, 0.42f, WHITE, ftp_file_transfer); - - if (isTransfering) { - Draw_Rect(50, 140, 220, 3, config.dark_theme? STATUS_BAR_DARK : STATUS_BAR_LIGHT); - Draw_Rect(pBar, 140, 40, 3, WHITE); - - // Boundary stuff - Draw_Rect(0, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); - Draw_Rect(270, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); - pBar += 4; + position += 4; + if (position >= xlim) + position = 34; + Draw_Rect(50, 140 + heigth, 220, 3, config.dark_theme ? STATUS_BAR_DARK : STATUS_BAR_LIGHT); + Draw_Rect(position, 140 + heigth, 40, 3, WHITE); + // Boundary stuff + Draw_Rect(0, 140 + heigth, 50, 3, config.dark_theme ? MENU_BAR_DARK : MENU_BAR_LIGHT); + Draw_Rect(270, 140 + heigth, 50, 3, config.dark_theme ? MENU_BAR_DARK : MENU_BAR_LIGHT); + } + heigth += 50; + file = file->next; + } + bftps_file_transfer_cleanup(transfersInfo); + } + + /* + if (strlen(ftp_file_transfer) != 0) + Draw_Text(((320 - Draw_GetTextWidth(0.42f, ftp_file_transfer)) / 2), 147, 0.42f, WHITE, ftp_file_transfer); + + if (isTransfering) { + Draw_Rect(50, 140, 220, 3, config.dark_theme? STATUS_BAR_DARK : STATUS_BAR_LIGHT); + Draw_Rect(pBar, 140, 40, 3, WHITE); + + // Boundary stuff + Draw_Rect(0, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); + Draw_Rect(270, 140, 50, 3, config.dark_theme? MENU_BAR_DARK : MENU_BAR_LIGHT); + pBar += 4; - if (pBar >= xlim) - pBar = 34; - } - */ - } - else { - Draw_Text(((320 - Draw_GetTextWidth(0.42f, "Failed to initialize FTP.")) / 2), 37, 0.42f, WHITE, "Failed to initialize FTP."); - snprintf(buf, 18, "WiFi not enabled."); - } + if (pBar >= xlim) + pBar = 34; + } + */ + } else { + Draw_Text(((320 - Draw_GetTextWidth(0.42f, "Failed to initialize FTP.")) / 2), 37, 0.42f, WHITE, "Failed to initialize FTP."); + snprintf(buf, 18, "WiFi not enabled."); + } Draw_Text(((320 - Draw_GetTextWidth(0.42f, buf)) / 2), 57, 0.42f, WHITE, buf); Draw_Text(((320 - Draw_GetTextWidth(0.42f, "Tap the FTP icon to disable the FTP connection.")) / 2), 117, 0.42f, WHITE, "Tap the FTP icon to disable the FTP connection.");