updateLogic.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. #pragma once
  2. #include "uart/ProtocolSender.h"
  3. #include <sys/sysinfo.h>
  4. #include "manager/ConfigManager.h"
  5. #include "net/NetManager.h"
  6. #include "core/update_assistant.h"
  7. #include "edge/popup_service.h"
  8. #include "base/strings.hpp"
  9. #include "restclient-cpp/restclient.h"
  10. #include "base/http_client.h"
  11. #include "net/tcp_client.h"
  12. #include "os/UpgradeMonitor.h"
  13. #include "core/utilities.h"
  14. #include "service/BusinessConfig.h"
  15. #include "manager/LanguageManager.h"
  16. /*
  17. *此文件由GUI工具生成
  18. *文件功能:用于处理用户的逻辑相应代码
  19. *功能说明:
  20. *========================onButtonClick_XXXX
  21. 当页面中的按键按下后系统会调用对应的函数,XXX代表GUI工具里面的[ID值]名称,
  22. 如Button1,当返回值为false的时候系统将不再处理这个按键,返回true的时候系统将会继续处理此按键。比如SYS_BACK.
  23. *========================onSlideWindowItemClick_XXXX(int index)
  24. 当页面中存在滑动窗口并且用户点击了滑动窗口的图标后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  25. 如slideWindow1;index 代表按下图标的偏移值
  26. *========================onSeekBarChange_XXXX(int progress)
  27. 当页面中存在滑动条并且用户改变了进度后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  28. 如SeekBar1;progress 代表当前的进度值
  29. *========================ogetListItemCount_XXXX()
  30. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表的总数目,XXX代表GUI工具里面的[ID值]名称,
  31. 如List1;返回值为当前列表的总条数
  32. *========================oobtainListItemData_XXXX(ZKListView::ZKListItem *pListItem, int index)
  33. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表当前条目下的内容信息,XXX代表GUI工具里面的[ID值]名称,
  34. 如List1;pListItem 是贴图中的单条目对象,index是列表总目的偏移量。具体见函数说明
  35. *========================常用接口===============
  36. *LOGD(...) 打印调试信息的接口
  37. *mTextXXXPtr->setText("****") 在控件TextXXX上显示文字****
  38. *mButton1Ptr->setSelected(true); 将控件mButton1设置为选中模式,图片会切换成选中图片,按钮文字会切换为选中后的颜色
  39. *mSeekBarPtr->setProgress(12) 在控件mSeekBar上将进度调整到12
  40. *mListView1Ptr->refreshListView() 让mListView1 重新刷新,当列表数据变化后调用
  41. *mDashbroadView1Ptr->setTargetAngle(120) 在控件mDashbroadView1上指针显示角度调整到120度
  42. *
  43. * 在Eclipse编辑器中 使用 “alt + /” 快捷键可以打开智能提示
  44. */
  45. namespace {
  46. base::UpdateAssistant assistant;
  47. base::VersionInfo info;
  48. enum Timer {
  49. kTimerProgress,
  50. };
  51. int loading_index = 0;
  52. }
  53. Json::Value linuxVersionList;
  54. string updateUrl;
  55. int chooseVersionId;
  56. static void getLinuxVersionList() {
  57. std::string url = getHttpGateway() + "/util/get_linux_version_list";
  58. LOGD("请求Linux设备初始化版本列表. url = %s", url.c_str());
  59. //发起HTTP GET请求
  60. RestClient::Response r = RestClient::get(url);
  61. if (r.code != 200) {
  62. LOGD("请求Linux设备初始化版本列表-> 错误代码: %d", r.code);
  63. return;
  64. }
  65. LOGD("获得Linux设备初始化版本列表. result = %s", r.body.c_str());
  66. //解析json
  67. Json::Reader reader;
  68. Json::Value root;
  69. if(reader.parse(r.body, root, false)) {
  70. linuxVersionList = root;
  71. mDeviceTypeListViewPtr->refreshListView();
  72. }
  73. }
  74. void NavibarSetProgressWindowVisible(bool visible) {
  75. mProgressWindowPtr->setVisible(visible);
  76. }
  77. void NavibarSetDialog1WindowVisible(bool visible) {
  78. mDialogWindowPtr->setVisible(visible);
  79. }
  80. void NavibarSetProgressMessage(const std::string& msg) {
  81. mProgressMessageTextViewPtr->setText(msg);
  82. }
  83. void NavibarSetDialog1Message(const std::string& msg) {
  84. mDialogTextViewPtr->setText(msg);
  85. }
  86. void NavibarProgressAnimation(bool visible) {
  87. mProgressLoadingTextViewPtr->setVisible(visible);
  88. if (visible) {
  89. loading_index = 0;
  90. mActivityPtr->registerUserTimer(kTimerProgress, 100);
  91. return;
  92. }
  93. mActivityPtr->unregisterUserTimer(kTimerProgress);
  94. }
  95. void NavibarDialog1ClickOk() {
  96. while (PopupService::instance()->busy_) {
  97. PopupService::instance()->busy_ = false;
  98. }
  99. //EASYUICONTEXT->hideNaviBar();
  100. }
  101. struct sysinfo info2;
  102. static bool isUpdate = false;
  103. bool getIsUpdate() {
  104. return isUpdate;
  105. }
  106. void updateDevice(){
  107. sysinfo(&info2);
  108. LOGD("关闭页面前,totalram == %ld", info2.totalram);
  109. LOGD("关闭页面前,freeram == %ld", info2.freeram);
  110. EASYUICONTEXT->closeActivity("mianActivity");
  111. EASYUICONTEXT->closeActivity("callActivity");
  112. EASYUICONTEXT->closeActivity("functionActivity");
  113. EASYUICONTEXT->closeActivity("medicalActivity");
  114. EASYUICONTEXT->closeActivity("promptActivity");
  115. EASYUICONTEXT->closeActivity("settingActivity");
  116. EASYUICONTEXT->closeActivity("sipTestActivity");
  117. EASYUICONTEXT->closeActivity("deviceInfoActivity");
  118. sysinfo(&info2);
  119. LOGD("关闭页面后,存在延迟,totalram == %ld", info2.totalram);
  120. LOGD("关闭页面后,存在延迟,freeram == %ld", info2.freeram);
  121. isUpdate = true;
  122. PopupService::Show([](PopupService* srv){
  123. base::HttpClient client;
  124. client.SetConnectionTimeout(5000);
  125. client.SetTimeout(120 * 1000);
  126. std::string url = getHttpGateway() + "/" + info.url.c_str();
  127. LOGD("请求更新文件的url: %s", url.c_str());
  128. sysinfo(&info2);
  129. LOGD("进行下载前,totalram == %ld", info2.totalram);
  130. LOGD("进行下载前,freeram == %ld", info2.freeram);
  131. base::HttpRequest req("GET", url, ""); // 去获取文件
  132. const char* tmp_file = "/tmp/update.img";
  133. base::HttpResponse response =
  134. client.Do(req, tmp_file, [srv, info](int64_t dltotal,
  135. int64_t dlnow, int64_t ultotal, int64_t ulnow){
  136. LOGD("downloading %lld/%lld", dlnow, dltotal);
  137. string msg = LANGUAGEMANAGER->getValue("Downloading") + " %.0f%%";
  138. srv->SetMessage(base::format(msg.c_str(),
  139. dltotal == 0 ? 0 : (dlnow * 1.0/dltotal * 100)));
  140. return 0;
  141. });
  142. if (response.StatusCode() != 200) { // 下载失败
  143. string msg = LANGUAGEMANAGER->getValue("DownloadFailed") + "%d";
  144. srv->SetMessage(base::format(msg.c_str(), response.ErrorCode()));
  145. return -1;
  146. isUpdate = false;
  147. }
  148. const char* msg = "-1";
  149. TcpClient::instance()->sendMsg(msg);
  150. TcpClient::instance()->closeTcp();
  151. pingThreadExitPending();
  152. // TODO: 应该去判断一下,下载的版本是否真的大于当前版本号
  153. UpgradeMonitor::getInstance()->checkUpgradeFile("/mnt/extsd");
  154. LOGD("img版本-> %s", "");
  155. system("touch /tmp/zkautoupgrade");
  156. UPGRADEMONITOR->checkUpgradeFile("/tmp");
  157. return 0;
  158. });
  159. }
  160. void openInitWindow() {
  161. getLinuxVersionList();
  162. chooseVersionId = 0;
  163. mInitWindowPtr->showWnd();
  164. }
  165. /**
  166. * 注册定时器
  167. * 填充数组用于注册定时器
  168. * 注意:id不能重复
  169. */
  170. static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  171. //{0, 6000}, //定时器id=0, 时间间隔6秒
  172. //{1, 1000},
  173. };
  174. /**
  175. * 当界面构造时触发
  176. */
  177. static void onUI_init(){
  178. //Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
  179. std::string currentVersion = getVersionCode();
  180. int currentVersionNo = getVersionNo();
  181. mVersionPtr->setText(currentVersion); // 写入界面的版本
  182. mVersionNoPtr->setText(to_string(currentVersionNo)); // 写入界面的版本号
  183. mProgressWindowPtr->setVisible(false);
  184. mDialogWindowPtr->setVisible(false);
  185. mInitWindowPtr->hideWnd();
  186. }
  187. /**
  188. * 当切换到该界面时触发
  189. */
  190. static void onUI_intent(const Intent *intentPtr) {
  191. sysinfo(&info2);
  192. LOGD("跳转到升级页面,totalram == %ld", info2.totalram);
  193. LOGD("跳转到升级页面,freeram == %ld", info2.freeram);
  194. isUpdate = false;
  195. if (intentPtr != NULL) {
  196. std::string _appUpdate = intentPtr->getExtra(appUpdate);
  197. if (_appUpdate == "true") {
  198. int ret = assistant.GetLatest("bed", &info);
  199. // int currentVersionNo = StoragePreferences::getInt(JHWS_VERSION_NUMBER, GetVersionNo());
  200. int currentVersionNo = getVersionNo();
  201. LOGD("from server : %s %d, from device: %d", info.version.c_str(), info.versionNo, currentVersionNo);
  202. if (currentVersionNo < info.versionNo) {
  203. updateDevice();
  204. }
  205. else {
  206. EASYUICONTEXT->closeActivity("updateActivity");
  207. }
  208. }
  209. }
  210. }
  211. /*
  212. * 当界面显示时触发
  213. */
  214. static void onUI_show() {
  215. EASYUICONTEXT->hideStatusBar();
  216. EASYUICONTEXT->hideNaviBar();
  217. }
  218. /*
  219. * 当界面隐藏时触发
  220. */
  221. static void onUI_hide() {
  222. }
  223. /*
  224. * 当界面完全退出时触发
  225. */
  226. static void onUI_quit() {
  227. }
  228. /**
  229. * 串口数据回调接口
  230. */
  231. static void onProtocolDataUpdate(const SProtocolData &data) {
  232. }
  233. /**
  234. * 定时器触发函数
  235. * 不建议在此函数中写耗时操作,否则将影响UI刷新
  236. * 参数: id
  237. * 当前所触发定时器的id,与注册时的id相同
  238. * 返回值: true
  239. * 继续运行当前定时器
  240. * false
  241. * 停止运行当前定时器
  242. */
  243. static bool onUI_Timer(int id){
  244. switch (id) {
  245. case kTimerProgress: {
  246. loading_index = (loading_index + 1) % 8;
  247. mProgressLoadingTextViewPtr->setBackgroundPic(
  248. base::format("loading/%d.png", loading_index).c_str());
  249. }
  250. break;
  251. default:
  252. break;
  253. }
  254. return true;
  255. }
  256. /**
  257. * 有新的触摸事件时触发
  258. * 参数:ev
  259. * 新的触摸事件
  260. * 返回值:true
  261. * 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上
  262. * false
  263. * 触摸事件将继续传递到控件上
  264. */
  265. static bool onupdateActivityTouchEvent(const MotionEvent &ev) {
  266. switch (ev.mActionStatus) {
  267. case MotionEvent::E_ACTION_DOWN://触摸按下
  268. //LOGD("时刻 = %ld 坐标 x = %d, y = %d", ev.mEventTime, ev.mX, ev.mY);
  269. break;
  270. case MotionEvent::E_ACTION_MOVE://触摸滑动
  271. break;
  272. case MotionEvent::E_ACTION_UP: //触摸抬起
  273. break;
  274. default:
  275. break;
  276. }
  277. return false;
  278. }
  279. static bool onButtonClick_sys_back(ZKButton *pButton) {
  280. LOGD(" ButtonClick sys_back !!!\n");
  281. return false;
  282. }
  283. static int getListItemCount_DeviceTypeListView(const ZKListView *pListView) {
  284. //LOGD("getListItemCount_DeviceTypeListView !\n");
  285. if (linuxVersionList.size() > 4) {
  286. return linuxVersionList.size();
  287. }
  288. return 4;
  289. }
  290. static void obtainListItemData_DeviceTypeListView(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {
  291. //LOGD(" obtainListItemData_ DeviceTypeListView !!!\n");
  292. string version = linuxVersionList[index]["type_name"].asString() + " " + linuxVersionList[index]["version_code"].asString();
  293. if (version != " ") {
  294. pListItem->setText(version);
  295. }
  296. else {
  297. pListItem->setText("");
  298. }
  299. if (index == chooseVersionId) {
  300. updateUrl = linuxVersionList[chooseVersionId]["app_path"].asString();
  301. pListItem->setSelected(true);
  302. }
  303. else {
  304. pListItem->setSelected(false);
  305. }
  306. }
  307. static void onListItemClick_DeviceTypeListView(ZKListView *pListView, int index, int id) {
  308. //LOGD(" onListItemClick_ DeviceTypeListView !!!\n");
  309. chooseVersionId = index;
  310. updateUrl = linuxVersionList[index]["app_path"].asString();
  311. }
  312. static bool onButtonClick_BackButton(ZKButton *pButton) {
  313. LOGD(" ButtonClick BackButton !!!\n");
  314. mInitWindowPtr->hideWnd();
  315. return false;
  316. }
  317. static bool onButtonClick_FindBackButton(ZKButton *pButton) {
  318. LOGD(" ButtonClick FindBackButton !!!\n");
  319. EASYUICONTEXT->goBack();
  320. return false;
  321. }
  322. static bool onButtonClick_UpdateButton(ZKButton *pButton) {
  323. LOGD(" ButtonClick UpdateButton !!!\n");
  324. PopupService::Show([](PopupService* srv){
  325. string msg = LANGUAGEMANAGER->getValue("Searching");
  326. srv->SetMessage(msg);
  327. if (!NETMANAGER->getEthernetManager()->isConnected()) {
  328. std::string msg = LANGUAGEMANAGER->getValue("EthernetDisconnect");
  329. srv->SetMessage(msg);
  330. return -1;
  331. }
  332. int ret = assistant.GetLatest("bed", &info);
  333. if (ret != 0) {
  334. LOGE("get latest failed ret %d", ret);
  335. msg = LANGUAGEMANAGER->getValue("GetVersionFailed") + "%d";
  336. srv->SetMessage(base::format(msg.c_str(), ret));
  337. return ret;
  338. }
  339. // int currentVersionNo = StoragePreferences::getInt(JHWS_VERSION_NUMBER, GetVersionNo());
  340. int currentVersionNo = getVersionNo();
  341. // LOGD("from server : %s %d, from device: %d", info.version.c_str(), info.versionNo, currentVersionNo);
  342. LOGD("更新版本,服务器版本-> %s, 版本号-> %d, 本机版本号-> %d", info.version.c_str(), info.versionNo, currentVersionNo);
  343. if (currentVersionNo >= info.versionNo) { // 判断本身的版本大于新的版本时,不进行升级
  344. msg = LANGUAGEMANAGER->getValue("IsTheLastVersion"); // 已经是最新版本
  345. srv->SetMessage(msg);
  346. return -1;
  347. }
  348. mVersionNewPtr->setText(info.version);
  349. mVersionNoNewPtr->setText(to_string(info.versionNo));
  350. mFindWindowPtr->showWnd();
  351. return 0;
  352. });
  353. return false;
  354. }
  355. static bool onButtonClick_InitButton(ZKButton *pButton) {
  356. LOGD(" ButtonClick InitButton !!!\n");
  357. Intent* intent = new Intent();
  358. intent->putExtra(functionWindows, "init");
  359. EASYUICONTEXT->openActivity("functionActivity", intent);
  360. return false;
  361. }
  362. static bool onButtonClick_InstantlyButton(ZKButton *pButton) {
  363. LOGD(" ButtonClick InstantlyButton !!!\n");
  364. updateDevice();
  365. return false;
  366. }
  367. static bool onButtonClick_DialogButton(ZKButton *pButton) {
  368. LOGD(" ButtonClick DialogButton !!!\n");
  369. return false;
  370. }
  371. static bool onButtonClick_InitUpdateButton(ZKButton *pButton) {
  372. LOGD(" ButtonClick InitUpdateButton !!!\n");
  373. // 小于的时候,代表在linuxVersionList里面
  374. if (updateUrl != "") {
  375. mProgressWindowPtr->showWnd();
  376. PopupService::Show([](PopupService* srv){
  377. base::HttpClient client;
  378. client.SetConnectionTimeout(5000);
  379. client.SetTimeout(120 * 1000);
  380. std::string url = getHttpGateway() + "/" + updateUrl;
  381. LOGD("请求更新文件的url: %s", url.c_str());
  382. base::HttpRequest req("GET", url, ""); // 去获取文件
  383. const char* tmp_file = "/tmp/update.img";
  384. base::HttpResponse response =
  385. client.Do(req, tmp_file, [srv, info](int64_t dltotal,
  386. int64_t dlnow, int64_t ultotal, int64_t ulnow){
  387. LOGD("downloading %lld/%lld", dlnow, dltotal);
  388. string msg = LANGUAGEMANAGER->getValue("Downloading") + " %.0f%%";
  389. srv->SetMessage(base::format(msg.c_str(),
  390. dltotal == 0 ? 0 : (dlnow * 1.0/dltotal * 100)));
  391. return 0;
  392. });
  393. if (response.StatusCode() != 200) { // 下载失败
  394. string msg = LANGUAGEMANAGER->getValue("DownloadFailed") + "%d";
  395. srv->SetMessage(base::format(msg.c_str(), response.ErrorCode()));
  396. mProgressWindowPtr->hideWnd();
  397. return -1;
  398. }
  399. // TODO: 应该去判断一下,下载的版本是否真的大于当前版本号
  400. UpgradeMonitor::getInstance()->checkUpgradeFile("/mnt/extsd");
  401. LOGD("img版本-> %s", "");
  402. // const char* msg = "-1";
  403. // TcpClient::instance()->sendMsg(msg);
  404. system("touch /tmp/zkautoupgrade");
  405. UPGRADEMONITOR->checkUpgradeFile("/tmp");
  406. return 0;
  407. });
  408. }
  409. return false;
  410. }