From 822bb1eb84b45c43ba2e6a6ac6c9274c5db01858 Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Mon, 25 Sep 2017 17:08:14 +0900 Subject: [PATCH] Introduce UX for RW update It shows these informations below - Updated scripts / Total scripts - Progress circle Current progress is stored in tmp Change-Id: Ice8a0ab17c2a125a83b52cb91d504ade497396e2 Signed-off-by: Kichan Kwon --- CMakeLists.txt | 6 + packaging/system-rw-update-ani.manifest | 5 + packaging/system-rw-update.spec | 36 +- res/tw1/images/solis_fota_progress_000.png | Bin 0 -> 24287 bytes res/tw1/images/wc_fota_downloading_0.png | Bin 0 -> 1221 bytes res/tw1/images/wc_fota_downloading_1.png | Bin 0 -> 1095 bytes res/tw1/images/wc_fota_downloading_2.png | Bin 0 -> 1225 bytes res/tw1/images/wc_fota_downloading_3.png | Bin 0 -> 1274 bytes res/tw1/images/wc_fota_downloading_4.png | Bin 0 -> 1175 bytes res/tw1/images/wc_fota_downloading_5.png | Bin 0 -> 1217 bytes res/tw1/images/wc_fota_downloading_6.png | Bin 0 -> 1279 bytes res/tw1/images/wc_fota_downloading_7.png | Bin 0 -> 1188 bytes res/tw1/images/wc_fota_downloading_8.png | Bin 0 -> 1273 bytes res/tw1/images/wc_fota_downloading_9.png | Bin 0 -> 1293 bytes res/tw1/images/wc_fota_downloading_slash.png | Bin 0 -> 261 bytes rw-update-ani/CMakeLists.txt | 60 ++++ rw-update-ani/rw-update-ani_new.c | 450 +++++++++++++++++++++++ rw-update-ani/rw-update-ani_new.h | 25 ++ rw-update-ani/rw-update-log.h | 105 ++++++ rw-update-ani/rw-update_new_cairo.h | 49 +++ rw-update-ani/rw-update_new_cairo_w_360_360.c | 492 ++++++++++++++++++++++++++ rw-update-ani/rw-update_new_common.h | 74 ++++ rw-update-ani/rw-update_new_common_display.h | 81 +++++ rw-update-ani/rw-update_new_fb.h | 48 +++ rw-update-ani/rw-update_new_fb_cairo.c | 257 ++++++++++++++ rw-update-ani/rw-update_new_tdm_display.c | 421 ++++++++++++++++++++++ upgrade/update.sh | 23 ++ 27 files changed, 2128 insertions(+), 4 deletions(-) create mode 100755 CMakeLists.txt create mode 100644 packaging/system-rw-update-ani.manifest create mode 100755 res/tw1/images/solis_fota_progress_000.png create mode 100755 res/tw1/images/wc_fota_downloading_0.png create mode 100755 res/tw1/images/wc_fota_downloading_1.png create mode 100755 res/tw1/images/wc_fota_downloading_2.png create mode 100755 res/tw1/images/wc_fota_downloading_3.png create mode 100755 res/tw1/images/wc_fota_downloading_4.png create mode 100755 res/tw1/images/wc_fota_downloading_5.png create mode 100755 res/tw1/images/wc_fota_downloading_6.png create mode 100755 res/tw1/images/wc_fota_downloading_7.png create mode 100755 res/tw1/images/wc_fota_downloading_8.png create mode 100755 res/tw1/images/wc_fota_downloading_9.png create mode 100755 res/tw1/images/wc_fota_downloading_slash.png create mode 100755 rw-update-ani/CMakeLists.txt create mode 100755 rw-update-ani/rw-update-ani_new.c create mode 100755 rw-update-ani/rw-update-ani_new.h create mode 100755 rw-update-ani/rw-update-log.h create mode 100755 rw-update-ani/rw-update_new_cairo.h create mode 100755 rw-update-ani/rw-update_new_cairo_w_360_360.c create mode 100755 rw-update-ani/rw-update_new_common.h create mode 100755 rw-update-ani/rw-update_new_common_display.h create mode 100755 rw-update-ani/rw-update_new_fb.h create mode 100755 rw-update-ani/rw-update_new_fb_cairo.c create mode 100755 rw-update-ani/rw-update_new_tdm_display.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..bd272ca --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(rw-updater C) + +#add sub directory +ADD_SUBDIRECTORY(rw-update-ani) + diff --git a/packaging/system-rw-update-ani.manifest b/packaging/system-rw-update-ani.manifest new file mode 100644 index 0000000..017d22d --- /dev/null +++ b/packaging/system-rw-update-ani.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 74ff7b3..2fa4253 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -1,25 +1,46 @@ -%define debug_package %{nil} - Name: system-rw-update Summary: System RW update management -Version: 0.1.4 -Release: 5 +Version: 0.2.0 +Release: 0 Group: Base/Startup License: Apache-2.0 Source0: %{name}-%{version}.tar.bz2 Source1001: %{name}.manifest +Source1002: %{name}-ani.manifest + +BuildRequires: cmake %description This package provides files for RW update which is implemented by using systemd offline update. +%package ani +Summary: System RW Ani +Group: System/Utilities +License: Apache-2.0 + +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(libtbm) +BuildRequires: pkgconfig(libtdm) +BuildRequires: pkgconfig(vconf) + +%description ani +UX for system RW update/upgrade + %prep %setup -q %build cp %{SOURCE1001} . +cp %{SOURCE1002} . + +export LDFLAGS+="-Wl,--rpath=%{_prefix}/lib -Wl,--as-needed" +LDFLAGS="$LDFLAGS" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} +%__make %{?_smp_mflags} %install +%make_install + mkdir -p %{buildroot}%{_datadir} cp -r upgrade %{buildroot}%{_datadir} mkdir -p %{buildroot}%{_unitdir}/system-update.target.wants @@ -50,3 +71,10 @@ fi %{_unitdir}/offline-update.service %{_unitdir}/system-update.target.wants %{_unitdir}/udev-sdb-init.service + +%files ani +%manifest %{name}-ani.manifest +%license LICENSE.Apache-2.0 +%attr(550,system,system_share) %{_bindir}/rw-update-ani +%{_prefix}/share/rw-updater/* + diff --git a/res/tw1/images/solis_fota_progress_000.png b/res/tw1/images/solis_fota_progress_000.png new file mode 100755 index 0000000000000000000000000000000000000000..1292e6ae2604473afd715213b308357111fa4f24 GIT binary patch literal 24287 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 literal 0 HcmV?d00001 diff --git a/res/tw1/images/wc_fota_downloading_2.png b/res/tw1/images/wc_fota_downloading_2.png new file mode 100755 index 0000000000000000000000000000000000000000..e9aca8e31e86611e2edc3eab60193509aa405448 GIT binary patch literal 1225 zcmbVMZD`zN91rW(ZQY6;3|SA+G?igtN$$y8lkCoVm)y0dyIZ*)?3jp`OP=;(FE1vk zcP)ZlDaE-H{Ll)DU~zS*l)*r7GDIv`7_Q2wli~-NQ2k=D6hZwU*5}&0>W8uqh9u8R z{=eVv|NLKac`(!8-WF=ZFswZ_pk~o{0zExPTG4w|U6Rqz86@(-kTV=qG!J4i!zn^M zWoaWY3pHc>#oI7~VJ)_q%Ln=NIazlsN~_yYRm(+a42$$tT}>Z_0bYb7rX3|VZ+%YS zrV%AB@ab^cRba^+nDF4xL?)+CjOvm>^gW43sxl(5V4&eut8DvnHA?L8%4lBSrU`t< zBp8hnyH4fPgSg^&5a%hD)WZPafx^2_ z84IEW@^tqImYYuR5!-$vP$*<{RdZ=Tg=x#GpKHh353=xIH}VhcO>GltH?Z6T zv9jVpEpWV?}GR-tFU1dXKUSoltiWph7$ zmhFwjl?1CWVL=2yWSCeyE-6YZ&a=Fz5Dl#Hf8$0Yhv<5d{HJJ|Tc{H2)4dizi@hd- zHtHM?waB&Bm6NEwwo+;=SN*>D*Y#gnSFV22&adBq0yXWAi3oWlcH-Gbyk2+hwzRw(-t|)xr zw`=&@G4tl}uIaDtE*(CTdEw-{i7TI7dZtX}SKE*NsMQ|6_w+*RBDi=bxPPTsUOV)B zsB8HRkE0if*^Rqf=eQQx{qV~<=9~GS<_2G;POl%R-AUHE%!Sb8O2@kQ`0N@t{pg%{ z^~7Vz%ZO|%62E+ns zEd}vNUdq5Yl+vTmd=6VNY>TQS`mDZa7cXmhmsGKF74temV_56HqAtlFciG6K&Ymr9;d1y&^F`rXSzUU{`czHCh zY?B1OW@2Ui#JW>`(QaJO42XMOv{QBifHRB>c)Sb)T5!q@DAJ8?#tA&Um*FWNUcCsU zW~2xCxEQW#p_QK)vMik^$wHyvD$p*?$dG{JxC#eFIgy3a991o;=v2*y8iNQ;*-&&# z(Nw&`D5bO!%TFLr*N>3bqtOjw)vN{zg^VmpItg5EGM}%UYt7oU;_zQLHnlbrqdFwx z(9}i@8RcWJp$0~=yR%Tm5P8ENFcg#&DJN?3NFJ(IMD!Eriz}_9d77ai05aHixy5;;UxisU~%QziykqG&#_I zy^bB9oNFlCS8e>=*SzIJj_y~PzkY5!W?LxzFqzr&cGuA>u7hte)4N_@_1`eIotSMZ z9lzPRaPRZYw$c+HJ-T${!tV!G=JXck9be?9E~@<8NxhdHPQ0}EWz)&tmDA2_vtwyb z)7CB9uQA-?BQIx8hhw|HnYn##|H6uKG5Nu-k6bu5_389?rT(s?MzQ^huWcfuw_lo{ zeQ*N*^QqS^PnTPFH_bHW4(7^J9g8;=@yx|-O0LYG|I9JH_{Qzt2kiH^amx)``&&AP zvyUZzj5&_@51k5UXXos1?yp@$jjquYU2H g@O{VMoxf}!z#hIe^Yug{_DAJ!6bZ$|`QX6#KgY+l`~Uy| literal 0 HcmV?d00001 diff --git a/res/tw1/images/wc_fota_downloading_4.png b/res/tw1/images/wc_fota_downloading_4.png new file mode 100755 index 0000000000000000000000000000000000000000..081e84e031e4d079211aba222d0eb2e3cea0498f GIT binary patch literal 1175 zcmbVMOKj9e7&b|Pb|FeVnh(QjfdEC;?;fZ{lNLjV#8asSf^ung0@_OxV(=W2$Vy2 z5>=7w&t6zVgB;fz1+_Y@S3a^l9ExsgBeuhsp*e1Fs2#iB6r!MkCW9!)KmFl84+1~O zpVKPYN^GNMP?{rXY;L6H%}sfx&kvmhgKdiugowJJ9ZpAy)z0x-ycV0M+Y%49Oz2dO z-*&2A83i^b2xy`rcv%R6u8UCBbRB*GEW339s+Oi(@&M>uJX0h7gjIEhJ6dd& z;2Gkvd`ukef?4cd zE|eNFZ>*0=z>?xlJJ_2EQAEp5j%Qy)KkzL@R}h4rAwbjh1XXUhf-5%+K{L>VD$Ay- zBel!38(xNrqUIgPREBj3i>e_HKvRQiQL~|A7)}>kjuPrd9_nfbOuK`%Uy8MCf?SG8 z4ddx<6^u49#Yq##z#h}V@pD1s<5qGaP0{v=9Yli9kv~ju2)1Hu1-t1h%0Rwg7ZqF1 z>IQ^{EawXa)3);kP0$g{H3->PfKUwfEn%}QCgKu8zKmF<6+gGj*+FZ{;?%CNJa`V8-7wNB} MTpV$}D~vDv1J71_;s5{u literal 0 HcmV?d00001 diff --git a/res/tw1/images/wc_fota_downloading_5.png b/res/tw1/images/wc_fota_downloading_5.png new file mode 100755 index 0000000000000000000000000000000000000000..f015a4e732ba2e1eede16c7318f21ebae50efc60 GIT binary patch literal 1217 zcmbVMTWs4@7dRpEO?U3-;;a zh8Jkjq=8x?#HMwyJr$wBfHByGi^?>KOT`Nt5@H~vF)^e~li15N9=IL1N#UW|1D5S` z@&A3_fBuX2jSLTTc5Lb(2%_eLEPb3r7|k#pHvLjj_Z+4JhVNGCWyZ6p{E<;5Rnx)W;rS9w@*H! zNXtx7qe4EB_f%N31{*#sHik<^W89EUYWw44U#MUL8zP+y?FlDP!W6a4tKfOG%~0gB z2^vpPD^8X3Bc$s3kQCw^Z6p97MKKO|K@`DbB%1&%lfbt~16~nCg-w#pi^6KYSyc*J ze^U#uQdA8gPhpsPy&kV~an~PXfGo=q2g}mff)1t}q=&QsJl>jurU6`j`EibM+% ztnw@?^CIM1JZs?r%ZebIlw_`71R%>xY!b)<;Io1XG)dB0*qjp}-7#QG+rrvSZ1T2P zMfIVMT)*VH6Rj#3skz7vYOY7BMUmV(YB{D`4|<{$t(;hczO@IM{l06H%Q050HS}4I zOQthwmQ&e;C;=d`Y&w&XRW+RvI6+dWCf5AFabvJUOjIQQDVo+6uEc1%+5&j7+C+I}r`IdanJx3%UVYfu^kx68 z7aM-V5sMzYqOi*n%#fq(fb-N zv|XEisdjKSSV&AEIPAsJH}wc>%H`P?H#R4d)KlWJD0A|>Ida|_jEnid*SZ3 zc1`$#LIQCT78#ltCa|a>2Apw5qhv7SU=a*5qY=>$#!OTa6XOTJ>C>&9epvY6ZNaL_CmQ1uY@`^PgF zswyEY?MsjeQvi9jr)+`#a&Jm556YZ^bw7>%T8qyeW+kq0QGsixJ*(M%Ca7c@v$uR7)p~AO_1V-iyOUdy` zF;>-rs}PoV9Fr%AVzKBcdOe0UKu{dVRXAuGhZeX!qB~Lv*X?aJ1`*h@rJ9av=xBve z${IsX2!oz3A3-w{i4|hqt_BK*j3`MaL3v0*(<sA;QE zyNdPR7t0G4kQ~EG8AhR21$}wLG3>lyqC!85?o6w?VifJpN{W_GECNd%21?8_G;}G( zyt;}$?e+S@5h3aoXp#+3RDh<#kq9RU;fT-c3kX;htNh=%5zrx`QY8N=n%Wku#L9G~ z1>j<(iGU6}$AT^L#6=hE*9UgQ#c-;0``*6q+%J$DUp&7-S-0<+>*=;#@2=T(v*C8b z-Sy5|KC*jFOPf21wR8;M{q0=ic(3c2J$2*2S?7x_6LS~-iWJ(rv2QP4`?9s`ovp3k zMCT?q*H2%)fy;m9gQ@F@mecI+Q^!50+GH%-+sTYc}#9^#6P*!^vBDMM<+LYwJMCB>t?;)TfmL;nC%5~|ez literal 0 HcmV?d00001 diff --git a/res/tw1/images/wc_fota_downloading_7.png b/res/tw1/images/wc_fota_downloading_7.png new file mode 100755 index 0000000000000000000000000000000000000000..023aa8e9e491d000af66b8834fd19019536b953e GIT binary patch literal 1188 zcmbVMTWB0r7@oK)A!(qELTid}n7mkZF6Yc;XNGLk-I!AlDRlD zaX0b7O$BL0r0v%FQba+;DirgkZAC0qq6i{QL5m_*5q*;SpgxH8Op=X0gg!XT%(=|} zegAj<%dAXIJT}lb)JIX&K$tM9O%85yssHoG%`Gp6zj=!Fq1UR2vd0{urMfj z<}9vY(^-7-Q#?XZ8Q-nelX`hvvjdMcQyaGBg#=AeBcrX*wC8XFEIjM_Ir`U2AJV{e za&%29^W{*-4fpU;gr}D#s`k>HtvdARK`_$N2!V$a6STZ}Kh|0~dV^OZ^K_e|!G=jP zm!mgD)yq>r4@2$8zyexgOt& zVs~dpsUcCLO-3$BiaBot_JW7~q-5l1@`ZI=M-yZLLue}uR85-^k!3O_vJ^&A@QjF% zD#}>w^6Z3%2+6RRhN2i*YgEQkQANX!aDyqZX6NBrA6|eqUmmtN=&EQEkG9AO@w{Y zIT2}*p39H_MB3}~l98{rZdiZazCD_GqrI}+cWnLSYu4H`=-vM7N3R^edI3}>)!qGf z-O7Q3{kJmw*PZsYzlRSEji0+ebNBL}?0Q>Ri(cPXdGW`-z0t0o_isM9-v0LI->!Z# zF(mT&SMSr$8ntgee)G8%tG4@>!TJlApS}3J^YXsT>fo6VhE9Cf>GbHQzIr-*oBrq# z<@)#W%HZkR?QleaiMVR_&;@#hvEPL literal 0 HcmV?d00001 diff --git a/res/tw1/images/wc_fota_downloading_8.png b/res/tw1/images/wc_fota_downloading_8.png new file mode 100755 index 0000000000000000000000000000000000000000..37f59ec85dd0808be24309d42d4ddcfff92a8883 GIT binary patch literal 1273 zcmbVMduZHr98YaGZA;Z{GI2~vvlW~+m)9kigr4P+T zu4V4!M5@kpRsR{AJqqIFU=$zNIZDSs?EIt52SeTFoR1;W;^x2y^$&k(@2Y>4{b5Lc z&+q5+eP^V*>+zPWeTa6X^h2c`&HWPNl_| z(oxX`cR?)Ux_OZx3Wb8N!1yeCfS?3H@Hl81hZ49mWV&h*H=Qk21_d~pt><0cGEt9F zOUJ#fLj-tYTo(@m~OZmgBOes9CRIw4$aaB_TRoyz& zUBU9V#fq{GRM)cOmX)hkL3hS-Ehl5;QMs2xAKsyxDXZXY^HQ|zu>x%US&-_mEdyPO zv8b=2pJtdqNRq>hOp_c>Q9MnDBuS9vki;@9FJl#K>i@=#fCdp>k^HA&3%AYk$;}SHH^j z9Y3;L8_8}x@Y%;bS!{Z;+;TDhQEWYhqAxu2mas>{7qHP67ysP&$jwrG{?l&{Uw^G{ z-8F5)OWSMqp-)(QOJZZorcW*<2Dgs8uiv<`=T^`7d~1Kr#E5Wl|5>Sd;^j-DopYN{ zw?BIA&$Kkj=29l+BEnzQ0_r?u5JcHja4Pa=W;bWPz@Iw$;0~XWQ+% zp>fQJD3~RH7~}9QCS&3dKi~^|&|qfJOfp`A1~U~UCS*j(jG`YVKDX_r9~M5?w0&Os z|NVad=l{~@TbdfnN*^di5Tq=&RY}0H0zT_kEQjxl${7g`RbDjZwc4FtPIUkh*6j{} z#!R&fB!H^-J@EyoN04QfkxY51_#={Ln}nLTA$&6n(Fjt%+0Uw48hB_2=rXJj_Uq|S zFx1dPSQ{Uw;#nDV8(aGw(AwXW)cVs}P{%eujMn=SBrt)eqQ052T*(h%bG#Cq=eJ1= zoip*$A#C2MRJ;Y1Z3mz{!QvW4)2JX2G{*}9y$NL~njtB83pmY5ydW_Fbm79Fnxl70 z38i5{3$8*~x94RglFa3DM2;nFr;DV6!C;<)VQ^@HyM30Y`nct;D=;X))f^-18McMy z8PyKE#|vT5)A=Kq*?4@B*m4&F1w%&qYL=u4iZspqx#p~0F9H5_V@Yc_*_Q=m0=RaM zqrrT1t}B3H?Cva-H-z3u&5i++qGl9Z>oI}l#gq^RzYw~iORT^Gn$|>|4yqc?F&!$d zG94n$i=dNZm>?$ruE4Vto(eDljurVJ+aS<%loOc%9pq^)%FDDOib??+vs_QLG*Hks zp!NcmyCYVT9iV!)leFzjp$b~MZO?YQ?JO#{3TR!MVd-|xU7t_U{D~Fd7`;GmaBLHu zi?L)Zq0g{vARLjStjth?NYf(2gd>rlEQcdJ%ZoC$fYtwR+(_sUnJ<$66is0ZR$_j- z*aC2|*hIjBo#Vh3nVng^3qgwbm=aFS~f_PKf6!eeSC7&sk=7*u%f59En89@ zZv3=jXK`h?@#xs2GxhI{z4bSB^}x$@hlZx7)3Q3Y>h;T!C*SNmJA{HCU-K^9yj@v+ z-Hp6G{J~-J>Glg#@cC%(JHz{1o40Jzmp${x1Xo*Bb(fi7eY}>q^DN@k33ML+uj>H=Hl|>by_ARP#$bwR=kZ{@cfX_SD3^$1aL>JXpK5>X!rcvDZCfF^<*6jEAbc&y@DSoYe?MSH)q zHCR6PnY`uNEo0y8wM#pn&H0>hDY<8&T2QF%tSvJmyIMLtT%KfHdiO4KQu(F5-{+}S zy}MPf@^@c$rl+u=tpBW;mcCoAMZNSiHkPlwy3#XVZ@Rag{CD36hJ1VOfjr6J>FVdQ I&MBb@09%V?`2YX_ literal 0 HcmV?d00001 diff --git a/rw-update-ani/CMakeLists.txt b/rw-update-ani/CMakeLists.txt new file mode 100755 index 0000000..466fffc --- /dev/null +++ b/rw-update-ani/CMakeLists.txt @@ -0,0 +1,60 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(rw-update-ani C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(LIBDIR "\${prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include") +SET(EDJDIR "\${prefix}/share/edje") +SET(VERSION 0.1) +SET(PKGDIR "${PREFIX}/share/rw-updater") +SET(RESDIR "${PKGDIR}/res") + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs_ani REQUIRED + vconf + cairo + libtbm + libtdm + dlog +) +SET(SRCS_ANI + rw-update-ani_new.c + rw-update_new_fb_cairo.c + rw-update_new_cairo_w_360_360.c + rw-update_new_tdm_display.c +) + +ADD_DEFINITIONS("-DFEATURE_ROTATE") +ADD_DEFINITIONS("-DCAIRO_LIB") + +FOREACH(flag ${pkgs_ani_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" MATCHES "^arm.*") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF() + +ADD_DEFINITIONS("-DVENDOR=\"${VENDOR}\"") +ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") +ADD_DEFINITIONS("-DPACKAGE_NAME=\"${PKGNAME}\"") +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + +ADD_EXECUTABLE(rw-update-ani ${SRCS_ANI}) +TARGET_LINK_LIBRARIES(rw-update-ani ${pkgs_ani_LDFLAGS}) + + +INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/rw-update-ani DESTINATION bin) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/tw1/images DESTINATION ${RESDIR}) diff --git a/rw-update-ani/rw-update-ani_new.c b/rw-update-ani/rw-update-ani_new.c new file mode 100755 index 0000000..e7c061a --- /dev/null +++ b/rw-update-ani/rw-update-ani_new.c @@ -0,0 +1,450 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CAIRO_LIB +#include "rw-update_new_cairo.h" +#endif +#include +#include +#include + +#include "rw-update_new_common.h" +#include "rw-update_new_fb.h" +#ifdef FEATURE_ROTATE +#include "rw-update_new_common_display.h" +#endif + +#define EVT_LOOP_DURATION 1000 + +#define MAX_KEY_PATH 4 +#define CMDLINE_SIZE 20 + +#define FILE_IO_BUF_SIZE 128 +#define CHG_ENV_BATT_STATUS "/sys/class/power_supply/battery/status" + +FbInfo fbi; + +static pthread_t keyevent_thread; + +static char key_path[MAX_KEY_PATH+1][256]; + +static const char granted_event[5][256] = { + "gpio-keys", + "sci-keypad", + "qpnp_pon", + "LPM_MOTION", + "s2mpw01-power-keys" +}; + +static void update_lang(void) +{ + _FUNC_ENTER; + + char *lang = NULL; + char *r = NULL; + + lang = vconf_get_str(VCONFKEY_LANGSET); + if (lang) { + setenv("LANG", lang, 1); + setenv("LC_MESSAGES", lang, 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) { + r = setlocale(LC_ALL, vconf_get_str(VCONFKEY_LANGSET)); + if (r) + _DEBUG_LOG("***** setlocale=%s\n", r); + } + + free(lang); + } + + _FUNC_EXIT; +} + +int read_from_file(const char *path, char *buf, size_t size) +{ + _FUNC_ENTER; + + if (path == NULL) { + _DEBUG_EXCEPTION("Inputted parameter is wrong"); + return -1; + } + + if (size == 0) { + _DEBUG_EXCEPTION("Inputted parameter is wrong"); + return 0; + } + + int fd; + ssize_t count; + + fd = open(path, O_RDONLY, 0); + if (fd == -1) { + _DEBUG_EXCEPTION("Could not open '%s'", path); + _FUNC_EXIT; + return -1; + } + _DEBUG_LOG("open '%s'\n", path); + + count = read(fd, buf, size); + if (count > 0) { + count = (count < (ssize_t)size) ? count : ((ssize_t)size - 1); + while (count > 0 && buf[count - 1] == '\n') + count--; + buf[count] = '\0'; + } else { + buf[0] = '\0'; + } + _DEBUG_LOG("read '%s'\n", buf); + + close(fd); + + _FUNC_EXIT; + return (int)count; +} + +static int read_event_node(void) +{ + _FUNC_ENTER; + + FILE *fp = NULL; + char buffer[1024]; + char *event_node = NULL; + int flag = 0; + int i = 0; + int node_cnt = 0; + + for (i = 0; i < sizeof(granted_event) / sizeof(granted_event[0]); i++) { + fp = fopen("/proc/bus/input/devices", "r"); + if (!fp) { + _DEBUG_EXCEPTION("Unable to open file. %m"); + return -1; + } + + memset(buffer, 0, sizeof(buffer)); + while (fgets(buffer, sizeof(buffer), fp)) { + char *ptr = NULL; + if ((ptr = strstr(buffer, granted_event[i]))) + flag = 1; + if (flag) { + if ((ptr = strstr(buffer, "Handlers="))) { + ptr = strstr(ptr, "event"); + if (ptr) { + char *ptr2 = strchr(ptr, ' '); + if (ptr2) + *ptr2 = '\0'; + + flag = 0; + + event_node = strndup(ptr, strlen(ptr)); + if (!event_node) { + fclose(fp); + _DEBUG_EXCEPTION("event_node is null"); + _FUNC_EXIT; + return -1; + } else { + _DEBUG_LOG("event_node : %s", event_node); + snprintf(key_path[node_cnt++], CMDLINE_SIZE, "/dev/input/%s", event_node); + + free(event_node); + + if (node_cnt > MAX_KEY_PATH) { + _DEBUG_EXCEPTION("node_cnt(%d) bigger than MAX_KEY_PATH(%d)", node_cnt, MAX_KEY_PATH); + fclose(fp); + _FUNC_EXIT; + return -1; + } + } + } + } + } else { + flag = 0; + } + } + + fclose(fp); + } + + _FUNC_EXIT; + return node_cnt; +} + +#ifdef FEATURE_ROTATE +static int read_degree(FbInfo *fbi) +{ + _FUNC_ENTER; + + char buffer[256] = {0,}; + int value = 0; + + if (read_from_file("/sys/class/sensors/ssp_sensor/fota_rotate_info", buffer, 256) < 0) { + value = -1; + _DEBUG_EXCEPTION("[%s] err %d", __func__, value); + fbi->degree = 0; + + _FUNC_EXIT; + return value; + } + + fbi->degree = atoi(buffer); + _DEBUG_LOG("fbi->degree : %d", fbi->degree); + + _FUNC_EXIT; + return 0; +} +#endif + +int is_batt_status(void) +{ + int value = 0; + char buf[FILE_IO_BUF_SIZE]; + + if (read_from_file(CHG_ENV_BATT_STATUS, buf, FILE_IO_BUF_SIZE) < 0) { + _DEBUG_EXCEPTION("read_from_file error"); + return -1; + } + if (strncmp(buf, "Charging", 8) == 0) + value = BATT_STATE_CHARGING; + else if (strncmp(buf, "Discharging", 11) == 0) + value = BATT_STATE_DISCONNECT; + else if (strncmp(buf, "Full", 4) == 0) + value = BATT_STATE_FULL; + else + value = BATT_STATE_NOTCHARGE; + + return value; +} + +/*----------------------------------------------------------------------------- + event_monitor_process() + ----------------------------------------------------------------------------*/ +void* event_monitor_process(void *arg) +{ + _FUNC_ENTER; + + int readcount = 0; + int ret = 0; + int i = 0; + int num_arg = *(int *)arg; + static unsigned int sys_power_cnt = 0; + struct pollfd pollevents[MAX_KEY_PATH]; + struct input_event event; + + _DEBUG_LOG("[main] event_monitor_process() started. %d\n", num_arg); + + memset(pollevents, 0, sizeof(pollevents)); + + for (i = 0; i < num_arg; i++) { + if ((pollevents[i].fd = open(key_path[i], O_RDWR)) < 0) { + _DEBUG_EXCEPTION("%s: open error, fd = %d\n", key_path[i], pollevents[i].fd); + + _FUNC_EXIT; + return (void *)i + 1; + } + pollevents[i].events = POLLIN | POLLERR; + } + + while (1) { + ret = poll(pollevents, num_arg, EVT_LOOP_DURATION); + if (ret < 0) + _DEBUG_EXCEPTION("poll error, ret = [%d]\n", ret); + + /* key event */ + for (i = 0; i < num_arg; i++) { + if (pollevents[i].revents & POLLIN) { + readcount = read(pollevents[i].fd, &event, sizeof(event)); + if (readcount != sizeof(event)) { + _DEBUG_EXCEPTION("key[%d] read error, readcount = [%d]\n", i, readcount); + continue; + } + _DEBUG_LOG("poll event:%d, fd:%d type=%d code=%d value=%d sys_power_cnt : %d, arg : %s", i, pollevents[i].fd, event.type, event.code, event.value, sys_power_cnt, key_path[i]); + + if (event.type == EV_KEY) + _DEBUG_LOG("keycode%d : 0x%x, value: %d\n", i, event.code, event.value); +#ifdef FEATURE_ROTATE + else if (event.type == EV_ABS) { + if (event.code == ABS_X) { + _DEBUG_LOG("LPM_MOTION event.code %d, event.value : %d ", event.code, event.value); + if (event.value == 1 || event.value == 3) { + fbi.degree = event.value; + + int battery_state = is_batt_status(); + if (battery_state == BATT_STATE_CHARGING || battery_state == BATT_STATE_FULL) + fb_draw_img_rotate_update(&fbi); + } + } + } else { + _DEBUG_LOG("etc event.code %d, event.value : %d ", event.code, event.value); + } +#endif + } + } + } + + _FUNC_EXIT; + return (void *)0; +} + +int rw_update_process(void) +{ + _FUNC_ENTER; + + int delay = 50000; + //int progress = 0; + + //initialize progress + vconf_set_int("db/SyncML/oma-dm-service/rw-updater-progress", 0); + + while (1) { + usleep(delay); + fb_draw_screen(&fbi); + sleep(1); + } + + _DEBUG_LOG("%s process killed!!", __func__); + + _FUNC_EXIT; + return 0; +} + +static int wait_ani_main_solis(void) +{ + _FUNC_ENTER; + + int ret = 0; + int status = 0; + int event_cnt = 0; + + event_cnt = read_event_node(); + if (event_cnt < 0) + _DEBUG_EXCEPTION("read_event_node failed, event_cnt = [%d]", event_cnt); + +#ifdef FEATURE_ROTATE + /* get degree */ + ret = read_degree(&fbi); + if (ret < 0) + _DEBUG_EXCEPTION("read_degree failed, ret = [%d]", ret); +#endif + /* open display interface */ + if (fb_open(&fbi) < 0) { + _DEBUG_EXCEPTION("fb_open failed"); + goto main_err_exit; + } + + /* cairo initialize */ +#ifdef CAIRO_LIB + cairo_ui_init(fbi.w, fbi.h); +#endif + + _DEBUG_LOG("charging-animation main function called."); + + chg_common_lcd_on(&s_disp); + + ret = pthread_create(&keyevent_thread, NULL, event_monitor_process, (void*)&event_cnt); + if (ret < 0) { + _DEBUG_LOG("[main] event_monitor_process ret : %d", ret); + goto main_exit; + } + + /* image drawing main thread */ + rw_update_process(); + +main_exit: + _DEBUG_LOG("[main] main_exit \n"); + + fb_close(&fbi); + +#ifdef CAIRO_LIB + cairo_ui_exit(); + pthread_join(keyevent_thread, (void *)&status); + _DEBUG_LOG("[main] keyevent_thread err_exit %d\n", status); +#endif + +main_err_exit: + _DEBUG_EXCEPTION("[main] main_err_exit \n"); + exit(0); + + _FUNC_EXIT; + return 0; + +} + +int main(int argc, char *argv[]) +{ + _FUNC_ENTER; + + int opt = 0; + int index = 0; + + struct option options[] = { + {"wait", 0, 0, 0}, + {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"", 0, 0, 0}, + {0, 0, 0, 0} + }; + + if (setpriority(PRIO_PROCESS, getpid(), -11) < 0) + _DEBUG_EXCEPTION("failed to setpriority\n"); + + opt = getopt_long(argc, argv, "", options, &index); + if (opt == -1) { + _DEBUG_EXCEPTION("getopt_long failed\n"); + _FUNC_EXIT; + return 0; + } + + switch (index) { + case 0: { + update_lang(); + + int ret = wait_ani_main_solis(); + + _FUNC_EXIT; + return ret; + } + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + default: + break; + } + + _FUNC_EXIT; + return 0; +} + diff --git a/rw-update-ani/rw-update-ani_new.h b/rw-update-ani/rw-update-ani_new.h new file mode 100755 index 0000000..d88eb2e --- /dev/null +++ b/rw-update-ani/rw-update-ani_new.h @@ -0,0 +1,25 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RW_UPDATE_ANI_NEW_H__ +#define __RW_UPDATE_ANI_NEW_H__ + +int is_batt_status(void); + +#endif /* __RW_UPDATE_ANI_H__ */ + diff --git a/rw-update-ani/rw-update-log.h b/rw-update-ani/rw-update-log.h new file mode 100755 index 0000000..023d15a --- /dev/null +++ b/rw-update-ani/rw-update-log.h @@ -0,0 +1,105 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FOTA_LOG_H__ +#define __FOTA_LOG_H__ + +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "FOTA_GUI_RW" + +#define COLOR_RED "\033[0;31m" +#define COLOR_GREEN "\033[0;32m" +#define COLOR_BROWN "\033[0;33m" +#define COLOR_BLUE "\033[0;34m" +#define COLOR_PURPLE "\033[0;35m" +#define COLOR_CYAN "\033[0;36m" +#define COLOR_LIGHTBLUE "\033[0;37m" +#define COLOR_END "\033[0;m" + +#define _DEBUG_SECURE_LOG(fmt, args...) SECURE_SLOGD(fmt, ##args) +#define _DEBUG_SECURE_EXCEPTION(fmt, args...) SECURE_SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) + +#define _DEBUG_LOG(fmt, args...) SLOGI(fmt, ##args) +#define _DEBUG_INFO(fmt, args...) SLOGI(COLOR_GREEN fmt COLOR_END, ##args) +#define _DEBUG_WARNING(fmt, args...) SLOGW(COLOR_BLUE"* Warning * " fmt COLOR_END, ##args) +#define _DEBUG_CHECK(fmt, args...) SLOGI(COLOR_LIGHTBLUE fmt, ##args) +#define _DEBUG_EXCEPTION(fmt, args...) SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) +#define _FUNC_ENTER SLOGI(COLOR_GREEN"ENTER >>>>"COLOR_END) +#define _FUNC_EXIT SLOGI(COLOR_GREEN"EXIT <<<<"COLOR_END) + +/* + * DEBUGGING FEATURE + */ + +extern unsigned int __log_level__; +extern FILE *__log_out_file__; + +#define LOG_INFO (1<<8) +#define LOG_RWANI (1<<7) +#define LOG_FUNCS (1<<6) +#define LOG_GUI (1<<5) +#define LOG_DEBUG (1<<4) +#define LOG_FILE (1<<3) +#define LOG_FLASH (1<<2) + +#define LOG_PRFIX "FOTA_GUI" + +#define DEBUG_STDOUT +//#define DEBUG_FILE + +#ifdef DEBUG_STDOUT +#define LOGE(s, args...) printf(LOG_PRFIX "/ERROR(%s) " s, __func__, ##args) // Error log +#define LOGL(mask, s, args...) do { if ((mask) & __log_level__) \ + printf(LOG_PRFIX "/(%s): " s, __func__, ##args); } while (0) +#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) + +#elif defined(DEBUG_FILE) +#define LOGE(s, args...) fprintf(__log_out_file__, LOG_PRFIX "/ERROR(%s) " s, __func__, ##args) +#define LOGL(mask, s, args...) do { if ((mask) & __log_level__) \ + fprintf(__log_out_file__, LOG_PRFIX "/(%s): " s , __func__, ##args); } while (0) +#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) + +#elif defined(DEBUG_STDOUT_FILE) // debug printf +#define LOGE(s, args...) do {\ + printf(LOG_PRFIX "/ERROR(%s) " s, __func__, ##args);\ + fprintf(__log_out_file__, LOG_PRFIX "/ERROR(%s) " s, __func__, ##args);\ + } while (0) +#define LOGL(mask, s, args...) do { \ + if ((mask) & __log_level__) {\ + printf(LOG_PRFIX "/(%s): " s , __func__, ##args);\ + fprintf(__log_out_file__, LOG_PRFIX "/(%s): " s, __func__, ##args);\ + } \ + } while (0) +#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) + +#else +#define LOGE(s, args...) +#define LOGL(mask, s, args...) +#define LOG(s, args...) + +#endif + + +#endif /* __FOTA_LOG_H__ */ + diff --git a/rw-update-ani/rw-update_new_cairo.h b/rw-update-ani/rw-update_new_cairo.h new file mode 100755 index 0000000..a52592c --- /dev/null +++ b/rw-update-ani/rw-update_new_cairo.h @@ -0,0 +1,49 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RW_UPDATE_NEW_CAIRO_H__ +#define __RW_UPDATE_NEW_CAIRO_H__ + +#include + +typedef struct _CairoInfo { + cairo_t *Cr; + cairo_surface_t *Surface; + int id; + int width; + int height; + int currentitem; + int currentfocus; + int currentselected; +} CairoInfo; + +extern long check_existence(const char *file_path); +extern int cairo_ui_init(int width, int height); +extern void cairo_ui_exit(void); +extern void cairo_clear_window(void); +extern void cairo_backgound_image(void); +extern void cairo_mask_image(void); +extern void cairo_update_screen(unsigned int * buffer, unsigned int size); +extern void cairo_draw_main_img(void); +extern void cairo_draw_main_text_img(void); +extern void cairo_draw_progress_bar(unsigned int progress); +extern void cairo_draw_num_progress(int progress, int total); +extern void cairo_draw_text(void); +extern int cairo_get_text_status(void); + +#endif /* __RW_UPDATE_NEW_CAIRO_H__ */ diff --git a/rw-update-ani/rw-update_new_cairo_w_360_360.c b/rw-update-ani/rw-update_new_cairo_w_360_360.c new file mode 100755 index 0000000..112f08e --- /dev/null +++ b/rw-update-ani/rw-update_new_cairo_w_360_360.c @@ -0,0 +1,492 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#define _USE_MATH_DEFINES +#include + +#include "rw-update_new_common.h" +#include "rw-update_new_fb.h" +#include "rw-update_new_cairo.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include // dgettext + +CairoInfo cairoinfo; + +#define DEFAULT_FONT "SamsungOneUI" +#define TEXT_COLOR 1, 1, 1 /* #12b4ff */ +#define TEXT_FONT_SIZE_MAX 32 +#define TEXT_FONT_SIZE_MIN 16 + +#define RW_PROCESS_MSG dgettext("rw-updater", "WDS_FOTA_BODY_FINALISING_NUPDATE_ING_ABB") +//#define RW_PROCESS_MSG "Finalising\nupdate..." + + +#if !defined(RESDIR) +#define RESDIR "/usr/share/rw-updater/res" +#endif +#define IMG_BASE RESDIR "/images/" +#define MAIN_IMG_NAME "solis_fota_progress_000.png" +#define POPUP_IMG_NAME "wc_popup_line.png" +#define PROGRESS_IMG_PREFIX "solis_fota_progress_" +#define PROGRESS_BAR_IMG_PREFIX "solis_fota_progress_" +#define PROGRESS_NUM_PREFIX "wc_fota_downloading_" +#define SLASH_IMG_NAME "wc_fota_downloading_slash.png" + +#define RO_TEXT_IMG_FILE_PATH "/opt/usr/data/fota/FotaBgImage2.png" + +#define MAX_FILE_PATH 512 + +#define PROGRESS_IMG_CNT 101 +#define PROGRESS_NUM_CNT 10 + +#define TEXT_FONT_SIZE_MAX 32 +#define TEXT_FONT_SIZE_MIN 16 + +cairo_surface_t *img_surf_main = NULL; +cairo_surface_t *img_surf_popup = NULL; +cairo_surface_t *img_surf_main_txt = NULL; +cairo_surface_t *img_surf_prog[PROGRESS_IMG_CNT] = {NULL,}; +cairo_surface_t *img_surf_num[PROGRESS_NUM_CNT] = {NULL,}; +cairo_surface_t *img_surf_slash = NULL; + +int main_img_x = 0; +int main_img_y = 0; +int main_img_w = 0; +int main_img_h = 0; + +#define BG_COLOR 0.0, 0.0, 0.0 + +#define MAX_BUF_LEN 512 +char s_rw_process_msg1[MAX_BUF_LEN]; +char s_rw_process_msg2[MAX_BUF_LEN]; +int s_bnewline = 0; + +static double s_text_x1 = 0.0; +static double s_text_x2 = 0.0; +static double s_text_y1 = 0.0; +static double s_text_y2 = 0.0; + +static int s_font_sz = 0.0; + +int s_font_initialized = 0; + +/*----------------------------------------------------------------------------- + cairo_update_screen() + ----------------------------------------------------------------------------*/ +void cairo_update_screen(unsigned int *buffer, unsigned int size) +{ + _FUNC_ENTER; + + unsigned char *temp_buffer = NULL; + + /* get buffer pointer of cairo surface */ + temp_buffer = cairo_image_surface_get_data(cairoinfo.Surface); + if (temp_buffer == NULL) { + _DEBUG_EXCEPTION("cairo_update_screen temp_buffer NULL error!!"); + _FUNC_EXIT; + return; + } + + memcpy((void*)buffer, (void*)temp_buffer, size); + + _FUNC_EXIT; +} + +/*----------------------------------------------------------------------------- + cairo_clear_window() + ----------------------------------------------------------------------------*/ +void cairo_clear_window(void) +{ + _FUNC_ENTER; + + /* set default color */ + cairo_set_source_rgb(cairoinfo.Cr, BG_COLOR); + + /* fill buffer to default color */ + cairo_paint(cairoinfo.Cr); + + _FUNC_EXIT; +} + +long check_existence(const char *file_path) +{ + _FUNC_ENTER; + + if (file_path == NULL) { + _DEBUG_EXCEPTION("Inputted paramter is wrong"); + _FUNC_EXIT; + return 0; + } + _DEBUG_LOG("%s\n", file_path); + + struct stat statbuf; + char filename[MAX_FILE_PATH] = {0,}; + + if (strncpy(filename, file_path, strlen(file_path) + 1) == NULL) { + _DEBUG_EXCEPTION("strncpy error=%s\n", filename); + _FUNC_EXIT; + return 0; + } + if (stat(filename, &statbuf)) { + if (ENOENT == errno) { + _DEBUG_EXCEPTION("stat %s: %m\n", filename); + _FUNC_EXIT; + return 0; + } + } + _DEBUG_LOG("satbuf.st_size = %d\n", (int)statbuf.st_size); + + _FUNC_EXIT; + return statbuf.st_size; +} + +/*-----------------------------------------------------------------* + cairo_image_init() + ------------------------------------------------------------------*/ +static void cairo_image_init(void) +{ + _FUNC_ENTER; + + int i = 0; + char img_name[1024] = {0,}; + + snprintf(img_name, 1024, "%s%s", IMG_BASE, MAIN_IMG_NAME); + _DEBUG_LOG("img name = %s\n", img_name); + img_surf_main = cairo_image_surface_create_from_png(img_name); + + for (i = 0; i < PROGRESS_NUM_CNT; i++) { + snprintf(img_name, 1024, "%s%s%d.png", IMG_BASE, PROGRESS_NUM_PREFIX, i); + _DEBUG_LOG("img name = %s\n", img_name); + img_surf_num[i] = cairo_image_surface_create_from_png(img_name); + } + + snprintf(img_name, 1024, "%s%s", IMG_BASE, SLASH_IMG_NAME); + _DEBUG_LOG("img name = %s\n", img_name); + img_surf_slash = cairo_image_surface_create_from_png(img_name); + + if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) + img_surf_main_txt = cairo_image_surface_create_from_png(RO_TEXT_IMG_FILE_PATH); + + main_img_w = cairo_image_surface_get_width(img_surf_main); + main_img_h = cairo_image_surface_get_height(img_surf_main); + main_img_x = (cairoinfo.width - main_img_w)/2; + main_img_y = 0; + _DEBUG_LOG("main_img_w = %d, main_img_h = %d\n", main_img_w, main_img_h); + _DEBUG_LOG("main_img_x = %d, main_img_y = %d\n", main_img_x, main_img_y); + + _FUNC_EXIT; +} + +/*-----------------------------------------------------------------* + cairo_image_exit() + ------------------------------------------------------------------*/ +static void cairo_image_exit() +{ + _FUNC_ENTER; + + int i = 0; + + cairo_surface_destroy(img_surf_main); + for (i = 0; i < PROGRESS_NUM_CNT; i++) + cairo_surface_destroy(img_surf_num[i]); + cairo_surface_destroy(img_surf_slash); + + if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) + cairo_surface_destroy(img_surf_main_txt); + + _FUNC_EXIT; +} + +/*----------------------------------------------------------------------------- + cairo_backgound_image() + ----------------------------------------------------------------------------*/ +void cairo_backgound_image(void) +{ +} +/*-----------------------------------------------------------------* + cairo_draw_main_img() + ------------------------------------------------------------------*/ +void cairo_draw_main_img(void) +{ + _FUNC_ENTER; + + cairo_set_source_surface(cairoinfo.Cr, img_surf_main, main_img_x, main_img_y); + cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); + cairo_fill(cairoinfo.Cr); + + _FUNC_EXIT; +} + +void cairo_mask_image(void) +{ +#if 0 + cairo_set_source_surface(cairoinfo.Cr, img_surf_black_mask, main_img_x, main_img_y); + cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); + cairo_fill(cairoinfo.Cr); +#endif +} + +void cairo_draw_main_text_img(void) +{ + _FUNC_ENTER; + + if (img_surf_main_txt) { + cairo_set_source_surface(cairoinfo.Cr, img_surf_main_txt, main_img_x, main_img_y); + cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); + cairo_fill(cairoinfo.Cr); + } + + _FUNC_EXIT; +} + +void cairo_draw_progress_bar(unsigned int progress) +{ + _FUNC_ENTER; + + double xc = 180.0; + double yc = 180.0; + double radius = 180.0; + double angle1 = 270.0 * (M_PI/180.0); + double angle2 = 360.0 * (M_PI/180.0); + + if (progress > 100) + progress = 100; + + if (progress <= 25) + angle2 = (270 + progress * 36 / 10) * (M_PI/180.0); + else if (progress > 25 && progress <= 99) + angle2 = (-90 + progress * 36 / 10) * (M_PI/180.0); + else + angle1 = 0; + + cairo_set_line_width(cairoinfo.Cr, 17.0); + cairo_set_source_rgb(cairoinfo.Cr, 0.0, 0.7, 1.0); + cairo_arc(cairoinfo.Cr, xc, yc, radius, angle1, angle2); + cairo_stroke(cairoinfo.Cr); + + _FUNC_EXIT; +} + +void cairo_draw_num_progress(int progress, int total) +{ + _FUNC_ENTER; + + int img_x = 110; + int img_y = 240; + int num; + + cairo_set_source_rgb(cairoinfo.Cr, BG_COLOR); + cairo_rectangle(cairoinfo.Cr, img_x, img_y, 140, 40); + cairo_fill(cairoinfo.Cr); + + if (total < 10) + img_x += 80; + else if (total < 100) + img_x += 90; + else + img_x += 100; + + num = total; + while (num > 0) { + cairo_set_source_surface(cairoinfo.Cr, img_surf_num[num % 10], img_x, img_y); + cairo_paint(cairoinfo.Cr); + img_x -= 18; + num /= 10; + } + + cairo_set_source_surface(cairoinfo.Cr, img_surf_slash, img_x, img_y); + cairo_paint(cairoinfo.Cr); + img_x -= 17; + + num = progress; + while (num > 0) { + cairo_set_source_surface(cairoinfo.Cr, img_surf_num[num % 10], img_x, img_y); + cairo_paint(cairoinfo.Cr); + img_x -= 18; + num /= 10; + } + + _FUNC_EXIT; +} + +void cairo_draw_text(void) +{ + _FUNC_ENTER; + + _DEBUG_LOG("s_font_initialized"); + + /* set text color */ + cairo_set_source_rgb(cairoinfo.Cr, TEXT_COLOR); + + /* set text font */ + cairo_set_font_size(cairoinfo.Cr, (double)s_font_sz); + cairo_select_font_face(cairoinfo.Cr, DEFAULT_FONT, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + + /* set text position */ + cairo_move_to(cairoinfo.Cr, s_text_x1, s_text_y1); + + if (s_bnewline) + /* set text position */ + cairo_move_to(cairoinfo.Cr, s_text_x2, s_text_y2); + + _FUNC_EXIT; + return; +} + +static void *__thread_font_init(void *arg) +{ + _FUNC_ENTER; + + double text_x1; + double text_x2; + double text_y; + int font_sz = 0; + char* pos_newline; + + /* separate text based on new line */ + s_rw_process_msg1[MAX_BUF_LEN - 1] = 0x00; + s_rw_process_msg2[MAX_BUF_LEN - 1] = 0x00; + strncpy(s_rw_process_msg1, RW_PROCESS_MSG, MAX_BUF_LEN - 1); + strncpy(s_rw_process_msg2, RW_PROCESS_MSG, MAX_BUF_LEN - 1); + _DEBUG_LOG("[%s], [%s]\n", s_rw_process_msg1, s_rw_process_msg2); + + pos_newline = strchr(s_rw_process_msg1, '\n'); + if (pos_newline != NULL) { + strncpy(s_rw_process_msg2, pos_newline + 1, MAX_BUF_LEN - 1); + *pos_newline = 0x00; + s_bnewline = 1; + } + + /* set text font */ + cairo_select_font_face(cairoinfo.Cr, DEFAULT_FONT, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + + /* calculate proper font size */ + for (font_sz = TEXT_FONT_SIZE_MAX; font_sz >= TEXT_FONT_SIZE_MIN; font_sz -= 2) { + /* set font size */ + cairo_set_font_size(cairoinfo.Cr, (double)font_sz); + } + + if (font_sz < TEXT_FONT_SIZE_MIN) + font_sz = TEXT_FONT_SIZE_MIN; + + /* set text position */ + text_x1 = (double)cairoinfo.width / 2; + text_x2 = (double)cairoinfo.width / 2; + + if (s_bnewline) + text_y = 180 - font_sz; + else + text_y = 180; + + /* keep for later use */ + s_text_x1 = text_x1; + s_text_y1 = text_y; + s_text_x2 = text_x2; + s_text_y2 = text_y + ((double)(font_sz)) * 1.2; + s_font_sz = font_sz; + + s_font_initialized = 1; + + _FUNC_EXIT; + return NULL; +} + +/*----------------------------------------------------------------------------- + cairo_ui_init() + ----------------------------------------------------------------------------*/ +int cairo_ui_init(int width, int height) +{ + _FUNC_ENTER; + + _DEBUG_LOG("cairo_image_init w :%d , h :%d", width, height); + + cairo_status_t status; + + /* get LCD resolution from fbinfo */ + cairoinfo.width = width; + cairoinfo.height = height; + + /* create cairo image surface(image surface means memory buffer) */ + cairoinfo.Surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, cairoinfo.width, cairoinfo.height); + status = cairo_surface_status(cairoinfo.Surface); + if (status != CAIRO_STATUS_SUCCESS) { + _DEBUG_EXCEPTION("cairo_image_init surface not create!!"); + _FUNC_EXIT; + return -1; + } + + /* create cairo context */ + cairoinfo.Cr = cairo_create(cairoinfo.Surface); + status = cairo_status(cairoinfo.Cr); + if (status != CAIRO_STATUS_SUCCESS) { + _DEBUG_EXCEPTION("cairo_image_init cairo_create fail!!"); + _FUNC_EXIT; + return -1; + } + + cairo_image_init(); + + cairo_clear_window(); + + /* draw main text image */ + if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) { + cairo_draw_main_text_img(); + } else { + pthread_t th_id; + + int error = pthread_create(&th_id, NULL, __thread_font_init, NULL); + if (error != 0) { + _DEBUG_EXCEPTION("Thread creation failed errno [%d]\n", errno); + _FUNC_EXIT; + return -1; + } + } + + _FUNC_EXIT; + return 0; +} + +void cairo_ui_exit(void) +{ + _FUNC_ENTER; + + cairo_image_exit(); + cairo_destroy(cairoinfo.Cr); + + _FUNC_EXIT; +} + +int cairo_get_text_status(void) +{ + _FUNC_ENTER; + _FUNC_EXIT; + return s_font_initialized; +} diff --git a/rw-update-ani/rw-update_new_common.h b/rw-update-ani/rw-update_new_common.h new file mode 100755 index 0000000..77bf179 --- /dev/null +++ b/rw-update-ani/rw-update_new_common.h @@ -0,0 +1,74 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RW_UPDATE_NEW_COMMON_H__ +#define __RW_UPDATE_NEW_COMMON_H__ + +#include +#include +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "FOTA_GUI_RW" + +#define COLOR_RED "\033[0;31m" +#define COLOR_GREEN "\033[0;32m" +#define COLOR_BROWN "\033[0;33m" +#define COLOR_BLUE "\033[0;34m" +#define COLOR_PURPLE "\033[0;35m" +#define COLOR_CYAN "\033[0;36m" +#define COLOR_LIGHTBLUE "\033[0;37m" +#define COLOR_END "\033[0;m" + +#define _DEBUG_SECURE_LOG(fmt, args...) SECURE_SLOGD(fmt, ##args) +#define _DEBUG_SECURE_EXCEPTION(fmt, args...) SECURE_SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) + +#define _DEBUG_LOG(fmt, args...) SLOGI(fmt, ##args) +#define _DEBUG_INFO(fmt, args...) SLOGI(COLOR_GREEN fmt COLOR_END, ##args) +#define _DEBUG_WARNING(fmt, args...) SLOGW(COLOR_BLUE"* Warning * " fmt COLOR_END, ##args) +#define _DEBUG_CHECK(fmt, args...) SLOGI(COLOR_LIGHTBLUE fmt, ##args) +#define _DEBUG_EXCEPTION(fmt, args...) SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) +#define _FUNC_ENTER SLOGI(COLOR_GREEN"ENTER >>>>"COLOR_END) +#define _FUNC_EXIT SLOGI(COLOR_GREEN"EXIT <<<<"COLOR_END) + +#define FILE_IO_BUF_SIZE 128 + +#define TRUE 1 +#define FALSE 0 + +#define UNUSED(x) (void)(x) + +#ifdef FEATURE_ROTATE +enum { + BATT_STATE_CHARGING = 0, + BATT_STATE_FULL, + BATT_STATE_ERROR, + BATT_STATE_DISCONNECT, + BATT_STATE_LOWBATT, + BATT_STATE_OVERVOLTAGE, + BATT_STATE_OVERHEAT, + BATT_STATE_NOTCHARGE, + BATT_STATE_COLD +}; +#endif + +#endif /* __RW_UPDATE_NEW_COMMON_H__ */ diff --git a/rw-update-ani/rw-update_new_common_display.h b/rw-update-ani/rw-update_new_common_display.h new file mode 100755 index 0000000..d3073f3 --- /dev/null +++ b/rw-update-ani/rw-update_new_common_display.h @@ -0,0 +1,81 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RW_UPDATE_NEW_COMMON_DISPLAY_H__ +#define __RW_UPDATE_NEW_COMMON_DISPLAY_H__ + +#include +#include + +#include +#include +#include + +#define MAX_BUF 2 +#define RGB32_BPP 32 +#define RGB32_PITCH 4 + +typedef struct chg_common_disp { + tdm_display *disp; + tdm_output *output; + tdm_layer *layer; + tdm_pp *pp; + int tdm_fd; + int drm_fd; + + tbm_surface_h surf[MAX_BUF]; + tbm_surface_h pp_surf[MAX_BUF]; + tbm_bufmgr bufmgr; + unsigned int handle[MAX_BUF]; + unsigned int pp_handle[MAX_BUF]; + tbm_bo bo[MAX_BUF]; + tbm_bo_handle bo_handle[MAX_BUF]; + tbm_bo pp_bo[MAX_BUF]; + tbm_bo_handle pp_bo_handle[MAX_BUF]; + void *buffer[MAX_BUF]; + void *pp_buffer[MAX_BUF]; + int buffer_size; + int width; + int height; + int stride; + int current_buf_id; + int degree; +} common_disp; + +typedef enum { + FRONT_BUFFER = 0, + BACK_BUFFER +} BUFFER_TYPE; + +enum { + CHG_DEGREE_0 = 0, + CHG_DEGREE_90 = 1, + CHG_DEGREE_180 = 2, + CHG_DEGREE_270 = 3, +}; + +extern common_disp s_disp; + +int chg_common_display_init(common_disp *st_disp); +void chg_common_display_deinit(common_disp *st_disp); +void chg_common_display_update(common_disp *st_disp); +void chg_common_lcd_on(common_disp *st_disp); +void chg_common_lcd_suspend(common_disp *st_disp); +void chg_common_lcd_off(common_disp *st_disp); +void chg_common_display_rotate(common_disp *st_disp); +#endif /* __RW_UPDATE_NEW_COMMON_DISPLAY_H__ */ diff --git a/rw-update-ani/rw-update_new_fb.h b/rw-update-ani/rw-update_new_fb.h new file mode 100755 index 0000000..58ef866 --- /dev/null +++ b/rw-update-ani/rw-update_new_fb.h @@ -0,0 +1,48 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __CHG_FB_H__ +#define __CHG_FB_H__ + +typedef enum _CHG_SLEEP_TYPE { + CHG_SLEEP_TYPE_NORMAL, + CHG_SLEEP_TYPE_EFFECT, + CHG_SLEEP_TYPE_TEMP_ERROR +} CHG_SLEEP_TYPE; + +typedef struct _FbInfo { + unsigned char *buf[2]; + unsigned int current_fb_id; + int w; + int h; + int sz; + int degree; + CHG_SLEEP_TYPE sleep_type; + int full_flag; +} FbInfo; + +extern int fb_open(FbInfo *fbi); +extern void fb_close(FbInfo *fbi); +extern int fb_display(FbInfo *fbi); +extern void fb_clear_screen(FbInfo *fbi, unsigned int color); +extern void fb_fill_rect(FbInfo *fbi, int x1, int y1, int x2, int y2, + unsigned int color); +extern void fb_draw_screen(FbInfo *fbi); +#ifdef FEATURE_ROTATE +extern void fb_draw_img_rotate_update(FbInfo *fbi); +#endif +#endif /* __CHG_FB_H__ */ diff --git a/rw-update-ani/rw-update_new_fb_cairo.c b/rw-update-ani/rw-update_new_fb_cairo.c new file mode 100755 index 0000000..a140ac6 --- /dev/null +++ b/rw-update-ani/rw-update_new_fb_cairo.c @@ -0,0 +1,257 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "rw-update-ani_new.h" +#include "rw-update_new_common.h" +#include "rw-update_new_fb.h" +#include +#include +#include + +#ifdef CAIRO_LIB +#include "rw-update_new_cairo.h" +#endif +#include "rw-update_new_common_display.h" + +common_disp s_disp; + +/*----------------------------------------------------------------------------- + fb_open() + ----------------------------------------------------------------------------*/ +int fb_open(FbInfo *fbi) +{ + _FUNC_ENTER; + + memset(&s_disp, 0x00, sizeof(struct chg_common_disp)); + + if (chg_common_display_init(&s_disp)) { + _DEBUG_EXCEPTION("chg_common_display_init fail!!"); + _FUNC_EXIT; + return -1; + } + + fbi->buf[FRONT_BUFFER] = s_disp.buffer[FRONT_BUFFER]; + fbi->buf[BACK_BUFFER] = s_disp.buffer[BACK_BUFFER]; + fbi->current_fb_id = s_disp.current_buf_id; + fbi->w = s_disp.width; + fbi->h = s_disp.height; + fbi->sz = s_disp.buffer_size; + + _FUNC_EXIT; + return 0; +} + +/*----------------------------------------------------------------------------- + fb_close() + ----------------------------------------------------------------------------*/ +void fb_close(FbInfo *fbi) +{ + _FUNC_ENTER; + + chg_common_display_deinit(&s_disp); + + _FUNC_EXIT; +} + +/*------------------------------------------------------------------------------ + fb_display() +------------------------------------------------------------------------------*/ +int fb_display(FbInfo *fbi) +{ + s_disp.current_buf_id = fbi->current_fb_id; + + //_DEBUG_LOG("current_fb_id : %d", fbi->current_fb_id); +#ifdef FEATURE_ROTATE + s_disp.degree = fbi->degree; + + int battery_state = is_batt_status(); + + if ((fbi->degree != CHG_DEGREE_0) && + (battery_state == BATT_STATE_CHARGING || battery_state == BATT_STATE_FULL)) { + chg_common_display_rotate(&s_disp); + } else +#endif + { + chg_common_display_update(&s_disp); + } + + return 0; +} + +#ifdef FEATURE_ROTATE +/*------------------------------------------------------------------------------ + fb_rotate() +------------------------------------------------------------------------------*/ +int fb_rotate(FbInfo *fbi) +{ + s_disp.current_buf_id = fbi->current_fb_id; + _DEBUG_LOG("current_fb_id : %d", fbi->current_fb_id); + s_disp.degree = fbi->degree; + chg_common_display_rotate(&s_disp); + + return 0; +} + +/*----------------------------------------------------------------------------- + fb_draw_img_rotate_update() + ----------------------------------------------------------------------------*/ +void fb_draw_img_rotate_update(FbInfo *fbi) +{ + int ret = 0; + + ret = fb_rotate(fbi); + _DEBUG_LOG("ret : %d", ret); +} +#endif + +/*----------------------------------------------------------------------------- + fb_draw_img_forced_update() + ----------------------------------------------------------------------------*/ +void fb_draw_img_forced_update(FbInfo *fbi) +{ + int ret = 0; + ret = fb_display(fbi); + _DEBUG_LOG("current_fb_id : %d, ret : %d", fbi->current_fb_id, ret); +} +/*----------------------------------------------------------------------------- + fb_draw_img_check_lcd_on() + ----------------------------------------------------------------------------*/ +void fb_draw_img_check_lcd_on(FbInfo *fbi) +{ + _FUNC_ENTER; + + int ret = 0; + + fbi->current_fb_id = FRONT_BUFFER; + //_DEBUG_LOG("current_fb_id :%d", fbi->current_fb_id); + + ret = fb_display(fbi); + _DEBUG_LOG("%s - drawing... ret : %d", __func__, ret); + + _FUNC_EXIT; +} + +/*----------------------------------------------------------------------------- + fb_clear_screen() + ----------------------------------------------------------------------------*/ +void fb_clear_screen(FbInfo *fbi, unsigned int color) +{ + unsigned int *fb_buf_cur = NULL; + int loop_count = fbi->w * fbi->h; + + fb_buf_cur = (unsigned int *)fbi->buf[FRONT_BUFFER]; + + if (fb_buf_cur == NULL) { + _DEBUG_LOG("fb_buf_cur is null error..."); + return; + } + while (loop_count--) + *(fb_buf_cur++) = color; +} + +#ifdef CAIRO_LIB + +/*----------------------------------------------------------------------------- + fb_update_screen() + ----------------------------------------------------------------------------*/ +void fb_update_screen(FbInfo *fbi) +{ + _FUNC_ENTER; + + unsigned int *fb_buf_cur = NULL; + + fb_buf_cur = (unsigned int *)fbi->buf[FRONT_BUFFER]; + if (fb_buf_cur == NULL) { + _DEBUG_EXCEPTION("fb_buf_cur is null error..."); + _FUNC_EXIT; + return; + } + + cairo_update_screen(fb_buf_cur, fbi->sz); + + _FUNC_EXIT; +} + +static int progress_before = -1; +static int total = 0; + +void fb_draw_screen(FbInfo *fbi) +{ + _FUNC_ENTER; + + int acc; + int progress = 0; + static int b_text_drawn = 0; + FILE *fp; + + if (total <= 0 && access("/tmp/upgrade/total", R_OK) == 0) { + fp = fopen("/tmp/upgrade/total", "r"); + if (fp) { + if (fscanf(fp, "%d", &total) == EOF) + _DEBUG_LOG("Error occurs at reading total"); + if (total < 0) + total = 0; + if (total > 0xffffff) + total = 0xffffff; + fclose(fp); + } else + total = 0; + } + + if (access("/tmp/upgrade/progress", R_OK) == 0) { + fp = fopen("/tmp/upgrade/progress", "r"); + if (fp) { + if (fscanf(fp, "%d", &progress) == EOF) + _DEBUG_LOG("Error occurs at reading progress"); + if (progress < 0) + progress = 0; + if (progress > total) + progress = total; + fclose(fp); + } else + progress = 0; + } + + _DEBUG_LOG("progress: %d/%d", progress, total); + + if (total > 0 && progress > progress_before) { + for (acc = progress_before + 1; acc <= progress; acc++) { + /* draw image */ + cairo_draw_main_img(); + + cairo_draw_progress_bar(100 * acc / total); + cairo_draw_num_progress(acc, total); + + if (cairo_get_text_status() == 1) { + if (b_text_drawn == 0) { + cairo_draw_text(); + b_text_drawn = 1; + } + } + + fb_update_screen(fbi); + fb_draw_img_check_lcd_on(fbi); + } + progress_before = progress; + } + + _FUNC_EXIT; +} +#endif diff --git a/rw-update-ani/rw-update_new_tdm_display.c b/rw-update-ani/rw-update_new_tdm_display.c new file mode 100755 index 0000000..ecf8ec5 --- /dev/null +++ b/rw-update-ani/rw-update_new_tdm_display.c @@ -0,0 +1,421 @@ +/* + * rw-update animator + * + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rw-update_new_common.h" +#include "rw-update_new_common_display.h" + +static void chg_common_display_commit_handler_cb(tdm_output *output, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, void *user_data) +{ + _DEBUG_LOG("commit_handle_cb!!\n"); + return; +} + +int chg_common_display_init(common_disp *st_disp) +{ + _FUNC_ENTER; + + int color = 0; + int buf_cnt; + int output_count = 0; + int i = 0; + + tdm_error err = TDM_ERROR_NONE; + tdm_output *output = NULL; + tdm_output_type output_type = TDM_OUTPUT_TYPE_Unknown; + tdm_output_conn_status conn_status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; + const tdm_output_mode *output_mode; + tdm_info_layer layer_info; + tbm_surface_info_s surf_info; + + st_disp->disp = tdm_display_init(&err); + if (!st_disp->disp) { + _DEBUG_EXCEPTION("failed to init tdm_display. error num = %d\n", err); + goto exit; + } + + err = tdm_display_get_fd(st_disp->disp, &st_disp->tdm_fd); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get tdm fd. error num = %d\n", err); + goto exit; + } + + st_disp->drm_fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD"); + if (st_disp->drm_fd == -1) { + _DEBUG_EXCEPTION("failed to get tdm fd. error num = %d\n", err); + goto exit; + } + + err = tdm_display_get_output_count(st_disp->disp, &output_count); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output count. error num = %d\n", err); + goto exit; + } + + for (i = 0; i < output_count; i++) { + output = tdm_display_get_output(st_disp->disp, i, &err); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get outout. error num = %d\n", err); + goto exit; + } + + err = tdm_output_get_output_type(output, &output_type); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output type. error num = %d\n", err); + goto exit; + } + + err = tdm_output_get_conn_status(output, &conn_status); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output connection status. error num = %d\n", err); + goto exit; + } + + _DEBUG_LOG("output_type=%d conn_status=%d\n", output_type, conn_status); + if ((output_type == TDM_OUTPUT_TYPE_LVDS || output_type == TDM_OUTPUT_TYPE_DSI) && + (conn_status == TDM_OUTPUT_CONN_STATUS_CONNECTED)) { + int cnt = 0; + err = tdm_output_get_available_modes(output, &output_mode, &cnt); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output available modes. error num = %d\n", err); + goto exit; + } + + /* GET MODE INFO */ + st_disp->output = output; + st_disp->width = output_mode->hdisplay; + st_disp->height = output_mode->vdisplay; + + unsigned int width_mm = 0; + unsigned int height_mm = 0; + + err = tdm_output_get_physical_size(output, &width_mm, &height_mm); + _DEBUG_LOG("err = [%d]", err); + _DEBUG_LOG("TDM_OUTPUT_MODE:name[%s] mode:wh[%d %d] mm[%d %d]", output_mode->name, st_disp->width, st_disp->height, width_mm, height_mm); + + break; + } + } + + /* MEMORY ALLOCATION */ + st_disp->bufmgr = tbm_bufmgr_init(st_disp->drm_fd); + if (!st_disp->bufmgr) { + _DEBUG_EXCEPTION("failed to tbm_bufmgr_init\n"); + goto exit; + } + + st_disp->buffer_size = st_disp->width * st_disp->height * RGB32_PITCH; + st_disp->stride = st_disp->width * RGB32_PITCH; + + surf_info.width = st_disp->width; + surf_info.height = st_disp->height; + surf_info.format = TBM_FORMAT_ARGB8888; + surf_info.bpp = 32; + surf_info.size = st_disp->buffer_size; + surf_info.num_planes = 1; + surf_info.planes[0].size = st_disp->buffer_size; + surf_info.planes[0].offset = 0; + surf_info.planes[0].stride = st_disp->stride; + + for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { + st_disp->bo[buf_cnt] = tbm_bo_alloc(st_disp->bufmgr, st_disp->buffer_size, TBM_BO_NONCACHABLE); + if (!st_disp->bo[buf_cnt]) { + _DEBUG_EXCEPTION("failed to tbm_bo_alloc\n"); + goto exit; + } + + st_disp->bo_handle[buf_cnt] = tbm_bo_map(st_disp->bo[buf_cnt], TBM_DEVICE_CPU, TBM_OPTION_WRITE); + st_disp->buffer[buf_cnt] = st_disp->bo_handle[buf_cnt].ptr; + st_disp->handle[buf_cnt] = tbm_bo_get_handle(st_disp->bo[buf_cnt], TBM_DEVICE_2D).u32; + + memset(st_disp->buffer[buf_cnt], color, st_disp->stride * st_disp->height); + + tbm_bo_unmap(st_disp->bo[buf_cnt]); + + st_disp->surf[buf_cnt] = tbm_surface_internal_create_with_bos(&surf_info, &st_disp->bo[buf_cnt], 1); + if (!st_disp->surf[buf_cnt]) { + _DEBUG_EXCEPTION("failed to create tbm_surface!!\n"); + goto exit; + } + } + +#ifdef FEATURE_ROTATE + for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { + st_disp->pp_bo[buf_cnt] = tbm_bo_alloc(st_disp->bufmgr, st_disp->buffer_size, TBM_BO_NONCACHABLE); + if (!st_disp->pp_bo[buf_cnt]) { + _DEBUG_EXCEPTION("failed to tbm_bo_alloc pp\n"); + goto exit; + } + + st_disp->pp_bo_handle[buf_cnt] = tbm_bo_map(st_disp->pp_bo[buf_cnt], TBM_DEVICE_CPU, TBM_OPTION_WRITE); + st_disp->pp_buffer[buf_cnt] = st_disp->pp_bo_handle[buf_cnt].ptr; + st_disp->pp_handle[buf_cnt] = tbm_bo_get_handle(st_disp->pp_bo[buf_cnt], TBM_DEVICE_2D).u32; + + memset(st_disp->pp_buffer[buf_cnt], 0x00, st_disp->stride * st_disp->height); + + tbm_bo_unmap(st_disp->pp_bo[buf_cnt]); + + st_disp->pp_surf[buf_cnt] = tbm_surface_internal_create_with_bos(&surf_info, &st_disp->pp_bo[buf_cnt], 1); + if (!st_disp->surf[buf_cnt]) { + _DEBUG_EXCEPTION("failed to create tbm_surface for pp!!\n"); + goto exit; + } + _DEBUG_LOG("pp:b[%d]hdl[%d]", buf_cnt, st_disp->pp_handle[buf_cnt]); + } +#endif + + /* SET LAYER */ + tdm_layer_capability layer_caps; + tdm_layer *tmp_layer = NULL; + + for (i = 0; i < output_count; i++) { + tmp_layer = tdm_output_get_layer(st_disp->output, output_count, &err); + tdm_layer_get_capabilities(tmp_layer, &layer_caps); + if (layer_caps & TDM_LAYER_CAPABILITY_PRIMARY) + break; + } + + if (!tmp_layer) { + _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); + goto exit; + } + + st_disp->layer = tmp_layer; + + layer_info.src_config.size.h = st_disp->width; + layer_info.src_config.size.v = st_disp->height; + layer_info.src_config.pos.x = 0; + layer_info.src_config.pos.y = 0; + layer_info.src_config.pos.w = st_disp->width; + layer_info.src_config.pos.h = st_disp->height; + layer_info.src_config.format = TBM_FORMAT_ARGB8888; + layer_info.dst_pos.x = 0; + layer_info.dst_pos.y = 0; + layer_info.dst_pos.w = st_disp->width; + layer_info.dst_pos.h = st_disp->height; + layer_info.transform = TDM_TRANSFORM_NORMAL; + + err = tdm_layer_set_info(st_disp->layer, &layer_info); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); + goto exit; + } + + /* SETUP PP */ +#ifdef FEATURE_ROTATE + st_disp->pp = tdm_display_create_pp(st_disp->disp, &err); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); + goto exit; + } +#endif + + st_disp->current_buf_id = 0; + _DEBUG_LOG("done"); + _FUNC_EXIT; + return 0; + +exit: + chg_common_display_deinit(st_disp); + _FUNC_EXIT; + return -1; +} + +void chg_common_display_deinit(common_disp *st_disp) +{ + _FUNC_ENTER; + + int buf_cnt = 0; + + if (st_disp->disp != NULL) { + /* RELEASE RESOURCE */ + for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { + if (st_disp->surf[buf_cnt] != NULL) + tbm_surface_destroy(st_disp->surf[buf_cnt]); + + if (st_disp->bo[buf_cnt] != NULL) + tbm_bo_unref(st_disp->bo[buf_cnt]); + +#ifdef FEATURE_ROTATE + if (st_disp->pp_surf[buf_cnt] != NULL) + tbm_surface_destroy(st_disp->pp_surf[buf_cnt]); + + if (st_disp->pp_bo[buf_cnt] != NULL) + tbm_bo_unref(st_disp->pp_bo[buf_cnt]); +#endif + } + + if (st_disp->bufmgr != NULL) + tbm_bufmgr_deinit(st_disp->bufmgr); + st_disp->bufmgr = NULL; + +#ifdef FEATURE_ROTATE + if (st_disp->pp) { + tdm_pp_destroy(st_disp->pp); + st_disp->pp = NULL; + } +#endif + + tdm_display_deinit(st_disp->disp); + st_disp->disp = NULL; + } + + _FUNC_EXIT; +} + +#ifdef FEATURE_ROTATE +void chg_common_display_rotate(common_disp *st_disp) +{ + int buf_cnt = 0; + int dst_degree = st_disp->degree; + + tdm_error err = TDM_ERROR_NONE; + tdm_info_pp pp_info; + + memset(&pp_info, 0x00, sizeof(tdm_info_pp)); + + pp_info.src_config.size.h = st_disp->width; + pp_info.src_config.size.v = st_disp->height; + pp_info.src_config.pos.x = 0; + pp_info.src_config.pos.y = 0; + pp_info.src_config.pos.w = st_disp->width; + pp_info.src_config.pos.h = st_disp->height; + pp_info.src_config.format = TBM_FORMAT_ARGB8888; + + pp_info.dst_config.size.h = st_disp->width; + pp_info.dst_config.size.v = st_disp->height; + pp_info.dst_config.pos.x = 0; + pp_info.dst_config.pos.y = 0; + pp_info.dst_config.pos.w = st_disp->width; + pp_info.dst_config.pos.h = st_disp->height; + pp_info.dst_config.format = TBM_FORMAT_ARGB8888; + + pp_info.sync = 1; + pp_info.flags = 0; + + switch (dst_degree) { + case CHG_DEGREE_0: + pp_info.transform = TDM_TRANSFORM_NORMAL; + break; + case CHG_DEGREE_90: + pp_info.transform = TDM_TRANSFORM_90; + break; + case CHG_DEGREE_180: + pp_info.transform = TDM_TRANSFORM_180; + break; + case CHG_DEGREE_270: + pp_info.transform = TDM_TRANSFORM_270; + break; + default: + pp_info.transform = TDM_TRANSFORM_NORMAL; + break; + } + + _DEBUG_LOG("dst_degree : %d", dst_degree); + + buf_cnt = st_disp->current_buf_id; + + err = tdm_pp_set_info(st_disp->pp, &pp_info); + if (err != TDM_ERROR_NONE) { + _DEBUG_LOG("failed to set pp info. error num = %d\n", err); + return; + } + + err = tdm_pp_attach(st_disp->pp, st_disp->surf[buf_cnt], st_disp->pp_surf[buf_cnt]); + if (err != TDM_ERROR_NONE) { + _DEBUG_LOG("failed to attach pp. error num = %d\n", err); + return; + } + + err = tdm_pp_commit(st_disp->pp); + if (err != TDM_ERROR_NONE) { + _DEBUG_LOG("failed to attach pp. error num = %d\n", err); + return; + } + + tdm_layer_set_buffer(st_disp->layer, st_disp->pp_surf[buf_cnt]); + + // TODO: sync or async?? + tdm_output_commit(st_disp->output, 1, chg_common_display_commit_handler_cb, st_disp); +} +#endif + + +void chg_common_display_update(common_disp *st_disp) +{ + /* DISPLAY UPDATE */ + int buf_cnt = 0; + + buf_cnt = st_disp->current_buf_id; + //st_disp->current_buf_id = (++st_disp->current_buf_id)%MAX_BUF; + + tdm_layer_set_buffer(st_disp->layer, st_disp->surf[buf_cnt]); + + // TODO: sync or async?? + tdm_output_commit(st_disp->output, 1, chg_common_display_commit_handler_cb, st_disp); + + return; +} + +void chg_common_lcd_on(common_disp *st_disp) +{ + _FUNC_ENTER; + + /* SET DPMS ON */ + _DEBUG_LOG("DPMS ON!\n"); + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_ON); + + _FUNC_EXIT; + return; +} + +void chg_common_lcd_suspend(common_disp *st_disp) +{ + /* SET DPMS SUSPEND */ + _DEBUG_LOG("DPMS SUSPEND!\n"); + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_SUSPEND); + + return; +} + +void chg_common_lcd_off(common_disp *st_disp) +{ + /* SET DPMS OFF */ + _DEBUG_LOG("DPMS OFF!\n"); + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_OFF); + + return; +} diff --git a/upgrade/update.sh b/upgrade/update.sh index 2654524..b0c44fe 100755 --- a/upgrade/update.sh +++ b/upgrade/update.sh @@ -4,6 +4,7 @@ # PATH=/bin:/usr/bin:/sbin:/usr/sbin +TMP_DIR=/tmp/upgrade PATCH_DIR=/usr/share/upgrade/scripts RESULT_FILE=/opt/data/recovery/rw_result SDB_RULE=/opt/data/recovery/99-sdb-switch.rules @@ -11,14 +12,36 @@ VERSION_FILE=/opt/etc/version RW_MACRO=/usr/share/upgrade/rw-update-macro.inc RUN=/bin/sh +RW_GUI= +RW_ANI=/usr/bin/rw-update-ani + +# Check GUI availability +if [ -e ${RW_ANI} ]; then + RW_GUI=1 +fi + # Execute update scripts if [ ! -d ${PATCH_DIR} ] then echo "FAIL: Upgrade directory does not exist" > ${RESULT_FILE} else + if [ "${RW_GUI}" = "1" ]; then + progress=0 + total=`ls -l ${PATCH_DIR} | grep -c '^-'` + mkdir -p ${TMP_DIR} + echo ${total} > ${TMP_DIR}/total + export XDG_RUNTIME_DIR=/run + export TBM_DISPLAY_SERVER=1 + /usr/bin/rw-update-ani --wait & + fi + PATCHES=`/bin/ls ${PATCH_DIR}` for PATCH in ${PATCHES}; do + if [ "${RW_GUI}" = "1" ]; then + progress=$((progress+1)) + echo ${progress} > ${TMP_DIR}/progress + fi ${RUN} ${PATCH_DIR}/${PATCH} done -- 2.7.4