From 351fcf946f5146b92f66c8ec448dce9ab7052fc4 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Thu, 4 Jun 2020 15:19:37 +0900 Subject: [PATCH] First draft Change-Id: I71155833a464a4737b752230ed4a7ff40a00f71b --- 42-tota-gui.list | 124 +++++ CMakeLists.txt | 46 ++ LICENSE.APLv2 | 206 ++++++++ NOTICE | 3 + firmware-update-system-ui.manifest | 9 + fota_gui/CMakeLists.txt | 58 +++ fota_gui/fota_fbinfo.h | 33 ++ fota_gui/fota_gr.c | 73 +++ fota_gui/fota_gr.h | 29 ++ fota_gui/fota_gr_direct.h | 29 ++ fota_gui/fota_gr_direct_tw.c | 464 +++++++++++++++++ fota_gui/fota_gui_common.h | 43 ++ fota_gui/fota_gui_log.h | 74 +++ fota_gui/fota_gui_main.c | 273 ++++++++++ fota_gui/fota_gui_util.c | 81 +++ fota_gui/fota_gui_util.h | 26 + fota_gui/fota_log.h | 78 +++ fota_gui/fota_png.c | 455 ++++++++++++++++ fota_gui/fota_png.h | 31 ++ fota_gui/tdm-if.c | 318 ++++++++++++ fota_gui/tdm-if.h | 74 +++ packaging/firmware-update-system-ui.spec | 51 ++ 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 res/wearable/images/tw_fota_downloading_0.png | Bin 0 -> 1221 bytes res/wearable/images/tw_fota_downloading_1.png | Bin 0 -> 1095 bytes res/wearable/images/tw_fota_downloading_2.png | Bin 0 -> 1225 bytes res/wearable/images/tw_fota_downloading_3.png | Bin 0 -> 1274 bytes res/wearable/images/tw_fota_downloading_4.png | Bin 0 -> 1175 bytes res/wearable/images/tw_fota_downloading_5.png | Bin 0 -> 1217 bytes res/wearable/images/tw_fota_downloading_6.png | Bin 0 -> 1279 bytes res/wearable/images/tw_fota_downloading_7.png | Bin 0 -> 1188 bytes res/wearable/images/tw_fota_downloading_8.png | Bin 0 -> 1273 bytes res/wearable/images/tw_fota_downloading_9.png | Bin 0 -> 1293 bytes .../images/tw_fota_downloading_percent.png | Bin 0 -> 1384 bytes res/wearable/images/tw_fota_progress_000.png | Bin 0 -> 18895 bytes res/wearable/images/tw_fota_progress_001.png | Bin 0 -> 899 bytes res/wearable/images/tw_fota_progress_002.png | Bin 0 -> 1020 bytes res/wearable/images/tw_fota_progress_003.png | Bin 0 -> 1085 bytes res/wearable/images/tw_fota_progress_004.png | Bin 0 -> 1136 bytes res/wearable/images/tw_fota_progress_005.png | Bin 0 -> 1153 bytes res/wearable/images/tw_fota_progress_006.png | Bin 0 -> 1175 bytes res/wearable/images/tw_fota_progress_007.png | Bin 0 -> 1172 bytes res/wearable/images/tw_fota_progress_008.png | Bin 0 -> 1208 bytes res/wearable/images/tw_fota_progress_009.png | Bin 0 -> 1222 bytes res/wearable/images/tw_fota_progress_010.png | Bin 0 -> 1232 bytes res/wearable/images/tw_fota_progress_011.png | Bin 0 -> 1233 bytes res/wearable/images/tw_fota_progress_012.png | Bin 0 -> 1229 bytes res/wearable/images/tw_fota_progress_013.png | Bin 0 -> 1217 bytes res/wearable/images/tw_fota_progress_014.png | Bin 0 -> 1251 bytes res/wearable/images/tw_fota_progress_015.png | Bin 0 -> 1252 bytes res/wearable/images/tw_fota_progress_016.png | Bin 0 -> 1231 bytes res/wearable/images/tw_fota_progress_017.png | Bin 0 -> 1232 bytes res/wearable/images/tw_fota_progress_018.png | Bin 0 -> 1238 bytes res/wearable/images/tw_fota_progress_019.png | Bin 0 -> 1202 bytes res/wearable/images/tw_fota_progress_020.png | Bin 0 -> 1160 bytes res/wearable/images/tw_fota_progress_021.png | Bin 0 -> 1143 bytes res/wearable/images/tw_fota_progress_022.png | Bin 0 -> 1090 bytes res/wearable/images/tw_fota_progress_023.png | Bin 0 -> 1019 bytes res/wearable/images/tw_fota_progress_024.png | Bin 0 -> 958 bytes res/wearable/images/tw_fota_progress_025.png | Bin 0 -> 880 bytes res/wearable/images/tw_fota_progress_026.png | Bin 0 -> 842 bytes res/wearable/images/tw_fota_progress_027.png | Bin 0 -> 978 bytes res/wearable/images/tw_fota_progress_028.png | Bin 0 -> 1048 bytes res/wearable/images/tw_fota_progress_029.png | Bin 0 -> 1103 bytes res/wearable/images/tw_fota_progress_030.png | Bin 0 -> 1157 bytes res/wearable/images/tw_fota_progress_031.png | Bin 0 -> 1177 bytes res/wearable/images/tw_fota_progress_032.png | Bin 0 -> 1184 bytes res/wearable/images/tw_fota_progress_033.png | Bin 0 -> 1201 bytes res/wearable/images/tw_fota_progress_034.png | Bin 0 -> 1213 bytes res/wearable/images/tw_fota_progress_035.png | Bin 0 -> 1230 bytes res/wearable/images/tw_fota_progress_036.png | Bin 0 -> 1256 bytes res/wearable/images/tw_fota_progress_037.png | Bin 0 -> 1238 bytes res/wearable/images/tw_fota_progress_038.png | Bin 0 -> 1205 bytes res/wearable/images/tw_fota_progress_039.png | Bin 0 -> 1236 bytes res/wearable/images/tw_fota_progress_040.png | Bin 0 -> 1213 bytes res/wearable/images/tw_fota_progress_041.png | Bin 0 -> 1219 bytes res/wearable/images/tw_fota_progress_042.png | Bin 0 -> 1220 bytes res/wearable/images/tw_fota_progress_043.png | Bin 0 -> 1189 bytes res/wearable/images/tw_fota_progress_044.png | Bin 0 -> 1186 bytes res/wearable/images/tw_fota_progress_045.png | Bin 0 -> 1154 bytes res/wearable/images/tw_fota_progress_046.png | Bin 0 -> 1138 bytes res/wearable/images/tw_fota_progress_047.png | Bin 0 -> 1127 bytes res/wearable/images/tw_fota_progress_048.png | Bin 0 -> 1070 bytes res/wearable/images/tw_fota_progress_049.png | Bin 0 -> 993 bytes res/wearable/images/tw_fota_progress_050.png | Bin 0 -> 887 bytes res/wearable/images/tw_fota_progress_051.png | Bin 0 -> 887 bytes res/wearable/images/tw_fota_progress_052.png | Bin 0 -> 1023 bytes res/wearable/images/tw_fota_progress_053.png | Bin 0 -> 1086 bytes res/wearable/images/tw_fota_progress_054.png | Bin 0 -> 1128 bytes res/wearable/images/tw_fota_progress_055.png | Bin 0 -> 1142 bytes res/wearable/images/tw_fota_progress_056.png | Bin 0 -> 1168 bytes res/wearable/images/tw_fota_progress_057.png | Bin 0 -> 1185 bytes res/wearable/images/tw_fota_progress_058.png | Bin 0 -> 1208 bytes res/wearable/images/tw_fota_progress_059.png | Bin 0 -> 1222 bytes res/wearable/images/tw_fota_progress_060.png | Bin 0 -> 1231 bytes res/wearable/images/tw_fota_progress_061.png | Bin 0 -> 1258 bytes res/wearable/images/tw_fota_progress_062.png | Bin 0 -> 1232 bytes res/wearable/images/tw_fota_progress_063.png | Bin 0 -> 1216 bytes res/wearable/images/tw_fota_progress_064.png | Bin 0 -> 1271 bytes res/wearable/images/tw_fota_progress_065.png | Bin 0 -> 1235 bytes res/wearable/images/tw_fota_progress_066.png | Bin 0 -> 1239 bytes res/wearable/images/tw_fota_progress_067.png | Bin 0 -> 1239 bytes res/wearable/images/tw_fota_progress_068.png | Bin 0 -> 1234 bytes res/wearable/images/tw_fota_progress_069.png | Bin 0 -> 1220 bytes res/wearable/images/tw_fota_progress_070.png | Bin 0 -> 1163 bytes res/wearable/images/tw_fota_progress_071.png | Bin 0 -> 1146 bytes res/wearable/images/tw_fota_progress_072.png | Bin 0 -> 1131 bytes res/wearable/images/tw_fota_progress_073.png | Bin 0 -> 1040 bytes res/wearable/images/tw_fota_progress_074.png | Bin 0 -> 985 bytes res/wearable/images/tw_fota_progress_075.png | Bin 0 -> 897 bytes res/wearable/images/tw_fota_progress_076.png | Bin 0 -> 896 bytes res/wearable/images/tw_fota_progress_077.png | Bin 0 -> 1005 bytes res/wearable/images/tw_fota_progress_078.png | Bin 0 -> 1075 bytes res/wearable/images/tw_fota_progress_079.png | Bin 0 -> 1130 bytes res/wearable/images/tw_fota_progress_080.png | Bin 0 -> 1162 bytes res/wearable/images/tw_fota_progress_081.png | Bin 0 -> 1169 bytes res/wearable/images/tw_fota_progress_082.png | Bin 0 -> 1201 bytes res/wearable/images/tw_fota_progress_083.png | Bin 0 -> 1196 bytes res/wearable/images/tw_fota_progress_084.png | Bin 0 -> 1216 bytes res/wearable/images/tw_fota_progress_085.png | Bin 0 -> 1232 bytes res/wearable/images/tw_fota_progress_086.png | Bin 0 -> 1227 bytes res/wearable/images/tw_fota_progress_087.png | Bin 0 -> 1238 bytes res/wearable/images/tw_fota_progress_088.png | Bin 0 -> 1189 bytes res/wearable/images/tw_fota_progress_089.png | Bin 0 -> 1239 bytes res/wearable/images/tw_fota_progress_090.png | Bin 0 -> 1233 bytes res/wearable/images/tw_fota_progress_091.png | Bin 0 -> 1198 bytes res/wearable/images/tw_fota_progress_092.png | Bin 0 -> 1192 bytes res/wearable/images/tw_fota_progress_093.png | Bin 0 -> 1191 bytes res/wearable/images/tw_fota_progress_094.png | Bin 0 -> 1205 bytes res/wearable/images/tw_fota_progress_095.png | Bin 0 -> 1160 bytes res/wearable/images/tw_fota_progress_096.png | Bin 0 -> 1139 bytes res/wearable/images/tw_fota_progress_097.png | Bin 0 -> 1134 bytes res/wearable/images/tw_fota_progress_098.png | Bin 0 -> 1057 bytes res/wearable/images/tw_fota_progress_099.png | Bin 0 -> 985 bytes res/wearable/images/tw_fota_progress_100.png | Bin 0 -> 859 bytes res/wearable/images/tw_fota_progress_bg.png | Bin 0 -> 18895 bytes .../images/tw_fota_progress_final.png | Bin 0 -> 17677 bytes res/wearable/images/tw_start_downloading.png | Bin 0 -> 17714 bytes rw-update-ani/CMakeLists.txt | 59 +++ rw-update-ani/rw-update-ani_new.c | 420 +++++++++++++++ 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 | 491 ++++++++++++++++++ rw-update-ani/rw-update_new_common.h | 74 +++ rw-update-ani/rw-update_new_common_display.h | 84 +++ rw-update-ani/rw-update_new_fb.h | 48 ++ rw-update-ani/rw-update_new_fb_cairo.c | 256 +++++++++ rw-update-ani/rw-update_new_tdm_display.c | 465 +++++++++++++++++ 160 files changed, 4654 insertions(+) create mode 100644 42-tota-gui.list create mode 100644 CMakeLists.txt create mode 100644 LICENSE.APLv2 create mode 100644 NOTICE create mode 100644 firmware-update-system-ui.manifest create mode 100644 fota_gui/CMakeLists.txt create mode 100644 fota_gui/fota_fbinfo.h create mode 100644 fota_gui/fota_gr.c create mode 100644 fota_gui/fota_gr.h create mode 100644 fota_gui/fota_gr_direct.h create mode 100644 fota_gui/fota_gr_direct_tw.c create mode 100644 fota_gui/fota_gui_common.h create mode 100644 fota_gui/fota_gui_log.h create mode 100644 fota_gui/fota_gui_main.c create mode 100644 fota_gui/fota_gui_util.c create mode 100644 fota_gui/fota_gui_util.h create mode 100644 fota_gui/fota_log.h create mode 100644 fota_gui/fota_png.c create mode 100644 fota_gui/fota_png.h create mode 100644 fota_gui/tdm-if.c create mode 100644 fota_gui/tdm-if.h create mode 100644 packaging/firmware-update-system-ui.spec create mode 100644 res/tw1/images/solis_fota_progress_000.png create mode 100644 res/tw1/images/wc_fota_downloading_0.png create mode 100644 res/tw1/images/wc_fota_downloading_1.png create mode 100644 res/tw1/images/wc_fota_downloading_2.png create mode 100644 res/tw1/images/wc_fota_downloading_3.png create mode 100644 res/tw1/images/wc_fota_downloading_4.png create mode 100644 res/tw1/images/wc_fota_downloading_5.png create mode 100644 res/tw1/images/wc_fota_downloading_6.png create mode 100644 res/tw1/images/wc_fota_downloading_7.png create mode 100644 res/tw1/images/wc_fota_downloading_8.png create mode 100644 res/tw1/images/wc_fota_downloading_9.png create mode 100644 res/tw1/images/wc_fota_downloading_slash.png create mode 100644 res/wearable/images/tw_fota_downloading_0.png create mode 100644 res/wearable/images/tw_fota_downloading_1.png create mode 100644 res/wearable/images/tw_fota_downloading_2.png create mode 100644 res/wearable/images/tw_fota_downloading_3.png create mode 100644 res/wearable/images/tw_fota_downloading_4.png create mode 100644 res/wearable/images/tw_fota_downloading_5.png create mode 100644 res/wearable/images/tw_fota_downloading_6.png create mode 100644 res/wearable/images/tw_fota_downloading_7.png create mode 100644 res/wearable/images/tw_fota_downloading_8.png create mode 100644 res/wearable/images/tw_fota_downloading_9.png create mode 100644 res/wearable/images/tw_fota_downloading_percent.png create mode 100644 res/wearable/images/tw_fota_progress_000.png create mode 100644 res/wearable/images/tw_fota_progress_001.png create mode 100644 res/wearable/images/tw_fota_progress_002.png create mode 100644 res/wearable/images/tw_fota_progress_003.png create mode 100644 res/wearable/images/tw_fota_progress_004.png create mode 100644 res/wearable/images/tw_fota_progress_005.png create mode 100644 res/wearable/images/tw_fota_progress_006.png create mode 100644 res/wearable/images/tw_fota_progress_007.png create mode 100644 res/wearable/images/tw_fota_progress_008.png create mode 100644 res/wearable/images/tw_fota_progress_009.png create mode 100644 res/wearable/images/tw_fota_progress_010.png create mode 100644 res/wearable/images/tw_fota_progress_011.png create mode 100644 res/wearable/images/tw_fota_progress_012.png create mode 100644 res/wearable/images/tw_fota_progress_013.png create mode 100644 res/wearable/images/tw_fota_progress_014.png create mode 100644 res/wearable/images/tw_fota_progress_015.png create mode 100644 res/wearable/images/tw_fota_progress_016.png create mode 100644 res/wearable/images/tw_fota_progress_017.png create mode 100644 res/wearable/images/tw_fota_progress_018.png create mode 100644 res/wearable/images/tw_fota_progress_019.png create mode 100644 res/wearable/images/tw_fota_progress_020.png create mode 100644 res/wearable/images/tw_fota_progress_021.png create mode 100644 res/wearable/images/tw_fota_progress_022.png create mode 100644 res/wearable/images/tw_fota_progress_023.png create mode 100644 res/wearable/images/tw_fota_progress_024.png create mode 100644 res/wearable/images/tw_fota_progress_025.png create mode 100644 res/wearable/images/tw_fota_progress_026.png create mode 100644 res/wearable/images/tw_fota_progress_027.png create mode 100644 res/wearable/images/tw_fota_progress_028.png create mode 100644 res/wearable/images/tw_fota_progress_029.png create mode 100644 res/wearable/images/tw_fota_progress_030.png create mode 100644 res/wearable/images/tw_fota_progress_031.png create mode 100644 res/wearable/images/tw_fota_progress_032.png create mode 100644 res/wearable/images/tw_fota_progress_033.png create mode 100644 res/wearable/images/tw_fota_progress_034.png create mode 100644 res/wearable/images/tw_fota_progress_035.png create mode 100644 res/wearable/images/tw_fota_progress_036.png create mode 100644 res/wearable/images/tw_fota_progress_037.png create mode 100644 res/wearable/images/tw_fota_progress_038.png create mode 100644 res/wearable/images/tw_fota_progress_039.png create mode 100644 res/wearable/images/tw_fota_progress_040.png create mode 100644 res/wearable/images/tw_fota_progress_041.png create mode 100644 res/wearable/images/tw_fota_progress_042.png create mode 100644 res/wearable/images/tw_fota_progress_043.png create mode 100644 res/wearable/images/tw_fota_progress_044.png create mode 100644 res/wearable/images/tw_fota_progress_045.png create mode 100644 res/wearable/images/tw_fota_progress_046.png create mode 100644 res/wearable/images/tw_fota_progress_047.png create mode 100644 res/wearable/images/tw_fota_progress_048.png create mode 100644 res/wearable/images/tw_fota_progress_049.png create mode 100644 res/wearable/images/tw_fota_progress_050.png create mode 100644 res/wearable/images/tw_fota_progress_051.png create mode 100644 res/wearable/images/tw_fota_progress_052.png create mode 100644 res/wearable/images/tw_fota_progress_053.png create mode 100644 res/wearable/images/tw_fota_progress_054.png create mode 100644 res/wearable/images/tw_fota_progress_055.png create mode 100644 res/wearable/images/tw_fota_progress_056.png create mode 100644 res/wearable/images/tw_fota_progress_057.png create mode 100644 res/wearable/images/tw_fota_progress_058.png create mode 100644 res/wearable/images/tw_fota_progress_059.png create mode 100644 res/wearable/images/tw_fota_progress_060.png create mode 100644 res/wearable/images/tw_fota_progress_061.png create mode 100644 res/wearable/images/tw_fota_progress_062.png create mode 100644 res/wearable/images/tw_fota_progress_063.png create mode 100644 res/wearable/images/tw_fota_progress_064.png create mode 100644 res/wearable/images/tw_fota_progress_065.png create mode 100644 res/wearable/images/tw_fota_progress_066.png create mode 100644 res/wearable/images/tw_fota_progress_067.png create mode 100644 res/wearable/images/tw_fota_progress_068.png create mode 100644 res/wearable/images/tw_fota_progress_069.png create mode 100644 res/wearable/images/tw_fota_progress_070.png create mode 100644 res/wearable/images/tw_fota_progress_071.png create mode 100644 res/wearable/images/tw_fota_progress_072.png create mode 100644 res/wearable/images/tw_fota_progress_073.png create mode 100644 res/wearable/images/tw_fota_progress_074.png create mode 100644 res/wearable/images/tw_fota_progress_075.png create mode 100644 res/wearable/images/tw_fota_progress_076.png create mode 100644 res/wearable/images/tw_fota_progress_077.png create mode 100644 res/wearable/images/tw_fota_progress_078.png create mode 100644 res/wearable/images/tw_fota_progress_079.png create mode 100644 res/wearable/images/tw_fota_progress_080.png create mode 100644 res/wearable/images/tw_fota_progress_081.png create mode 100644 res/wearable/images/tw_fota_progress_082.png create mode 100644 res/wearable/images/tw_fota_progress_083.png create mode 100644 res/wearable/images/tw_fota_progress_084.png create mode 100644 res/wearable/images/tw_fota_progress_085.png create mode 100644 res/wearable/images/tw_fota_progress_086.png create mode 100644 res/wearable/images/tw_fota_progress_087.png create mode 100644 res/wearable/images/tw_fota_progress_088.png create mode 100644 res/wearable/images/tw_fota_progress_089.png create mode 100644 res/wearable/images/tw_fota_progress_090.png create mode 100644 res/wearable/images/tw_fota_progress_091.png create mode 100644 res/wearable/images/tw_fota_progress_092.png create mode 100644 res/wearable/images/tw_fota_progress_093.png create mode 100644 res/wearable/images/tw_fota_progress_094.png create mode 100644 res/wearable/images/tw_fota_progress_095.png create mode 100644 res/wearable/images/tw_fota_progress_096.png create mode 100644 res/wearable/images/tw_fota_progress_097.png create mode 100644 res/wearable/images/tw_fota_progress_098.png create mode 100644 res/wearable/images/tw_fota_progress_099.png create mode 100644 res/wearable/images/tw_fota_progress_100.png create mode 100644 res/wearable/images/tw_fota_progress_bg.png create mode 100644 res/wearable/images/tw_fota_progress_final.png create mode 100644 res/wearable/images/tw_start_downloading.png create mode 100644 rw-update-ani/CMakeLists.txt create mode 100644 rw-update-ani/rw-update-ani_new.c create mode 100644 rw-update-ani/rw-update-ani_new.h create mode 100644 rw-update-ani/rw-update-log.h create mode 100644 rw-update-ani/rw-update_new_cairo.h create mode 100644 rw-update-ani/rw-update_new_cairo_w_360_360.c create mode 100644 rw-update-ani/rw-update_new_common.h create mode 100644 rw-update-ani/rw-update_new_common_display.h create mode 100644 rw-update-ani/rw-update_new_fb.h create mode 100644 rw-update-ani/rw-update_new_fb_cairo.c create mode 100644 rw-update-ani/rw-update_new_tdm_display.c diff --git a/42-tota-gui.list b/42-tota-gui.list new file mode 100644 index 0000000..6e45816 --- /dev/null +++ b/42-tota-gui.list @@ -0,0 +1,124 @@ +# ---- Target contents ----------------------------------------------------- # +VERBATIMS=" +/usr/share/fota/res/images/tw_fota_downloading_0.png +/usr/share/fota/res/images/tw_fota_downloading_1.png +/usr/share/fota/res/images/tw_fota_downloading_2.png +/usr/share/fota/res/images/tw_fota_downloading_3.png +/usr/share/fota/res/images/tw_fota_downloading_4.png +/usr/share/fota/res/images/tw_fota_downloading_5.png +/usr/share/fota/res/images/tw_fota_downloading_6.png +/usr/share/fota/res/images/tw_fota_downloading_7.png +/usr/share/fota/res/images/tw_fota_downloading_8.png +/usr/share/fota/res/images/tw_fota_downloading_9.png +/usr/share/fota/res/images/tw_fota_downloading_percent.png +/usr/share/fota/res/images/tw_fota_progress_000.png +/usr/share/fota/res/images/tw_fota_progress_001.png +/usr/share/fota/res/images/tw_fota_progress_002.png +/usr/share/fota/res/images/tw_fota_progress_003.png +/usr/share/fota/res/images/tw_fota_progress_004.png +/usr/share/fota/res/images/tw_fota_progress_005.png +/usr/share/fota/res/images/tw_fota_progress_006.png +/usr/share/fota/res/images/tw_fota_progress_007.png +/usr/share/fota/res/images/tw_fota_progress_008.png +/usr/share/fota/res/images/tw_fota_progress_009.png +/usr/share/fota/res/images/tw_fota_progress_010.png +/usr/share/fota/res/images/tw_fota_progress_011.png +/usr/share/fota/res/images/tw_fota_progress_012.png +/usr/share/fota/res/images/tw_fota_progress_013.png +/usr/share/fota/res/images/tw_fota_progress_014.png +/usr/share/fota/res/images/tw_fota_progress_015.png +/usr/share/fota/res/images/tw_fota_progress_016.png +/usr/share/fota/res/images/tw_fota_progress_017.png +/usr/share/fota/res/images/tw_fota_progress_018.png +/usr/share/fota/res/images/tw_fota_progress_019.png +/usr/share/fota/res/images/tw_fota_progress_020.png +/usr/share/fota/res/images/tw_fota_progress_021.png +/usr/share/fota/res/images/tw_fota_progress_022.png +/usr/share/fota/res/images/tw_fota_progress_023.png +/usr/share/fota/res/images/tw_fota_progress_024.png +/usr/share/fota/res/images/tw_fota_progress_025.png +/usr/share/fota/res/images/tw_fota_progress_026.png +/usr/share/fota/res/images/tw_fota_progress_027.png +/usr/share/fota/res/images/tw_fota_progress_028.png +/usr/share/fota/res/images/tw_fota_progress_029.png +/usr/share/fota/res/images/tw_fota_progress_030.png +/usr/share/fota/res/images/tw_fota_progress_031.png +/usr/share/fota/res/images/tw_fota_progress_032.png +/usr/share/fota/res/images/tw_fota_progress_033.png +/usr/share/fota/res/images/tw_fota_progress_034.png +/usr/share/fota/res/images/tw_fota_progress_035.png +/usr/share/fota/res/images/tw_fota_progress_036.png +/usr/share/fota/res/images/tw_fota_progress_037.png +/usr/share/fota/res/images/tw_fota_progress_038.png +/usr/share/fota/res/images/tw_fota_progress_039.png +/usr/share/fota/res/images/tw_fota_progress_040.png +/usr/share/fota/res/images/tw_fota_progress_041.png +/usr/share/fota/res/images/tw_fota_progress_042.png +/usr/share/fota/res/images/tw_fota_progress_043.png +/usr/share/fota/res/images/tw_fota_progress_044.png +/usr/share/fota/res/images/tw_fota_progress_045.png +/usr/share/fota/res/images/tw_fota_progress_046.png +/usr/share/fota/res/images/tw_fota_progress_047.png +/usr/share/fota/res/images/tw_fota_progress_048.png +/usr/share/fota/res/images/tw_fota_progress_049.png +/usr/share/fota/res/images/tw_fota_progress_050.png +/usr/share/fota/res/images/tw_fota_progress_051.png +/usr/share/fota/res/images/tw_fota_progress_052.png +/usr/share/fota/res/images/tw_fota_progress_053.png +/usr/share/fota/res/images/tw_fota_progress_054.png +/usr/share/fota/res/images/tw_fota_progress_055.png +/usr/share/fota/res/images/tw_fota_progress_056.png +/usr/share/fota/res/images/tw_fota_progress_057.png +/usr/share/fota/res/images/tw_fota_progress_058.png +/usr/share/fota/res/images/tw_fota_progress_059.png +/usr/share/fota/res/images/tw_fota_progress_060.png +/usr/share/fota/res/images/tw_fota_progress_061.png +/usr/share/fota/res/images/tw_fota_progress_062.png +/usr/share/fota/res/images/tw_fota_progress_063.png +/usr/share/fota/res/images/tw_fota_progress_064.png +/usr/share/fota/res/images/tw_fota_progress_065.png +/usr/share/fota/res/images/tw_fota_progress_066.png +/usr/share/fota/res/images/tw_fota_progress_067.png +/usr/share/fota/res/images/tw_fota_progress_068.png +/usr/share/fota/res/images/tw_fota_progress_069.png +/usr/share/fota/res/images/tw_fota_progress_070.png +/usr/share/fota/res/images/tw_fota_progress_071.png +/usr/share/fota/res/images/tw_fota_progress_072.png +/usr/share/fota/res/images/tw_fota_progress_073.png +/usr/share/fota/res/images/tw_fota_progress_074.png +/usr/share/fota/res/images/tw_fota_progress_075.png +/usr/share/fota/res/images/tw_fota_progress_076.png +/usr/share/fota/res/images/tw_fota_progress_077.png +/usr/share/fota/res/images/tw_fota_progress_078.png +/usr/share/fota/res/images/tw_fota_progress_079.png +/usr/share/fota/res/images/tw_fota_progress_080.png +/usr/share/fota/res/images/tw_fota_progress_081.png +/usr/share/fota/res/images/tw_fota_progress_082.png +/usr/share/fota/res/images/tw_fota_progress_083.png +/usr/share/fota/res/images/tw_fota_progress_084.png +/usr/share/fota/res/images/tw_fota_progress_085.png +/usr/share/fota/res/images/tw_fota_progress_086.png +/usr/share/fota/res/images/tw_fota_progress_087.png +/usr/share/fota/res/images/tw_fota_progress_088.png +/usr/share/fota/res/images/tw_fota_progress_089.png +/usr/share/fota/res/images/tw_fota_progress_090.png +/usr/share/fota/res/images/tw_fota_progress_091.png +/usr/share/fota/res/images/tw_fota_progress_092.png +/usr/share/fota/res/images/tw_fota_progress_093.png +/usr/share/fota/res/images/tw_fota_progress_094.png +/usr/share/fota/res/images/tw_fota_progress_095.png +/usr/share/fota/res/images/tw_fota_progress_096.png +/usr/share/fota/res/images/tw_fota_progress_097.png +/usr/share/fota/res/images/tw_fota_progress_098.png +/usr/share/fota/res/images/tw_fota_progress_099.png +/usr/share/fota/res/images/tw_fota_progress_100.png +/usr/share/fota/res/images/tw_fota_progress_bg.png +/usr/share/fota/res/images/tw_fota_progress_final.png +/usr/share/fota/res/images/tw_start_downloading.png +" + +WITHLIBS=" +/usr/bin/fota_gui +/usr/lib/tdm/libtdm-default.so +/usr/lib/bufmgr/libtbm_default.so +" diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..50cb25b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,46 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(tota-gui C) + +ADD_DEFINITIONS("-DFEATURE_SUPPORT_CAPABILITY") + +STRING(FIND ${CMAKE_C_FLAGS} "mfloat-abi=hard" IFFOUND1) +STRING(FIND ${CMAKE_C_FLAGS} "mhard-float" IFFOUND2) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/) + +SET(PACKAGE ${PROJECT_NAME}) +SET(PKGNAME "${PACKAGE}") +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(PKGDIR "${PREFIX}/share/fota") +SET(RESDIR "${PKGDIR}/res") + +IF("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") +MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -fPIE") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") + +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed -pie") + +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/wearable/images DESTINATION ${RESDIR}) +ADD_SUBDIRECTORY(fota_gui) +ADD_SUBDIRECTORY(rw-update-ani) + diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..18113b6 --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,206 @@ +Copyright (c) 2000 - 2020 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..5daedc6 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2000 - 2020 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under the Apache License, Version 2.0. +Please, see the LICENSE.APLv2 file for Apache License, Version 2 terms and conditions. diff --git a/firmware-update-system-ui.manifest b/firmware-update-system-ui.manifest new file mode 100644 index 0000000..1b29af6 --- /dev/null +++ b/firmware-update-system-ui.manifest @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fota_gui/CMakeLists.txt b/fota_gui/CMakeLists.txt new file mode 100644 index 0000000..c9f832b --- /dev/null +++ b/fota_gui/CMakeLists.txt @@ -0,0 +1,58 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +#set( CMAKE_VERBOSE_MAKEFILE on ) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(FOTA_GUI "fota_gui") + + +STRING(FIND ${CMAKE_C_FLAGS} "mfloat-abi=hard" IFFOUND1) +STRING(FIND ${CMAKE_C_FLAGS} "mhard-float" IFFOUND2) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +IF("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") +MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") + +INCLUDE(FindPkgConfig) +pkg_check_modules(gui_pkgs REQUIRED + libtbm + libtdm + libpng +) +SET(GUI_SRCS + fota_gui_main.c + fota_gr.c + fota_png.c + fota_gui_util.c + tdm-if.c +) + +FOREACH(flag ${gui_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +SET(GUI_SRCS ${GUI_SRCS} fota_gr_direct_tw.c) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed -pie") + +ADD_EXECUTABLE(${FOTA_GUI} ${GUI_SRCS}) +TARGET_LINK_LIBRARIES(${FOTA_GUI} ${gui_pkgs_LDFLAGS} ${LIBS} -lpthread) + +INSTALL(TARGETS ${FOTA_GUI} DESTINATION ${BINDIR}) +INSTALL(TARGETS ${FOTA_GUI_TEST} DESTINATION ${BINDIR}) diff --git a/fota_gui/fota_fbinfo.h b/fota_gui/fota_fbinfo.h new file mode 100644 index 0000000..6b60e7f --- /dev/null +++ b/fota_gui/fota_fbinfo.h @@ -0,0 +1,33 @@ +/* + * tota-ua + * + * 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_FBINFO_H__ +#define __FOTA_FBINFO_H__ + +typedef struct _FbInfo { + unsigned char *buf[2]; + unsigned int current_fb_id; + int w; + int h; + int sz; + int degree; + int full_flag; +} FbInfo; + +#endif /* __FOTA_FBINFO_H__ */ + diff --git a/fota_gui/fota_gr.c b/fota_gui/fota_gr.c new file mode 100644 index 0000000..8787e34 --- /dev/null +++ b/fota_gui/fota_gr.c @@ -0,0 +1,73 @@ +/* + * tota-ua + * + * 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 "fota_gr.h" +#if defined(USE_CAIRO) +#include "fota_gr_cairo.h" +#else +#include "fota_gr_direct.h" +#endif + +/*----------------------------------------------------------------------------- + fota_gr_init + ----------------------------------------------------------------------------*/ +int fota_gr_init(void) +{ +#if defined(USE_CAIRO) + return fota_gr_cairo_init(); +#else + return fota_gr_direct_init(); +#endif +} + +/*----------------------------------------------------------------------------- + fota_gr_deinit + ----------------------------------------------------------------------------*/ +void fota_gr_deinit(void) +{ +#if defined(USE_CAIRO) + fota_gr_cairo_deinit(); +#else + fota_gr_direct_deinit(); +#endif +} + +/*----------------------------------------------------------------------------- + fota_gr_clear_screen + ----------------------------------------------------------------------------*/ +void fota_gr_clear_screen(u32 color) +{ +#if defined(USE_CAIRO) + fota_gr_cairo_clear_screen(color); +#else + fota_gr_direct_clear_screen(color); +#endif +} + +/*----------------------------------------------------------------------------- + fota_gr_update_progress + ----------------------------------------------------------------------------*/ +void fota_gr_update_progress(int percent) +{ +#if defined(USE_CAIRO) + fota_gr_cairo_update_progress(percent); +#else + fota_gr_direct_update_progress(percent); +#endif +} + diff --git a/fota_gui/fota_gr.h b/fota_gui/fota_gr.h new file mode 100644 index 0000000..85cfc0a --- /dev/null +++ b/fota_gui/fota_gr.h @@ -0,0 +1,29 @@ +/* + * tota-ua + * + * 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_GR_H__ +#define __FOTA_GR_H__ + +extern int fota_gr_init(void); +extern void fota_gr_deinit(void); +extern void fota_gr_update_progress(int percent); +extern void fota_gr_clear_screen(unsigned int color); + +extern void fota_gr_direct_circular_progress(void); +#endif /* __FOTA_GR_H__ */ + diff --git a/fota_gui/fota_gr_direct.h b/fota_gui/fota_gr_direct.h new file mode 100644 index 0000000..e0e2cc0 --- /dev/null +++ b/fota_gui/fota_gr_direct.h @@ -0,0 +1,29 @@ +/* + * tota-ua + * + * 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_GR_DIRECT_H__ +#define __FOTA_GR_DIRECT_H__ + +#include "fota_gui_common.h" + +extern int fota_gr_direct_init(void); +extern void fota_gr_direct_deinit(void); +extern void fota_gr_direct_clear_screen(u32 color); +extern void fota_gr_direct_update_progress(int percent); + +#endif /* __FOTA_GR_DIRECT_H__ */ diff --git a/fota_gui/fota_gr_direct_tw.c b/fota_gui/fota_gr_direct_tw.c new file mode 100644 index 0000000..cb073cb --- /dev/null +++ b/fota_gui/fota_gr_direct_tw.c @@ -0,0 +1,464 @@ +/* + * tota-ua + * + * 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. + */ + +/***************************************************************************** +** header files +*****************************************************************************/ +#include +#include +#include + +#include "fota_gui_common.h" +#include "fota_png.h" +#include "fota_fbinfo.h" +#include "tdm-if.h" + +#define UNUSED(x) (void)(x) + +#define COLOR_BLACK 0x0000 + +#define MAX_PATH 256 +#define MAX_FILE_PATH 512 + +#if !defined(RESDIR) +#define RESDIR "/usr/share/fota/res" +#endif +#define IMG_BASE RESDIR "/images/" + +#define MAIN_IMG_NAME "tw_start_downloading.png" +#define MAIN_PG_IMG_NAME "tw_fota_progress_bg.png" +#define PROGRESS_BAR_IMG_PREFIX "tw_fota_progress_" +#define PROGRESS_NUM_PREFIX "tw_fota_downloading_" +#define PERCENT_IMG_NAME "tw_fota_downloading_percent.png" + +/***************************************************************************** +** global variables +*****************************************************************************/ +FbInfo s_fbi; +tdm_if_disp s_disp; + +int s_percent_to_draw = 0; +int s_saved_percent = -1; + +/*----------------------------------------------------------------------------- + fb_open() + ----------------------------------------------------------------------------*/ +int fb_open(FbInfo *fbi) +{ + memset(&s_disp, 0x00, sizeof(struct _tdm_if_disp)); + + if (tdm_if_display_init(&s_disp)) { + LOGE("tdm_if_display_init fail!!\n"); + 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; + + return 0; +} + +/*----------------------------------------------------------------------------- + fb_close() + ----------------------------------------------------------------------------*/ +void fb_close(FbInfo *fbi) +{ + UNUSED(fbi); + tdm_if_display_deinit(&s_disp); +} + +/*------------------------------------------------------------------------------ + fb_display() +------------------------------------------------------------------------------*/ +int fb_display(FbInfo *fbi) +{ + s_disp.current_buf_id = fbi->current_fb_id; + LOG("current_fb_id : %d\n", fbi->current_fb_id); + tdm_if_display_update(&s_disp); + + return 0; +} + +/*----------------------------------------------------------------------------- + fb_draw_img_forced_update() + ----------------------------------------------------------------------------*/ +void fb_draw_img_forced_update(FbInfo *fbi) +{ + int ret = 0; + ret = fb_display(fbi); + LOG("current_fb_id : %d, ret : %d\n", fbi->current_fb_id, ret); +} +/*----------------------------------------------------------------------------- + fb_draw_img_check_lcd_on() + ----------------------------------------------------------------------------*/ +void fb_draw_img_check_lcd_on(FbInfo *fbi) +{ + + int ret = 0; + + fbi->current_fb_id = FRONT_BUFFER; + + LOG("current_fb_id :%d\n", fbi->current_fb_id); + + ret = fb_display(fbi); + + LOG("%s - drawing... ret : %d\n", __func__, ret); +} + +/*----------------------------------------------------------------------------- + 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) { + LOG("fb_buf_cur is null error...\n"); + return; + } + while (loop_count--) + *(fb_buf_cur++) = color; + +} + +/*----------------------------------------------------------------------------- + _gr_direct_fill_rect + ----------------------------------------------------------------------------*/ +static void _gr_direct_fill_rect(FbInfo *fbi, s32 x, s32 y, s32 w, s32 h, u32 color) +{ + unsigned int *fb_buf_int = NULL; + unsigned int *fb_buf_cur = NULL; + s32 dx = 0; + s32 dy = 0; + s32 wb = 0; + + if (NULL == fbi) + return; + + dx = w; + dy = h; + wb = w * sizeof(u32); + + fb_buf_int = (unsigned int *)fbi->buf[FRONT_BUFFER]; + fb_buf_int += y * fbi->w + x; + fb_buf_cur = fb_buf_int; + + while (dx--) + *fb_buf_cur++ = color; + + fb_buf_cur -= w; + fb_buf_cur += fbi->w; + dy--; + while (dy--) { + memcpy((void*)fb_buf_cur, (void*)fb_buf_int, wb); + fb_buf_cur += fbi->w; + } + +} + +/*----------------------------------------------------------------------------- + _gr_direct_clear_screen + ----------------------------------------------------------------------------*/ +static void _gr_direct_clear_screen(FbInfo *fbi, u32 color) +{ + unsigned int *fb_buf_int = NULL; + unsigned int *fb_buf_cur = NULL; + s32 dx = 0; + s32 dy = 0; + s32 w = 0; + + if (NULL == fbi) + return; + + dx = fbi->w; + dy = fbi->h; + w = fbi->w * sizeof(u32); + + fb_buf_int = (unsigned int *)fbi->buf[FRONT_BUFFER]; + fb_buf_cur = fb_buf_int; + + while (dx--) + *fb_buf_cur++ = color; + + dy--; + while (dy--) { + memcpy((void*)fb_buf_cur, (void*)fb_buf_int, w); + fb_buf_cur += fbi->w; + } +} + +/*----------------------------------------------------------------------------- + _gr_direct_draw_text + ----------------------------------------------------------------------------*/ +static void _gr_direct_draw_text(FbInfo *fbi, int percent) +{ + char img_name[MAX_PATH]; + int img_x; + int img_y; + int num; + + img_x = 110; + img_y = 240; + + if (percent < 10) + img_x += 10; + else if (percent < 100) + img_x += 20; + else if (percent == 100) + img_x += 30; + + if (percent == 100) { + snprintf(img_name, MAX_PATH, "%s%s%d.png", IMG_BASE, PROGRESS_NUM_PREFIX, 1); + if (read_png_file(img_name) < 0) + return; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); + } + + img_x += 18; + if (percent >= 10) { + num = percent / 10; + if (num == 10) + num = 0; + + snprintf(img_name, MAX_PATH, "%s%s%d.png", IMG_BASE, PROGRESS_NUM_PREFIX, num); + if (read_png_file(img_name) < 0) + return; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); + } + + img_x += 18; + num = percent % 10; + + snprintf(img_name, MAX_PATH, "%s%s%d.png", IMG_BASE, PROGRESS_NUM_PREFIX, num); + if (read_png_file(img_name) < 0) + return; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); + + img_x += 17; + + snprintf(img_name, MAX_PATH, "%s%s", IMG_BASE, PERCENT_IMG_NAME); + if (read_png_file(img_name) < 0) + return; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); +} + +/*----------------------------------------------------------------------------- + _gr_direct_draw_prog_text + ----------------------------------------------------------------------------*/ +static void _gr_direct_draw_prog_text(FbInfo *fbi, int percent) +{ + if (percent <= 0) + percent = 0; + + if (percent > 100) + percent = 100; + + _gr_direct_fill_rect(fbi, 110, 240, 100, 41, COLOR_BLACK); + _gr_direct_draw_text(fbi, percent); +} + +static void _gr_direct_draw_main_prog_img(FbInfo *fbi, int percent) +{ + int img_x = 0; + int img_y = 0; + + if (read_png_file(IMG_BASE MAIN_PG_IMG_NAME) < 0) + return; + + img_x = 0; + img_y = 0; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); +} + +/*----------------------------------------------------------------------------- + _gr_direct_draw_main_img + ----------------------------------------------------------------------------*/ +static void _gr_direct_draw_main_img(FbInfo *fbi) +{ + int img_x = 0; + int img_y = 0; + + if (read_png_file(IMG_BASE MAIN_IMG_NAME) < 0) + return; + + img_x = 0; + img_y = 0; + + draw_png_img_xy(fbi, img_x, img_y); + release_png_res(); + +} + +/*----------------------------------------------------------------------------- + __init_screen + ----------------------------------------------------------------------------*/ +static void __init_screen(FbInfo *fbi) +{ + _gr_direct_clear_screen(fbi, COLOR_BLACK); + + //_gr_direct_draw_text_img(fbi); + + _gr_direct_draw_main_img(fbi); + + _gr_direct_draw_main_prog_img(fbi, 0); + + _gr_direct_draw_prog_text(fbi, 0); +} + +static void _gr_direct_final_circle_progress_bar(FbInfo *fbi, int progress) +{ + char img_name[MAX_PATH]; + + // draw current progress image + snprintf(img_name, MAX_PATH, "%s%sfinal.png", IMG_BASE, PROGRESS_BAR_IMG_PREFIX); + if (read_png_file(img_name) < 0) { + LOG("ERROR \n"); + return; + } + + draw_png_img_xy(fbi, 0, 0); + release_png_res(); +} + +static void _gr_direct_circle_progress_bar(FbInfo *fbi, int progress) +{ + char img_name[MAX_PATH]; + + static int prog_pre = 0; + int count = 0; + int prog_cnt = 0; + + if (progress <= 0) + return; + + if (progress > 100) + progress = 100; + + prog_cnt = progress; + + for (; prog_pre <= prog_cnt; prog_pre++) { + LOG("prog_pre/prog_cnt : %d, %d \n", prog_pre , prog_cnt); + + // draw current progress image + snprintf(img_name, MAX_PATH, "%s%s%03d.png", IMG_BASE, PROGRESS_BAR_IMG_PREFIX, prog_pre); + if (read_png_file(img_name) < 0) { + LOG("ERROR \n"); + return; + } + + draw_png_img_xy(fbi, 0, 0); + release_png_res(); + + s_saved_percent = prog_pre; + + count++; + + if (count > 3) + break; + } +} + +/*----------------------------------------------------------------------------- + _gr_direct_update_screen + ----------------------------------------------------------------------------*/ +static void _gr_direct_update_screen() +{ + s_disp.current_buf_id = s_fbi.current_fb_id; + + tdm_if_display_update(&s_disp); +} + +/*----------------------------------------------------------------------------- + fota_gr_direct_update_progress + ----------------------------------------------------------------------------*/ +void fota_gr_direct_circular_progress(void) +{ + if (s_saved_percent != s_percent_to_draw) { + + LOG("fota_gr_direct_circular_progress progress : %d \n", s_percent_to_draw); + + if (s_percent_to_draw == 100) { + _gr_direct_final_circle_progress_bar(&s_fbi, 100); + _gr_direct_draw_prog_text(&s_fbi, 100); + + } else if (s_percent_to_draw > 0) { + _gr_direct_circle_progress_bar(&s_fbi, s_percent_to_draw); + _gr_direct_draw_prog_text(&s_fbi, s_percent_to_draw); + } + } + _gr_direct_update_screen(); +} + +/*----------------------------------------------------------------------------- + fota_gr_direct_update_progress + ----------------------------------------------------------------------------*/ +void fota_gr_direct_update_progress(int percent) +{ + s_percent_to_draw = percent; +} + +/*----------------------------------------------------------------------------- + fota_gr_direct_clear_screen + ----------------------------------------------------------------------------*/ +void fota_gr_direct_clear_screen(u32 color) +{ + _gr_direct_clear_screen(&s_fbi, color); + _gr_direct_update_screen(); +} + +/*----------------------------------------------------------------------------- + fota_gr_direct_init + ----------------------------------------------------------------------------*/ +int fota_gr_direct_init(void) +{ + /* open display interface */ + if (fb_open(&s_fbi) < 0) + LOG("fb_open failed \n"); + + __init_screen(&s_fbi); + + tdm_if_lcd_on(&s_disp); + + return 0; +} + +/*----------------------------------------------------------------------------- + fota_gr_direct_deinit + ----------------------------------------------------------------------------*/ +void fota_gr_direct_deinit(void) +{ + fb_close(&s_fbi); +} + diff --git a/fota_gui/fota_gui_common.h b/fota_gui/fota_gui_common.h new file mode 100644 index 0000000..bf3330a --- /dev/null +++ b/fota_gui/fota_gui_common.h @@ -0,0 +1,43 @@ +/* + * tota-ua + * + * 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_GUI_COMMON_H__ +#define __FOTA_GUI_COMMON_H__ + + +#include +#include "fota_gui_log.h" + +typedef signed char s8; +typedef unsigned char u8; + +typedef signed short s16; +typedef unsigned short u16; + +typedef signed int s32; +typedef unsigned int u32; +typedef u32 size_t; + +typedef signed long sl32; +typedef unsigned long ul32; + +typedef signed long long s64; +typedef unsigned long long u64; + + +#endif /* __FOTA_GUI_COMMON_H__ */ diff --git a/fota_gui/fota_gui_log.h b/fota_gui/fota_gui_log.h new file mode 100644 index 0000000..5faa394 --- /dev/null +++ b/fota_gui/fota_gui_log.h @@ -0,0 +1,74 @@ +/* + * tota-ua + * + * 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_GUI_LOG_H__ +#define __FOTA_GUI_LOG_H__ + +#include + +extern unsigned int __log_level__; +extern FILE *__log_out_file__; + +#define LOG_INFO (1<<8) +#define LOG_SSENGINE (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_GUI_LOG_H__ */ + diff --git a/fota_gui/fota_gui_main.c b/fota_gui/fota_gui_main.c new file mode 100644 index 0000000..a4e8254 --- /dev/null +++ b/fota_gui/fota_gui_main.c @@ -0,0 +1,273 @@ +/* + * tota-ua + * + * 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 "fota_gui_common.h" +#include "fota_gui_util.h" +#include "fota_gr.h" + +#define SERV_PATH "/tmp/FotaGuiSocket" + + +unsigned int __log_level__ = + (LOG_DEBUG | LOG_FLASH | LOG_FILE | LOG_FUNCS | LOG_GUI | LOG_SSENGINE | LOG_INFO); +FILE *__log_out_file__; + +int s_prog_percent = 0; +int s_last_prog_percent = 0; + + +typedef struct { + char cmd_name[64]; + int argc; + char argv[3][64]; +} sock_cmd; + +typedef struct { + int ack; + char ack_desc[256]; +} sock_ack; + +#define CMD_SUCCESS 0 +#define CMD_ERROR -1 +#define MISSING_PARAM -2 + +int do_exit = 0; + +int s_pid = -1; + +int run_command(sock_cmd * recvbuff, sock_ack * sendbuff, int connfd) +{ + char cmd[100]; + int argc = 0, ret = -1; + int val = 0; + + memset(cmd, 0x00, sizeof(cmd)); + strncpy(cmd, recvbuff->cmd_name, sizeof(cmd)-1); + argc = recvbuff->argc; + + if (!strcmp(cmd, "draw_progress")) { + LOG("draw_progress selected\n"); + if (argc != 1) { + sendbuff->ack = MISSING_PARAM; + strncpy(sendbuff->ack_desc, "Missing parameter", + sizeof(sendbuff->ack_desc) - 1); + ret = send(connfd, sendbuff, sizeof(sock_ack), 0); + } else { + LOG("argv[0]: %s\n", recvbuff->argv[0]); + ret = CMD_SUCCESS; + sendbuff->ack = ret; + strncpy(sendbuff->ack_desc, "Command recieved", + sizeof(sendbuff->ack_desc) - 1); + ret = send(connfd, sendbuff, sizeof(sock_ack), 0); + + val = atoi(recvbuff->argv[0]); + if (val < 0) + val = 0; + else if (val > 100) + val = 100; + + s_prog_percent = val; + fota_gr_update_progress(s_prog_percent); + s_last_prog_percent = s_prog_percent; + } + } else if (!strcmp(cmd, "draw_end")) { + LOG("draw_end selected\n"); + if (argc != 0) { + sendbuff->ack = MISSING_PARAM; + strncpy(sendbuff->ack_desc, "Missing parameter", + sizeof(sendbuff->ack_desc) - 1); + ret = send(connfd, sendbuff, sizeof(sock_ack), 0); + } else { + LOG("argv[0]: %s\n", recvbuff->argv[0]); + ret = CMD_SUCCESS; + sendbuff->ack = ret; + strncpy(sendbuff->ack_desc, "Command recieved", + sizeof(sendbuff->ack_desc) - 1); + ret = send(connfd, sendbuff, sizeof(sock_ack), 0); + LOG("send() returned %d\n", ret); + return -1; + } + } else { + LOG("Command Not Found \n"); + sendbuff->ack = MISSING_PARAM; + strncpy(sendbuff->ack_desc, "Command Not found", + sizeof(sendbuff->ack_desc) - 1); + ret = send(connfd, sendbuff, sizeof(sock_ack), 0); + } + + LOG("run_command() ret = %d\n", ret); + return ret; +} + +static void *__thread_draw_progress_img(void *arg) +{ + int delay = 20000; + + if (setpriority(PRIO_PROCESS, getpid(), -11) < 0) + LOG("failed to setpriority\n"); + + if (fota_gr_init() < 0) { + LOG("fota_gr_init() failed.\n"); + _exit_stdio(); + return -1; + } + + while (do_exit != 1) { + usleep(delay); + fota_gr_direct_circular_progress(); + } + + fota_gr_deinit(); + + return NULL; +} + +int main(int argc, char **argv) +{ + int connfd = 0, sockfd = 0; + socklen_t slen, clen; + struct sockaddr_un saddr, caddr; + int cnt, done; + sock_cmd *recvbuff = NULL; + sock_ack *sendbuff = NULL; + +// _init_stdio(); + + fota_gr_update_progress(s_prog_percent); + s_last_prog_percent = s_prog_percent; + int error = 0; + pthread_t th_id = 0; + + error = pthread_create(&th_id, NULL, __thread_draw_progress_img, NULL); + if (error != 0) { + LOG("Thread creation failed errno [%d]\n", errno); + _exit_stdio(); + return -1; + } + + recvbuff = malloc(sizeof(sock_cmd)); + if (recvbuff == NULL) { + LOG("memory allocation failed:\n"); + _exit_stdio(); + return -1; + } + + sendbuff = malloc(sizeof(sock_ack)); + if (sendbuff == NULL) { + LOG("memory allocation failed:\n"); + _exit_stdio(); + return -1; + } + + sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sockfd <= 0) { + LOG("invalide sockfd\n"); + _exit_stdio(); + return -1; + } + + memset((char *)&saddr, 0, sizeof(saddr)); + saddr.sun_family = AF_UNIX; + strncpy(saddr.sun_path, SERV_PATH, + sizeof(saddr.sun_path) - 1); + slen = sizeof(saddr); + + unlink(SERV_PATH); + if (bind(sockfd, (const struct sockaddr *)&saddr, slen) < 0) { + LOG("bind fail\n"); + _exit_stdio(); + return -1; + } + + if (chmod(SERV_PATH, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) /* 0777 */ + LOG("failed to change the socket permission\n"); + + if (listen(sockfd, 5) < 0) { + LOG("listen fail\n"); + _exit_stdio(); + return -1; + } + + while (1) { + clen = sizeof(caddr); + connfd = accept(sockfd, (struct sockaddr *)&caddr, &clen); + if (connfd < 0) { + LOG("accept fail \n"); + _exit_stdio(); + return -1; + } + + LOG("Client Connected...\n"); + + done = 0; + do { + cnt = 0; + cnt = recv(connfd, recvbuff, sizeof(sock_cmd), 0); + if (cnt <= 0) { + if (cnt < 0) + perror("recv!"); + done = 1; + LOG("recv() <= 0\n"); + } + + if (!done) { + if (run_command(recvbuff, sendbuff, connfd) < 0) { + done = 1; + do_exit = 1; + LOG("run_command() < 0\n"); + } + } + } while (!done); + + close(connfd); + + if (do_exit) + break; + } + + close(sockfd); + + LOG("waiting for termination of thread((th_id) = %lu)\n", (th_id)); + if (pthread_join(th_id, NULL) != 0) { + LOG("pthread_join failed for thread [%lu] errno [%d]\n", + th_id, errno); + _exit_stdio(); + return -1; + } + + _exit_stdio(); + + return 0; +} diff --git a/fota_gui/fota_gui_util.c b/fota_gui/fota_gui_util.c new file mode 100644 index 0000000..6e762d2 --- /dev/null +++ b/fota_gui/fota_gui_util.c @@ -0,0 +1,81 @@ +/* + * tota-ua + * + * 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 "fota_gui_log.h" + +int s_fd_stdin = -1; +int s_fd_stdout = -1; +int s_fd_stderr = -1; + +/*----------------------------------------------------------------------------- + set_default_stdio + ----------------------------------------------------------------------------*/ +static int set_default_stdio(int flags, int nfd) +{ + int fd, r; + + fd = open("/dev/null", flags|O_NOCTTY); + if (fd < 0) + return -errno; + + if (fd == nfd) { + return fd; + } else { + r = dup2(fd, nfd) < 0 ? -errno : nfd; + close(fd); + return r; + } +} + +/*----------------------------------------------------------------------------- + _init_stdio + ----------------------------------------------------------------------------*/ +void _init_stdio(void) +{ + s_fd_stdin = set_default_stdio(O_RDONLY, STDIN_FILENO); + + s_fd_stdout = set_default_stdio(O_WRONLY, STDOUT_FILENO); + + s_fd_stderr = set_default_stdio(O_WRONLY, STDERR_FILENO); +} + +/*----------------------------------------------------------------------------- + _exit_stdio + ----------------------------------------------------------------------------*/ +void _exit_stdio(void) +{ + if (s_fd_stdin >= 0) + close(s_fd_stdin); + + if (s_fd_stdout >= 0) + close(s_fd_stdout); + + if (s_fd_stderr >= 0) + close(s_fd_stderr); +} + diff --git a/fota_gui/fota_gui_util.h b/fota_gui/fota_gui_util.h new file mode 100644 index 0000000..e4ec592 --- /dev/null +++ b/fota_gui/fota_gui_util.h @@ -0,0 +1,26 @@ +/* + * tota-ua + * + * 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_GUI_UTIL_H_ +#define _FOTA_GUI_UTIL_H_ + +extern void _init_stdio(void); +extern void _exit_stdio(void); + +#endif /* _FOTA_GUI_UTIL_H_ */ + diff --git a/fota_gui/fota_log.h b/fota_gui/fota_log.h new file mode 100644 index 0000000..c4b303f --- /dev/null +++ b/fota_gui/fota_log.h @@ -0,0 +1,78 @@ +/* + * tota-ua + * + * 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 + +/* + * DEBUGGING FEATURE + */ + +extern unsigned int __log_level__; +extern FILE *__log_out_file__; + +#define LOG_INFO (1<<8) +#define LOG_SSENGINE (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/fota_gui/fota_png.c b/fota_gui/fota_png.c new file mode 100644 index 0000000..f36bc50 --- /dev/null +++ b/fota_gui/fota_png.c @@ -0,0 +1,455 @@ +/* + * tota-ua + * + * 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 "fota_gui_common.h" +#include "fota_png.h" + +int png_img_width; +int png_img_height; +/* clear screen based on img size */ +//int png_img_width_batt_normal; +//int png_img_height_batt_normal; + +png_byte png_color_type; +png_byte png_bit_depth; + +png_structp png_ptr; +png_infop info_ptr; +int number_of_passes; +png_bytep *row_pointers; + +/*----------------------------------------------------------------------------- + read_png_file() + ----------------------------------------------------------------------------*/ +int read_png_file(char *file_name) +{ + char header[8]; /* 8 is the maximum size that can be checked */ + int y; + size_t rn; + + /* open file and test for it being a png */ + FILE *fp = fopen(file_name, "rb"); + if (!fp) { + LOG("[read_png_file] File %s could not be opened" + " for reading \n", file_name); + + LOG("Failed to open png file, path = [%s]\n", file_name); + return -1; + } + + rn = fread(header, 1, 8, fp); + if (rn != 8) + LOG("fread() read num mismatch\n"); + if (png_sig_cmp((png_bytep)header, 0, 8)) { + fclose(fp); + LOG("[read_png_file] File %s is not recognized" + " as a PNG file \n", file_name); + LOG("Failed to recognized PNG file\n"); + return -1; + } + + /* initialize stuff */ + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) { + fclose(fp); + LOG("[read_png_file] png_create_read_struct failed \n"); + + LOG("Failed png_create_read_struct()\n"); + return -1; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + png_destroy_read_struct(&png_ptr, NULL, NULL); + fclose(fp); + LOG("[read_png_file] png_create_info_struct failed \n"); + + LOG("Failed png_create_info_struct()\n"); + return -1; + } + + if (setjmp(png_jmpbuf(png_ptr))) { + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(fp); + LOG("[read_png_file] Error during init_io \n"); + + LOG("Failed png_destroy_read_struct()\n"); + return -1; + } + + int bit_depth, color_type; + png_uint_32 png_width; + png_uint_32 png_height; + + png_init_io(png_ptr, fp); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + + int ret = png_get_IHDR(png_ptr, info_ptr, &png_width, &png_height, &bit_depth, &color_type, NULL, NULL, NULL); + if (ret == 0) { + LOGE("Failed png_get_IHDR(), ret = [%d]\n", ret); + } else if (ret == 1) { + LOG("color_type = [%d]\n", color_type); + + if (color_type == PNG_COLOR_TYPE_RGB) + LOG("png color type is PNG_COLOR_TYPE_RGB, color_type = [%d]\n", color_type); + else if (color_type == PNG_COLOR_TYPE_RGBA) + LOG("png color type is PNG_COLOR_TYPE_RGBA, color_type = [%d]\n", color_type); + else if (color_type == PNG_COLOR_TYPE_PALETTE) + LOG("png color type is PNG_COLOR_TYPE_PALETTE, color_type = [%d]\n", color_type); + else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + LOG("png color type is PNG_COLOR_TYPE_RGB_ALPHA, color_type = [%d]\n", color_type); + else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + LOG("png color type is PNG_COLOR_TYPE_GRAY_ALPHA, color_type = [%d]\n", color_type); + else if (color_type == PNG_COLOR_TYPE_GA) + LOG("png color type is PNG_COLOR_TYPE_GA, color_type = [%d]\n", color_type); + else + LOG("Unknown color type = [%d]\n", color_type); + } + + png_img_width = png_width; + png_img_height = png_height; + png_color_type = color_type; + LOG("png_color_type = [%d]\n", png_color_type); + png_bit_depth = bit_depth; + + number_of_passes = png_set_interlace_handling(png_ptr); + png_read_update_info(png_ptr, info_ptr); + + /* read file */ + if (setjmp(png_jmpbuf(png_ptr))) { + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(fp); + LOG("[read_png_file] Error during read_image \n"); + + LOG("Failed png_destroy_read_struct()\n"); + return -1; + } + + png_size_t row_size = 0; + + row_pointers = (png_bytep *) malloc(sizeof(png_bytep)*png_img_height); + for (y = 0; y < png_img_height; y++) { + row_size = png_get_rowbytes(png_ptr, info_ptr); + row_pointers[y] = (png_byte *) malloc(row_size); + } + + png_read_image(png_ptr, row_pointers); + + fclose(fp); + + return 0; +} + +/*----------------------------------------------------------------------------- + draw_png_img_clip_xy() + - x1, y1 : cordinate on canvas (fb) + - cx, cy, cw, ch : image clip (rect on image) + ----------------------------------------------------------------------------*/ +void draw_png_img_clip_xy(FbInfo *fbi, int x1, int y1, int cx, int cy, int cw, int ch) +{ + unsigned int *fb_buf_cur = NULL; + int bpp; + int x, y; + /* temp patch - lcd resoultion for qualcomm */ + + fb_buf_cur = (unsigned int *)fbi->buf[0]; + + /* check out range */ + if ((x1 + cw > fbi->w) || + (y1 + ch > fbi->h)) { + LOG("[%s] output range exceeds frame buffer range \n", __func__); + return; + } + + if ((cw > png_img_width) || (ch > png_img_height)) { + LOG("[%s] clip range exceeds image range \n", __func__); + return; + } + + if (png_color_type == PNG_COLOR_TYPE_RGB) + bpp = 3; + else if (png_color_type == PNG_COLOR_TYPE_RGBA) + bpp = 4; + else { + LOG("[draw_png_img_xy] png type does not match RGB or RGBA \n"); + return; + } + /* temp patch - lcd resoultion for qualcomm */ + fb_buf_cur += (y1 * (fbi->w)); + fb_buf_cur += x1; + for (y = 0; y < ch; y++) { + png_byte *row = (png_byte *) row_pointers[cy + y]; + if (png_bit_depth == 8) + row += (bpp * cx); + else if (png_bit_depth == 16) + row += (bpp * 2 * cx); + for (x = 0; x < cw; x++) { + if (bpp == 3) { + if (png_bit_depth == 8) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (row[0] << 16) | (row[1] << 8) | (row[2]); + row += bpp; + } else if (png_bit_depth == 16) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (row[0] << 16) | (row[2] << 8) | (row[4]); + row += bpp*2; + } + } else if (bpp == 4) { + if (png_bit_depth == 8) { + if (row[3] != 0) { + char r1, g1, b1, a1; + char r2, g2, b2, a2; + char r3, g3, b3, a3; + // background pixel + b1 = ((*fb_buf_cur)&0x000000ff); + g1 = ((*fb_buf_cur)&0x0000ff00)>>8; + r1 = ((*fb_buf_cur)&0x00ff0000)>>16; + a1 = ((*fb_buf_cur)&0xff000000)>>24; + // new pixel + r2 = row[0]; + g2 = row[1]; + b2 = row[2]; + a2 = row[3]; + // blended pixel + r3 = (r2 * a2 + r1 * (0xff - a2)) >> 8 ; + g3 = (g2 * a2 + g1 * (0xff - a2)) >> 8; + b3 = (b2 * a2 + b1 * (0xff - a2)) >> 8; + a3 = a1; + (*fb_buf_cur) = (a3 << 24) | + (r3 << 16) | (g3 << 8) | (b3); + } + row += bpp; + } else if (png_bit_depth == 16) { + if (row[6] != 0) { + short r1, g1, b1, a1; + short r2, g2, b2, a2; + char r3, g3, b3, a3; + // background pixel + b1 = ((*fb_buf_cur)&0x000000ff)<<8; + g1 = ((*fb_buf_cur)&0x0000ff00); + r1 = ((*fb_buf_cur)&0x00ff0000)>>8; + a1 = ((*fb_buf_cur)&0xff000000)>>16; + // new pixel + r2 = (row[0]<<8) + row[1]; + g2 = (row[2]<<8) + row[3]; + b2 = (row[4]<<8) + row[5]; + a2 = (row[6]<<8) + row[7]; + // blended pixel + r3 = (r2 * a2 + r1 * (0xffff - a2)) >> 24; + g3 = (g2 * a2 + g1 * (0xffff - a2)) >> 24; + b3 = (b2 * a2 + b1 * (0xffff - a2)) >> 24; + a3 = a1 >> 8; + (*fb_buf_cur) = (a3 << 24) | + (r3 << 16) | (g3 << 8) | (b3); + } + row += bpp*2; + } + } + fb_buf_cur++; + } + fb_buf_cur -= cw; + fb_buf_cur += fbi->w;/* temp patch - lcd resoultion for qualcomm */ + } + +} + +/*----------------------------------------------------------------------------- + draw_png_img_xy() + ----------------------------------------------------------------------------*/ +void draw_png_img_xy(FbInfo *fbi, int x1, int y1) +{ + unsigned int *fb_buf_cur = NULL; + int bpp; + int x, y; + /* temp patch - lcd resoultion for qualcomm */ + + fb_buf_cur = (unsigned int *)fbi->buf[0]; + + /* check out range */ + if ((x1 + png_img_width > fbi->w) || + (y1 + png_img_height > fbi->h)) { + LOG("[draw_png_img_xy] output range exceeds frame buffer range \n"); + + LOG("[draw_png_img_xy] output range exceeds frame buffer range \n"); + return; + } + + LOG("png_color_type = [%d]", png_color_type); + if (png_color_type == PNG_COLOR_TYPE_RGB) { + bpp = 3; + LOG("png color type is PNG_COLOR_TYPE_RGB, png_color_type = [%d]\n", png_color_type); + } else if (png_color_type == PNG_COLOR_TYPE_RGBA) { + bpp = 4; + LOG("png color type is PNG_COLOR_TYPE_RGBA, png_color_type = [%d]\n", png_color_type); + } else { + LOG("[draw_png_img_xy] png type does not match RGB or RGBA \n"); + + LOG("[draw_png_img_xy] png type does not match RGB or RGBA, png_color_type = [%d] \n", png_color_type); + return; + } + + /* temp patch - lcd resoultion for qualcomm */ + fb_buf_cur += (y1 * (fbi->w)); + fb_buf_cur += x1; + for (y = 0; y < png_img_height; y++) { + png_byte *row = (png_byte *) row_pointers[y]; + for (x = 0; x < png_img_width; x++) { + if (bpp == 3) { + if (png_bit_depth == 8) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (row[0] << 16) | (row[1] << 8) | (row[2]); + row += bpp; + } else if (png_bit_depth == 16) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (row[0] << 16) | (row[2] << 8) | (row[4]); + row += bpp*2; + } + } else if (bpp == 4) { + if (png_bit_depth == 8) { + if (row[3] != 0) { + char r1, g1, b1, a1; + char r2, g2, b2, a2; + char r3, g3, b3, a3; + // background pixel + b1 = ((*fb_buf_cur)&0x000000ff); + g1 = ((*fb_buf_cur)&0x0000ff00)>>8; + r1 = ((*fb_buf_cur)&0x00ff0000)>>16; + a1 = ((*fb_buf_cur)&0xff000000)>>24; + // new pixel + r2 = row[0]; + g2 = row[1]; + b2 = row[2]; + a2 = row[3]; + // blended pixel + r3 = (r2 * a2 + r1 * (0xff - a2)) >> 8 ; + g3 = (g2 * a2 + g1 * (0xff - a2)) >> 8; + b3 = (b2 * a2 + b1 * (0xff - a2)) >> 8; + a3 = a1; + (*fb_buf_cur) = (a3 << 24) | + (r3 << 16) | (g3 << 8) | (b3); + } + row += bpp; + } else if (png_bit_depth == 16) { + if (row[6] != 0) { + short r1, g1, b1, a1; + short r2, g2, b2, a2; + char r3, g3, b3, a3; + // background pixel + b1 = ((*fb_buf_cur)&0x000000ff)<<8; + g1 = ((*fb_buf_cur)&0x0000ff00); + r1 = ((*fb_buf_cur)&0x00ff0000)>>8; + a1 = ((*fb_buf_cur)&0xff000000)>>16; + // new pixel + r2 = (row[0]<<8) + row[1]; + g2 = (row[2]<<8) + row[3]; + b2 = (row[4]<<8) + row[5]; + a2 = (row[6]<<8) + row[7]; + // blended pixel + r3 = (r2 * a2 + r1 * (0xffff - a2)) >> 24; + g3 = (g2 * a2 + g1 * (0xffff - a2)) >> 24; + b3 = (b2 * a2 + b1 * (0xffff - a2)) >> 24; + a3 = a1 >> 8; + (*fb_buf_cur) = (a3 << 24) | + (r3 << 16) | (g3 << 8) | (b3); + } + row += bpp*2; + } + } + fb_buf_cur++; + } + fb_buf_cur -= png_img_width; + fb_buf_cur += fbi->w;/* temp patch - lcd resoultion for qualcomm */ + } + +} + +/*----------------------------------------------------------------------------- + draw_png_mask_xy() + - draw pixel only when alpha>0 of given png image + ----------------------------------------------------------------------------*/ +void draw_png_mask_xy(FbInfo *fbi, int x1, int y1, char r, char g, char b) +{ + unsigned int *fb_buf_cur = NULL; + int bpp; + int x, y; + /* temp patch - lcd resoultion for qualcomm */ + + fb_buf_cur = (unsigned int *)fbi->buf[0]; + + /* check out range */ + if ((x1 + png_img_width > fbi->w) || + (y1 + png_img_height > fbi->h)) { + LOG("[draw_png_img_xy] output range exceeds frame buffer range \n"); + return; + } + + if (png_color_type == PNG_COLOR_TYPE_RGB) { + bpp = 3; + LOG("[draw_png_img_xy] PNG_COLOR_TYPE_RGB : no mask channel \n"); + return; + } else if (png_color_type == PNG_COLOR_TYPE_RGBA) + bpp = 4; + else { + LOG("[draw_png_img_xy] png type does not match RGB or RGBA \n"); + return; + } + /* temp patch - lcd resoultion for qualcomm */ + fb_buf_cur += (y1 * (fbi->w)); + fb_buf_cur += x1; + for (y = 0; y < png_img_height; y++) { + png_byte *row = (png_byte *) row_pointers[y]; + for (x = 0; x < png_img_width; x++) { + if (bpp == 4) { + if (png_bit_depth == 8) { + if (row[3] != 0) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (r << 16) | (g << 8) | (b); + } + row += bpp; + } else if (png_bit_depth == 16) { + if (row[6] != 0) { + (*fb_buf_cur) = ((*fb_buf_cur)&0xff000000) | + (r << 16) | (g << 8) | (b); + } + row += bpp*2; + } + } + fb_buf_cur++; + } + fb_buf_cur -= png_img_width; + fb_buf_cur += fbi->w;/* temp patch - lcd resoultion for qualcomm */ + } + +} + +/*----------------------------------------------------------------------------- + release_png_res() + ----------------------------------------------------------------------------*/ +void release_png_res(void) +{ + int y; + + for (y = 0; y < png_img_height; y++) + free((void *)row_pointers[y]); + free((void *)row_pointers); + + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); +} diff --git a/fota_gui/fota_png.h b/fota_gui/fota_png.h new file mode 100644 index 0000000..4d2a525 --- /dev/null +++ b/fota_gui/fota_png.h @@ -0,0 +1,31 @@ +/* + * tota-ua + * + * 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_PNG_H__ +#define __FOTA_PNG_H__ + +#include "fota_fbinfo.h" + +extern int read_png_file(char *file_name); +extern void draw_png_img_xy(FbInfo *fbi, int x1, int y1); +extern void draw_png_img_clip_xy(FbInfo *fbi, int x1, int y1, int cx, int cy, int cw, int ch); +extern void draw_png_mask_xy(FbInfo *fbi, int x1, int y1, char r, char g, char b); +extern void release_png_res(void); + + +#endif /* __FOTA_PNG_H__ */ diff --git a/fota_gui/tdm-if.c b/fota_gui/tdm-if.c new file mode 100644 index 0000000..c3a2ee3 --- /dev/null +++ b/fota_gui/tdm-if.c @@ -0,0 +1,318 @@ +/* + * tota-ua + * + * 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 "fota_gui_common.h" +#include "tdm-if.h" + +static void tdm_if_display_commit_handler_cb(tdm_output *output, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, void *user_data) +{ + LOG("commit_handle_cb!!\n"); + + return ; +} + +int tdm_if_display_init(tdm_if_disp *st_disp) +{ + int color = 0; + int buf_cnt; + + 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; + int output_count = 0; + + tdm_info_layer layer_info; + + tbm_surface_info_s surf_info; + + int i = 0; + + LOG("start\n"); + + st_disp->disp = tdm_display_init(&err); + if (!st_disp->disp) { + LOGE("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) { + LOGE("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) { + LOGE("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) { + LOGE("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) { + LOGE("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) { + LOGE("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) { + LOGE("failed to get output connection status. error num = %d\n", err); + goto exit; + } + + 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) { + LOGE("failed to get output available modes. error num = %d\n", err); + goto exit; + } + + err = tdm_output_set_mode(output, &output_mode[0]); + if (err != TDM_ERROR_NONE) { + LOGE("failed to set mode. 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); + LOG("TDM_OUTPUT_MODE:name[%s] mode:wh[%d %d] mm[%d %d]\n", + 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) { + LOGE("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]) { + LOGE("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]) { + LOGE("failed to create tbm_surface!!\n"); + goto exit; + } + } + + /* CHECK HWC USAGE */ + tdm_output_capability output_caps; + tdm_output_get_capabilities(st_disp->output, &output_caps); + if (output_caps & TDM_OUTPUT_CAPABILITY_HWC) + st_disp->use_tdm_hwc = true; + else + st_disp->use_tdm_hwc = false; + + /* SET LAYER */ + if (st_disp->use_tdm_hwc) { + st_disp->hwc = tdm_output_get_hwc(st_disp->output, &err); + if (!st_disp->hwc) { + LOGE("failed to get hwc. error num = %d\n", err); + goto exit; + } + } else { + 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) { + LOGE("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) { + LOGE("failed to get output layer. error num = %d\n", err); + goto exit; + } + } + + st_disp->current_buf_id = 0; + LOG("done\n"); + return 0; +exit: + tdm_if_display_deinit(st_disp); + return -1; +} + +void tdm_if_display_deinit(tdm_if_disp *st_disp) +{ + 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]); + } + + if (st_disp->bufmgr != NULL) + tbm_bufmgr_deinit(st_disp->bufmgr); + st_disp->bufmgr = NULL; + + tdm_display_deinit(st_disp->disp); + st_disp->disp = NULL; + } +} + +void tdm_if_display_update(tdm_if_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; + + if (st_disp->use_tdm_hwc) { + uint32_t num_types; + tdm_region damage; + memset(&damage, 0, sizeof(damage)); + + tdm_hwc_set_client_target_buffer(st_disp->hwc, st_disp->surf[buf_cnt], damage); + tdm_hwc_validate(st_disp->hwc, NULL, 0, &num_types); + tdm_hwc_accept_validation(st_disp->hwc); + tdm_hwc_commit(st_disp->hwc, 1, tdm_if_display_commit_handler_cb, st_disp); + } else { + tdm_layer_set_buffer(st_disp->layer, st_disp->surf[buf_cnt]); + + // TODO: sync or async?? + tdm_output_commit(st_disp->output, 1, tdm_if_display_commit_handler_cb, st_disp); + } + + return ; +} + +void tdm_if_lcd_on(tdm_if_disp *st_disp) +{ + /* SET DPMS ON */ + LOG("DPMS ON!\n"); + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_ON); + return ; +} + +void tdm_if_lcd_suspend(tdm_if_disp *st_disp) +{ + /* SET DPMS SUSPEND */ + LOG("DPMS SUSPEND!\n"); + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_SUSPEND); + + return ; +} + +void tdm_if_lcd_off(tdm_if_disp *st_disp) +{ + /* SET DPMS OFF */ + LOG("DPMS OFF!\n"); + + tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_OFF); + + return ; +} diff --git a/fota_gui/tdm-if.h b/fota_gui/tdm-if.h new file mode 100644 index 0000000..9bd8d3b --- /dev/null +++ b/fota_gui/tdm-if.h @@ -0,0 +1,74 @@ +/* + * tota-ua + * + * 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 __TDM_IF_H__ +#define __TDM_IF_H__ + +#include +#include +#include +#include +#include + +#define MAX_BUF 2 +#define RGB32_BPP 32 +#define RGB32_PITCH 4 + +typedef struct _tdm_if_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; + + bool use_tdm_hwc; + tdm_hwc *hwc; +} tdm_if_disp; + +typedef enum { + FRONT_BUFFER = 0, + BACK_BUFFER +} BUFFER_TYPE; + +extern tdm_if_disp s_disp; + +int tdm_if_display_init(tdm_if_disp *st_disp); +void tdm_if_display_deinit(tdm_if_disp *st_disp); +void tdm_if_display_update(tdm_if_disp *st_disp); +void tdm_if_lcd_on(tdm_if_disp *st_disp); +void tdm_if_lcd_suspend(tdm_if_disp *st_disp); +void tdm_if_lcd_off(tdm_if_disp *st_disp); +#endif /* __TDM_IF_H__ */ diff --git a/packaging/firmware-update-system-ui.spec b/packaging/firmware-update-system-ui.spec new file mode 100644 index 0000000..5ad8181 --- /dev/null +++ b/packaging/firmware-update-system-ui.spec @@ -0,0 +1,51 @@ +Name: firmware-update-system-ui +Summary: Firmware update system GUI application +ExclusiveArch: %{arm} +Version: 1.0.0 +Release: 0 +Group: System +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz + +BuildRequires: cmake +BuildRequires: pkgconfig(libtbm) +BuildRequires: pkgconfig(libtdm) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libtzplatform-config) + +BuildRequires: pkgconfig(cairo) + +%description +Firmware update system GUI application + +%prep +%setup -q + +%build +export LDFLAGS+="-Wl,--rpath=%{_prefix}/lib -Wl,--as-needed" +LDFLAGS="$LDFLAGS" + +%cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} + +make %{?jobs:-j%jobs} + +%install +%make_install +mkdir -p %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d +cp 42-tota-gui.list %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d/ + +%post + +%files +%license LICENSE +%manifest firmware-update-system-ui.manifest + +%defattr(-,root,root,-) +%attr(700,-,-) %{_datadir}/initrd-recovery/initrd.list.d/42-tota-gui.list +%{_datadir}/fota/res/images +%{_bindir}/fota_gui + +%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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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/res/wearable/images/tw_fota_downloading_0.png b/res/wearable/images/tw_fota_downloading_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1733c86d79ff3979582efa952cf9510883b685 GIT binary patch literal 1221 zcmbVMZD`zN9FNR8d+x?&WvC1c867)qE_w2HN$lC(CAaogub$WAdf*(FOP*^(FE2~d zUaqpW)E739I)=McRva6S#~zMh7#7cus3kOSM{nZZd(ii5^`eZXhk{%+7$OYF`PQY^OiOV zOHeb~hdzgc7`Dka%hjM-cv99KE2%{?$R;HHr# zCintfa1}UZj?8&*d~U3)&rR!+K@2^C4~8-#uwbC!q1Ci~IZP9)yfRux#}t9DiUiYX zV$G;(p@=Jv2XQ{hk~$3lE(l4$@qz#baE1m9MWZ2*fRlMaW>R?PA&@rDXvigXUq=_( zrHQE^aAk^WwOYv*n{>QM3P_R^aWD*tBuKw)2UA3Vq!(-N1BgJYv-9&PIb<+cl{67-!JPe=J^?COG1 z?Cz{65=7R>PkAOviq=#eea3=zkXO?Lx=9+QA+rJt0nkMfNSaP^OkE>2rY@4a2pb&3 zNSpwc( zDmhkRXh8%(WSC4gD=A7Q%d@7x|>?fH^ zo8$9dFZtP(`wsm5et7%p+t-^5yT2Pf-UrTRk8-n#rI!z%=D2Qhubnyi=#`y!SG3r3{a+pI-E#HQGXr~F{`EhWPTzRyjuYd6n7O5LZ7>-s%wu)6mYN0TV2nuGildmSBYu!z@y5QDjyU;}tnoXwN*i9xT({8#a z?LkyL2;RJih#(670R=%&^x#4CAc6>@C|<;SQ78LRJ(L~{N#-N(^E~goAGuPVKCvq` zl42NUSMj7-q2nI<9NDp*zTcQnbvhg%g&LW`^Q2{kh{-v)jzH0~7ElFQ&dT|hXo6t| ze79O7wbCiw#$MV=Y|^n8P&C6#OvZs_FCqf!Xu@4m)`aOvE}R@DQ;;>^1#JkF#utSEuu2n`c4Cge+#+u2Z#A85lT3Ku(LC zoq-T2N*YSCqQIj-$UuS5&|Bf4q|1sfjDz0AQnk>T*DK~!Pm8XyY=e+M=lNEvm2Qb? z94_!s)3k&`5IAbVMJqnBV$P2a_8CkR*`XT{7yBS#wCZ??WLfHI_Xu84Dy!`XCAijbkycF6rAM*$MU>dv4g%U&Rjea_GX;Q4F ziR~p1`J`xOS^6dIxQ;F=B7)FXIjC7SCkb_nvxK_J$ts$c1VNJ&B=vbV#Anokra(y( zrxXYak}8ZtO@>lIHlV4hW*=MhBVzeB>TA1+b{8vdiq(w}Sp{;-sC!})h3+zPrb6t2PK|zh-Z4 z0l$s{W$f9Zo#oQ=K~y=Sz-VH literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_downloading_2.png b/res/wearable/images/tw_fota_downloading_2.png new file mode 100644 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/wearable/images/tw_fota_downloading_4.png b/res/wearable/images/tw_fota_downloading_4.png new file mode 100644 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/wearable/images/tw_fota_downloading_5.png b/res/wearable/images/tw_fota_downloading_5.png new file mode 100644 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/wearable/images/tw_fota_downloading_7.png b/res/wearable/images/tw_fota_downloading_7.png new file mode 100644 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/wearable/images/tw_fota_downloading_8.png b/res/wearable/images/tw_fota_downloading_8.png new file mode 100644 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{@cf8U}fi7AzZCsS=07?|@iLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armi>E z%ndC~4NY84oefoEJ@bl767!N%VRmPN?1tzy$E(-MxhOTUB)=#mKR*YS3Ia0n zOY(~|@(UE4gUu8)!ZY(y^2>`gK~V(pu}f-EW?5>ATTy}+IUW?^V(VPxd!Zc+h>u_LV%w8HWU)D%V;! zUXooSyEi9&rIEyqBb&7Zw?0jX;ZENEKxeg48}m`Fi-CWoG8PK?*>WtGyb;HrwC;;O2BWcN#G0D zO~uF)_y+&;0gE%Az3LZ9AUalS>kYARkMz6M-o|^`@DlgnkQ(aw?j}r?d zAAmKqG3aRv0x^PA73FpPvUV4J{Y-ynpWmNT#RzXtCfGFg=&ihVhg!d^ctL9@35NG1 zzTx4_)b#(T$t08c>gm-{bBL->btX5asJ2QNOvQ>+fzQ$jNb#PDyR){P4SXq{k_eZ z$n;_I5@aa~Ayn(BifshL1%%R%ZE+$4^4prMa`Ca6Epth4pldSK*nZ?Q;8##{`Pb6I z5>SKmr%>a@=LDtL-!P^k+xz$$`V0s<$8*1MZBKKhZ`ppzWw@HlYp1)KV{RupkMZ^v zt6;l1g&fcd{CT5hB%C{GsD>m&cO6XQF>YjW2eIkMLe)MisKx~SCf7O>e~}mp3NZO$ zVV74z6&X0(&V{p!AsW^G5zN=1Vk1Uqk4e&&3eEgsvGbM)(E%+S&kK5#G>EK{JRsK` zR2iRilk>`n+_&A7#FeqL!DVB{X~B^uzYCDKvEzz%fZ3IMtPG-K(B81$o6D5+xWC@d z9_g90i~ZL96#*IXrk2$1G4MUU3|j+J<2r)DcI{4y=qR6Fiu8;*UNslY0dDQ9s z!U613D@JgthEqsVuI*S8%%-D*hiMZpx&Qj8`1bFN z582ReY9VT5Gx#Ud%9E9Dw8dz~&WBuZ_T3-QU+_MjT*{(1c{N*-6ZK=?&$M_dycMUD z%S5+y0uyT|1M(|mBkxNq>p*)jyNeR;n;k|Hr9~uz+uXhZ#yV3D*HIWG7t*L|{P6B8 z#1SQOxo35GdWK{KG+FTCCW}P#K6YGuQ)CY^=hT zjDEEqWiC?{6U-zaceC@xi7^uVCK*m@E=i~6^n1D&XD^T5ehI(Gx4($=;ZrX8HsYIy z*?L8EgqtVu*nt!|oB>P(ZvJPmtvPe`AH)%Hk4D)}(!|MG-A4;*EVz3G@oYq;*i9{s zxYi$x2<*$h?F3sART#4a)oGi3l&H)~HW7H8q3nx02DU&2?G0S$!05i+OT1d;FZuWvHGJv8R4VjsLq)vGF8E7rDoikYL^oeuEPh8P<>TKCRBru2sc3 zm3{=!RRxF0Oc5KQY~p`W7k?|xVE?{1k>|=h7b`z5dTGV2QSkYS2Ce=sR3RCMdZf4; zHkB&(=GEhPkpU`o%OS2t&SaG^tII#mQe5Aq1<7vf70}D5vhK`yDvy;P6wjX=FbnO* z^weFIymjf$$mExoac;YLpmjpHbmwC~$G0;X@6l=(R?f0BG51*HjXkW02%64$k6-nX zb2+Qp0KGd2FUsU#39kbG+65c^5cj3?mpi~-(N+;BjyWaavO0=KwP7{TH~5{n62$R@ zX|$_|lCgPk{*=REulxQkdz39!DvX~=$cb>9EEgP1#cAN(*LuQ>yi-&X z!dqC0-z);f7QM_I%n-}^hj0>u7j~7u5W(}V=c?AK=SY9AQ>PWD1$Rz`lr~;u`*T^< za}|4?A{@fa;#%Abt|}$Y@1~&=1I8cI#(0ES`zh?s`m}0#l#S&Mgsb!}p1{k0YQ9rL zjE~ZxcPiDcrOjt?jhhuy7U5l~`QZWF2ULi6>Y89+(#l5{)JK}B7nb{f zk>ky|{uU>dnvbhuZyp@r7&|7r^o7lbNyVQ!T`moBzov@L+b1a|dN(~Ie=B_8P++XA z$xOJ}E5gu7<%!KG7V*cNsM?^5VIVJeqV;2t9@i7*GiDn-IjC0m`D3nU6X3s!eSE1O z?i?;Pj2@LZpsp_bA|P%rv1vmkuDT98dIop$4_g~N)S&?$NzfdqEWvtwA~!kJX=-O^ zYRDI5my@g|Ua@;ce!&-axRN`)UQS`YEJ9ARvKc0fr-#)BJt-%C7?F90$7Qme%QEfyb_ee|%}Dm=(qLze?*FpxEkh26OZa*un1Jy&BEQ}*bBeT5;O zFL;cv_D;~@3;D35cfY*&g@#w^j~viBvyf9VBlXBTYertVc0%3N!>6~7X}+C5T|u$I z%C|TNyam|>F3ite)>-aF<-#V6*gt!4kRh%4<<~?@BC6>w#E)EG>=cp0pps7>f#qO* zIS7UCzr<9n&)-o>rTH=!`p4xug*d*HRw-U8dbdPI?y5uV^Sw<@`TTN*poLhRY{Rem zBbHZ?2Qm(FkGGy^z_Bw>8_j;^Xsa@(NFVq_GOeD`ciK0mVf)_2S=6tM}HH)om@z&gW z2``A=!7^XB$`n6{%1O-0N@Aeh<5%K`cqZ{0Dy_ejcL;np;tIQkjW6yFuLT0@`P+fBnS}dmj);W?1F9UQKc_wB9#WOuo2@H*!piW)ke$6(mvb=b!x0nRjp|^2f4Gj`)e{I^{Mp1^#}M8cTD4zt!Ynd( zpN&4W?aK^`8fzr@tSLQAnEe>2!2&L`D-_Djm% zQGbD})?m$&2Vycdzoc-@n5j}erk}Z|C@JrLzT&)j{=MPXEC1xtJ28@>agO3JJ>QRMA zy=&PbY`0-gJ~JRj)oz4>OFo6ZfNe8Nui{{ProPiB`*pCkQclDz3xc~;wA)~-l*GZt zjhIp93q`xcnXN`1BW;L&)B3xpj`Cu4dcYum$wg^WP> zFGr)Xx8C|A-XwK$%)VuXy89(6*51x;-vl*D#~dd>-wK*%JJN4;j7d$1w?A<;9xnNl z+(7kIsFvi{bKjK~fq7}P+deE{^jde37`o%HlQ)IF(b2ITyw0i8%JCzgRlD}|$}H(K zm0v0EvFg~tA($R(F>nFt4|ueTW@qwCxkm-$m5UJjagROr7BXrx;+}^#kvYhE5l1Rt z+4D3>)@9NMJ69Y(zx?v}-tsT>jv|0m$0kmwN9Gao)GOy~#79v!tSNhwlHN$`HY`0CSlF4682#S=Y82#B-yj3(l z59#@N<`|V-J3r;)`rIx_{%{s^gO1qW7Yrno32kzt;%tvOzD7*Crq&A8D@7J~eRIh4 z%1zYIum5CXm@N5b;B(0ng%Srjtk$xzlE>Y@34gv8ObdDFMH?0Wof?riGj|0fXDM_f43=%V1lnzF_n_FGJ4vBm@} zw|kW>Y@T2f>&x`p&xmE-cH|!W5_`>N3eV6d`#NWvQRvU2wjrDRFf?7^0zN{dQj9rULp`Mu0iA*Xl*qO16s2ztA*s@5b3-K_)6Re>=ERiSD0GC2AJ(*ZypK-FfA7p9ekbFZ%^7=YqBj)a+1NK0E3JMWmRsH)EpaB$Z20_wH_1A~d^Xy5q^(Y^k^Cv-RAj~YYW~2U<*sgMHCIg>#pD4Gy&GJSO4Jc6?$W;JBy@NJDL3bmw&m93Mc3O0-0 z6*Yz(3a3jnw<;_IKJt;qy8|QXdZyreg?SU}#R|s!rL5%-^xH7iJ~s#c>B$`^U@M3N z?ewBhLrEg`PJ@@f(mEP%0fH@%hmbT7*=vu9C&R6Go(*xDYPuo7c4zWiUK~8WA+}oI zUJ<&=VcmtPAvCWZ3R-GPl0qb_{?Iy!=PdGT8Wq6T-88%e|N9-L;YD}G~j z6Q6NjdpRzv;8T*C3_qjTPI*y&FIsqU5992Q>hXOwcA4Z>a*v1dT<}w^Zlow`iMl?) zfH6~NA!VKRj)ry_LNXLeER8C7!c|COEd@_^$2Vgqd@BE?)Hft$8hi5iw`}6BxM{>I zTUG8Y%8_&E-_D)Hy?Ga39QwOV9_JqAY+pu(z$AFFD}~3~-7>H2K6kpYMohsq*+9_K z?=~=8cyY4m7;o-9@xe1`3AZiY{qw&$G(+{!I5y`9wPM6fG;LQ~i@Z zA+Cbh85~pWype^aUEQi|LUup_t#;>p}Vpk2^QC0*3qC#q$`^Vw&SO z`U%|t3q4)^d+17n*LNOL9<319;-A1d_UKmts}mgFS4$(JN!lUcf=%CbpyFyM=Ie;v zyqX+UnvzEh`TO`;C>L=4eV`D?!ZULwQ=g*dK_@!RF{rt$^RiXOAC|~Wwh7fF4R*s&8vY?XmgQ1T}365a1 z*C#U^FS|(6s{1afY*k{56B2cN7;A?DLUQ4=opC{b|61n05R|v=I{Q=lno1q?9<}T4 zFT1p^Qj5HMI0ADQ;aOVWrvlu-p$F12SrKEIHKUw`a3lUH2bFAgHkt*)7TotGU}_YB z8db4w=V5zToN8Q*)Iu$h%w3iDRoz1Gn{ZXSJUG|nDI_z@cXU2s$B`v^HQsq`Fp!DN z6weE6k{}DG_#A}gobeb<4ddcVFx&-R9$oCU=3s>P!A68P0SZQ{n)q)Ds zD&-)2L(-wooFc!$&Xh{HRsH;_5+wz3C5d5LfV+jdN9JIMBu>b46^;$MB8ROr639K` z`pgHJciIg24*K0hHH&o(e_i0ZiLi;d^%5SrcW8|e&ohLrnxmfG#<7OJRVx-gp{@9! z!<}LK$`P{qiU* zfTx00X|my5q$f;9qniEly${&mkSD1A3RKb8d{>NTPh2%$9+82SRylD=wOF(|Qa$x| zDaNZBuExo(j2b`@Y{~B3e4tX#`wTANyORIR!OecF+2N}shi4j7-ecB!-1DGCbPlvN zZ*O5&sQZc@+Qv&WAM)3wX!V!o3OA&I`eIX8*IT2r>$p&bN`szznR)L%tL3V}E9dn_ zSPYEu-P#K^o5%bI1a54T_^V@?**T*j1b~_FD0d>SU{8liFC&I?JyF?`{sX4_d|BGN zH9s2h8%PQ53MYPIpc0dt>}7ane-${=51106q7c&skMuQsV4-A&>LHxMuiRSF+C;@q zKAbk6r+uDH`dP_YC}=9Kumn}9JE@hBE4G5Jr$S1f3BDTBu!Zse*lup}OUxp+WhaY} z(S~t=4xlU3#Z!1XoXO@tsE(Xgup=O=A8_a7INABH%xBw~jYK&gbLSGWB94nq@bo;h zbKKYcH=QxXF>X8sv5S)WB<~4mKh^71b*WC8elfvA#UW-31|B8SkE}}N_=0JAxg(y@ zWamtHlVsFEFv5J922n|HuIE^&SGZ#}lXEw=uA@p$LW@c(-+I4ns|3JkBA*a)#)L=4 zpfX+WBXmG#H>2CthkEdW65z45SKzky4r+fQXt#+yj@deX)_2UN=q9==9|fY5b*Geb z%mvyMhSeORUzOijAfvy{t8t1j4THrVQhsBjbTbd({TBIcTwulwM;98$?&;S1QNA3y z6w{3#y}TaeJ_#0c--E-GJ5#P1V=-Nd?O;`f=_i|6v5}- zLgB}7Sy*wSv?2PbyUs8Mb;dMUM|a1~S*ZI%ns}kB$5JE`o6C0I!pt0d@S0J;G>W!< z;}iai-Gt!|4bH@q>vSCnMpGTyKOnXYTsKv`YTWV#w0o>2Vf*HfBxKdga?@waHzl1;yrulCs8wTXFql8ZUK1(~l>k zKE|{?X%Gop(@`t-bM9=iqBM%6v$(a$~1`f!ND zC{pI?H6ktBsK3nU1do+wjl>n!EgC3Wi;vX=yK=tK?cWCc7@n->a+qgNM%buqH(HE@ z-M>BSrWu+3<#R@hhprsW_%WPUuE^+ILC3nYdf{l-~d9UJOvEP#LM`RnI@ydy9%^X8*I6yJ{ChgbK zO`OjF{h?7>yV;d$Ht>nRwlAh!smkN&FWgOSh(O?*+ClfA_}Sw}D{<~EMQ}CEWI2e5 z>EI_%4>p=kcJ`~tC)i#Mb>-j&syGVU^19Hc9F#JFcWR}7i<01+idPF_ZM#87eY=xW zV}A!>9g5qZ*d@d7a4ZF^ao5RbEM{A}Gi3f^+zEU?f1y^adk|>J4lLQ(=LpZTiv*<> z8>g{8_>u@P{(bQZkMe0EJ`4&2$li{xg;3(?s4-{ZV^#5v0w(wx_Y~FFwP?ip;_B{) zUParHzu@;@N~1n;U2~fd8G8>aBb96RjX0Bseo&p^xJ88V?a)phlIzLa$iN;ZWIuT) zk}HG82B)o6oDqyxZ@7YqOxysK#T$Xrh#qPTEZHm`tIVXM1-K=FK zBW4_rH3M)3Cq0JomISwvo!y)?2M07w{R54`OTtZJ(2(~qNHf0(bKF9{ z(h{I)CZlaN9`G$aT0s-KE}1lyJ>#&rc!N3j7uZ$$5U3q3%yzuH{s^WCRr%A@X0#~^ z?8po>(DL)HPv?Qw-@1@srVD9(Ki+1Ojr!`{~K;arJtg!VUJ z{ANY0(7gde$WfL_$E;)jAi)(cOqRTwsU2AGczzL~G{#A@pEDq%zPBoWp4qL;9I2Pt z{0d?)pJIp4L+<)?iAXZW+E@_@R>0*0J?08wd{lSU%F0 zC?bNKyV1+U6%a2L;#W|Fwj=VgGq6e?U&W|&#rAXN{sl?v4pwVnQ!b~sPUU0M zn!f-H@hBAL^(c05C;Y2F<7HsfVxboJRv+!}&$1FVmCxAy<7Qx0BpGmAZV3b&WVq7p z*%OLgYnuo7a_vCn9cynKj`x;JPf^}V)3z%$x19i=#A`t_aWPp*_cStHv+Ir|S)IBO z6eD6#EWOhqJED)Xt}+2VcTWqG`s@?J;x%YZwD@!6X=CQK3cN-W_c zqc|(d)JEKex^)2<2jipmdtc}+SWUXkqS_d9JLZY|!%Ch=>+IFExc_wga8l!tVRl9V z4E}>>w=xdcw*2hvOG`h{H>|$yxht6^f~!Gf>QVa8Bn=P*#nIQb>u?rUy+&BE(schh zmA}*g@h3D=Q1a)xV&n#d-O>QadOq$tPFnXaKXB@$2b2#!<*N#gX|Y1sv+r}+4(UW7+YyOk_t@*GRanNZlmkz zYUyvM{@pxR!n^nnv?f-VWGPTx=6?o40!S_Qyr^;S0d7#Ps$8_9Yx1bmbEzllU3tENeS*apRYiqLw7dVb7c-SF*GN+WSF<7S?NZT? zx4D zi~tG*I-#<%)buZ{U28I%O3NdGJ$8Qw;K^oaT$qXQ)A z<>#VZvJc#V#RtB^e0ox6XjdQ0pYT0Z9`Vjv1jIJJm$TqG<;dTJzd3&P32*`1+?3A1 z%>oJuc|OckE!525R`^|2*IloSU8%CkOZsBqZ1{TzR3c+}6TWkUr6Uz@3O8KxzAp~OSOuwfvhaD8BsAwEVlEb2Jshsq=VV~{$S<7-tY+#++5(Sc#bjpP$> zo*W%$S&bJ}6I!g%sR2kf#}3xnD^yL8}RP8GVrmd)61-k6yrt&yC|U zeo>|YlS=iDsCk3N{OkQTmrNmNA7RhU%8L?yZYU?dXz=>5Tpr~MP^69r33 z%MoGCC_JaaB={Px-6mt0)rPUXg_R$cvt7e-z`7f284&AHu&PI0@0Ry*|4?uVyM4wI zK9xV!5CuGYg6fy%A)!PtO~OiUPM(>PD$K&c}8)m{9O&NLnEIwBK)+dz{2ne24O%!KlTdj=X0KU+K?kEz_$z+A# zGQjmxg94Y}Nmw;-wL%U;d%%)Dryc=x;wR~}&$r|fjZ-X9<2L{QD$*a*zb2x=U}=@4 zt)m4_%0nKQnixJ3*R82sSW)#~T2DMc@USGXw%X6U)sWpL^k7@{w3om6|lli?WzgRTxbU$#5h$PVE6b1UU!U0 zGamQ#*d?0M_ko6LoQ16Fo^;!MN|B}*UQ3(N6F>h;7JnB=K*R7Ivqj~pz0yJlaB^(_ z(wgvm)e13k_o+v?MRMN?AXWm8x9Km+pW(}^Jci5maRuq_#OlChMDaMm+;UvhD)>6u z`oTx}Or~r6WA#$yYEl6u;HG{;Uc3ffCKcXr zE;uq^kN+&DZ6@oY3y>2dO~Hwc2P3N*J`^LEg;V)g|5tjVd2^LbkoH`L8z@MDegy;y-aFIgqTUm2VvPkrPeAMM z@_1}6(Dwd<(pwUPZi&EV(t8VH&(%1|@q33NC1a=n;#7aERvNdD@_{WnhPW%3eDCZE0Akqifm_J* z)l%l(Ar4)L-7q$-8it!Z#oH1_UzF>2J<$QSBASrSM#PSNg^iQrF$twTO#AErDTj>A zzr0@`+nUN3A!Psp6dSt#*@Njs9% zKyXtSG}7wBP_6>{5vWOfzFp;Vb9IU4v9K<%F}{T4_->^Sbd%lX_U3@9?mS~d#v?=Lu&+Pw3U+gn;4Lu<3yQLWKIlda<=!MA|Ku+ zt}0ze18*!*d8|KJjmHH%x%Pva%c=a#U4C7_4`NQI?Cq%pz#13@ z3_GE9qk%D3bDRL84I1&8xa%w$te%T=0ddvdet~mkz7eV*nL)0`e*kDc!~S2l7Ss;S zJ$-u{9T==1oP*skdG`{a1YSLao@+xz31IKtzg<^5hmb2(M%Xkb4#9l;_mk*SW#1W# zf9$w?l|Vv_H9mpDG$#@SxZc3qJ8tuuk#?&0*aFn)XXO0t0F#wdS}7M00GUljh+KA1pcuJ;ure zUzEW>Sd-1vU)lAeQ{bTJRJ$g56L+ggdxx;&HN4kFbHO1v5%v-|Ea7JcL*`Z@IssBT zG#!Be^3e1Jb1BwJ<eJJwNYj;^mwv>6qd;+w zu?}z55gZ=cTGZb=CjHM~Xb=N3v0TzZ!mjpolOgPea#{JGWQc5n^Qe(nn~H6ST#6U~ zq}=1s+EviZ(Gn%|=HM2NgTIC~zYJmkX0`DJPbO*k%GNgTrFnZEh$rNI>!coGT3H6$ z&;1GVzO|Xk*Vb5R1=9K#7Q2;cFTs`NezI`P~cb zvNOuZ3F%LwC2~6wSHjV2K*`z_(FBj50+Weq%7;PA^wf>>%&Gb}5@6qTmUk9@qI9Ku;p=~qtOT2!z zj@<}I!kb^}DoR?0%s%HbvGYbXt6`T0#_iWtR+N~yexbnJ@7lQNh35deAKiz&xh8Gt<>ix1gK)w8qZfe(``@oM`REzy}rPh!ImRZqd5w=)^uG zqq3C^9QAt2vve(@B+?HotD9FLzPnib5 z^h^n=)ds5ivsC-hF7Hpa6p2_z!L68nX)8FiAw!qjmpfdAj_S?t1Gq}>=S&E?`Ij6t%HUBgZBrKe);^e&eMoa zrK`8}y7{w%WEPaNIRe0FYu348G}-K>`CWUwOJufzf;c79RQHVH1{CLcF9axoS z(4*d#2+vJ%x>PzeAx7j5=u4J$sJBt}jUqKwsnY(ZJCS$R0Jdvy0a<$boQ$Y1?@ zlp=SJ11-7&W&N^$8PqH7AcYY`iR^L~*gSxCB|@W@Uu7Sjs#?C$_vR=};LLi$jnsZg znINylUP$1h`uQC(>6+?drHU;K+JbZQPok;u%OYQn!=zGR7&bwNTf-Y5j3T8NO2Y>6 z14o1WW}7@_N2cW#)Jn~(r%;5%C&R*XZ2GrAkhsT#kB5@k91G3HcO7(2|kK?xX; zPi2_0;ed)27x~3N^`4LJ&QE+kfols)$0y_eVCF+8h{)L|1b)erR*i*-ynm4^;LoC~ zW|POvYT}Vrtt8mpn>V<^0Gc6?PWw>Rbj&7`+o7=%jDApb4!d^Wu;cNgOVWk%K9KXYY8e40i^D91vKIS&u%NCW$q!+CZY|Gq2l&+tMpHiy`6$GLPGKCZAM$$evVmr}XEXhe2c!PKvv4Yq@ z1`rGNUk6F>^c^R3@`W1fi>wa>s!H#MBdeX@ngOt=zd=jH(*16sCv!s=9>-Rfg!(bR zy2DHoC6o$vyBf(a#3PlfSjCnv|IOA@20dyB75pkXBnD9b(bJ5V=VKlZGR$r)xk{q< z>266a<;RqO^d~F+KM7>c63-B&WBL+OJN^Vc)%hW3yRU#BA%4IFI=jcjlFZI|Vka^o z3}9L9@+r74bUZnMcH=f{K!6dhcfE>N@9&^Tjnc&Q+e{$J@z| zv|qjgg=r7)_`piYcFi9^HPP1ZYIGD()^$oZby;*qBm*sr0>^^Hm?vpo*nYJGXgQ1D zLP(kCAXU@w1+iU8a1~ld<`bfWXfH86ru8_Jv$s)?I+G`OqnF-Ex9NcD zg)yNfAn7?V07fw3v@Sl z2_nH|Anf>mN-G|Xw5qTqhGd)@@5rAK5c9Op8e1FVN<-G!JW*=JNr_QGf6EIho(g{7 zA{AHZ68?+1sa(ZgC>vH}471Mo{aUC0Gx< z8(b$>d(<$?IWx*i#j;Oir>&;ih$P}4kb^8lQ6*&j{7%2Y{wV2tUp-8VuV*Ny+$j)V zC}?sKc(a2xTVGehB1@8xbFWaY>LdU!U`r?9iD3?>2C%$80JUQR)ixx2f$V-}rKU9u zQ3j#b&H;@S7y5$O#Yq|PbI39}5t_OL`6n^|@SuZRF8q!NDF+gJ^30?$y8uq!eW`)? zey^m2<+SM>HrEMwVi$P*zt!Ilih+y36w$LlGUwQQMGC%i(R-!b%|{M~e{gkB&dEIqrOu`CBl4pFN+Z|T^UzC>$HtMDv6BkG~-=cNS!J20~`;$$G}Nq{7$}MbL_BsYtB!TOa83n2&Bi zQ&XdfiG;EXrB8OBe8`cb3U~5Hm#17U9_fJ+Jf?s5jp#Hhc6M9FHze-)>)TA#c*hOxi82h{HtKk}U2IYKod z7EE{`WhwF<&1_7h;0*N(9vc2y8fTu^hH0;)egOErf1iC7ksfINaa+~p#{cS;?c!RV z>-*9WYfeu#&KC8E{5oYOAy61;F9i{yXq@kXORzUJttnZ8{FsXK_0%+fwxWGO;cpBY z+nK}{i04Bbyo&;fjGDD(jqRj>#~C$i88E-uAiku;t_j>SJC)S89;KrUF!s7(qSa)O z(8|yRxMKn(S`5kmlG5!kb0KvshTz9pRGHapsrV)7;9hF`szOg#_$!1z*@e^%RHTN% zlVPl|R!5g9(@5jk8*RFtuQL}+0Otx{XHutT_?gHeg|X=Jl!_|Cx&3vUD9Y@$D?~Cu zWTY3h4<@WqJj5Zz-TLJ~GEo-wouCXf1&I^t+(2AF#)Cbda;cbY4 z%6h3c5vsp!RV%+fo63BoBTcB^K56ESt-?7JtNdLKQ~_-OZ>{DfWzbHA(Qp^qY?|aE znwsrC(hMmhPtoZJLN7rZI4nHkHP*43^a(7UR{t354Mr zUE9g$hD^6vi?5zS8<`r`;y2Te9}BW(F$txJe>#2Gx-jZP>G-IT`+NUjs*AtOpuofn zNDKb#K$ToEi#}KL;_HDd?&37el6|-OOM-$VmwEm&n%7fRN@`+q@AW=o3M)<(h&>V1 z?Vk!Xr-o2ZIq?ik!*fSO-Qxxw-Uq%J(Ch#YHK|WkIudO_B?{ zhl0S~bk=a{J1`;1SUYHn^kjH-H>5b!=QwdzV7)7%8$X+!V7=%_u;7P+D?Jx^`%8q~ zN|XRWvAcQA_r~ew!t>JI2T7V7!%T%<4rXOfK57u!qexmTAl$fEkKE6Yy003{=DBh> zr|aq707YH!-8}m3Pav;nZ z5StF??26tcxVaAta-_EWUAFIv^;&p-`95h<@Fb+*@OhUjSAQh3PWs(RVq0Xa67-%? z7bv;j|J@ru$ZwuA@cBu(qKn#%#7zc(-3`ir6<&&54T~fksd(O2v>>1<@mWpl>67@7 zA%{spVftCJ5ysnsbBNfOXP3IR=S5_0|2=_?_gHunfP~!5qMO4yR6-s8sWb=5r41v> z6-9G2+Iw!Rp&=40dP5IrpU%a8)~vo&?5T<2axn{gwe>CU3yJ;$7G~joj*K8i;5{On zmIx@#%8B28SXgEDu!`VN7WP1Z$wMRB_Id$-T^8|rxWQMArSSDvYHDC%Beq>E45SW}rv3b~a#>E?j_(MyHCH_`7WLN9Nay)q`cX;yk z0M;WCJigz%;LE5NPr7eEpbub^rj4sJ!PH7vCGoXevpsVsmI+Y9+AZotg!vom`upG!CB2dh)<=yS)Oae^$(x%VxfH&Y7%#Dn5g%R1^d8V?epwhF zTC-U6UDyD8kMvpy5TSw^aJ?f~aVe1Ymib7VR!@{-w$aueW0U(Lpj-8b&#Y zY@B}JmkC{6NWLBKg%Ph4$0JbD4Qs4NT;92`s0-w?|qtWWhc4EVvwk7dB~*# zI+We5g-RVNDe4)Y`PKkh)wNI|-?Y~0nES$ZJbv$25o-2CJN|`fQpPKDgxGFsSUU36 zPh+pspD9AGL&Pr#vH}LL67AwsTDwUFrb=_cbW+4)&v#@Q<8I(aM_)3eDh+m|aic^P zhK+W#&%ilQdW9X>$1Joh*CnM>_{ubTAZ;3?V@Pydo;4#W)MI>{ zH|Q1+cgp^on5+``Zvlya{ujUmC9*5CCaW9+>{3=j@oM}J&6i%x(9X zQ!CLr!$q))HGB5+5=8-2#@g^pO@W|ia8ZgKKD52vnW|ZJC{zB;5RI z7*RvJh|?o_*y)cyi>+&b#=1=Wm>`THcnLTGNv(INLdaH?MgKMc#iw1-=c?Gt=%I!0bVn#32ye7MG#sp6T(f#fp3~XZi(>WR>qCBNrd8>wKXUUrhXUVVs*Gb7oJmzyEYe^jmu2nDCG2m(S=pOUN%cxVO ztChHN@Q^wPUfEEYS4x(7kMspGfb_v6KY@0=AxDn?Gj-dPBuWrUYp0#(eF`!jCsSLCQxD}Cn``Nx%KB_SG);Hrt;+IYA4`E{ z1OUiv{^uiWaVJk6pjG+jRL$ac&Z@F3RS2d7$L9nUVA4VCHlhWv%HYXDztvgayX7yH z5wELmfNp?vGv(c9u}oJ~Zjx^s1U(*T(oK2t%g6$&am)9gmRTdm z%+3yU5%Pa6vyP?D)c%+gv;K(^qPj=F;@VmfL^Up5p(ZY+j?XMo=VzeDP*)zn!4 z+=v`JyaBn!J2ys9pr#2{h;$OK?P%#hSLBzbWcVNOOLzXP!bD(5d6Xp!WLY zM$hckkQc*gE>1=Uq4fxyJpdg|GSiOOj~sXZC*&MO-3*gl`N;Wx*8tZ87mxmp;gOSk zre6fr3t~Ib$BBOsPHdAK%yJ$eXfUT74d~QkAPsCjh1J&7yP!mKkwIAk>1dST?!Vw(VhGrU+}+=b z%&>O>!{=X^C49go$P9T6Qmu0d);hAKs8WKsvOf01h+{D_DE09tUxmSL>reZUvdixP z2giG=N(~y&>7^XmnfO8EbQh_2t!a=pkrlI(`|kb$+2Y%E3c8zR+pl@SCb9r>=)g{- z2752C8#zTIQ+AwrkpKS6kUHcg$bEyw$Pz|`;gRkAWiup{D`rDpVRA>;c|zLOwj8vM zRRj6&|L@4oKP|CL6B^Lz$%Cv@e*m}+Ylc=(CNt_8OXA-_=0+$WJwbZT$gjOEFwk-S zvWUeG97Z-d97d`|8i6L@1gTf*R|(7p<^c6bb;Uwtv(ZAVlDBAv0fm(k$feVvv{rsi zM9HL+p`QQO-r2o08HQo}w-4QiPB*QkmUR$hU{D=IR3}k%*hx^QL4Q~D2Xqib5J40b z6jXE&B; z)c*g1*118p4JOcspOa`-ec!p3P{f91$%>z8{zlVQR7$Ws@778}OCxUT*=A(Xxr}qb z3^0r0D;J$gI%5`XUZ#-fZ7J$%4?SV`@3e%?v3#$iu`=&TpNcJ6X@2#3)}!6pymcS1H3+MJ`J3eGoV?% z>fKTkcxP#KoZcxffZ9iw$+fgnmF|C-@Sjg(Sn3H&y z^17~+Bub^cMg{n6j;}*EDStqt*DouZKcMOeYLl)rq=dl^XFMnYZbT`sPSDwLxocc| zTm^WA(hHxUrwXHmFoAA;22iW;J>VL(|J>u%rq$8YnpuZq2ly3@4P+KIQ=Xg9rmVXe zTLs<&k5Q|>9oEpom_WA|gUC~T7d64S3#Q?ymO}bYLEkX=n$${c?2K{&7N%rrOib3F zoC9*kyhDQg6s^%4ZGZ`M`w~T+Y`2jU#EnApcx4NV4XdI<`@8wo4pd5zoYv;v;*@NQ zYb}cl$bs<;b#j_Dt_?APHUNC+n50`yU2$F$9Uaq^dJ ziE9P9jJh*lI`zqU&1hpxpp8aEP+RhKr!G)0*dTX9bPyuPMUq()mwFJ851+IC6yZWKKzjfEM z%LQ0Y$m?D6d@s+-g|d+pYKi{{d_b8dmSbXUi3zmvFL;3w;1W8u{3383XxzTo8J0_= z<|7XF%41xsW(3af1=Wf?+N+gvecYKv&6FFn1bju=Bwv8fz&PejHg<^#w9za)s2%zo zFpBaiMv;&QxA>fnZ3=`n)_lkv!Hs_9^?qhw=l02O)v9K?>;2Q~{nf>s>%%UrKt5A{ sT-avhknoP7%#ksaJ2HXAb{b9KFO5Csm%u|`=>Px#07*qoM6N<$g25l*7XSbN literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_001.png b/res/wearable/images/tw_fota_progress_001.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac35be0ae8efd9361bc8d0ca709edacccf3f38c GIT binary patch literal 899 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzdxNitiF5hQa)ui&j>aWiv*s>cAZf*V_FT{fp1JiG-srHNolrVm{*>>1 z#RTE=Z*Hhx{(1c7<3*YLyJYr7sd!q-=%0S^WL-~s`PnCDH_h1-JN4w5w~`6o%RFBh z@5}#tq^15b+gZDvUPix@@2W}Ko^kh7^E}4?*yQBfu*;xu9RjKxIWjOm9$8Ipx-v%cup`&)~g?T-SfLsR$h+NUcL7G z%e?i=v+6y!@16DT*Yc3JTlcQlQQv9Mvf|2>6C0QhY>?SqSiaorRNQCR@9xVt@7#1b z_HRUK__Y4AY4P>He?58l{^ueI55HI5j=|BPMwJh0EH7z9b0?=}EAA{YJ-YSwdG@Ki zLae@feZOqpq1C@*^|*$BO@#GSElK_fBWlM&pK#kyjpet zZt61uv~xAP<|SbcNf>})jr`uFBzZQJW+?w4m+?+-i|e<$ON ze(vGeF*%^wr5o1@q2xl?E)|-GB9|$`njxgN@xNA4yg0U literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_003.png b/res/wearable/images/tw_fota_progress_003.png new file mode 100644 index 0000000000000000000000000000000000000000..8d62ed9251f2ef707644a7300f964671b041d6e0 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzO->y-LQ_{*DFm7tV!l;cQYk z!O^VnmP7W13pQ$C)lNQDIX{UHi%|thhMMk z`lcc;ZmH$n!N|+|;>G%Ps+N~La!o%ami)Q*b^H8t^KV&g4HuC!eYWn}8-@?_U*v7s z5OMk5txf;0@H)@jA8H14(QB(;tBpLb%iMma<03XqoLMSuyQSx8nQAsMC63eGjJ%s) z|7)Ii`?GA*)8h?oH%rfN{P*&=@X_C`9EUzVQdK;&VAU%5@7n#}a`Rr=)~vpEHCRk~ z_pL6|+}S}>Ue{lKSJ7OV=x~^)?k7|7_ZL^ae=p0Q^4j`%_?s8Ck*_VkY}@wyLB!hX z_qP_UEspLgiVd{5#}J`&d{T@@k?Q^b0y3UKXSamq+_1Y;_29|JG}hG2j|h($ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_004.png b/res/wearable/images/tw_fota_progress_004.png new file mode 100644 index 0000000000000000000000000000000000000000..b4cad036dc03f611dda993a7dd0e2739107408ee GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz*bTGZ_oE83K|OK{gmZjbUu%i<5}Uz{7u zCf>Tr(d3`=!H%$8?{ZdM@wGxdGP|EhX6 z-`90>|GoIwTf8zq_Qd3O@#o#2O`79dq;)c6lCfu6bl2%>KS$?gFU`nO9rvJ5f4yJx z@8W;``tr-Ob7BI|`z-zUxaiXkze#bEygm1Me~RXwSlO?ck#XZhisi(V@6zp6#if5= zm#i;;`F!E8S0{Is*H)!!rfypmGilF*oQAeupJ}^2!}h(c`T6{uPx=2B&r||0oVlK9 z&7h;IJo)Koodt6yFOib7T{WX}ZsRuQ145gh%6|KEse)@73oGwgsrUzf{@VOy;g4Im zU|}Tp-sX9){6fC|pVYGNxul87i+hbXStUQ06zp25WHeI>= z5A*lTY@EbRpiwZ4L*T*T&-(M9RQ&ugnc*SG No1U(IF6*2UngB%eGvojO literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_005.png b/res/wearable/images/tw_fota_progress_005.png new file mode 100644 index 0000000000000000000000000000000000000000..336dfd0b8d72f14a2d5f81c42f9e90b1b373e9a7 GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzfweKzcXEfDJd7v~Q$GBU}DWE4{}Qu`uDid*4ANsrle0}CuHkfP**?Rv`Tgg{%{%85|2*`xPW*XM z9uv@Y3=FduM_V)a?3}40KG|k^itfpL&tsv&j6S=Aynea+?YldBw*Jc!?@5!MtXD~& zv}bxs{@I!<*RSv~TwXP0(!rP3%V*t;m0uPs+q>^?R?YiY8|-(L**%W7|7-r%ZPMod zefg_emvXW4it@HSeXX+IuA;W)_w?P1kG9tB{*s#hcK6bhJ@ZuTpVtM}PkM508XHLI zRGzlf^hr-u{<{0c#Ad#awY!`vE?)K8TyI^^?W=c}PT7{ZXJ5ayzl4?~&*_IM;%bqb z{~i9i^eO*0c@H7hzdv4I*?ss z+MHOabkbW`&-(lGjmz%#*yQ+gNp17cOiljt_oejuHFx)v*e?F|oinen>hhtDx;LBK zbUz)q_i^F3Q#ZvYFZurF&ZjdE%j@P?ehAyXIsN`;PvhSco^CT=Heo$)!133fekztz zo~-O$ZT)Lz<f%U#etI(*I|1ZO#f|(FCi~$!FAmTAWOp^!1MY zr`Ss+r~1U>et$jLFShR8uRqT|&QfIbnCDq!baJOk`RD)tE#+!wur}zL&VF)M<^452 kNX&twZ81CZA|UHx3vIVCg!085ZMtpET3 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_006.png b/res/wearable/images/tw_fota_progress_006.png new file mode 100644 index 0000000000000000000000000000000000000000..797aeccd1073b99252743710f31e464e6a2cbe6a GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DziKdBRyML|BZHL&!5d}o=@I0`^m~G?VDMlcNq_;#c18WRi9#c^2h$; zyUed&dv=bue7~)A&F|x@J$D9Ait+mtIO+W4lGmN7t0OKH$Y+$F+NUyi_gsDRy2#kQ zCA)6^{q^`xWSqyOsVd7S%e)U(vNZ@PXV{?0Ze|tfYjZP4)^g(UwE9y&R_?rd@ul@Zzh_nQr@hmE`t#d!gXI2iI`eZ4-vYaSwMylam7QoEE4wZ1bNQW)z4*} HQ$iB}Obkd1 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_007.png b/res/wearable/images/tw_fota_progress_007.png new file mode 100644 index 0000000000000000000000000000000000000000..9b580225fae481705a4634b986782a0c0fc11695 GIT binary patch literal 1172 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz%)++D!RU0ftE-p{ull{r7B`bnfodC6i)2KIKe0mvNc#&cRh$n|)>HWv{w# zTfNl$^QDt@zxTCo>;83JC0})>bgoy~D$`dC2j0Ch+d9KhP~9_X<*k^=TW@Or9lUbw zRqK*hQImo_@A-fFyrQV6noCN}WBW?KN%50xKIFgtJ-z`{N~Zy|C&;} z4|EEv9S-(9r|wx@RbT(=<@Nou>)!P;&zx!dM?QI<|ECYPoL28w=aih))OPZMXOYdx z)t-HM`g>k)Ts%F^ujWhi^9vK*UtfFt_vzNwYcKcma270|eg1*HOt{gHrVUp7=l&Ny zn7e-3?)Wd&cb8?YTiN|{nN2g3#Kdaj9gF^Hns@K2{qXPW-~75=Hr2l_bTuPz< literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_008.png b/res/wearable/images/tw_fota_progress_008.png new file mode 100644 index 0000000000000000000000000000000000000000..4276f1c5401406f132fe8d2ccdf1e2e1a78f7c6d GIT binary patch literal 1208 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzyLFnw3?R%WQQ=1c#8mf=hQpN5@=7*3Jj5 zF529R3SwfjEV`B%E?{(=7!k2VP(-^sbfU%X%`^Y%USrkgRB?UQ@!96Gu%Di9iCvRbtQCgNO@^z)kc9YqY!Y(s5Jk(yghJ2eoss{&(Z2Bh z<+YnCKTT9gpL{1WTQz6M3_v`Yh_xX0Ec~7t04!<5%y>vxi z;s(dVFDfmj2cGi`O55J=|F-^Nz}l_ltwx26TvBcaj&0qgGJD$Y_4jA*`gS|j?$PT_ z$>*h)PPs9!{rK#*i=P}Ol}ANC3tui*{dD$6>u>MZF10P^EdD)B?DX<*E1CN1c~%St zA(uVZt^E7+_3wC@`+GnATb+ExEU`&4UPa-P zwy34E1^3I_ZmzuVY`$d5%KdY!=RaAt^k~tx#vTUcT*Z^_k^ieUY&u?B|TUzz3d6%yv^B?m&lb_sPBmUKxH=Xf; r{4GzpGso(!Fk^pIWN3zf#4dY=;%kd;tGsI30rG*TtDnm{r-UW|U)on; literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_009.png b/res/wearable/images/tw_fota_progress_009.png new file mode 100644 index 0000000000000000000000000000000000000000..c59beb5427554e8733ba2bafd784bc7d5a9ab946 GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzQ%eN>Lpl0xXSh zvlMw;J$7iUb}iTc;wa*%Ec#H1jqB7xDHjQ;-+cS&DHl0*MFV! ze9q@NlYtJz4Vu^7e9v%r*}eA+2mU*0pEUPeHmPQ2%Fg|T3~e!*s!ONz*w()}%lq9n zF6gS)q|2W3Jc3>q+cZ23^*Z^ZJ+)|4@VPD4OLOWTKauaf{Z7l%Yts5jcP>BgU_L7< z@M7hvRVK44H>%8@ykuYL^%p-Lp5OHHLG|-&^PHQLpG;P9pM2-W^##nQj58K2FI#?R z(v!C_VcM^v%dWV~SL})oU3qT)ucUIllKDQLswb`gEl`~BazUeZrRm;f=C98Fda+nP z{JQ+lx|Nl`_X>NaO{$rd@?7efbVlfYW`@_nyMw=}{rr=4U4MSX^Yce%rb|D4lke@h zZCcQ?)n1)H^-C@|=&z4G{b*uszp2{2S<&|jz8`)MlnmFtVi35Xaes`|>g+pP-Y$H1 z=S}JLnx<>G7ctH0~}gsX=c z-VQK4%J^sYQI%@_Gv|GE_tx*2Tiku$to-fjpw+p14$Yg{`tsG+ty~s7AU8br&o39cP`$nTrRg`@sxU#a(nfgI}KvzMt+{c;G7dZiGS0luL+qs_lv6@-B`c; z*4&_fWil^{-5M5_)lZV2G$mx~rK%@OC%^6Am416}(Vt7FT^W8YpZa9#nm=dPUAY~+ z-$!od-pEF_2>UXXpBCEnTbUE)u1vasJ4uYn42=+AyWr}ivCR9qkgqhz!Je*uF6*2U FngD5+Wn%yU literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_010.png b/res/wearable/images/tw_fota_progress_010.png new file mode 100644 index 0000000000000000000000000000000000000000..160f583b80904da21e4c88cfaec34a2a1b2e2d93 GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz^`;)JEsO2UD7^ZUcI!Wdg-02H*@QfQ_4LzO?gr=$?vQndr)XOL&AsB z>ZcBq_&-12l=*-8(VsV8mi@n??Ws9m-E!6wA74TCNm3>SvAgzO@+wj~`EEbYmRn~R zI=f%m_xaxG?&bb{)8^M#D4ndCmVIT76VQPN4pgh1Y^;~gc{^W1s_x~Trwg6=%O~xb z@Z_z^;@6^i6D%E>v#-6Ky4N$#|599G((21HyWU?kanFm7vibaOpN_8GyeF4c;@3K# zX?)7U8?!mc%S-d*p+7#8W{2(0d+}lN+PC_37xVk??zKHxUjL`PKBbxM+LBeP7EfRH z?QZ?kM?153{m6cE=kiS}Q{!ka%fI!hw>9=WVz~CISEXO&+M1HP5c8K5QuV zPaykpB(NwGW^&*)tU#Cq({LJ41ot)`qh4uza^a4GKa<;A z9IkJ@_4J%d@z3cGqkDbL%dP+{#SbJdID~J#mFhjI zd~#2GQQ+D*>6>32vXUoj&-M4eHzVlX$yaatifvEHc;po_#0GkKPFkf?8s}N`v+7&V zz5gM(k8VyDUv+v}+N7E}Pqyi)@!2p-y;#=#od5kkOKts<`fl{?O>1{PTzI(MOLKm?Vc~C`dG99Uli8l@*7)cD&3*La&-bf8zHI#;@i}gi zE%)ZD7xpKyU&x+4dC&YMODv<*=KcRLIc)co?&IQX%VxeRS2$phtx~DE`u{_XH*de^AR)z!DjftN&=6YBa9D5l UZ07w3r9sZ|boFyt=akR{0O6r;_5c6? literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_012.png b/res/wearable/images/tw_fota_progress_012.png new file mode 100644 index 0000000000000000000000000000000000000000..9304d6c230085689999f2acc7c2ac6337f78e7d9 GIT binary patch literal 1229 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzUo=p(b1#Sc-J5CKt9_LW@$g6&EcsjF8< z$Q*Gj5wI7~?`kSF5LMq=B6LJc!)=4=HI}p2ZTZ5FF1)65Qu_VhzYk*L<}v>-udKLt z_@N5WdE|ftVUihE3p$@~9sNn3gCoZqwXSAU@-gncaCkK}mGk)0{ zm91B~{hr~)b)}EaE}eStrF8bBSt(|BSMFN>MPw@6_aLXt+k(e>9+2gt0fE#D*Df4 z&RTl1t>0T*kn^p1YSF(FC6khuPT3nRyw+06k!Q+;yGqF zt(14GtIYU5?_7WUd<*x#S(A2G?X^^wGTC6Ovt+mY-=gQ=mtH%x`1i7F`+mJSz4=P% zq&vk`%l7Qw`jO$+o%z2{Z1&9ZS}AV(``mNkw^9E;-nn1k(y*`G;I6gBs~3;m_uaU- zZtlmj+BGi&7)op>yxS{X`s11VyjMqqr5OIFZ&#~a_ELbHWHYLV?jd0NjGtrgR;@O# QZaI+Mp00i_>zopr0L$lX3IG5A literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_013.png b/res/wearable/images/tw_fota_progress_013.png new file mode 100644 index 0000000000000000000000000000000000000000..a158ad04c96e96135f91600f1f33e449c8cb6b2b GIT binary patch literal 1217 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzat^c8x&KGPTUhHGJk=TW_#@e0C>$9{ahXbL9`_-uwL6 zx_vUxb(DhtK~q!e?B%7FWy@uTP=ZoZQcm8?x;>**i$L2As zzE+L(T4^nJ;9IDd=kJipjdwMd-qlPkdG`G2*GX|cMuFw~{zrwDGc=sdDnC{1d2ipt zCsX6s>F%jnQd#@%Ptc^5D$8G=xW>&TCBgC5uTt$~$)ts|_5S^PeYJJEob12-Q@1p+ z{fgTiylm1OpG$v^yP8k?;-dL<_A042UAupJvRqL2(%hN*>E_9hO8xCx&s8KddEeLl z?auD~&G*jhQ($Ol`*xKSe$9*p`Jthv`~IBVEwAId|I_1Tc@j78=Is4=)hqdYW7wo% zPrk1v3H?B2^Y2bwveTsa&xK28J{E^g-P)VCA}ZNBdi~r;NvYfB)0Rx`ReNuDZG|<% z0o^|np1f8$9(I2I&G5R}`weXBzMRYX@Ndnn(&K&4eh7DK&lUDpoq4-yj%^~)2X|kV z>^~C`^Y6o1_H}!{9x9(bV~M``w|oCRCh1qpuP^txa6n1I#0=gU{^)b+p43=BAx>6h+KuB$5j z_IYpU;>x_^&F;HYW1r?sIu2Ab{}m6%hP%EhJ7+EFv8jJ_yDa_f_ z)_wWC_`?go`pwKQ^xKnHi&2_xM)lJy1XkRa-_^L)_4f1qyFhk$y85}Sb4q9e0OrAC AU;qFB literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_014.png b/res/wearable/images/tw_fota_progress_014.png new file mode 100644 index 0000000000000000000000000000000000000000..2f975aad552b55789eec859ceea4e1c28bf3e383 GIT binary patch literal 1251 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzB5k*T(M5!0xwhCF0T|B06>lT$Q(63NV~$)3;kGiBoOaWzT*2mG3P-M9bR5?>S>mg1guK4}fP}$;Fp@{;zsf!f@dK z!kb#no_1cJZroq5UsJrx_VcrO`*gPWt5%wL?iQ}q4tx((lw}&dbmEe!PbSviTix4p ztvYXC?!LcIFK$%1JxONoty=BWMz&p1n?tv${8TyF94-~SzqERKKb^V zPv-Zo@Bh@_N98$%PMem-_h#K$|605GPadkouPJ?!6|tZ(?_10y{@_r_s^6=PZEwH3 zz41-YPWxy2`)bPHKU#l(zJF2vB>C%BMN4xE8DdvYDY7`Jt*L6f{{5|uCGVE!PoH~b z|IYFk4^Hm9b)lDe=dt>vjSkGQt5>a3sWd+s9hs5-?5Op7jp=%SHr&}0^?BJ#U;jN{ zaweU>wyV$-Xx?kbsZai@{C;Jg^LMl1$J0l@e2IN2(|6f(-o6hNrT<<%UE8CckzlLg z`Ayw&=a1hzeT~=K26&%ZS}$3yaq?YW#2m(Jv)v}WpEPA(`#ekQnmsyZ(Mx%@d+n}V zwCBQ0i-z7jlau+LryksE4n7+;GjE=T_3nqe(;Ipd(kJaynao^${J5UHGuHvr#PCT6 k{oJXS#70e`N(g9w5)byMeSsutdPgg&ebxsLQ0M`_C%>V!Z literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_015.png b/res/wearable/images/tw_fota_progress_015.png new file mode 100644 index 0000000000000000000000000000000000000000..0f43b63f27598da3fdccba04ec0a56831d555150 GIT binary patch literal 1252 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz&3bU4+LUavX`yAu&Q^^T$_Tu~#e`}7Nw)`;npUk}H zmgXRL(grl#o9S0nzF(PvElyK)>69lGl2SLz-=vt{(eq53w8cyF?>T0Pn59$h)NSe6 zZvFIg+43n9ndhHd9;WZvr?T?b-R*O#_A@h7J$!Iv-(2sL>YnfXC*6`Qznbm5c4_No zbvchu{*x}(^2W3=^5#^%^}9Lu$zhe~_5b%4zE=({|F*kCzvgqrBxBFIH}3bn%${tN zd+`6lyD3^H@2UI_kJ(aD`mz6Ir`z}CGf#WUc@-^mugqTc)tVt;?j57@A5+UW-74^# zbj-JR;@{)XR$qIO>v_-r(hUuLUfzrZ<5iPtY|5V;DDHmlH#fHUDR97cNLhWZuEFfa`yc6e4cvQG;Q(vh-~NLPbZ&UxboTaQ&DJW@asF}&Nj_#W=n&- zR;{v{@ucN~gwjR5YRlREI(Rc4J3x9q0bG@G0&52K*&pWd20H@TADXUg_ zO`1Mw&YOQ`yPuxQ4z3SBc_^#eYi*!>-Ph)yx6U38H9Mf|JpU%+?3+Q89(&G<`}OtD zx2zRkOCRrZKOTNJFn``ly)(8~ZOeak&l6d9NSQA|z-G>qkX5TJe|_6-{5ALcn~1ct zS5>Mf?WxQR->PW$*kD1UWeDy?z=cl?!tEOCfU%}A4 zddj4?>Zg>2-xe*rs+aoZ=i|F7swWrLiIrU4KAF+1A#8V#N~P+_&Drnct6n}Vv8yb% zJb6zg{;TrrCN{RP)v*K0b&(_VU`8;zT!OpeSGizlH0p3-_^d`%DlU+`g#2irIYu9 zytc1;wbC#D!hr=pEl%cCX-C$4+$XEK*ZZ{}e?L#ZoYlRPS3^&1v|@@|yr9w1Wb%{C zQ|0$d?*4P^;roBN6_;aw&pyjO&u3C{Xz1OK^Or}b9%bZNby6jLQqJ9PuWp`~-tPA{ zvb-vDi(5g-2c*hedceglaIUI-_Q5-eL5$ikm1gx zC#O}Sx9>HpU$?RN`;}Sgr#;gq@2N@Lwd$|CD8r=ZlcpT|Hd}w2-x{55x0Y_X^)zI4 ztlDo`o`eg$s+Mz?^w^X=IUKgz=4zI>G+P62Qu(ColYM{@PlseSY6X@MI1vArlc8?a TU8}>pB0$ofu6{1-oD!MPV literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_017.png b/res/wearable/images/tw_fota_progress_017.png new file mode 100644 index 0000000000000000000000000000000000000000..0853460650039752eb62eb6f75f979c841c4f892 GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz^#yQu5c z7AIw=^L&X7U7xo6^d0m0cc(qcm^A-Z=rIRootP1qE4>Zi(i)st6V`}3w1)-4L%XI9|t|9GGJEoj-DSx+rkGH7Y`TYyfAtAkAZ9V0pU)r%rJxHpae8xwbRP33{iwk!#<9RUfRs$S&>L6f;Kz O6bhcMelF{r5}E)V8f9|; literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_018.png b/res/wearable/images/tw_fota_progress_018.png new file mode 100644 index 0000000000000000000000000000000000000000..00d776e8101f8bf19c90985f911c7b7cf4197808 GIT binary patch literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzYXw)6VZe~u?u_grp%@>#O}{pWq>jcslI z)ambM0lIG>LBrcsc5j#%wl%s>GMOABTc*fh9i^$dbc#=1)VI5JRS#F+IuT)ha;E(} zW&;&r`RSc2%Pj9^O`jUJd&*sR|EVf>Rrq-~IfgS^b0*Br-s)|9vfDGx-{|Y}L$^Nl zp8HrmE4A`vjOJ61P~K%*udx+z9Wc9=HGS1pz2lQ==092cXRoFD$rHI}FD5Vdnshic zR8}S=j#p~IcJ+1hZv1zhx@Z2AeP^4>6ZBPQzF!x!dVOu(v*Yumz3TGp>V9lh(f>Mi z`~0&E)@Kf?#9u$AeqH^X-nwP0-u^uP%W0DN#nX Z4_VfgyPe(~aMJ_%*3;F`Wt~$(69DW4W$FL` literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_019.png b/res/wearable/images/tw_fota_progress_019.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a4e8cf05e126d172fe73e29884997805043231 GIT binary patch literal 1202 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzcEs_~LtEVkv$>bXu@B26ncG*1X{R1KNla$<7&_Q`B< zPWgfDjefk`zVpRZpC5jH z>Irn*U;+)Z-}x2&kK$)E_>{GF<<_*CWqCJk{$5q@{kZa|%KUqE{0F3F&RNO7E&cVz zZ!@d5+D5;=vG05Kr2CU|q|FwbmYpk*aAZsR>u)OWRd3E;Qu(_!HtI!8<`|ZjdXAmd^r-Jw>5Ar+@CW#78 z9(X@#PW0YwcV3*EzxRiEs_Dt;p5NA1*L>gWdCzy#h4*0#L-QNzpC46OKKpjrpG`l1 zTo3jP^3uCHYqF=Gu1&Pw+P4)9i&xKlvRq|uC;xN%S+iE2f8tSU&Gzopr04Nz%<^TWy literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_020.png b/res/wearable/images/tw_fota_progress_020.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb04864407b1fefd5164746f18ae5818d67f03d GIT binary patch literal 1160 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz zyF)md$0U}$t*nV7b;m}rtBdZma67loS#5mgw$juND`SK5IYvgYuS+?tOHJ{qam0Nj2FEG3=H}iaVcJ9r|SCXPP zR6n^=H0k-IH?g@Zn%E-t&z}?%x3fCE=I8VG^*P*mmKL!ueN;|%UTxFLXn1HbTcx>p zzR$L0YTL@K^ksb~J&t@jzXWKL#W{7!JOA_k-PF0i|DxC%xvG54lg6HLnWr@~8WdNo zy6w5oZ*9uUSBJiC%Sr!lU0HC(@b8Ch59(hA3~ jy9aZ+8X9ghnDmb+?&r*FUEY7)KrZ%l^>bP0l+XkK{FFYr literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_021.png b/res/wearable/images/tw_fota_progress_021.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2cfeba9833f322677c3e41efd29a1ed7fe57da GIT binary patch literal 1143 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzEG%8MHaTHmz``nMu3&L_PSI@d>d*(Sav;O<<51&?7Rm?1Z<_mP# z&;e#guDIzl7<|fFyK-yV>!VhG|A^bqeJNv6Xnpc-`t#qKuXigQcyY6A<-1j?@25XW z$>LKv`RdWlck%P*cf{0 zbL)y(c?~MWCp|g%^!#>{)+l`+|7~S&ye4h`eU5#<_<<9<=PW79kGV1T%F|^D>E9wI z?U`t2e=FbuLvy+P$*=C(rwGdh_nyoFO$|D*yex`6}+$`$S9*6#SX+r2pOCrMfTI{ktXd=FGmS zD(s)1tnS+n^pE0-t=}fa_)dB^clP&RZC>xDPg;NaO7VQPnVz4X??3+U6|aF!_@q7C zcU9zV+WWoW)02k}x2Dg(??2@jdj|v0!OP}X-uisHdgI$m{%x_V^m9LW4V{!VcwG9S Z|G08oOG(et{|`Zq@^tlcS?83{1OTR9O<4c{ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_022.png b/res/wearable/images/tw_fota_progress_022.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2a9789b7abab83c9a0cdd6921e92983e7e82aa GIT binary patch literal 1090 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dztu9FmeNA{T znF-xh5JvAFZ61GHK@fYVrM7XP@**69T$s$bzWz+qTLvEO9@6upB~*eoBR51y_m}ROJ*%uu5)_-&ZM(yEE$T??x*jmET7c#$CB^rw^irm z^lEmNZL&T&bCb?{@uNki;nx!U8p1XjpM1J*^K`Z@rRS%Na0$kJQ4@#9XViY~F!{bt+g|+MHSRDz zKJ}9Ufg-Q7vbm%dY&M9mb+6g36R&F;@BQ-d>GLmN?w!2;^W%~I z77Vi%>Yl8bR2rREQyo;Yu6|yM+R2hhFL!=E`rLFb--4rW`<9Ch+2lh{hp+y@Ys#3D T-k!z03uLXQtDnm{r-UW|lvEka literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_023.png b/res/wearable/images/tw_fota_progress_023.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd3f254b3dad96fbb799da26d77233ea469d415 GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzzx8w#E~y2wcmLST@rnF4$>++~{mxIf-sJhVd$Xs}rAGw}>Nnd}B)@#KGi^Qf za;M5n-L6Fe7Z~0~_)p48f4o8S%FKPY{f*|OL^(2VN!Io3ySFE!CQ2_~@2^DOa}g5< z>uZyj?EhG^Ni!sFm!;XAdto50-jiPaJ+0lla^vO2N00ne*|~55Sqdkp&)NQyfA~iGU0z>Za*bDQ^`DZyDmi`jT%6nnnS(TM#_rJ|{ zdipf_ugcQ-Eevme&QQ7fY<2L?{}0}8UaWL;?c}$M{N_HH*~FG{{UeeNq${<4Y#Schsh#}w||9>zIt*vFMNd*kAA4N zGAr+e#bzh>=!knpZjU`!RTAvT{N;^-=cYfmN?KoioY%zm;%4BaHP3yYbKmM>UQoZ> zGw4~m{Vu1iK#ADNDobr+OIug1P6nE?S# zD?02?^W2ox*ZzM;ylSTLohU7!ioKqncGOhW$4%d&nR&hRmdbO_Th9Ww?s)KXm_{(E d-fH;&RXC_S^x5(3g`YrrJzf1=);T3K0RXUY%c=kX literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_025.png b/res/wearable/images/tw_fota_progress_025.png new file mode 100644 index 0000000000000000000000000000000000000000..20344af399da1eacc16b1477fcda07c24ae5f6eb GIT binary patch literal 880 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzAC7>o?u2p zq3+}*@&D%W_pU0_XW}(jw_8QC{O-96E3&?4HL^)u&z&^oYnIuLSzCc}n?iw{O|mhj z#*J(@ChY&~8qNu{FK^P4_v^~r-LCrm_FKTH=7oe;-TcDH5WUR1C_>KbuKCOP_Se4a qn|+->|9;;wJDw2|QRv=m_uJzkesKhpUXO@geCxD9hm26HnL@8&rwM=xf>SV9;*+OKRanj&-3?Jua?yc0QD~O z3|bazdg1T0qux#p$I?8FX2gcc7k*ja@4A5TR+Nh8%=ouii|an?Twv(kt6HhCIWKgQ z{Qg$Eb@SQ&9c3(VI{mwD))Mbcf68`!eS7w+r#>jbj0o_dUcR6PvwNkLI}K+a6`0P^$)>|1tu4*Jfc=9?6}$Gv%^S9f1yyix>nEr> znfx!~Yziztro<(bcpy#e%;y6p#`zyZ?U(%&0=i-pfI{G3?98u>4CiL9RoSk8r@my% zk0)1m)SR{`mXx>CIiB8LY-}NOpz@o-$VJZ1K-b zycgE4_6%y1{yOt}=%j<|)jeOWIvvb7A#qYj^Ve&Ewl~+aNG*s4s+e}YDtB?(A5D;k z#7R?@POZDW!p=@0qoHrDs%PoTPf52|%zVRb;&9x}Gw2t0^R__SpE?&9WTU(`#r)#V zTy?ML_6EBj8bFa-9+U3<>OFkz>X+kNX1?JxacEzs?rC}}kGG_DOZ6m|1&mfDzu0Ye zeZ9W*o&D8n`B_Io^BeT`dVksywRc;{q$MevGmDhEE?|f3sIc{eE@m-R^MDPnUqo9#>5I zA~Q2))!MLW;is>^Orlj{!iXT+`T-c{`X+pOXVRAqtHng?=SxJ_H_SOefeLT z3@_A8W7*)#mVPQ>Qn2T;NpoUq|0Mi+Jy-j%=eg-Ya=EXcGWzopr0Cl4VUjP6A literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_029.png b/res/wearable/images/tw_fota_progress_029.png new file mode 100644 index 0000000000000000000000000000000000000000..ce92083d1ca90cf6fc28a6e0b16b166bb9d854a7 GIT binary patch literal 1103 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzAba4!+ znDh4b!S2vhnPVT{U$uV3G1XUUN=Wyj9t|Ouvx_8Wm^t23`;{NH<@NcD;MroiIhT_H zmaOTSvgC@=>QI5i4kf?uw=xZRC9brJU2ptV6Q=+E_nr^YwlaLrMSu<(1%yN3gS`2w zZ~tz4KepsyIuLIg7kg*l_lKu<-~abfSd(rs4dPp4k|{=dZ2k@?L1gR5H8!}Ix^ z-B&N3&F+1?eRZ$dsj8w^d*j#d{rc+Fbs?|7!}W{rwn?jE0|*p{GM1yYt&vXj@p;C#7$_ckKJc zsZDG%mjAsv?`^f*u8Vy~Yd1Gt{;a;*PO>erw%8wN_4%T!haM*1KkMUrZTaQX>8t(j z?pq7=-SgS6=E|Pm|Lyde3tt|+^xVEIR6YOxcXh=Bf7XO%KVBa0b~X5__tmV$)1-H0 z8=L%mbogjiQ0*SmWTp)dj~K-LO0X!p|M6jO_5Hs;Pq(VipS|VdznzH^+p4S>@;0xo j%30k`IK~F4iU#Xv{P8!+_W$a?0(PONtDnm{r-UW|5cxK< literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_030.png b/res/wearable/images/tw_fota_progress_030.png new file mode 100644 index 0000000000000000000000000000000000000000..85eddd2723516048692608d5e4feedf20e0f0c39 GIT binary patch literal 1157 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 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_035.png b/res/wearable/images/tw_fota_progress_035.png new file mode 100644 index 0000000000000000000000000000000000000000..4c04bfa2849cdf70b03b712bee2f4692e7e16762 GIT binary patch literal 1230 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzDFY7QTDxc^Q^WUQHGrxy85vYsU4^{KRaolQ)-MML7(ph@4QA6tj3_37$PcPoCxW-RS_&-0Vp_TX5# z6btK&gowB2(mpx+f?LLC1oq~p5=W0 zXUm_rHR0#u>*Z=Qy^HRzD*maTvk&%4pN+Bka;UGaJk#{#=amcR2($9?tjt^fs@(c& zwC6mZPq)8bulg*%=KDUYi7M;WA|-097=pY`-l)mkZm+F=t9WUTyzTa&-kxbHp9^_- z0_JDeuhm{ERsH+);k9@BzfAfwGiB4e{Wlpub6Mw<&;$Tk$Yxdm literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_036.png b/res/wearable/images/tw_fota_progress_036.png new file mode 100644 index 0000000000000000000000000000000000000000..30a5da42613271ec3261fdb996c671f4c75e16ea GIT binary patch literal 1256 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz8;E(&+JoXzasxC^HY{c?RdAUH9z|CT&^8rth`?~ zU7vg>UjEkS^#9qyo@=jdzxHU=7U_D~`Zx2I&WtZp{kg+fFg*PTMs4Z^;^FG-N5|$v;UZ$%w0O=bLdvnRU0q9WnlQf zeQML+B_UVuM#_cX*>mgG&5IMOe&2Z#G>Lt3°e9*YJ!v*IPcG*8a;wA*{<=gy56 zm;U@%KIzF%75P$wTWvXWqgfBAN#;yVn`A!8rt0O5M>jwIyg%Qz#&z1Q_o|f&r{hJK zE_g1TG9}2UWS5O)$*wKz_vY=2_{uv)<-YpPUAKQSY+LKi8tdhGe`Bz}$+vg^l~1;+ qRR2B8mymsP`jdd|&a_IPx9{E8v0lg0wMjk`WQC`zpUXO@geCw)a&qCHuS;tx<^k(I;Gt5x`>$%Tk)5iR_w(9NQ{+Y}$(Vo1-voGY+jrizUlkfIc z6jtq$Wk{H}XL3sN`&YC5`1gKvK0Bp&QbCHOcdf4es5h^PZ5_*cmC8-&M<0B- zurIlO$@bF2mf!A7dg8G=xL>Den`Q8Y13}x3Ppn*=KRepUkGwF)S z*=H)hCqH==JOA&U^5eCy(`=1xO>KXDx_0eK{&DrmH9Iay>Q4olx2n`LN_&2F^^Vf_ z*LLeaIbfe}d)c`1%W9QMt&`^5l6iJtO05|V#DrX3t!-v&YqsI%&FlJ4Bv1V~UcK!2 z{yX<4r<8}vX3RQW$5Q)~|0LtN<#$)g&P<(W^YgFzaEtZV zib>3t$8UUlvvIw;-`+0;_2>L*WxOCawl~G^ctxrB{dOdWKu;;q>Wp)jz+0U-; zGHri-F!X(I&$l%@cTV~FYU^zoitHpvwaL>!o{6#Jk(2?2bg|| YZ{56g&MC!nUqPmNy85}Sb4q9e0J%PE4*&oF literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_038.png b/res/wearable/images/tw_fota_progress_038.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6cd0706380e033e17809c6a11f5c0b3bd0c89e GIT binary patch literal 1205 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzlOU=756_$%GLQZ z0o^tV25AT!_`h-GONNI3FJ`Kgt65$z;a~`V>t{57$@P1mAI)2pwTrzWM)vtEi-JEP z&o9rK{cFuPGg;Px&9gm=3_X2iDn9S_+rH}Z+FQ5Q9`)P)&0My8aj&T?!v-&7&wV~c z(be}C8c$~Le;-pBaI#`jzxCa!l^b^{8eBM_QDM|vxNq;?_ZMbH$Jc%Tw<`Nvw$4fR zxp}g&zxO-@DyZ6See(Iw?}h(%moKy1`RAL|R^F+NY}Yp5REbxaIpfCvV=qH{J|9^6 z@8QPW?=>@)goa99jh0)xjG5uz!F4M4)gF4IZ zD*P%xD`!kR{KQ!_Vec=~lV6@_zt`P1-}=*oReopwRxYitNc;TB!hY(LGX~7gWoo<|F>}!^XI=u?`8Y<=+Cvco_^3`zD(8wsU1s!!S_0IYn11v30u-8 z*GxUA-T!*_d;M>Hw%aOS9=|+&(wVTUC!c;+&i(SAal^yXU0Y30UiU1E`&_WEd};Zc zj~|~F-kW`JMm`6dlmzG8yj=fJzLToM>sJ43ZT)xAeVfkQ--(BNjSrkyu`0(p(Aw(m zueF!g&ieIY`svy4?ge^QdCFz&;(xGgYtj75S1!KyKmPkJe*E37IL|u&P1zyuEtzv% s`qh4FHdmixSY!Oymz~m7SfKou^|Ro)78&qol`;+0IC3I3jhEB literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_039.png b/res/wearable/images/tw_fota_progress_039.png new file mode 100644 index 0000000000000000000000000000000000000000..aeeb890cff0ec50d38f609145d3eb86af9cc2269 GIT binary patch literal 1236 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzMqV4|JaIVW0Q% z;rY|meoR0Ij)K7-0vjIkgvc^9)Zd!_-E}CnX6;lR`XrY-nxpJ;m^v6Pbwz0Uy|_n{E~lP&YhCi zXTxpl?N9DCe!SKD>XFyBth{Sj4|~RWZ(44*W9My~s$a8zoj4c!f783SD&NodT({cW z8_vth8G>^n;pe1f%U&&=60`G~GSH-_eJYndxAEWE_uc37&hu@TBqSnF zcHfP!w+XQScIxwL>Gf6HEE-nvsQ%2zcvNuT^tXEX)J>ZjKYl8YKN~;e&gPY8=GjkA zDW5by%rv#t=YoT(m*#Xf^=04q-p!VY%(T>>XLohyha)$Z8CC!DnYPXSTCSzKTE>E; zwPljtMOvQ!i(ZS_*=#KMc%u1l)Qm)um4^#Y0s<_rIT$I%)A@Q z_Jm8VEt{FQ)jJc2_S#*4dA~ONVmAGwa&i0?>!n+)pYB}N{8iasH(~J`&re~K-X6a0uh%30_fw6jS>bEZ$G@K~ zUp1LG^|iONFFV7(@2gbWC(rTPw0G<4#`o)N>(>2VUgS4P_^sd0RV?l@O!JG zKFMe4s!gf?z2kfBzMSdXRK@qVe4qcO^tx5QG9N2_(`V(q^7Ng`W>2;DW9qw-_3M9q z{ouR(?!La#`Kmkf>sGzGCcXZ@cTY;OI=MLToadVbjl37$ zO}XoNPUU9F)4xxR-|Oh_sag;!rXPDI%dq}}i(NxwsF&yOy`R23J-_Spk=>{Fo~`De zw&q{|7k{=*?*F&z52MT0PW{~N=_b|3Zm{Fpz4Uuq@~fU- ycyXgu#a{j9?GinPe=p{#n48Hmk&-%BTz_xXx@_W)|H*Gb+B{wTT-G@yGywo1$ysv% literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_041.png b/res/wearable/images/tw_fota_progress_041.png new file mode 100644 index 0000000000000000000000000000000000000000..219d64a1a6ca16947eb3a61b0309e64914272d72 GIT binary patch literal 1219 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzZlIs68N++vJclYpXJ=kz*LF3jel}f#n=AQ5Jw`?no&abt# z|9IrJb+GBSf2+TpQ&}JTxy5;%R0%_ZhOfHiyeIEeBI^YUCWE*w}jB`7HLs?Vh3v(4{ay7}wV8~(GimzS^o@N2zi+1%T~f4B4ry0;0k zZxCZYE^qlE^7WDaRME4Rp3B6<{m!ap-g*@=kBxVYS7@kbQCZP{ZR3?v*VjMG%YS#| zk$k)S9KWK3*h9S%%6tjFugX?Vs+sj3 zHt&ipQ;GE0^z(m~*z@OAbHl&)#r}IcJ#SL8=RKdKZ5x@SObS9@m03=Cvh=@9%&*Uv zT9eP`zd9%9?-l9sDMRz=?SCCDq92wwtPa|K`kBh-$f&*ElXU7#Z@=ENvHs1co5uC3 zmb0D&OnTR##FXQ+bc#=H%)6DhmtJ{4|9#)x-w`J-aU?6Ae8+g4`NocQYfk&Vvo2bd zm8%_DrMZ7b%H@W|j2FtCC-qOdWB5XWn6#QxQqNp=Z6(`PM}3KDD-F)2-+O+u?)ib;ziOY~ z*9SRs6b$JQ_;K3dGGoL4rMD-q@hIBzQi0(Mk9wuzNqJ8@zo1#Y%np-se2NS_eKkve zTie|0s> zilN|W)Wj!CRqm@-?kK%`V&&`kzaOlgczyq#jXgbgcNr|3{G|7oP~6iw@{G@=JT_UL z{OlRFY>G~O#_96wd3CuuYY)~(>)IRG#@WT}>iFx}$acD;%Sd+mAF>`FiD>bKu= zujuz{r^Pn#TQ;-(%X`~4-Tj_T!6%`v;z>)U( z^D5lCRYD}=f&8-Lr+p^L{y9fN_pK`Uf8F{CHL$r&$<6%UVQrWwe@?JO_`NqwAW3{eF=lFMeu_4 zJL@kur`{~^HJbe7sLI>6#f$~hmS4(t!bP0l+XkK D75-S9 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_043.png b/res/wearable/images/tw_fota_progress_043.png new file mode 100644 index 0000000000000000000000000000000000000000..380dac6f4d0451b11830a9e48e1fa593b08b62ce GIT binary patch literal 1189 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz|kVfGgp&ImouxQ zwFQTkMwsfQJWW0=4n9XgQE_o`TPq3uoiU%S=BR6CEy`R{-D@bTYI zA)w<%!7vGdby45dBRz{UE;%wt?9x8@+%s#^Et?G+=0tg~Ej_f6VcGRu&vPjuXNt|g zrN#aDvbxrL>;C+eb}JUBulBKGFc2(PskA#eQ6=-u+`Ad}A8&cR{&3iQ`IK+*-~UW` zGA(cU7xgKHuT0fs86;L8_MA4kX5tf%$G2v3zg3U_U-j;8e0X%ZebMh}MShc7RgS9( zPEw4&U|>7XtH{Vxs`|Ovt^U26HvPW0n0u>9y8g#A`JQ>N%1-^F+>Uu_nxpS~mcu~&@ok7t|9v(|20oxDfH#AjmO@;?)vd`Y$6 zuy3lgJr z)3P1;e>HzK&Nr!gzu!dbS+QrI`p+Vzmki4S*P5=}dZzxy@49~_>-RsuC_MY=uD_;- zj~;%?!@rrqAaC(qiQVrltMjWO=ku&` R=)4b-_jL7hS?83{1OV={NBRH& literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_044.png b/res/wearable/images/tw_fota_progress_044.png new file mode 100644 index 0000000000000000000000000000000000000000..1567063152b4d63d545bef0afde56ef5d852a80f GIT binary patch literal 1186 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzIOju7RN^IB3UTxP*VUAl)r+ag| zIhs_mJ~thjcxwxXxmQ5vl2fhR?Y(rStaRe|G4h+>iWs$B&nv z_XIj_6bz>jXjr&;*-Hk7JDZeFYJ2YU{#1H6lEK4h+7pLK@sp;gEZzEU;mULSg#D)n z&GKa{n15^1le;S6MT-r#o7;u1x2=0uv)%kf`F@T0+80hcUoBxsaNIKajo&8wlf~xZ z;qUHzz5UAE@A_N!?Rom!_kEv~5^Wp!_kx4pvxRp{7#^&%o&4moO23NdYGX5r+Ls5u z&$Vqo_UXWnXDZVFuj+?;@~Kzmb`~4?TV+K2lk+KB`S-}T)pPf%*TwBDzCL+n)c?|` zWVMsesuuk!<^1%~{^f$inY(iPYAXNi?UrAAV@q=UB;MjX_xy?sHrosCbO%avlvF?c zsSiGAN8FN~LzWL@Zz3|IAhO&wi|WnQtd|_Dp=U zO8VrU@X*rSl}<+GX%`G!cJ2L?I!XNB#t5%8Js-dC_STkFe-GVUGR5BbcJBOBZ*-j* z#DX)F0s1@kqRs-&MfF)R7` ztBL9Hx|#iVbk0on{C31cctPQNm6iE6+fC-MHry_mye7+v1vQbDe=>hoI(5BO+M>-M N2~Sr)mvv4FO#n5FLht|p literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_045.png b/res/wearable/images/tw_fota_progress_045.png new file mode 100644 index 0000000000000000000000000000000000000000..748edafdb14b1c88f6608059a45e3eac4545ef55 GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz;##q_Ee>(B4+Ukc-jXls`u2`Xo@x)!)JS|Pv7T%_iCPf&FcQ@^R{V#*O3&uZSiRLuiswPz74J`3ll&*gob}T5 zKf6Z$YuVnd}Nq}|4iS*n$f zCpO!ky%O~}!c>r>#g?QU(tyr*UbU${`T^_tC()W2Jo+04uicV8^O@5G1Q{nm>&$Ez=1 znzD1x^T{%vMJq3EU?`s)m7P|$_qS*I>(i!ltMmR0u?F@p00i_>zopr0JSSP;Q#;t literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_046.png b/res/wearable/images/tw_fota_progress_046.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3eff3d933e45943aeda96c4da485800ec25a16 GIT binary patch literal 1138 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 Ib4q9e0ObbUqW}N^ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_050.png b/res/wearable/images/tw_fota_progress_050.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ea519c35f7973cbd075407a8b22e2c82732eea GIT binary patch literal 887 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz;q3Wk3O{MfSUEyD-bS1OCspB?9aY;e+T(pMGVN!=>P?+f!T zxW8@ElyV#OwM$yce_SkM_#u?-8@twKufVm%Crc*<@y^OLl{mNh>&4i+Ip>Td;{5)< zv3<8%Yr5wycgM{lYQLX%i%)Cge|-M`v*TVf*R8(I$Dk{@e=qB;r3+rJ?mg*P*u3Pj zh)L};5#QyS8NYlSFK2Sivdg~3$FM%|f=+k;p3{C8N@n$|=(O&>eE;_9{blp@&MdE= zJf+A!KE*D2%FC;Z?!+xSleg;k=EHM?P6a-)&)D@+K3>A=TGxk-&7g?$boFyt=akR{ E02BMI1poj5 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_051.png b/res/wearable/images/tw_fota_progress_051.png new file mode 100644 index 0000000000000000000000000000000000000000..127ea69650b15f27bb60d11c62a68772f14d96fe GIT binary patch literal 887 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz;fD{>zuWAvbHSWPHrst2av`=f7iLee>{!bIYqsKW+)1{yA|{%1@i9y?gVn zeay1E8x!9p?efoz)i--;kkQVS=|7KIg`WDOzIPe(0kg@ocgfG@u<~)doaPQRQ%y7D zR?ejohKxx~%g&0J%w4u1)0owFIZ*VBafa1d>7uCDPk(({QeU%6=keiCN!cr#>O)Sy zSP)+3ZvB$qYtod18{)n5H(y-w^>MuD{5v17?`2lEaY{6op1K7TbDpk#F6*2UngFY# BtyBO2 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_052.png b/res/wearable/images/tw_fota_progress_052.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c51a325b512da6b24e913f611d4708f6425874 GIT binary patch literal 1023 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz9W z|3oWyu6x(lx+y`Vu=`BjjQ81W@6Pc16C3TM9BLP?>|nm&@qN-7+3445H$65@O|d?CZvFG)D*luAtTa~eVPf@NyK2>` zH-FoUo9FVM|1GWmoK1SY)!(z%=dLQh;&;if=&OG6`$Y>f6@Uu67I~!a-8J>eul(1| zb=zObzUAYyuU*IYttzy9wf&8|K3o6pd$YH88u-)z5cqQ<@lpF8D;_l9qo9;6rNaWl^EqTTGG uJj0`Zc5b=l-K;fp-Ks2$_q$|$KQX8LkBbW0S@Z>zUOZj>T-G@yGywpqB=!CP literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_053.png b/res/wearable/images/tw_fota_progress_053.png new file mode 100644 index 0000000000000000000000000000000000000000..2aed22bdf229c891633200977affcc9644814139 GIT binary patch literal 1086 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz8mfDUYNyx3qQFBmN2dkDPM*$8LQ)(1cq|CnY)4 zM^k#cVCtkagM~ZKWj{<)oV;%5^`}2-UcJn@_xwxjp68KsK9>mroihrCcL=PQT3{k>Lx5E61*>eD<_co9X*W<)qK@d8(C`J2DvluMG0KHrJwj+0N1&P0z@M(Q7x(`j(`G&g+co=Zsy9vPSrYR8^rPA0Z?8?}f4iK&{q|=5Z8ep4n-^Do zPg6NL(NFc{HkER==@S3y;tDSaFTVUVZ4$S(p2pSPo3{Meb>_V8w&!W9pU(UpJpWzX z{%I<`ZMhuwk54X8cU$hQeKJB^SN#6G+&eFVWmd4p--+CM@uktMcWuR!w)_%c%{tn! zOuX;EoB!(TiVO01GO7|co&I{-Gw!Q0$CXY-UwxU^MSt(y-rT!N-*bT*Pexeo&x>m( zr)EAZ7S~-{m)dAm$T#citsnnR{fzZA+L9SPD_J=6-OLlS{!V`T?8lSm&%W(F9BIAj zTl>6g^ZPmf%Q4To`fJLQkV%WL9{S_5wIDy~=f}N=J>4$djPK>0efdtQ!r8g(Mq83? zdRIy5Ev?z#SbX6_@jRYii5mCo=9FlhtXR%hwr=<27_Ub>CVvivzuR9jCG(=SB`BSF My85}Sb4q9e0JumRCjbBd literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_054.png b/res/wearable/images/tw_fota_progress_054.png new file mode 100644 index 0000000000000000000000000000000000000000..6097e7c374f05b1d6acd03bd7dc65afa3f2e5bc0 GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzjdm{Kw%e zTzcR{hzLuo?=^=b4&{M4C3|`-dQ&gNmFF(Kx~%Qx^G2^#ubRy*z80>qS}p{1)+iXp zA@D14#XAO_iv8+0CqIdt)NY#2_<%WmQb>LuyXQGI%SkCpo{`CV5ns+Mc)4y>*Hh)- z_U@&N{a0VxpM3T6O;OKl>NjUU37GWQ^PB2VQ%~cQr&ZS8`gBMs_=;>p>uSs3T#rxJ zcMI!3f440^cE5T3*E{^5!_WP{v9G$=b=9l=soIxkW-{ORXkNDZnNO+7$(8HOL)NFo zZ~eFP^1t7oVt(H`dhw_9bhlgI-><2x-l@T(|3hq^!mg}yA>xyKz6TU7G>v`pK3q=1 z#QPQBfkRj3tURT%yGm#G#eN-w6($+GZq7Ud_v9-;EDUX5+m-k?pK? zXy{)1GR* zZ`L{att71YjnAj(Ne@*bFU3s#^judmYPW9hSL=D<{qN@26g_${-!!e&)xCL{_+d{o z)tht9Y4z)RUR!3|S9h{~Hy`7QyAf9Pdp_GTGf42PXUxma5j~)NpbV4}Jzf1=);T3K F0RY1pC3pY; literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_055.png b/res/wearable/images/tw_fota_progress_055.png new file mode 100644 index 0000000000000000000000000000000000000000..b90df4c312a543d12eee6196d5cf8fc93d498988 GIT binary patch literal 1142 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzj6Fvk2Um8_4UY~IKgRy*W#%Y zqSj0oy?NuPd*ULqFr^Ns4o;^I{eVYz_g?obG#7fD?3?hu<8!US)tSbBj-KH!el`*4 zvQaQhLtsyH+bceY+An+qNVH!AC9H33ijkv^Q^jSzstPt z&(D|N)sLm=&ySqE^PGKo?TjZelY%|{_-!;y<}~Ha_&9Tw&!_51OZEH1{O8@>Tbupu zQb_){_Q|Vvm*@4I<(Kg;swmKGba6C4_rqta^em?Z+*zK39lDqe>uGr%-vEh2gRoRAvGvn{w_$-vAk6-7+0r0jUdz~dGulDb;vZ%W4DzA4e)%H7T0 zzfLX5+<9P&->>(s%%&eEY_OcR^grXNdn($Oq)vUf)j36YzHN5?&HI_U|9>>s`)hQ? z?AgBghS`e+4)dGxmi4|A|9VeFdeV}w7gudD_f30pId<;1UvJk=S^W0Z$>w}{8HxY9 zt}S8U-DY%hy63Xb-~U@iIbQ{ux@wNim&&y#87lHDPF_=SpB&?16qGFmNrPfX;}g2; U{(QK#c^*i>)78&qol`;+0QMU?TL1t6 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_056.png b/res/wearable/images/tw_fota_progress_056.png new file mode 100644 index 0000000000000000000000000000000000000000..8695306df2a991e455571429b282aa69bfdc0c61 GIT binary patch literal 1168 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz@Lk4DX_sPO=KQ@>+!y;Q08$#74#Nj+bTwJ*$F zb)WG?Z`ER($tmy7ZBO0#`R~`A*IN7ew&cf1`A7c$eK=@R{-l~YPp*|cW7)Ob@x9QNr)#p$BYxU3D?fVt`xpT@S75B+8cb9b>5X-z!?XWlSoBB`7lM&&p ztF^hc&))pGw0QDy@0$@};Zs*KSf6#+&wN2x_~kZB^^*Z_H{R0D|2rXN?<%dcl4Tma zRrwXq>#x*Y{4C<&zw^Qd@2S1EPkQ|7tF%sbN9+98JvlWlovG?HSJm`rEBn8{Q%pp>CXOnKA#dN{ZvtHc20e9V)fI7-}Se=7N34QdA_cR*Y{{ehC9mbn+u~qELT}7 yC8v4#y!`A-3mD7#v`%t+raiKkL8Qqyb@fc$f)h5&F11?-67_WTb6Mw<&;$UQzd!o` literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_057.png b/res/wearable/images/tw_fota_progress_057.png new file mode 100644 index 0000000000000000000000000000000000000000..405e6fea8505a4fd689298ffbb725a30825b0893 GIT binary patch literal 1185 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzHl@(i~<|rt(F72Ir$jr${)FV@|tg%5XYhjp{l#Yu^ zSJV%7N2At8mfSUdJ&OcZKYnneMEcx`w{qp%&p#5;cm2Y*$vXSpXU+S6dBf(k3SZ%W`t>~vfKUm`qJ93 z*5>}M&+{D3W|w$wn($<%%64-pfrRV7mTlQx8u{kR(vow%ZNKCHR_&|Jc$f7r^U7(@ zdp<_jGyEPbTRn^K!2Z`)o~BItzP&HhGctbHpU0=H&)?hn?eJ0OXuVjUPi2#eJ+G-x z7m{G-t?DX$b;;{f@uc>=h%KA;82os&^?vyNn#U(HKDfVLfARR_IrAM{5_(KtXkJ@+ zdZWtx+|@gJ)~&6r|2O^M&C9>9iPu{Nc}c2zhVDH2q5kR1xk+<(#dsB!v|o;U^?jB2 zaRK%j8_F&-?ugS=^}Mv!eBOz3vp;K`tTwk6zR+{6e)@%$gYNo!=52lGC;n?6P{Y!V zEKF*C&GVc>LuF-aK7G1#Rha#@cDn!anAhv`ieK$c=4JDll7Hdy>xnAMC&_qMpFeZ& zxL?Y*AH|2S9c0hj?f7@9O8f7IgR9;^9!{JTpfWmla3 zTd!}xbfKrr%zxYN2}_pjUH+!_%gXm&nim%^E;}A$cK+cDQ&|?Y^!Y&SgZe6;g{|Kn Ro>l@$dAjJrH7HXBV8}*L2G@P`tfsa;y&5 zQfI*}97-Hwmy`ITxPnBr9xd2mVX^9P?D@+v?{)hR2i_0JIe7ZN!F>J{&dLYejq*SL zdrktnZWIiQ5V$bqqe{POrnxNBf%$tUEK&Pub<&x4J3~PB*)Q#-$G07xKR^F|(eapT z?z_}1=RdiZ_L{*hVy)@i$zOZ@)?a&FU0V5T>Sgg;xASApymzkEI(aWmyHRcGGG@2X z<>BS(KebNY$oIc?E8gz+H}k)X+22X&=*8?)ueCaPP-Q-^tx!hD>X!|IWg7J|&s8*2 zi(WJP-`V?j@6Ohf%lm3B&YBVD{V8FR|7N=@-+AnXGrIgQ@V@x+>aXXyf45(I#qQow z^6ba~$bNl~wVJ#K$L@7&d%;z?7keX009lYi2hX+b^4JsixoE=#9${`)wc z@7hoK>FYkd`0jb{R)<=`XQK;;x8}dRV?9~?`}NX{||pSt8O{* z$=@|GyGoy)Hr_owt#9k88`lorcw5bux%Gcl=;vEG+vj905KegV*1Jg0Gq*HvU9kVY zeb+2E?z!~x>aCYokIqhe#k=)dn=qr>?OM;YNmq*A_E~NHfA!!tXZi1X^}m@Lp1t+` t6gcUs%I;adj1S)5xmJQb!G4(kLv+QxwVRJUZ@Ujt;pyt@QgY#IOn literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_059.png b/res/wearable/images/tw_fota_progress_059.png new file mode 100644 index 0000000000000000000000000000000000000000..217b3b56744c2a8d01dd36d9bc3c1c37f34aa626 GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzlPDqy0FRBZFN)&XXAxM zN=;o0+QgFC_U4K?ZRwn)87mUGTck;HFW^PioYf1dr_vm*YQo#J(W z-tGK8hXv@uQ81K4Afk5Fem;h2Go3yCRBv7_5oj=7KV?#om)pHrJ67MlS*7RcX*B(b z$E1g8ml@Y2erDZuS@-c=|KH;6^D8oqLRT-*yOKWH=2C%6!`9W8b=j@%20iP)eXQILJglG8x9|C^qD`pg%9V|V$x7iQb+)GeKOZ|;*;nzFokFQ=8G^g>k#s%hp(5ut5u%xnm1dY zyzTjo_wMHeGuz+qo?e?KEB!z9%#SPoUTsu8!M4W1>cv6J$xj+p{J-z}pY-dH@nUKH z`X5Q2`>+3Re_ibv7qP42fY;?bs{>kJd?$S`T3he_{>#eW>uSE$t*-sOEw1|aI_dXc zrGtO3-l)dJ6i|L8US0FG+xMx_@$=`rE%BCoIgNY!91Z2q^$iRcdct0{YCI3#daA8` zzLvSHTy=Wgc|L|&<;9a0uM}T;<0@Z*q*Rs_-ZZi`sTO<38&!?_5Y4fU*{`ycQI=hc!L)F$>PhW=Zo^o{K zzXzR=&r%`#)uHR>$M^Cyl^~o=l{Q2!O z4sczL*q8D(%4X}v4_}v`SKqmNy=CvhugU!TE6&~u@0XX&^8GjK$=#!+3~UdDj|+Ke zu3Yu1?crMUIoqPEG+?kaxUQK*=vESPJioa^*!#^&}VOp|Z9&A&sG(K5+b}oO) zpNZ3-U6!%_zTA`BGtYAC>RGGQa`uEUHI?o4^I zT4m|Z$Nx6H`}$JeTwW`=?<(UTa~}1Z^Hc0j%6@fYeDFRduAI0uJLw6(Z1Cp!HTj(t OAPt_belF{r5}E*$Vqmra literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_061.png b/res/wearable/images/tw_fota_progress_061.png new file mode 100644 index 0000000000000000000000000000000000000000..dc787a787fffc0cea1007c4bbd0d29832397b6a1 GIT binary patch literal 1258 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dza?({;U+elRlH!tz~!@ z+?&?@nf3kjTxWJM|1WQ=-UUqh6n=a9l8ZN67)-BaP5&JIwrIyyy`@+6p6+?R-)ctM z`=W{eOinK2b7#p~@~Wia>!PcAXI11?ZWjLf`04hOi7)ToHrMy@`=V|+>&ZQp_;LlM z0OQ!Xd>i`SoVM>Oo)p6D9BsbO?4Nt_@3ZccVW z8XH^t{LPO2`(Me+%>MoE@mbG2@1oL4{FCQI&7R_L_sTcT4O1qmNLGBB>t5ylu5#s+ zsb|&1)cbmT?F$cYJNokEJ(c#!Jn5Oo*$=E*^;O6{G<5p>s_OHbyVd*F?l@2uyQQ?^ zL+|6@v)XQIllH`T&5YLj#;|(jHCC&W%YJ^8PxE`XZ&i8So6R>xzh`}k*^zi&{eF7p zU8x6aR^&FWTczc>&!Z^!=ilkhm;LWvGX8w8yIcFszv8PIb`zF_gl?_TZwP&=npk9X za<*pb={pDe*Tq=;3$9vsf9HgC?~HllR8PhRFTUEJJwtGXB5T#jm`UZ6&*=5^-!=LD z_TRgCuiwpC`OECz_3O>m%iUIoU$>ACaDMjee_8dU?W>B}+stgf{fhZ~Z1?QtbAPLy zJaHw%^!~yehOOm=lk_J~xo0h><;?!FxE`9$n te4gds{&I$rd*@X2ORQK(OU4KOe^VFIIQ(}5_ln~nou00KF6*2UngCV0cpv}( literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_062.png b/res/wearable/images/tw_fota_progress_062.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecbe8058f7801b874b1f3c4b3621adf972f45ec GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzx$iqVCVE^}nSJNro%{Uf(w@ou2$MH% zx10=g-6$CRA&}GYZx{2G7p*FfJ@>7*=5X-WUi!zn?S0iBhe?xC%uXtsx--AX^?tf% zY2>%u+-c`-{5u?vYbjpIq%Z@64lX><(+I7A=rITU0(N*^@1N*L};M zht1b6FOR)$dHtRDr@%?@hIjx^I%7soB3j7q#2f=UWAMRo1`!Y}1f;`%Co& zPqj%k0kKBAYX2O4_U1rebo;f9&$e!!d^K5GmM6h<_BYO|nU6icO(}l6KDzy#%&gyE z=I%6oRzK-Ur`{8$h|u+ax);xVa<)V)Z`R)*FI?_l@JN4f%T{}@?Vl-6`ZiAvU48l| zgWd&g*10OrC(C#m8Jd56c<$UxVaa_D@A<9Tw{%fn`o=lSUw3m{xV=h8?zLXCb-sS@ z_S>8P%lzH9|6KxuPL;{Yod2TNr(Aq~uVU{z1BO4>bv^l(o9{~ll__Kay+`@c%)35^ SGl(q$>GyQ?b6Mw<&;$UVK5ktA literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_063.png b/res/wearable/images/tw_fota_progress_063.png new file mode 100644 index 0000000000000000000000000000000000000000..05c28ee622916a8e353790937316a0353bc108d0 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz*VolzvS|tLUE3#$pxUjdE39yK} z-kBq#!}q8}J$i9R(^W^4MK2aLmu^s;5pvmV{mH_Pl}m42v%7U?-}L+Z?~302KXhDj z-@|*=LO}P8g25RA4Yy1uzgcO`a$r}umt}qG^MAdb_xv}_c=B=9V#YQ3tDn}~Zch!~ z9rZ8c#m?>f{DL+GU3zSKoH^qDtw}JoQy>h8Np3tiH6y z`oPvp>rQ1%O7?sg9lJa8`r++qm6^Zpl+V96@rlEv{>gJzXeu2Dec9cV7oMtfGGx+j zy?y2t?|VGeJ@vF?tx>xC+{bTESG2<<%AB;B7Rbfw4m%1vI%KXCX z{Juv!PKbM|O{<$}XZ!t;b93a3_&rDN6irH>Vtj%7*U|;SUNcX%s{Xw$Kli_cwT1P? ziu|>k88;-^oSc95ZF1_96DN&VAK!O7v~uCQ1O}Dr$!AQr_fMTzUT<&x>EO)p*L*Ao z_J32GDSczx@j{TU#g&C@w^mw2EWG6^Qz9bLU=W4Cu8{aibLaLkM11$stlw+)cD{tK(aaRRlYM;48Q0`bKfbeY)0+&F z(>wS5)t}=TH0jTblqH8N8D2*(j^s0&mAdbuPU`2*O*g9V?^~(U`^DUo&3X>|hOAY7 z>}x_6N51lm^Zj(>zP;w==ks^H{_Y(-*<7ts|KvNB>FcT#4rsmZYRoe^{Y>S(%Fh4s z{4ulU|9g61+QFmqm#_CMQaPC%xoZ{Mi>R%B?0=>QdHs^N`;u@qYR;Ld$1FWx?LEw# zUsJkm+sge@pEyhs_uhEkp*;FBb8P5UX7RrLWm`-?AHJ|DeSPj7qYuBP$1lG(Tg5*- z^lQp*ZpK^bzWgPVR$lu#UvFN0+4W;*{%+fF=i#jnCvF_@mam()%4^!YaQiFYoEpp` zf#!Mr)H`|a=;r%+f2uP4{X?VHKHV3*|LZ&J_0`XAytKb>H+{+WwG$a~H!Wk|6}3y~ zpT^0>-0Anuzj=5({L1a(^Ye0R+2buIri4%WX{N@s296=49Vb|Gxfjck15Pk|UUYaXc zWf`1YnHBthTjO;5dAAEb%SumPvZ`py6dNPsxSh{=E;u@SE?ad_`qbC_y84ZUIqy8~ z>D~R7&G4W;+vMcVTNh3|^zpf3W67~$8&A0vbrWrb@jr&|2AdyE{~A9NWU{BLpUXO@ GgeCydc7Esp literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_065.png b/res/wearable/images/tw_fota_progress_065.png new file mode 100644 index 0000000000000000000000000000000000000000..c46965a114c7e2f1945f668cc6d7a4933f2e6441 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzGCHoHrnMKLNJQzqqnxp%R~Zg+M4^8@8y zpBB9H1-fq(40H%2`0i9VdE9edt`!Hv>0Nt^e*dsN|Hd&8FJd-JSd7<(x%xCNHV|_w@4XZEt>Pd8(hh?Rjpkp_;>6Dg76#R;4|w)_<$z zUcV=8>(=G>zkQfGcXgiCl%@98_s#@GGXK#xjl1Bk^l?s=oBG zxhJ1Lzx3fpmFw!2>*jSZe9hjoz+3aa>daV+9rnlL_wC>Ns_oi|D^I$A@AFUB@qFjK z>FIr6jtf1vwN1J+{r<&-B0U$-6+={HxO3 z3*vh3JI-G-Cwq$6G8{BjBdu<}_gNjQHvd=2y4%`I zZ);bduiQW9dVvkYq#kw40N;|+Pm<-|`0ek}oo>$H{9uv_zlkgp&5~im*2n&$N(-iG ShdZT!Eb(;pb6Mw<&;$TM0${`d literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_066.png b/res/wearable/images/tw_fota_progress_066.png new file mode 100644 index 0000000000000000000000000000000000000000..695620f6918a1eb881fe4eb251e5c38b5ead1501 GIT binary patch literal 1239 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzhaMTSt!WYW!SWqx2=b+=k zMXs_X;lEr~EY;EwSsAj%B+QCKE9l5Ex67YCy|++la;}VixBJ2K&2y{IJ*`X};(C(e;z2sKl#fezg=k@IQKYaM^b2 zrxm+{y?&qgb?Lwp-}=%^K=f|1!)3N~=_Ao;>YY_UCua-|6!EcK>+uW}eDv z&piK6!ST9{tRn{oL=~j3?Vv-d~@~zd-ZV zo!4_EDzn~gR*7G7y!}8n-yXxeyWaiEo5ViZCOF)pVcE*f4*Sc09=`tW{L-aU-M9e-J(|2F>r-{%V#R)6~@b3^bFFR_i_TREe?NbJWx}s%OI6C%DpPMWGnx40 z))!6*3JSfNFeyJu*ton$)^7W(gAWhRd$03v+lC)c*4>=a`&H$;nq{DOL<8H3T-Mmo z&`E35Dyts%$6ue$Z+m^Sg}SF{-QhPU8n64S{?s^mGq;c9g2rEqjparsYremDxTf}Z z=KHmMTGQL*Z?a?4?a!D0pI86L>*&w3D&?Bz7-|E&JST}ynlktN{>``EO)bP0l+XkK0Uc+C literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_067.png b/res/wearable/images/tw_fota_progress_067.png new file mode 100644 index 0000000000000000000000000000000000000000..8e549daac26a8ae95c861be0fd71c1d55426d43b GIT binary patch literal 1239 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzH?eXo5r2nnVZ1B4xd-KnXz? zg(qqUyE?K~g$hpbSi5NwSYJ$!IQJQ)<)jf61zMoNULvwNDCr`l;TWs^T3id_T_CYLEU&pGgZU=OU!P#SkWy;$BK_HZoBxSo|76~Ug?#1b%dL2E z^Zn#6YL>Cid<|}^7dzGmJp2FR%v{OWdqW@Q`tRGbc57jR;YnprzH1X$7i@f$aUp!t zoO%Br#Y|ha?{&%iy|u@WCFjTPD*P5TX`j?529qG&>IbpS)91-&4lEVbL_USg)VDCp(XxT)(N{Xd1(VcT~1`u887g+29DX0A6Bc1XT*X~F8LS3eX@T725r zerfT$l!8|QT#^h@>8AhGzE@AW`Sj&V z=eKjK#cu8X9_AV6`{~6S57V7opP4VXYM(qhZ>_cZFZc6y+pZ-t{Mat*c`I9%i7rVF c)sk5ct^9T8q$hss-U5>FboFyt=akR{04axRKmY&$ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_068.png b/res/wearable/images/tw_fota_progress_068.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba24f46a9b6c4be351092fb6788f6987a7fa5df GIT binary patch literal 1234 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzdh*Y&JiR=*l0jzE#O7zeeXSQS?eWQB()+42tS_pWZRhQu^>ym>*B3ul zeVEt2J?~qn?WDbvr(f5fJJ+u$eUg7QNR{s$$N8&|Etkum`|D{M+jpKk$q=An{XV^= z>-Bk6XL=SbY|Lrccl9;PT$S)mRgW`l3l*B%`SPt@um66(W6!s<)3>WzPI=PIwu$jq z*m>a+P1VrQx$AFVHeTCbcTeN%gKNI~r%3PLZxEZW^UrG1lb1oKX0FP5;x5#%@AB(- znfl7byA9?~EqnWvQD~iDs(a$vdB(=kuo2etlL}{oUrr zlUnA>T7bsYJ8XMXbRO{=eea-mvUhOq`k~ ONROwhpUXO@geCwqUS(zg literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_069.png b/res/wearable/images/tw_fota_progress_069.png new file mode 100644 index 0000000000000000000000000000000000000000..524caab6ca16c78daa7f1472f618d29436007616 GIT binary patch literal 1220 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzUF?5y0}&5*Gt$m^3w=2;o7>gD3o=Xqc9-ZW>)-jhoi|Ev#{ zuH121cXQ~}zn<^3R5yEmdVPr3{#(ENOi!bDuga~f%t}}slCQp-H#bkxyC{0n?#XZd z{`t^N39=J?u_Wbr#hWFnh>F+U@XU&jN z*|~Jps?~ZvGa1fqUh1|@rP45a@7v_v&(F_awd&)hT}4a&KW(3``cl0zJz15>BzP`o zmFdaP`)fZ{ojRqzH}PPnwcL!D{deZ46h(+N6t6aRR6qHV=bYXawdLEltiN6R@9C!- z*Zls!IDVhcuckJ0()-CZyCy0z&RTJfWvAfSo&NF3ucx&u|0@E+ zV;8TL=RCPTAAEm#zvquF-cla7cXjR0t@f%rl}^50EW&;vWwFT%^GQ1ME8lj0Ok6lA z*mxy z+#P3n_2=tdi|0RCs?tAq&sM9d#8WH_`m`s{nY-ij!b>lwU8>wX=UvI^M!)T6^2!n! zRM?|~jqT(A{BYOzm({X>Ws85zNSY2Z&ePS;Wt~$( F69A{5TB!g4 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_070.png b/res/wearable/images/tw_fota_progress_070.png new file mode 100644 index 0000000000000000000000000000000000000000..83fc82976b4d672961ddecc2b487d8fee99654ee GIT binary patch literal 1163 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dzg$b#J0FST-|yr0<>Ey_+AApSLoPP_F9e0 zsomrI6h5t2juTD<2=dQk(sWtaTs<-M|Cvjd7k(6YV(sn6V=|wA&xbvG_J4m`{p-`G zPj;L@*Np;-LV(BB`edhy@L@hCgHN~SZrXZRQ+}KE)2PqAwfj{yJ^Q8xwaM~6s9zlQ zK4Ew8Hg(He*7s`b^1pvOdi(soId^A2iP215x9Zwo4~DES*_ZE5E}ma+_VHl2wfCyI z|1CCd`}Oqs8xSgrj+Wu||*>fLDjD}23sYYU=R zxlNMs+mz{Wlff-&f73t9lZ&59-|xNZXL@}3@$cvU%vvIvf02Rt;`#;NlZx+Fhfkh* z^w)WrHFI|_Ntb1pZqzrFzcheC#S>OohqrXUdvD4R&vT|cksTOH7oa+z6oIX x^R@r;(v7yp^K)!V(=Vy>P!#tx*PQU;AB&;jgy-v5_i%tL^K|udS?83{1ON}{L_Yuk literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_071.png b/res/wearable/images/tw_fota_progress_071.png new file mode 100644 index 0000000000000000000000000000000000000000..722d775eb7c8bfb667dc56abce8874347d862635 GIT binary patch literal 1146 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzeiUCb18c%oR7OgbKPncZxd+HvHRSI*nqORPCtJ*T@V zu?UraUaT}pMC%osV`mfBMJGprl7mP8T5HNk&)utZW`)IhW^umnbNKJQdi?m#Y@owN z0f`}S;CIr~2+4KpC9EbqshCvy-irS~`>Kz-m`@+~GCsLY{Cv!&Rqsz_V$D) z>s8!$&k|VRuAB9F-OiN%-`(wG^^Z^QpU&?2&$meD zCjBfu9?W=Qn`69(k!9`A?~SVt{hIag*`mgSlTwPKsE$_U6 d1FPKjWqmYv?asWq8=pW9@pScbS?83{1OTi;Jc|GT literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_072.png b/res/wearable/images/tw_fota_progress_072.png new file mode 100644 index 0000000000000000000000000000000000000000..9ace826f329ef82afc241e6f97e430db61b0af01 GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz^$t{c5YBdW)! z#a=?YWl=~-it; zWUcP!Q&aNs?#5>0-ILC!SWZycS~(^6v1E1btB((+@3x-2XX2CNYrAhPF~#_U+-7@=lJAA>8j)RcVC{O z9_7z&aOm3n1?$y3|Nm}X2oyf|b@rze@0koIJ~RKCtx~@>ZvK6<9Ov&39@hG1Ixug^ z_}dWYS@d+j--XJ|-%oD5t3B-*r@Pc=`wWmRW;Oa>^6RIsv3t3HgSDq-q@Pj6i9fshr<>_39mu$4u|Qu{a!t&? zH;(Vm?)1M@{qyv!m_KiQcJ3E_$WU=lJ6e`dG!AC@hO^&93cr_LUtQYi3v#EYtDnm{ Hr-UW|0*^1) literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_073.png b/res/wearable/images/tw_fota_progress_073.png new file mode 100644 index 0000000000000000000000000000000000000000..0c64d0d8403849cd689da1ccb0d6721a31a60bd2 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzulU za(+;Vh^I-Vjc!^`hfKJ!?w`M5`p>Jy&cAvZU84?i(I~(Ofd~Fa@5{SAU!`>NqRM1X zwcwOTx8J^Yk2?D^*z=ug<&Eck48MbvPu^V^{e3-O%n_0m!Df+9naaY zWbcCb>91Gcb#6c2Zv8mqyfotkpiuaB^KTIs+S`s>Ee0B~r`wl&{hPi$;qQ~9=5s&Byw3*O@kz(?RJr!ryo1NiO!c4pF=xFu zdla71F)$Iv<^NrmCXy*U>tQY}3bOjRPf3j|Um@3JAIrlcm N7oM(uF6*2UngEt#`?&xB literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_074.png b/res/wearable/images/tw_fota_progress_074.png new file mode 100644 index 0000000000000000000000000000000000000000..e44c35842de2e8cde0dd3dbe44b30a0a20bd1407 GIT binary patch literal 985 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzqGbi|75K!*uSUY#03)lPu?i)Whx*YUl;f~%q^?;b8V$LEr z7pFYVPt2y1>e?VB%-T7VtAHo)uGnX~)&r_Y8NMtx8_kU3R!RQ~$WdY_QbVSADFu(fx(_ zO?C`DuQvSIR_XZu-G7P4?^tRXB(6UEef=!+=fhVeo_~*LZ^%BoVb`v=JC21;GPB;S z@2NLQXW432hs(9Ue!P2m`tf literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_076.png b/res/wearable/images/tw_fota_progress_076.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7cb001ba2d44cfbe6c8433f1ec528088de5203 GIT binary patch literal 896 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz9b9Ta@PCKA&)$;#Ye(PDq;MDe{JgXGr_r_;^`G;esGWRv_4>ExKd-jGRSa|6{Od0>%1)-&*CuYS;M z-sJaxo_=~JM}g_z&-{meZZ(>{pS`sH!<)qa*I!RB_PjSe$ZYkhugjf>XIdb~S36wl Y8Q%U%KCyUhNIgiur>mdKI;Vst0RFz_mjD0& literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_078.png b/res/wearable/images/tw_fota_progress_078.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea32ca9cb56ec4a6708594469e052768029ff61 GIT binary patch literal 1075 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 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_084.png b/res/wearable/images/tw_fota_progress_084.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3c8da47a12530dd93f72541b35f62c6c5e99f8 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzQxcz5^&jeS}aP!Da2seg;PlfMYNU~ z9BgP!61<>x)+xv*d2w&jWB;5Z^B2ShT@MAFv0JJV;!e<#V}dC~n> zj~`oq_hSOOkgni^ys7ak28Ni0QzogDtG)DlJFhzZ_C@`urBh;dF-XkSI_ZA(*xIFg zH+%`-9lS5M{FL)zKGqHMOxwQ9QJ?%K%l7XtuVw3ZtDXF&@_xJZ)3;^IW9*mkFeERP zI%J&Z^C|T6I(GAXi%$pb*UtAY$|&4sW!s{|ken_0vay_WA+wCb)V zcl150;_jIy4)J$ce>JN3$5?-N$~<$&&bA=^<=da7|1SEkT4goiVaYd!*HOBxRcpEP zR4ni9czDgn{#(-f`|n=Pt9kkR>e1rclisXX7Cx|J<>uyl^PlXy7JPh~@x?h3TQ>gr z_u2gJWc~L(o8~;3sq#$b!2dX1)?KSs@p{J1y|YpK?A_wC2dg*lD)}+dS97mQ<=QEq zQe|f{9P^Ep{Zg~)n9u7Av%{?=_Plv?eEIn`bN-g7ohz-^)vUvv3I*a+ke~T zE$r#1TDiUr7$U2$RXXhs-lk$X=Sjk^xnEPC9{RcYx%~ZIwoA(mPxgIrmtk15@~iEO zqc>ko2jZPyxIY}4nl0XU#&@kOk6iyF9)qa2emnQy)s)Yxdi?qPrTVGw+Et|8Ww;x> z)$(^G=TBNcS>{8g`GH@?Gavq)El1Y`HqtHQxqn|VXV%mmpTx94LE-7@=d#Wzp$P!m CQ)m|e literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_085.png b/res/wearable/images/tw_fota_progress_085.png new file mode 100644 index 0000000000000000000000000000000000000000..efbe6bddaab76f74c44f06715bd1648c0b884cee GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzJ|6*LSKIcITbYIKNg zoh7kIESKAB%M7tghkWfhuACKUacyco7~!XE_IPhTx9Fmzcc+T=&OG02y@&nW=BkRH z^S;kv0lJUoph`N&>Og4q$xiJllJVih%9~0!*+pxmez}~N$=Tj z-9COi?RmIS(c?DLcec}>ygYjHRgUjXhF?x=mHX=V{HfLrHMRS7>G`&SCR3T%Uk0Yt5&`9|5TKHejktTo4Cz$CO=uPf8Ty<)u$U3lV++MzHY1FFn>k$ z5yLr8b~mow{zhu{-$K*1(${qE6xAjE`?D|lz2ElBzMnECJ>I&65+bSc@MQzLi*eehSlcwPb$nHJ7zEdeX~l@6wG*-aoc=mljWtv$z~-vDfmX zxhG#}=wx<3hF9U~j{j$+6g|H3`gzse8$X|3>GY02^Tub>oD{8-PhZROEx3Qh_R$RK z9Y6bIJ@1{IT72$*V5#-<>C5DIzkcj)YC&#lN8GgAfZod0%qS2I;`bp-Ka^B3DY5((hv9)?p>Xt(PNtb<} zF-L4)SG&WgY{#37`cKav9{jfLsfy~!&vnySF2paJR5Pos{2R>^*{B7$Lg2#T`wo%I Uf;fX;od7BEboFyt=akR{0AD0)R{#J2 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_086.png b/res/wearable/images/tw_fota_progress_086.png new file mode 100644 index 0000000000000000000000000000000000000000..583dda4482db13ef2e12bd3628d6810c7d2cb770 GIT binary patch literal 1227 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz!0@Ysvq;e z%iLoDI*%6M#)DaZ`9A2s@iLl{vh2Pi!;jnBRE*c=TBqH1x3>)O^3+^66~<-nM<$mDv#tdqcPL{`#kqKI`^z>9?K1-q~mDf~I~deSL6adbJ?Wg6mm< z7qsR7MR}eJE9dR!lmB01cec^Ao^j8|m)4iN?c@I_ooxJij^jf1R*e^;`KpzhYzwm% z7Jg@rz9tp-=i}`6>*m{SQ$ATVX=SND`-S9E%jSF2pKR7WFMsAj_WSjgF=^}l{#HHM z*S^_czKXu;&y2aB8NbBDn!Q*a&2KyJ+iLaeR^@)v#M0~PYyaGvT4WdL6?pDITS#}4 z-qJmWJDxukUYhle5U z{m(x?xBvU$ul(xACdc?~GJf}*!E8g6Xvw6KT}!7vahbF@a%%q1Q&*1O=d-h#79=*= zX6lpMcCIWp?pWRZ^Ih|QfZ(3XUdVk(hR017v9q%O^upKatM5|FXgT?T>7da|Gp4N Nv!|<{%Q~loCIB*bV(tI{ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_087.png b/res/wearable/images/tw_fota_progress_087.png new file mode 100644 index 0000000000000000000000000000000000000000..5d67e0c0a180ec08e24ff5fe7d29971d79a4a991 GIT binary patch literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz0*nh8}9j9mCIG?`z_g?ne4B@su?^sS)Y7)?A+_qAEcLym7SZmo5#eV zH_ZLVEtSt#`?61c*f?4I_S~Rbo1Y&47IQPYSkB?P$t%7cA)%pfJwDZK&HZp}wVHiI zPR#b*Q&lu?#;tvFw`}>H_-Wd1^B~>x)ZXw4U>?RZd=OFF!3s;iUCjzseQ! zY#QF(^kR-xo#_>N*UseQwV?m=tY`l(j8#5avOAbBKSA2z`q!(n1)Om{pPoEetiRUe zeQnO!`PV{E)@rBw>Fb=Y|Mrn>3uDRMW&4}s{sw(`sNx>|UB>J6fg`(Si9e6C-T33) zYkl>~ZPRNR_HKH~zH8Mg>q#=w5__$~xs!IwX0f-=9Xz4`ld_RQ<(734 z5w8zT&40Gv!o2WyL|v`UrxMMlXYV~{{Nff`exPcrb!z>jmnzNw%i{F@6nuK4yxT2I zFD^r6rq8E4Zr>P7ZcmeZp^{mCDr3@274tt&6DnWc-puaaHf{g^Dua_DlbTJRFqT{m zt2pv;xAE^)!k&4apDxP3pZ59rJjwN8$A2DH>AxP#UNBR8sY?FzwB5nW*3HvBeKwl^ zjJl@hJ|Cl)Vz~oPUvJ+ps=IW_*7qlZJ*Q2snVz!bnF+(cwERgQcPUdVO^upEwGjCC azK(H+(rT8dAI+Q~Lp@#nT-G@yGywqacWCMW literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_088.png b/res/wearable/images/tw_fota_progress_088.png new file mode 100644 index 0000000000000000000000000000000000000000..553146dbb1ec2f61920d0677783b3e5d100415b5 GIT binary patch literal 1189 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzyL$5CBzD;lohF6S zukyQ&-4?SF5pi5K`Rc+4R}L<;*t*m=XTx#DPEE5(`))ijTR)%w&dWIut!p3tJ7>uW zbQwip@zch2%nSv)XR3%#wz*p>zz`lWoGBzs#=-(y5#ynhIdyYt~0({7L`3o#;a)C_U!!q{}1xlPfNT0^>xnEoW>^0nOAGk6m+76)BmpL}NBl;ZyfO~1)|yvq4zXCIe+_7i)7{>@9Q zdqY;SPoDGA*Ee5!&+og3WTzBQO8NKXxNn{HUsuhg;a;Aasm`03c(PY-zcf!}|CeRU z#Q9nB=UcAN`uDp0T>Sqxy?;H$CfQ7Wa=e#^bA#O8b=efKJuZGeauax_KU0>SmZhX;x-?e)|MW1hVUe`NQ`}Ld8 zq@60~RcGG)FoEIqmaFbE|1)m=s+#mYJUUwM`Okd2Dy5TCRrFPVmKlF$TklH_lm~{!x*eA$G^tizl7i<89|WDVkz@!1m=y75x%fCW;crsAk%R cK*QPZ=8Lzj`oYie;SIhAqL%=Py|A{mIvK!{1x~k|)=f z-`%i2-Bvy{G^&2CMOj&1O^)X2@Q=^dWqCE2mi*$Z+O_fVvG440zl-iZoipX8eVpvv zS<>>mRZrei*&cVchhh5VkKw1H+~ulw8CLwArqaG{M`dB%uRou+n~T-kY}P)h?}71zkFTgr{2k0&t?49xVxmvfk+Z5I)ojw{f$tJkigdt4Q?^Eui_Sbw&2bS)7%|}M+8PzfXA#fq> YKSN>p;*{vVyf~2cp00i_>zopr0ET8^&;S4c literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_090.png b/res/wearable/images/tw_fota_progress_090.png new file mode 100644 index 0000000000000000000000000000000000000000..c37815d6b57764aa9bb337a900a5456f420c5f0f GIT binary patch literal 1233 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz0<&VtSb#n#;r+Wx;I8xwt%SpO~?E@dl#|8|UYh4|MpRTYp%0@BQOH zHJm`_5e+`nmsd|}f5pdmpex90l8@TX3%3lcjQ4zh;G(Jem${*eN3GJ*Q}V{P#dkhk z^Zy*}_oqy4X$Y6p0=wwRHPe=CQU5;uV|g|A+&oR~6NZ58*sv_~s%*ks3C|*%lNTS}y}Wi~a=h*zUrY6qcRl0wTV8Bfmi2|J z>gmK|+fbR zUpG^{;1VaKHgoPOJ@uQDpB~z~PV42_`88i>$A7=SyLRcE-JWGGmdx2lxPJLt-Q8q- za=E8jTybJ%V%ob8PnO=hzI?mdOI6DmPa=f&3o~WAIj+C-a@z7qdoJ7S7aQBh)l@yt z?G`_m>s4fTaXHQMqH%3r_Vkf>iT^RC4E=ATnDH%n$s*I7Ts-mfV8tRUm8m;JsI zyjGg|$X6MkJ{mJ=&%~6k`u7>Gq$E!>_qi2b%*U|quyGa9>19;m;0S??p8Jf)q;`p0 Sg;gvBxyaMi&t;ucLK6UtcU#r~ literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_091.png b/res/wearable/images/tw_fota_progress_091.png new file mode 100644 index 0000000000000000000000000000000000000000..5554045362b03e7b57745aca13d8e859d718ec33 GIT binary patch literal 1198 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzfzDYrcf@e#+EY!2=SR19qVbv)lHT{A8f&h`Awcf2im=|hUbTl`4 z&vA0t#3{S#{KH4Pn#ObBy&$GWPI=}P7+i6v9y-wa^bugCmE;96#tbMgJ zsD9hF$nD-Ue{8Z@xuEg?sw}Gmx>-6Wt398!sqyn}kBhw{RasK?W!J~4D#ydpSDj6J z#Mqp$;w8iO1?`h`man=eQJq%y)7Z2_x zuf0BPn_Hjk{*5!%Z=d<(#Ven$fBzj}X6tQwcW$A|e6^WUwSR7Ic{XjEQQh(VQ$Nr9 z?71u~U2FD5hx0jwcaFSk-}ihq^V*fyULMU}yZ!vq(?x!hmQSAZBHk)tg64~NH5I?D z=dbUPt500Ae7V>2Psbj;-t4J1_Z34`YWHIA(%pAv&s8oJzI*2WzAZ(Cf6sjRdwc)? zOJ18Mq->l2v*BPe>)oYSXTA!WB%W`!{#DNZjfVBFc5j`|FMn6}`TEHbq2DT5+W76~d`kvfj(>%fD$kTbpC4@t9Yj)HYPi0QM#H}kbl3m{ZQe)D* zb<-@CW8J%;Kg?;SwL3Hvo6L+ZwHTRQtC=Hq?t%bsPr>o)um98)h`m2;`C*M5-*el1 zCZOYRfdf@{=07>R%$ecC`im;^>NB<9POLh9`R?G^Rs2@`HOem}q0^PEa$&5w!AH@{sozaI7d&AnZHrTbNHS{nyGGc%Jj z$au5hcfwES`%85nfA7t!e}3i9H~({~bDz#p**$5`#=@5kj!PH(UUF@h!KX{@@>}Lx z?Rk1kTwnHd^7%V&!`L^>YI@fk>1Zx#P;tnUsZES)z^?ohqccyP5Jo#eSXkbbwfyq$yJqUr8TFozzUMVWJ9rl9UGF!x^D?@WBf}7Od+w8kz-S!>Lp}tU Z-^wReu5z1l@RJV6FP^S`F6*2UngAx3Td4p5 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_093.png b/res/wearable/images/tw_fota_progress_093.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecd08afb082b67c485686375f6af364ace016ed GIT binary patch literal 1191 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzkxX@xz0+Ue3BsXba#a)UDNdgn6 zBrR=9QY^dGxkholn(vQy zx6cMT4-;%S`_AuE*`%_|jtn<8%z1KIW$PLJE9d_D&s(!~*|l3GdJQW}4Nl%v*?OnK zd#-(1)t$c?25;&tepqf5W0hLwpJ~Mq>GvsWQuEq(LC^T+%aqI2RL%MJ=Dxc$|JrY- z)OnvWOC{~QImdePo>@;OhLvj;_wTp3_4h#V%C+BoCS4QF4xglP!63Ed!sPPmN#T=Z zbU$;azPsRc_wS41#cy8yxqZ5*a%=d$xej&-?H3&V1J;@@oszeD^Ya%u?`Lj$e!}~3 z$+Pt0-1CX5CzEf>2;Oikxgfmd>%#ZTF2~nhy;uHV-s`*bp7dRf`}x$KpY4rD_&KYa zZcC?33AzN7^O$t{`rcZTn#9*9<_61t_`lr2JYj2io&Tp_rui!#cOTZb`|FsMhWVMk1{;A$BR$;Gb`m|R<@Vy+P@!vRzJUfzq0QCk4vqwv$yxFS0)QdHl}G_ z;C=P&^~XQX>anjfatofVy|1^w`q8?N4<4O)_O{s5FE_4HbAf~Tirecqd)E1EGWQI6 z{p-V>-}Yd3#tTYsNQvVVWQ zGb;OVsZ4w=-)V+`P5(|IYiTroHr=wD$HS_Q^FDGE_Gt z^1S%C-TEZA=R6P1=)61C2EoP0r`@XNFA4JUycB7@QO$p95KqRBehpvt58Ly+KeZ0Tl3uC^YVPp z$wq74jZ}x`Ke;k^!9j8p4qZrB%*d-H2-_+`TMQu-(=&Se=7DY`<{OKR9icv z^3^P>27B$LOQuZvc4nWlC)?|oecC4*6;l|M(;WIY0k|o%d?)PJQC@?`551?9ZQ{R<`D|zu!~w{L{_LcU88lS=u+bBzW+=@LgaYf8Y1h zjrh8sr(2Di`TOHzemyz6JDg4YdY$0k8BZRn#P?_jN-!~33BNddefOlA$=cUftCaq1 zfA9Cd>XXNNpt*Ce&)GHO$yyb8^+>r|%>(~^)|&41f9<~a=hTB|*Xz|?y=Qs({43-0 zrYHS9{ZhW}m0{=!T5B5YFSmcW>E6FV>-e5+_Uu#Jx$>d~!z7jYsy~fRDtqQ->|kxk lE}6}T6yu}JVG#mmH{{=2b~&YNvuptQ$J5o%Wt~$(69A-FRC)ja literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_095.png b/res/wearable/images/tw_fota_progress_095.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ebe826248e4377e12264f8d72a8ecce2b9fe4f GIT binary patch literal 1160 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{DzfpgH1q;h9&H}B|$}-diy{GZCUNiarsBj0bRfn44-uOLs=YP!oe2Cw!!g9}Z z6`WusxzA_4=JhRZ+1dZAOaHuh`95ncuRHU+ z)EzGw*6cp1a(vPpk4@TZFK+oJ>-GDrzxCRe-zQJp80LBRc7a<0>ltNsXX}&fo_*?- z>PvZe-`h_3c3XXyGP~V6$-7sooX)Omz4^&KKA36sBNkf;JylDaEw$-x_pPRVdpNl} zHObxD|NnmXNps%%+a&0kyb!gU!@4r=* z_;35h#mn>fd-q@Re81JrcRgqQ{3nZ5l6{}CRJ^K$ds=Ptt{uGBK)&;I^>bP0l+XkKYp*;s literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_096.png b/res/wearable/images/tw_fota_progress_096.png new file mode 100644 index 0000000000000000000000000000000000000000..340e68337a69d4fc971031eb8fb341812981521f GIT binary patch literal 1139 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dznd2YN7klcdgt2VQm>89l{nuMnDNAwM1->ATvuct@moC^nxq0)2l`nz{ zidHrW1Quvmbxd2-?eTHJpPxl>zzT$*p6%$>$AGA3B>fc-Je(5ky| zGN^V`c-iE!s?j^f3ka>ybt8)8Z%~qS4JO8IY|9N$DW#Q8=%kS>D(tfu0r}w0jsy;2pK8v_BPYv4iD(T#m zl<2fw{JZDge`mM1qR938_m$`4?W&E8^1l>LI_+8KTeNasR0Esl(kIP_)wl8G$nKrL zO3U-vy6K+l)GcSFluz0xWy~nGc5;f<$&g9So?+K#Gas1K>)9qYhY1v2qhNT3z>LrQ Xr3Z><9Il;s9^^q!S3j3^P6^WTwBZ z5szFTu9GZ3Q z!_U_mef)kR!SrifskphCjy>0`$f^7O+^U*(GU(E&%^PpuwO@Bva(~S-x&ME!JbSnH zp=sr3kH_;>W>4zTsfuWb3-a>(Ki$19Z~gBIoy+q}_Rl)*S?B%9dD8nyHFC$(HYB`R zFf%kX)U(L;zopr09)-j9{>OV literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_098.png b/res/wearable/images/tw_fota_progress_098.png new file mode 100644 index 0000000000000000000000000000000000000000..b056990db008868ccd16ebfb3811fc7d7f626521 GIT binary patch literal 1057 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv4mO}j)zieQK#H@#BeEDsGlDRqh0+%XAVZ}p zB%;K*C^fMpzledMVotHoNq?`<0v~Np-Jk+rZ*N~cO*RI{Dz}zpO*Dsh}VcqgF>dy8~G1fYP$dFwg zoD&5?cuxJyNbGdsJasX#?RlfU@dtbR3i0B&bC$(j4qv-e9(yjEbjP>I+Vk&sDc>Nq z%2`i5(;qpOuPC)*uwCf$$%4Jr=4W;6ug#G>alV#8{`U)PpL*Cn?X~V*GGRLCo9t|hQg%;!Tpz#voR;{Pu6=&&3#vt33wNCQ_2mxdargFTx86N? zAi*_jmCn2mKmMs4P8VdUYHeDk#l3vS#~I9h3m2?Bl{IOu@HvePi?*g^LeZODtxsO! zJbvt)689Ib{K9~xM^%jf-_nRW`}W%Rxo59!-#Yi%t#-HK)Q3*RrT=bSGUwYjVA2>dw2j?#1NSMc%tz|9{oBh&szFe||hm%P!A0IQbx6`L&nizw+)~^U2M8uN-mfhf7lKQ|5?n9SLWilWf;A zJW{?#rSN8on9rJdphlkO%-o&gex*OUqgh{lS3CJQzB{XO!np@!R@u_a-=A&{`Mb5` zcXQC)2>X*x?-TwMeZF?{->NJXlPkFkUovbte`#}gWW|pc(doI1U#(g5{Zj0ke`(oM zmrP%>d`hM=tMA)&wzVJ4o~ymse_{U;je@16v-ljed7t08A6pwcO;4F4CY5WJ8jpU# zF%jR_8X2<;_8gcw^}j6BIxC=7x7kKteaH+ zby>?ZNzaT^b5*`isyUTuSf6Xg2aKgrFziF%&+Pg3s{;4cy}z>^vm9go9#4#q}-d3|$JP+rT zE!%PR?31UyTq|yTc=fKVpzPy>U4edw3zz)c(YY=A(t=ziCD+^XHT&%6E(y`l`m@XN zCBuig?|%K$RB~Hd?7-;@HnsrMvtDnm{r-UW|q>7xA literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_bg.png b/res/wearable/images/tw_fota_progress_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..57c41671211ab3c6b43889bc02e7ac1a2dc32609 GIT binary patch literal 18895 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 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_fota_progress_final.png b/res/wearable/images/tw_fota_progress_final.png new file mode 100644 index 0000000000000000000000000000000000000000..7959b95bcacfdf3bd6558a9f38624498a3ae34a0 GIT binary patch literal 17677 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 literal 0 HcmV?d00001 diff --git a/res/wearable/images/tw_start_downloading.png b/res/wearable/images/tw_start_downloading.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ab5d27ed5a51e45b6631c6542c4661479cad8f GIT binary patch literal 17714 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 literal 0 HcmV?d00001 diff --git a/rw-update-ani/CMakeLists.txt b/rw-update-ani/CMakeLists.txt new file mode 100644 index 0000000..845d479 --- /dev/null +++ b/rw-update-ani/CMakeLists.txt @@ -0,0 +1,59 @@ +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 + 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 100644 index 0000000..c5f1421 --- /dev/null +++ b/rw-update-ani/rw-update-ani_new.c @@ -0,0 +1,420 @@ +/* + * 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 "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" +}; + +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; + + 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: { + 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 100644 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 100644 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 100644 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 100644 index 0000000..24ca7f9 --- /dev/null +++ b/rw-update-ani/rw-update_new_cairo_w_360_360.c @@ -0,0 +1,491 @@ +/* + * 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 // 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 100644 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 100644 index 0000000..456e184 --- /dev/null +++ b/rw-update-ani/rw-update_new_common_display.h @@ -0,0 +1,84 @@ +/* + * 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; + + bool use_tdm_hwc; + tdm_hwc *hwc; +} 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 100644 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 100644 index 0000000..b01631a --- /dev/null +++ b/rw-update-ani/rw-update_new_fb_cairo.c @@ -0,0 +1,256 @@ +/* + * 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 + +#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 100644 index 0000000..a8ff0f7 --- /dev/null +++ b/rw-update-ani/rw-update_new_tdm_display.c @@ -0,0 +1,465 @@ +/* + * 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; + } + + err = tdm_output_set_mode(output, &output_mode[0]); + if (err != TDM_ERROR_NONE) { + _DEBUG_EXCEPTION("failed to set mode. 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 + + /* CHECK HWC USAGE */ + tdm_output_capability output_caps; + tdm_output_get_capabilities(st_disp->output, &output_caps); + if (output_caps & TDM_OUTPUT_CAPABILITY_HWC) + st_disp->use_tdm_hwc = true; + else + st_disp->use_tdm_hwc = false; + + /* SET LAYER */ + if (st_disp->use_tdm_hwc) { + st_disp->hwc = tdm_output_get_hwc(st_disp->output, &err); + if (!st_disp->hwc) { + _DEBUG_EXCEPTION("failed to get hwc. error num = %d\n", err); + goto exit; + } + } else { + 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; + } + + if (st_disp->use_tdm_hwc) { + uint32_t num_types; + tdm_region damage; + memset(&damage, 0, sizeof(damage)); + + tdm_hwc_set_client_target_buffer(st_disp->hwc, st_disp->surf[buf_cnt], damage); + tdm_hwc_validate(st_disp->hwc, NULL, 0, &num_types); + tdm_hwc_accept_validation(st_disp->hwc); + tdm_hwc_commit(st_disp->hwc, 1, chg_common_display_commit_handler_cb, st_disp); + } else { + 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; + + if (st_disp->use_tdm_hwc) { + uint32_t num_types; + tdm_region damage; + memset(&damage, 0, sizeof(damage)); + + tdm_hwc_set_client_target_buffer(st_disp->hwc, st_disp->surf[buf_cnt], damage); + tdm_hwc_validate(st_disp->hwc, NULL, 0, &num_types); + tdm_hwc_accept_validation(st_disp->hwc); + tdm_hwc_commit(st_disp->hwc, 1, chg_common_display_commit_handler_cb, st_disp); + } else { + 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; +} -- 2.34.1