statusbar.cc 12 KB

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