deviceInfoLogic.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #pragma once
  2. #include "uart/ProtocolSender.h"
  3. #include "net/NetManager.h"
  4. #include <string>
  5. #include <unistd.h>
  6. #include <sys/reboot.h>
  7. #include "utils/TimeHelper.h"
  8. #include "core/utilities.h"
  9. #include "core/sip_config.h"
  10. #include "base/strings.hpp"
  11. #include "base/base.hpp"
  12. #include "storage/StoragePreferences.h"
  13. #include "service/BusinessConfig.h"
  14. #include "manager/LanguageManager.h"
  15. #include <net/NetUtils.h>
  16. #define ETHERNETMANAGER NETMANAGER->getEthernetManager()
  17. #define WIFIMANAGER NETMANAGER->getWifiManager()
  18. /*
  19. *此文件由GUI工具生成
  20. *文件功能:用于处理用户的逻辑相应代码
  21. *功能说明:
  22. *========================onButtonClick_XXXX
  23. 当页面中的按键按下后系统会调用对应的函数,XXX代表GUI工具里面的[ID值]名称,
  24. 如Button1,当返回值为false的时候系统将不再处理这个按键,返回true的时候系统将会继续处理此按键。比如SYS_BACK.
  25. *========================onSlideWindowItemClick_XXXX(int index)
  26. 当页面中存在滑动窗口并且用户点击了滑动窗口的图标后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  27. 如slideWindow1;index 代表按下图标的偏移值
  28. *========================onSeekBarChange_XXXX(int progress)
  29. 当页面中存在滑动条并且用户改变了进度后系统会调用此函数,XXX代表GUI工具里面的[ID值]名称,
  30. 如SeekBar1;progress 代表当前的进度值
  31. *========================ogetListItemCount_XXXX()
  32. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表的总数目,XXX代表GUI工具里面的[ID值]名称,
  33. 如List1;返回值为当前列表的总条数
  34. *========================oobtainListItemData_XXXX(ZKListView::ZKListItem *pListItem, int index)
  35. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表当前条目下的内容信息,XXX代表GUI工具里面的[ID值]名称,
  36. 如List1;pListItem 是贴图中的单条目对象,index是列表总目的偏移量。具体见函数说明
  37. *========================常用接口===============
  38. *LOGD(...) 打印调试信息的接口
  39. *mTextXXXPtr->setText("****") 在控件TextXXX上显示文字****
  40. *mButton1Ptr->setSelected(true); 将控件mButton1设置为选中模式,图片会切换成选中图片,按钮文字会切换为选中后的颜色
  41. *mSeekBarPtr->setProgress(12) 在控件mSeekBar上将进度调整到12
  42. *mListView1Ptr->refreshListView() 让mListView1 重新刷新,当列表数据变化后调用
  43. *mDashbroadView1Ptr->setTargetAngle(120) 在控件mDashbroadView1上指针显示角度调整到120度
  44. *
  45. * 在Eclipse编辑器中 使用 “alt + /” 快捷键可以打开智能提示
  46. */
  47. void setDeviceInfoTheme() {
  48. int deviceInfoThemeInt = StoragePreferences::getInt(STORE_THEME, defaultThemeInt);
  49. if (deviceInfoThemeInt == 1) {
  50. mDebugPicPainterPtr->setBackgroundPic("/deviceInfo/shbei.png");
  51. mDeviceInfoPicPainterPtr->setBackgroundPic("/deviceInfo/xinxi.png");
  52. mQRCodePicPainterPtr->setBackgroundPic("/deviceInfo/saom.png");
  53. }
  54. else if (deviceInfoThemeInt == 2) {
  55. mDebugPicPainterPtr->setBackgroundPic("/deviceInfo/shbei-pink.png");
  56. mDeviceInfoPicPainterPtr->setBackgroundPic("/deviceInfo/xinxi-pink.png");
  57. mQRCodePicPainterPtr->setBackgroundPic("/deviceInfo/saom-pink.png");
  58. }
  59. }
  60. using namespace std;
  61. struct NetworkConfiguration {
  62. std::string ip;
  63. std::string sub_network_mask;
  64. std::string gateway;
  65. };
  66. NetworkConfiguration GetNetworkConfiguration() {
  67. char ip[64] = {0};
  68. char mask[64] = {0};
  69. char gateway[64] = {0};
  70. char dns1[64] = {0};
  71. char dns2[64] = {0};
  72. if (ETHERNETMANAGER->isAutoMode()) {
  73. ETHERNETMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
  74. } else {
  75. ETHERNETMANAGER->getStaticConfigureInfo(ip, mask, gateway, dns1, dns2);
  76. }
  77. return NetworkConfiguration{ip, mask, gateway};
  78. }
  79. //地址总长
  80. #define ADDRLEN 15
  81. //定义字符串数组保存IP地址、掩码地址、网关地址、首选DNS服务器地址以及备选DNS服务器地址
  82. static string addr[5];
  83. /**
  84. * 字符长度是否正确
  85. * */
  86. const bool isLengthCorrect(const string addr)
  87. {
  88. return addr.size() <= ADDRLEN;
  89. }
  90. /**
  91. * 检查是不是最多只有3个.字符
  92. * */
  93. const bool noMoreThan3charactor(const string addr)
  94. {
  95. //.字符个数
  96. int count = 0;
  97. for(unsigned int level1 = 0; level1 < addr.size(); ++level1)
  98. {
  99. if('.' == addr[level1])
  100. {
  101. ++count;
  102. }
  103. }
  104. return 3 >= count;
  105. }
  106. /*
  107. * 判断所有字符是不是由0~9和.组成
  108. * */
  109. const bool allCharacterIsLegal(const string addr)
  110. {
  111. for(unsigned int level1 = 0; level1 < addr.size(); ++level1)
  112. {
  113. if(false == (('0' <= addr[level1] && addr[level1] <= '9') || '.' == addr[level1]))
  114. {
  115. return false;
  116. }
  117. }
  118. return true;
  119. }
  120. /**
  121. * 判断开头是否是1`9
  122. * */
  123. const bool headIsCorrect(string addr, unsigned int pos = 0)
  124. {
  125. //查找到达末尾,直接返回true
  126. if(addr.size() == pos)
  127. {
  128. return true;
  129. }
  130. //查找.字符
  131. if(string::npos == addr.find('.', pos))
  132. {
  133. if('0' < addr[pos] && addr[pos] <= '9')
  134. {
  135. return true;
  136. }
  137. //如果开头为字符'0'且其后没有字符,那么返回true
  138. else if(addr.size()-1 == pos)
  139. {
  140. return true;
  141. }
  142. return false;
  143. }
  144. else
  145. {
  146. //开头为0~9
  147. if('0' > addr[pos] || addr[pos] > '9')
  148. {
  149. return false;
  150. }
  151. //开头为0,后面没有字符返回false
  152. if('0' == addr[pos] && addr.size()-1 <= pos)
  153. {
  154. return false;
  155. }
  156. //跳过.字符继续查找
  157. return headIsCorrect(addr, addr.find('.', pos)+1);
  158. }
  159. return true; //默认返回true
  160. }
  161. /**
  162. * 检查地址每一小段的长度,最长为3个字符
  163. * */
  164. const bool partCheractorCorrect(const string addr, unsigned int pos = 0)
  165. {
  166. //查找到达末尾,直接返回true
  167. if(addr.size() == pos)
  168. {
  169. return true;
  170. }
  171. //查找.字符
  172. if(string::npos == addr.find('.', pos))
  173. {
  174. if(3 >= addr.size()-pos)
  175. {
  176. return true;
  177. }
  178. return false;
  179. }
  180. else
  181. {
  182. //由于跳过了.字符进行查找,因此判断条件应该是>3
  183. if(3 < addr.find('.', pos) - pos)
  184. {
  185. return false;
  186. }
  187. //跳过.字符继续查找
  188. return partCheractorCorrect(addr, addr.find('.', pos)+1);
  189. }
  190. return true; //默认返回true
  191. }
  192. /**
  193. * 检测地址是否有误
  194. * */
  195. const bool checkAddr(string addr)
  196. {
  197. return (true == headIsCorrect(addr))? //地址每小段开头是否为0~9
  198. (true == partCheractorCorrect(addr))? //每小段字符串最大长度是否为3
  199. (true == noMoreThan3charactor(addr))? //最多是否只有3个.字符
  200. (true == isLengthCorrect(addr))? //地址最大长度是否为15
  201. (true == allCharacterIsLegal(addr))? //所有的字符是否都由0~9和.组成
  202. true: false: false: false: false: false;
  203. // bool ret = true;
  204. //
  205. // ret = headIsCorrect(addr); //地址每小段开头是否为0~9
  206. // if(false == ret){LOGD("---%d---", __LINE__); return ret;}
  207. //
  208. // ret = partCheractorCorrect(addr); //每小段字符串最大长度是否为3
  209. // if(false == ret){LOGD("---%d---", __LINE__); return ret;}
  210. //
  211. // ret = noMoreThan3charactor(addr); //最多是否只有3个.字符
  212. // if(false == ret){LOGD("---%d---", __LINE__); return ret;}
  213. //
  214. // ret = isLengthCorrect(addr); //地址最大长度是否为15
  215. // if(false == ret){LOGD("---%d---", __LINE__); return ret;}
  216. //
  217. // ret = allCharacterIsLegal(addr); //所有的字符是否都由0~9和.组成
  218. // if(false == ret){LOGD("---%d---", __LINE__); return ret;}
  219. //
  220. // return true;
  221. }
  222. /**
  223. * 注册定时器
  224. * 填充数组用于注册定时器
  225. * 注意:id不能重复
  226. */
  227. static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  228. //{0, 6000}, //定时器id=0, 时间间隔6秒
  229. //{1, 1000},
  230. };
  231. /**
  232. * 当界面构造时触发
  233. */
  234. static void onUI_init(){
  235. //Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
  236. string qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
  237. mQRCodePtr->loadQRCode(qrStr.c_str());
  238. mDeviceIdPtr->setText(StoragePreferences::getInt(STORE_DEVICE_ID, 0));
  239. mDeviceCodePtr->setText(GetDeviceUid());
  240. mDeviceMacPtr->setText(StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0"));
  241. if (ETHERNETMANAGER->isConnected() || WIFIMANAGER->isConnected()) {
  242. mDeviceIpPtr->setText(ETHERNETMANAGER->getIp());
  243. mNetMaskPtr->setText(GetNetworkConfiguration().sub_network_mask);
  244. mGatewayPtr->setText(GetNetworkConfiguration().gateway);
  245. }
  246. else {
  247. mDeviceIpPtr->setText("0.0.0.0");
  248. mNetMaskPtr->setText("0.0.0.0");
  249. mGatewayPtr->setText("0.0.0.0");
  250. }
  251. //sip
  252. //StoragePreferences::putString(SIP_REG_ACCOUNT, SIP_REG_ACCOUNT_DEFAULT);
  253. string voiceId = StoragePreferences::getString(SIP_REG_ACCOUNT, SIP_REG_ACCOUNT_DEFAULT);
  254. mVoiceIdPtr->setText(voiceId);
  255. string voicePwd = StoragePreferences::getString(SIP_REG_PASSWORD, SIP_REG_PASSWORD_DEFAULT);
  256. mVoiceDomainPtr->setText(StoragePreferences::getString(SIP_REG_DOMAIN, SIP_REG_DOMAIN_DEFAULT));
  257. mVersionPtr->setText(getVersionCode());
  258. //server ip
  259. string sIP = StoragePreferences::getString(STORE_GATEWAY, serverIP);
  260. mServerIPPtr->setText(sIP);
  261. }
  262. /**
  263. * 当切换到该界面时触发
  264. */
  265. static void onUI_intent(const Intent *intentPtr) {
  266. if (intentPtr != NULL) {
  267. //TODO
  268. }
  269. }
  270. /*
  271. * 当界面显示时触发
  272. */
  273. static void onUI_show() {
  274. EASYUICONTEXT->showStatusBar();
  275. EASYUICONTEXT->showNaviBar();
  276. setDeviceInfoTheme();
  277. }
  278. /*
  279. * 当界面隐藏时触发
  280. */
  281. static void onUI_hide() {
  282. }
  283. /*
  284. * 当界面完全退出时触发
  285. */
  286. static void onUI_quit() {
  287. }
  288. /**
  289. * 串口数据回调接口
  290. */
  291. static void onProtocolDataUpdate(const SProtocolData &data) {
  292. }
  293. /**
  294. * 定时器触发函数
  295. * 不建议在此函数中写耗时操作,否则将影响UI刷新
  296. * 参数: id
  297. * 当前所触发定时器的id,与注册时的id相同
  298. * 返回值: true
  299. * 继续运行当前定时器
  300. * false
  301. * 停止运行当前定时器
  302. */
  303. static bool onUI_Timer(int id){
  304. switch (id) {
  305. default:
  306. break;
  307. }
  308. return true;
  309. }
  310. /**
  311. * 有新的触摸事件时触发
  312. * 参数:ev
  313. * 新的触摸事件
  314. * 返回值:true
  315. * 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上
  316. * false
  317. * 触摸事件将继续传递到控件上
  318. */
  319. static bool ondeviceInfoActivityTouchEvent(const MotionEvent &ev) {
  320. switch (ev.mActionStatus) {
  321. case MotionEvent::E_ACTION_DOWN://触摸按下
  322. //LOGD("时刻 = %ld 坐标 x = %d, y = %d", ev.mEventTime, ev.mX, ev.mY);
  323. break;
  324. case MotionEvent::E_ACTION_MOVE://触摸滑动
  325. break;
  326. case MotionEvent::E_ACTION_UP: //触摸抬起
  327. break;
  328. default:
  329. break;
  330. }
  331. return false;
  332. }
  333. static bool onButtonClick_SettingButton(ZKButton *pButton) {
  334. LOGD(" ButtonClick SettingButton !!!\n");
  335. // Intent* intent = new Intent();
  336. // intent->putExtra(functionWindows, "setting");
  337. // EASYUICONTEXT->openActivity("functionActivity", intent);
  338. EASYUICONTEXT->openActivity("sipTestActivity");
  339. return false;
  340. }
  341. static bool onButtonClick_ServerButton(ZKButton *pButton) {
  342. LOGD(" ButtonClick ServerButton !!!\n");
  343. Intent* intent = new Intent();
  344. // intent->putExtra(functionWindows, "serverChange");
  345. intent->putExtra(functionWindows, "serverChange2");
  346. EASYUICONTEXT->openActivity("functionActivity", intent);
  347. return false;
  348. }
  349. static bool onButtonClick_NetworkButton(ZKButton *pButton) {
  350. LOGD(" ButtonClick NetworkButton !!!\n");
  351. // EASYUICONTEXT->openActivity("EthernetSettingActivity");
  352. EASYUICONTEXT->openActivity("NetSettingActivity");
  353. return false;
  354. }
  355. static bool onButtonClick_VersionButton(ZKButton *pButton) {
  356. LOGD(" ButtonClick VersionButton !!!\n");
  357. EASYUICONTEXT->openActivity("updateActivity");
  358. return false;
  359. }
  360. static bool onButtonClick_RestartButton(ZKButton *pButton) {
  361. LOGD(" ButtonClick RestartButton !!!\n");
  362. Intent* intent = new Intent();
  363. // intent->putExtra(functionWindows, "reboot");
  364. intent->putExtra(functionWindows, "reboot2");
  365. EASYUICONTEXT->openActivity("functionActivity", intent);
  366. // const char* req = "-1";
  367. // TcpClient::instance()->sendMsg(req);
  368. //
  369. // lightControl("CALLLED", "000F");
  370. // //重启
  371. // sync();
  372. // reboot(RB_AUTOBOOT);
  373. return false;
  374. }
  375. static void onCheckedChanged_QrCodeRadioGroup1(ZKRadioGroup* pRadioGroup, int checkedID) {
  376. LOGD(" RadioGroup QrCodeRadioGroup1 checked %d", checkedID);
  377. string qrStr = "";
  378. switch (checkedID) {
  379. case ID_DEVICEINFO_QrCodeRadioButton1:
  380. qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + "&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=3&device_name=门口机";
  381. mQRCodePtr->loadQRCode(qrStr.c_str());
  382. break;
  383. case ID_DEVICEINFO_QrCodeRadioButton2:
  384. qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h1&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
  385. mQRCodePtr->loadQRCode(qrStr.c_str());
  386. break;
  387. case ID_DEVICEINFO_QrCodeRadioButton3:
  388. qrStr = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE&code=&mac=" + StoragePreferences::getString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr())) + ":h2&model=&hard_ver=HV1.0&soft_ver=SW1.0&device_type=4&device_name=床位分机";
  389. mQRCodePtr->loadQRCode(qrStr.c_str());
  390. break;
  391. }
  392. }