mainwindow.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. #include "mainwindow.h"
  2. #include <sys/un.h>
  3. #include <sys/ioctl.h>
  4. #include <sys/socket.h>
  5. #include <linux/types.h>
  6. #include <linux/netlink.h>
  7. #include <errno.h>
  8. #include <unistd.h>
  9. #include <stdio.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <unistd.h>
  14. #include <stdlib.h>
  15. #include <QPainter>
  16. #include "Setting.h"
  17. #include "AutoConnect.h"
  18. #include "carback.h"
  19. #include "ark_api.h"
  20. #include <QDebug>
  21. #include "Audio.h"
  22. MainWindow::MainWindow(QWidget *parent) :
  23. QMainWindow(parent)
  24. {
  25. resize(1920,720);
  26. setWindowFlags(Qt::FramelessWindowHint);
  27. setAttribute(Qt::WA_TranslucentBackground);
  28. m_SocketNotifier = NULL;
  29. m_bgLabel = new QLabel(this);
  30. m_bgLabel->setGeometry(0,0,1920,720);
  31. m_BgPixmap = QPixmap(QString(":/Resource/ARK1668ed/homeWidget/HomeBg.png"));
  32. m_bgLabel->setPixmap(m_BgPixmap);
  33. m_homeViewPaperWidget = new homeViewPaperWidget(this);
  34. m_homeViewPaperWidget->setGeometry(0,0,1920,720);
  35. m_multiMusicWidget = new multiMusicWidget(this);
  36. m_multiMusicWidget->setGeometry(0,0,1920,720);
  37. m_multiMusicWidget->setVisible(false);
  38. m_videoPicWidget = new videoPicWidget(this);
  39. m_videoPicWidget->setGeometry(0,0,1920,720);
  40. m_videoPicWidget->setVisible(false);
  41. m_settingWidget = new settingWidget(this);
  42. m_settingWidget->setGeometry(0,0,1920,720);
  43. m_settingWidget->setVisible(false);
  44. m_btTelePhoneWidget = new btTelePhoneWidget(this);
  45. m_btTelePhoneWidget->setGeometry(0,0,1920,720);
  46. m_btTelePhoneWidget->setVisible(false);
  47. m_phoneWidget = new phoneWidget(this);
  48. m_phoneWidget->setGeometry(0,0,1920,720);
  49. m_phoneWidget->setVisible(false);
  50. m_toolwidget = new toolWidget(this);
  51. m_toolwidget->setGeometry(0,0,160,720);
  52. m_avinWidget = new avinWidget(this);
  53. m_avinWidget->setGeometry(0, 0, 1920 , 720);
  54. m_avinWidget->setVisible(false);
  55. m_Timer = new QTimer(this);
  56. m_Timer->setInterval(2000);
  57. m_Timer->setSingleShot(true);
  58. QObject::connect(m_Timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
  59. QObject::connect(m_toolwidget,SIGNAL(showMultiMusicWidget()),this,SLOT(onShowMultiMusicWidget()));
  60. QObject::connect(m_toolwidget,SIGNAL(closeMultiMusicWidget()),this,SLOT(onCloseMultiMusicWidget()));
  61. QObject::connect(m_toolwidget,SIGNAL(showVideoPicWidget()),this,SLOT(onShowVideoPicWidget()));
  62. QObject::connect(m_toolwidget,SIGNAL(closeVideoPicWidget()),this,SLOT(onCloseVideoPicWidget()));
  63. QObject::connect(m_toolwidget,SIGNAL(showSettingWidget()),this,SLOT(onShowSettingWidget()));
  64. QObject::connect(m_toolwidget,SIGNAL(closeSettingWidget()),this,SLOT(onCloseSettingWidget()));
  65. QObject::connect(m_toolwidget,SIGNAL(showBtTelWidget()),this,SLOT(onShowBtTelWidget()));
  66. QObject::connect(m_toolwidget,SIGNAL(closeBtTelWidget()),this,SLOT(onCloseBtTelWidget()));
  67. QObject::connect(m_toolwidget,SIGNAL(showPhoneWidget()),this,SLOT(onShowPhoneWidget()));
  68. QObject::connect(m_toolwidget,SIGNAL(closePhoneWidget()),this,SLOT(onClosePhoneWidget()));
  69. connectSignalAndSlotByNamesake(g_Multimedia, this, ARKRECEIVER(onDeviceWatcherStatus(const int, const int)));
  70. connectSignalAndSlotByNamesake(g_Carback, this, ARKRECEIVER(onCarbackStatusChange(int)));
  71. m_Timer->start();
  72. printf("*************Launcher start complete\n");
  73. }
  74. MainWindow::~MainWindow()
  75. {
  76. }
  77. void MainWindow::paintEvent(QPaintEvent *event)
  78. {
  79. UNUSED(event);
  80. QPainter painter(this);
  81. // 先重置整个区域为完全透明
  82. painter.setCompositionMode(QPainter::CompositionMode_Source);
  83. painter.fillRect(rect(), Qt::transparent);
  84. // 恢复默认混合模式
  85. painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
  86. return;
  87. }
  88. void MainWindow::onDeviceWatcherStatus(const int type, const int status) {
  89. if (DWT_USBDisk == type) {
  90. switch (status) {
  91. case DWS_Empty: {
  92. break;
  93. }
  94. case DWS_Unsupport: {
  95. break;
  96. }
  97. case DWS_Busy: {
  98. g_Setting->setWidgetType(Setting::WIDGET_MULTIMUSIC);
  99. m_toolwidget->setMusicBtnSelectStatus();
  100. break;
  101. }
  102. case DWS_Ready: {
  103. break;
  104. }
  105. case DWS_Remove: {
  106. if(g_Setting->getWidgetType() == Setting::WIDGET_MULTIMUSIC ||
  107. g_Setting->getWidgetType() == Setting::WIDGET_VIDEOPICTURE)
  108. {
  109. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  110. setWidgetTypeVisible();
  111. m_toolwidget->setHomeWidgetBtnSelectStatus();
  112. if(!m_toolwidget->isVisible()) {
  113. m_toolwidget->setVisible(true);
  114. }
  115. }
  116. break;
  117. }
  118. default: {
  119. break;
  120. }
  121. }
  122. }
  123. return;
  124. }
  125. void MainWindow::onShowMultiMusicWidget()
  126. {
  127. g_Setting->setWidgetType(Setting::WIDGET_MULTIMUSIC);
  128. setWidgetTypeVisible();
  129. return;
  130. }
  131. void MainWindow::onCloseMultiMusicWidget()
  132. {
  133. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  134. setWidgetTypeVisible();
  135. return;
  136. }
  137. void MainWindow::onShowVideoPicWidget()
  138. {
  139. g_Setting->setWidgetType(Setting::WIDGET_VIDEOPICTURE);
  140. setWidgetTypeVisible();
  141. return;
  142. }
  143. void MainWindow::onCloseVideoPicWidget()
  144. {
  145. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  146. setWidgetTypeVisible();
  147. return;
  148. }
  149. void MainWindow::onShowSettingWidget()
  150. {
  151. g_Setting->setWidgetType(Setting::WIDGET_SETTING);
  152. setWidgetTypeVisible();
  153. return;
  154. }
  155. void MainWindow::onCloseSettingWidget()
  156. {
  157. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  158. setWidgetTypeVisible();
  159. return;
  160. }
  161. void MainWindow::onShowBtTelWidget()
  162. {
  163. g_Setting->setWidgetType(Setting::WIDGET_BTTELEPHONE);
  164. setWidgetTypeVisible();
  165. return;
  166. }
  167. void MainWindow::onCloseBtTelWidget()
  168. {
  169. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  170. setWidgetTypeVisible();
  171. return;
  172. }
  173. void MainWindow::onShowPhoneWidget()
  174. {
  175. g_Setting->setWidgetType(Setting::WIDGET_PHONELINK);
  176. setWidgetTypeVisible();
  177. return;
  178. }
  179. void MainWindow::onClosePhoneWidget()
  180. {
  181. g_Setting->setWidgetType(Setting::WIDGET_HOME);
  182. setWidgetTypeVisible();
  183. return;
  184. }
  185. void MainWindow::onActivated()
  186. {
  187. QSocketNotifier* socket = static_cast<QSocketNotifier*>(sender());
  188. if (socket == m_SocketNotifier) {
  189. QByteArray data;
  190. data.resize(1024);
  191. size_t len = ::read(m_SocketNotifier->socket(), data.data(), 1024);
  192. data.resize(len);
  193. data = data.replace(0, '\n').trimmed();
  194. QString filter(data);
  195. //qDebug()<<"++++filter++++++"<<filter;
  196. if (filter.contains(QString("SUBSYSTEM=module"))
  197. || filter.contains(QString("SUBSYSTEM=mmc_host"))
  198. || filter.contains(QString("SUBSYSTEM=drivers"))
  199. || filter.contains(QString("SUBSYSTEM=platform"))
  200. || filter.contains(QString("SUBSYSTEM=sound"))
  201. || filter.contains(QString("SUBSYSTEM=udc"))
  202. || filter.contains(QString("SUBSYSTEM=net"))
  203. || filter.contains(QString("SUBSYSTEM=usb"))
  204. || filter.contains(QString("SUBSYSTEM=usb_device"))
  205. || filter.contains(QString("SUBSYSTEM=misc"))
  206. || filter.contains(QString("SUBSYSTEM=queues"))
  207. || filter.contains(QString("SUBSYSTEM=video4linux"))) {
  208. if (!filter.contains(QString("PRODUCT=5ac/"))) {
  209. return;
  210. }
  211. }
  212. if (filter.contains(QString("DEVNAME=sd"))
  213. || filter.contains(QString("DEVNAME=mmcblk1"))) {
  214. g_Multimedia->startMultimedia();
  215. m_SocketNotifier->setEnabled(false);
  216. ::close(m_SocketNotifier->socket());
  217. }
  218. }
  219. return;
  220. }
  221. void MainWindow::onCarbackStatusChange(int status){
  222. qDebug()<<"===[MainWidget::onCarbackStatusChange:status]==="<<status;
  223. switch (status) {
  224. case Carback::CBS_On:
  225. arkapi_display_hide_layer(g_Setting->getUIDispLayer());
  226. break;
  227. case Carback::CBS_Off:
  228. arkapi_display_show_layer(g_Setting->getUIDispLayer());
  229. break;
  230. default:
  231. break;
  232. }
  233. return;
  234. }
  235. void MainWindow::onTimeout()
  236. {
  237. qDebug()<< "************onTimeout";
  238. // system("insmod /lib/modules/6.12.16/kernel/drivers/usb/dwc2/dwc2.ko");
  239. // system("carlink &");
  240. CHECK_SYSTEM("echo host > /sys/devices/platform/soc/40000000.usb/usb_role/40000000.usb-role-switch/role");
  241. CHECK_SYSTEM("echo host > /sys/devices/platform/soc/40c00000.usb/usb_role/40c00000.usb-role-switch/role");
  242. initializeNetlink();
  243. g_Carback->initialize();
  244. checkDirExist();
  245. g_Audio->requestAudioSource(AS_Idle);
  246. return;
  247. }
  248. multiMusicWidget *MainWindow::getMultiMusicWidgetObjdect()
  249. {
  250. if (m_multiMusicWidget != NULL) {
  251. return m_multiMusicWidget;
  252. }
  253. return NULL;
  254. }
  255. videoPicWidget *MainWindow::getVideoPicWidgetObject()
  256. {
  257. if (m_videoPicWidget != NULL) {
  258. return m_videoPicWidget;
  259. }
  260. return NULL;
  261. }
  262. settingWidget *MainWindow::getSettingWidgetObject()
  263. {
  264. if (m_settingWidget != NULL) {
  265. return m_settingWidget;
  266. }
  267. return NULL;
  268. }
  269. btTelePhoneWidget *MainWindow::getBtTelePhoneWidgetObject()
  270. {
  271. if (m_btTelePhoneWidget != NULL) {
  272. return m_btTelePhoneWidget;
  273. }
  274. return NULL;
  275. }
  276. phoneWidget *MainWindow::getPhoneWidgetObject()
  277. {
  278. if (m_phoneWidget != NULL) {
  279. return m_phoneWidget;
  280. }
  281. return NULL;
  282. }
  283. toolWidget *MainWindow::getToolWidgetObject()
  284. {
  285. if ( m_toolwidget != NULL ) {
  286. return m_toolwidget;
  287. }
  288. return NULL;
  289. }
  290. avinWidget *MainWindow::getAvinWidgetObject()
  291. {
  292. if ( m_avinWidget != NULL ) {
  293. return m_avinWidget;
  294. }
  295. return NULL;
  296. }
  297. homeViewPaperWidget *MainWindow::getHomeViewPaperWidgetObject()
  298. {
  299. if ( m_homeViewPaperWidget != NULL ) {
  300. return m_homeViewPaperWidget;
  301. }
  302. return NULL;
  303. }
  304. QLabel *MainWindow::getbgLabelObject()
  305. {
  306. if ( m_bgLabel != NULL ) {
  307. return m_bgLabel;
  308. }
  309. return NULL;
  310. }
  311. void MainWindow::setWidgetTypeVisible()
  312. {
  313. int type = static_cast<int>(g_Setting->getWidgetType());
  314. switch (type) {
  315. case Setting::WIDGET_HOME:
  316. setWidgetVisible(true, false, false, false, false, false);
  317. break;
  318. case Setting::WIDGET_MULTIMUSIC:
  319. setWidgetVisible(false, true, false, false, false, false);
  320. break;
  321. case Setting::WIDGET_PHONELINK:
  322. setWidgetVisible(false, false, true, false, false, false);
  323. break;
  324. case Setting::WIDGET_BTTELEPHONE:
  325. setWidgetVisible(false, false, false, true, false, false);
  326. break;
  327. case Setting::WIDGET_VIDEOPICTURE:
  328. setWidgetVisible(false, false, false, false, true, false);
  329. break;
  330. case Setting::WIDGET_SETTING:
  331. setWidgetVisible(false, false, false, false, false, true);
  332. break;
  333. default:
  334. break;
  335. }
  336. return;
  337. }
  338. void MainWindow::setWidgetVisible(bool homeWidgetVisible, bool musicWidgetVisible, bool phoneWidgetVisible,
  339. bool btTelWidgetVisible, bool videoPicWidgetVisible, bool settingWidgetVisible)
  340. {
  341. if (m_bgLabel->isVisible() != homeWidgetVisible) {
  342. m_bgLabel->setVisible(homeWidgetVisible);
  343. m_homeViewPaperWidget->setVisible(homeWidgetVisible);
  344. }
  345. if (m_multiMusicWidget ->isVisible() != musicWidgetVisible) {
  346. m_multiMusicWidget->setVisible(musicWidgetVisible);
  347. }
  348. if (m_phoneWidget->isVisible() != phoneWidgetVisible) {
  349. m_phoneWidget->setVisible(phoneWidgetVisible);
  350. m_phoneWidget->setPhoneWidgetVisible(phoneWidgetVisible);
  351. }
  352. if (m_btTelePhoneWidget->isVisible() != btTelWidgetVisible) {
  353. m_btTelePhoneWidget->setVisible(btTelWidgetVisible);
  354. }
  355. if (m_videoPicWidget->isVisible() != videoPicWidgetVisible) {
  356. m_videoPicWidget->setVideoPlayStatus();
  357. m_videoPicWidget->setVisible(videoPicWidgetVisible);
  358. }
  359. if (m_settingWidget->isVisible() != settingWidgetVisible) {
  360. m_settingWidget->setVisible(settingWidgetVisible);
  361. }
  362. return;
  363. }
  364. void MainWindow::checkDirExist()
  365. {
  366. QString path = QString("/data/MultiMediaFile");
  367. QDir dir(path);
  368. if(!dir.exists()){
  369. mkdir("/data/MultiMediaFile",0777);
  370. }
  371. return;
  372. }
  373. void MainWindow::initializeNetlink()
  374. {
  375. if (NULL == m_SocketNotifier) {
  376. int socket = ::socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
  377. if (-1 == socket) {
  378. perror("socket");
  379. qDebug() << "create netlink socket fail!";
  380. return;
  381. }
  382. struct sockaddr_nl sock_nl;
  383. memset(&sock_nl, 0, sizeof(struct sockaddr_nl));
  384. sock_nl.nl_family = AF_NETLINK;
  385. sock_nl.nl_groups = 1;
  386. int bind = ::bind(socket, (struct sockaddr*)&sock_nl, sizeof(struct sockaddr_nl));
  387. if (-1 == bind) {
  388. perror("bind");
  389. qDebug() << "bind netlink socket fail!";
  390. return;
  391. }
  392. m_SocketNotifier = new QSocketNotifier(socket, QSocketNotifier::Read, this);
  393. QObject::connect(m_SocketNotifier, SIGNAL(activated(int)),
  394. this, SLOT(onActivated()));
  395. }
  396. return;
  397. }