statusbar.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. #pragma once
  2. #include "uart/ProtocolSender.h"
  3. #include "utils/TimeHelper.h"
  4. #include "net/NetManager.h"
  5. #include "net/DhcpClient.h"
  6. #include "manager/LanguageManager.h"
  7. #include "core/utilities.h"
  8. #include "core/sip_config.h"
  9. #include "edge/call_log.h"
  10. #include "edge/popup_service.h"
  11. #include "base/base.hpp"
  12. #include "service/BusinessConfig.h"
  13. #include "net/tcp_client.h"
  14. #include <sys/reboot.h>
  15. #include <net/NetUtils.h>
  16. /*
  17. *此文件由GUI工具生成
  18. *文件功能:用于处理用户的逻辑相应代码
  19. *功能说明:
  20. *========================onButtonClick_XXXX
  21. 当页面中的按键按下后系统会调用对应的函数,XXX代表GUI工具里面的[标识]名称,
  22. 如Button1,当返回值为false的时候系统将不再处理这个按键,返回true的时候系统将会继续处理此按键。比如SYS_BACK.
  23. *========================onSlideWindowItemClick_XXXX(int index)
  24. 当页面中存在滑动窗口并且用户点击了滑动窗口的图标后系统会调用此函数,XXX代表GUI工具里面的[标识]名称,
  25. 如slideWindow1;index 代表按下图标的偏移值
  26. *========================onSeekBarChange_XXXX(int progress)
  27. 当页面中存在滑动条并且用户改变了进度后系统会调用此函数,XXX代表GUI工具里面的[标识]名称,
  28. 如SeekBar1;progress 代表当前的进度值
  29. *========================ogetListItemCount_XXXX()
  30. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表的总数目,XXX代表GUI工具里面的[标识]名称,
  31. 如List1;返回值为当前列表的总条数
  32. *========================oobtainListItemData_XXXX(ZKListView::ZKListItem *pListItem, int index)
  33. 当页面中存在滑动列表的时候,更新的时候系统会调用此接口获取列表当前条目下的内容信息,XXX代表GUI工具里面的[标识]名称,
  34. 如List1;pListItem 是贴图中的单条目对象,index是列表总目的偏移量。具体见函数说明
  35. *========================常用接口===============
  36. *LOGD(...) 打印调试信息的接口
  37. *mTextXXX->setText("****") 在控件TextXXX上显示文字****
  38. *mButton1->setSelected(true); 将控件mButton1设置为选中模式,图片会切换成选中图片,按钮文字会切换为选中后的颜色
  39. *mSeekBar->setProgress(12) 在控件mSeekBar上将进度调整到12
  40. *mListView1->refreshListView() 让mListView1 重新刷新,当列表数据变化后调用
  41. *mDashbroadView1->setTargetAngle(120) 在控件mDashbroadView1上指针显示角度调整到120度
  42. */
  43. #define ETHERNETMANAGER NETMANAGER->getEthernetManager()
  44. #define WIFIMANAGER NETMANAGER->getWifiManager()
  45. #define SYS_RESTART 10 // 重启
  46. static bool isLight = false;
  47. static net::DhcpClient _s_wifi_dhcp_client;
  48. static net::DhcpClient _s_eth_dhcp_client;
  49. static bool _start_wifi_dhcp_client() {
  50. // 静态ip模式不做处理
  51. if (!WIFIMANAGER->isAutoMode()) {
  52. return false;
  53. }
  54. if (!WIFIMANAGER->isConnected()) {
  55. return false;
  56. }
  57. char ip[32], gw[32];
  58. if (!WIFIMANAGER->getConfigureInfo(ip, NULL, gw, NULL, NULL)) {
  59. return false;
  60. }
  61. return _s_wifi_dhcp_client.start(ip, WIFIMANAGER->getMacAddr(), gw);
  62. }
  63. static void _stop_wifi_dhcp_client() {
  64. _s_wifi_dhcp_client.stop();
  65. }
  66. static bool _start_eth_dhcp_client() {
  67. // 静态ip模式不做处理
  68. if (!ETHERNETMANAGER->isAutoMode()) {
  69. LOGD("以太网静态");
  70. return false;
  71. }
  72. if (!ETHERNETMANAGER->isConnected()) {
  73. LOGD("以太网连接状态");
  74. return false;
  75. }
  76. char ip[32], gw[32];
  77. if (!ETHERNETMANAGER->getConfigureInfo(ip, NULL, gw, NULL, NULL)) {
  78. return false;
  79. }
  80. LOGD("正在重新请求dhcp");
  81. return _s_eth_dhcp_client.start(ip, ETHERNETMANAGER->getMacAddr(), gw);
  82. }
  83. static void _stop_eth_dhcp_client() {
  84. _s_eth_dhcp_client.stop();
  85. }
  86. static void _dhcp_lease_cb(dhcp_lease_type_e type, void *data) {
  87. LOGD("_dhcp_lease_cb type %d\n", type);
  88. switch (type) {
  89. case E_DHCP_LEASE_TYPE_SUCCESS:
  90. LOGD("DHCP连接成功");
  91. break;
  92. case E_DHCP_LEASE_TYPE_FAIL:
  93. LOGD("DHCP连接失败,重连");
  94. _start_eth_dhcp_client();
  95. break;
  96. case E_DHCP_LEASE_TYPE_TIMEOUT:
  97. // 续租超时,可以断开再重连尝试
  98. LOGD("DHCP连接超时,断开重连");
  99. _stop_eth_dhcp_client();
  100. _start_eth_dhcp_client();
  101. break;
  102. }
  103. }
  104. void NavibarSetPartName(const std::string& partName){
  105. mPartNamePtr->setText(partName);
  106. }
  107. static int netOffCount = 0; //断网计数,每秒+1
  108. static int netOffMax = 300; //断网300秒,则重启
  109. static bool isDataRefresh = false;
  110. static void updateNetState(){
  111. if (netOffCount == 0) {
  112. mRestartTimeTextViewPtr->setText("");
  113. }
  114. else {
  115. int restartTime = netOffMax - netOffCount;
  116. string restartTimeStr = LANGUAGEMANAGER->getValue("RestartTime") + to_string(restartTime);
  117. mRestartTimeTextViewPtr->setText(restartTimeStr);
  118. }
  119. if (ETHERNETMANAGER->isConnected() || WIFIMANAGER->isConnected()){
  120. netOffCount = 0;
  121. if (isDataRefresh) {
  122. dataRefresh();
  123. isDataRefresh = false;
  124. }
  125. } else {
  126. netOffCount++;
  127. isDataRefresh = true;
  128. //5分钟仍然断网,则重启
  129. if (netOffCount > netOffMax){
  130. netOffCount = 0;
  131. //重启
  132. sync();
  133. reboot(RB_AUTOBOOT);
  134. }
  135. }
  136. EEthConnState connState = ETHERNETMANAGER->getConnState();
  137. switch (connState){
  138. case E_ETH_DISCONNECTED: // 以太网断开
  139. mPainter1Ptr->setBackgroundColor(0xFF949494);
  140. break;
  141. case E_ETH_CONNECTING: // 以太网连接中
  142. mPainter1Ptr->setBackgroundColor(0xFF2F9DF1);
  143. break;
  144. case E_ETH_CONNECTED: // 以太网连接
  145. mPainter1Ptr->setBackgroundColor(0xFF37C127);
  146. break;
  147. case E_ETH_DISCONNECTING: // 以太网断开连接中
  148. mPainter1Ptr->setBackgroundColor(0xFF949494);
  149. break;
  150. case E_ETH_CONN_UNKNOWN: // 以太网未知
  151. mPainter1Ptr->setBackgroundColor(0xFF949494);
  152. break;
  153. }
  154. }
  155. void OnRegisterStateChanged(voip::Telephone* telephone, int code){
  156. code = GetTelephone()->GetRegistrationStatusCode();
  157. LOGD("SIP STATUS : %d", code);
  158. if (code == voip::SIP_STATUS_CODE_PROGRESS){
  159. //mTextViewRegPtr->setText("CONNECTING");
  160. mTextViewRegPtr->setBackgroundColor(0xFF2F9DF1);
  161. } else if (code == voip::SIP_STATUS_CODE_OK){
  162. //mTextViewRegPtr->setText("OK");
  163. mTextViewRegPtr->setBackgroundColor(0xFF37C127);
  164. } else {
  165. //mTextViewRegPtr->setText("ERROR");
  166. mTextViewRegPtr->setBackgroundColor(0xFF949494);
  167. }
  168. }
  169. void tcpStatus(){
  170. if (TcpClient::instance()->connected()){
  171. mTextViewTCPPtr->setBackgroundColor(0xFF37C127);
  172. } else {
  173. mTextViewTCPPtr->setBackgroundColor(0xFF949494);
  174. }
  175. }
  176. class PingThread: public Thread {
  177. public:
  178. /**
  179. * 线程创建成功后会调用该函数,可以在该函数中做一些初始化操作
  180. * return true 继续线程
  181. * false 退出线程
  182. */
  183. virtual bool readyToRun() {
  184. LOGD("Ping Thread 已经创建完成");
  185. return true;
  186. }
  187. /**
  188. * 线程循环函数
  189. *
  190. * return true 继续线程循环
  191. * false 推出线程
  192. */
  193. virtual bool threadLoop() {
  194. LOGD("Ping 线程循环函数");
  195. //检查是否有退出线程的请求,如果有,则返回false,立即退出线程
  196. if (exitPending()) {
  197. return false;
  198. }
  199. if (ETHERNETMANAGER->isAutoMode()) {
  200. string serverIp = StoragePreferences::getString(STORE_GATEWAY, serverIP);
  201. LOGD("===================> ping %s", serverIp.c_str());
  202. string pingStr = "ping " + serverIp + " -c 3";
  203. int result = system(pingStr.c_str());
  204. LOGD("===================> ping 服务器返回的结果: %d", result);
  205. if (result != 0) { // 如果不是0,就代表ping不通,需要重新请求dhcp
  206. LOGD("无法ping通服务器地址:%s", serverIp.c_str());
  207. NetUtils::dhcpExit();
  208. usleep(20 * 1000);
  209. NetUtils::enableIfc("eth0", false);
  210. usleep(100 * 1000);
  211. NetUtils::enableIfc("eth0", true);
  212. }
  213. //为了方便观察,这里添加休眠500ms
  214. // usleep(1000 * 1000);
  215. usleep(1 * 60 * 1000 * 1000);
  216. }
  217. //返回真,继续下次线程循环
  218. return true;
  219. }
  220. };
  221. void setIsLight(bool _isLight) {
  222. LOGD("设置是否常亮:%d", _isLight);
  223. isLight = _isLight;
  224. if (isLight) { // 常亮的时候关闭息屏
  225. setSleepTimerRegistered(false); // 关闭息屏功能
  226. }
  227. }
  228. int getTime(char* timeStr) {
  229. int hour, minute, second;// 定义时间的各个int临时变量。
  230. sscanf(timeStr, "%d:%d:%d", &hour, &minute, &second);
  231. int time = hour * 60 * 60 + minute * 60 + second;
  232. return time;
  233. }
  234. int dayLight = 100;
  235. int nightLight = 100;
  236. void isTimeScale(char* timeStr) {
  237. std::string dayTime = StoragePreferences::getString(STORE_DAY_START, "07:00:00");
  238. std::string nightTime = StoragePreferences::getString(STORE_NIGHT_START, "18:00:00");
  239. int day = getTime((char*) dayTime.data());
  240. int night = getTime((char*) nightTime.data());
  241. int now = getTime(timeStr);
  242. bool isSleepTime = getSleepTimerRegistered();
  243. if (day <= night) { // 在白天时间小于晚上时间的时候
  244. if (day <= now && now <= night) { // 这个时候,时间处于白天
  245. if (isSleepTime) { // isSleepTime就是定时任务开启,需要关闭
  246. setSleepTimerRegistered(false); // 关闭息屏功能
  247. // dayLight = StoragePreferences::getInt(STORE_DAY_LIGHT, 100);
  248. // if (dayLight > 100) {
  249. // dayLight = 100;
  250. // }
  251. // LOGD("dayLight == %d", dayLight);
  252. BRIGHTNESSHELPER->setBrightness(dayLight);
  253. LOGD("白天开始时间小于晚上开始时间,切换至白天");
  254. }
  255. }
  256. else { // 这个时间处于晚上
  257. if (!isSleepTime) { // isSleepTime就是定时任务关闭,需要开启
  258. setSleepTimerRegistered(true); // 开启息屏功能
  259. // nightLight = StoragePreferences::getInt(STORE_NIGHT_LIGHT, 100);
  260. // if (nightLight > 100) {
  261. // nightLight = 100;
  262. // }
  263. // LOGD("nightLight == %d", nightLight);
  264. BRIGHTNESSHELPER->setBrightness(nightLight);
  265. LOGD("白天开始时间小于晚上开始时间,切换至晚上");
  266. }
  267. }
  268. } else { // 这里是day > night时间的时候
  269. if (night <= now && now < day) { // 这个其实是晚上时间
  270. if (!isSleepTime) { // isSleepTime就是定时任务关闭,需要开启
  271. setSleepTimerRegistered(true); // 开启息屏功能
  272. // nightLight = StoragePreferences::getInt(STORE_NIGHT_LIGHT, 100);
  273. // if (nightLight > 100) {
  274. // nightLight = 100;
  275. // }
  276. // LOGD("nightLight == %d", nightLight);
  277. BRIGHTNESSHELPER->setBrightness(nightLight);
  278. LOGD("白天开始时间大于晚上开始时间,切换至晚上");
  279. }
  280. } else {
  281. if (isSleepTime) { // isSleepTime就是定时任务开启,需要关闭
  282. setSleepTimerRegistered(false); // 关闭息屏功能
  283. // dayLight = StoragePreferences::getInt(STORE_DAY_LIGHT, 100);
  284. // if (dayLight > 100) {
  285. // dayLight = 100;
  286. // }
  287. // LOGD("dayLight == %d", dayLight);
  288. BRIGHTNESSHELPER->setBrightness(dayLight);
  289. LOGD("白天开始时间大于晚上开始时间,切换至白天");
  290. }
  291. }
  292. }
  293. }
  294. namespace {
  295. // 以太网状态监听
  296. class EthernetConnStateListener : public EthernetManager::IEthernetConnStateListener {
  297. public:
  298. virtual void handleEthernetConnState(EEthConnState state) {
  299. LOGD("[net] handleEthernetConnState state: %d\n", state);
  300. switch (state) {
  301. case E_ETH_CONNECTED:
  302. LOGD("以太网连接");
  303. _start_eth_dhcp_client();
  304. break;
  305. case E_ETH_DISCONNECTED:
  306. LOGD("以太网断开");
  307. _stop_eth_dhcp_client();
  308. break;
  309. default:
  310. break;
  311. }
  312. }
  313. };
  314. // wifi状态监听
  315. class WifiListener: public WifiManager::IWifiListener {
  316. public:
  317. virtual void handleWifiConnect(E_WIFI_CONNECT event, int args) {
  318. LOGD("[net] handleWifiConnect event: %d\n", event);
  319. switch (event) {
  320. case E_WIFI_CONNECT_CONNECTED:
  321. _start_wifi_dhcp_client();
  322. break;
  323. case E_WIFI_CONNECT_DISCONNECT:
  324. _stop_wifi_dhcp_client();
  325. break;
  326. default:
  327. break;
  328. }
  329. }
  330. };
  331. }
  332. /**
  333. * 注册定时器
  334. * 填充数组用于注册定时器
  335. * 注意:id不能重复
  336. */
  337. static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  338. {1, 1000},
  339. {2, 5000}
  340. };
  341. static void updateUI_time() {
  342. struct tm *t = TimeHelper::getDateTime();
  343. char timeStr[50];
  344. string day[] = {
  345. LANGUAGEMANAGER->getValue("Sunday"),
  346. LANGUAGEMANAGER->getValue("Monday"),
  347. LANGUAGEMANAGER->getValue("Tuesday"),
  348. LANGUAGEMANAGER->getValue("Wednesday"),
  349. LANGUAGEMANAGER->getValue("Thursday"),
  350. LANGUAGEMANAGER->getValue("Friday"),
  351. LANGUAGEMANAGER->getValue("Saturday")};
  352. string formatStr = "%s %d"+LANGUAGEMANAGER->getValue("Year")+"%02d"+LANGUAGEMANAGER->getValue("Month")+"%02d"+LANGUAGEMANAGER->getValue("Day")+" %02d:%02d:%02d";
  353. //string formatStr = "%s %d-%02d-%02d %02d:%02d:%02d";
  354. sprintf(timeStr, formatStr.c_str(), day[t->tm_wday].c_str(),1900 + t->tm_year, t->tm_mon + 1, t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
  355. mDateViewPtr->setText(timeStr); // 注意修改控件名称
  356. // 如果不是常亮,就能需要去判断
  357. if (!isLight) {
  358. char timeStr2[50];
  359. string formatStr2 = "%02d:%02d:%02d";
  360. sprintf(timeStr2, formatStr2.c_str(), t->tm_hour,t->tm_min,t->tm_sec);
  361. isTimeScale(timeStr2);
  362. }
  363. }
  364. static EthernetConnStateListener _s_eth_state_listener;
  365. static WifiListener _s_wifi_listener;
  366. static PingThread ping_thread;
  367. /**
  368. * 当界面构造时触发
  369. */
  370. static void onUI_init(){
  371. //SIP
  372. GetTelephone()->AddRegisteredStateListener(OnRegisterStateChanged);
  373. mPartNamePtr->setText(StoragePreferences::getString(STORE_PARTNAME,""));
  374. updateUI_time();
  375. //网络判断
  376. updateNetState();
  377. tcpStatus();
  378. //Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
  379. ETHERNETMANAGER->addEthernetConnStateListener(&_s_eth_state_listener);
  380. WIFIMANAGER->addWifiListener(&_s_wifi_listener);
  381. StoragePreferences::putString(STORE_MAC_ADDR, std::string(ETHERNETMANAGER->getMacAddr()));
  382. _s_wifi_dhcp_client.set_lease_cb(_dhcp_lease_cb);
  383. _s_eth_dhcp_client.set_lease_cb(_dhcp_lease_cb);
  384. // 这里也检测网络是否连接上 (有可能启动前网络已经连接触发不到回调),启动dhcp租赁检测,之后都是根据网络的连接断开执行相应的操作
  385. _start_wifi_dhcp_client();
  386. _start_eth_dhcp_client();
  387. ping_thread.run("ping");
  388. isLight = StoragePreferences::getBool(STORE_LIGHT, false);
  389. }
  390. /*
  391. * 当界面完全退出时触发
  392. */
  393. static void onUI_quit() {
  394. GetTelephone()->RemoveRegisteredStateListener(OnRegisterStateChanged);
  395. }
  396. /**
  397. * 串口数据回调接口
  398. */
  399. static void onProtocolDataUpdate(const SProtocolData &data) {
  400. //串口数据回调接口
  401. }
  402. /**
  403. * 定时器触发函数
  404. * 不建议在此函数中写耗时操作,否则将影响UI刷新
  405. * 参数: id
  406. * 当前所触发定时器的id,与注册时的id相同
  407. * 返回值: true
  408. * 继续运行当前定时器
  409. * false
  410. * 停止运行当前定时器
  411. */
  412. static bool onUI_Timer(int id){
  413. switch (id) {
  414. case 1:
  415. updateUI_time();
  416. updateNetState();
  417. break;
  418. case 2:
  419. tcpStatus();
  420. break;
  421. default:
  422. break;
  423. }
  424. return true;
  425. }
  426. /**
  427. * 有新的触摸事件时触发
  428. * 参数:ev
  429. * 新的触摸事件
  430. * 返回值:true
  431. * 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上
  432. * false
  433. * 触摸事件将继续传递到控件上
  434. */
  435. static bool onstatusbarActivityTouchEvent(const MotionEvent &ev) {
  436. switch (ev.mActionStatus) {
  437. case MotionEvent::E_ACTION_DOWN://触摸按下
  438. //LOGD("时刻 = %ld 坐标 x = %d, y = %d", ev.mEventTime, ev.mX, ev.mY);
  439. break;
  440. case MotionEvent::E_ACTION_MOVE://触摸滑动
  441. break;
  442. case MotionEvent::E_ACTION_UP: //触摸抬起
  443. break;
  444. default:
  445. break;
  446. }
  447. return false;
  448. }