mainwindow.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "IUserLinkPlayer.h"
  4. #include <QMouseEvent>
  5. #include <linux/fb.h>
  6. #include <sys/ioctl.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>
  9. #include "UsbHostService.h"
  10. #include <QPushButton>
  11. #include <QLabel>
  12. //#include <QWSServer>
  13. #define FBPATH "/dev/fb0"
  14. MainWindow::MainWindow(QWidget *parent)
  15. : QMainWindow(parent)
  16. , ui(new Ui::MainWindow),mChangeMode(false),mPlayer(nullptr),mIsRunningBackGround(false),mConnectStatus(CONNECT_STATUS_DISCONNECTED)
  17. {
  18. ui->setupUi(this);
  19. system("ifconfig lo up");
  20. setWindowFlags(Qt::FramelessWindowHint);
  21. setAttribute(Qt::WA_TranslucentBackground);
  22. int screen_width = 1920;
  23. int screen_height = 720;
  24. setGeometry(0, 0, screen_width, screen_height);
  25. m_CarplayLink = new QPushButton(QString("Carplay"), this);
  26. m_CarplayLink->setGeometry(width() / 6 * 0, 0, width() / 6, height());
  27. QObject::connect(m_CarplayLink, SIGNAL(clicked()),
  28. this, SLOT(onClicked()));
  29. m_AutoLink = new QPushButton(QString("Auto"), this);
  30. m_AutoLink->setGeometry(width() / 6 * 1, 0, width() / 6, height());
  31. QObject::connect(m_AutoLink, SIGNAL(clicked()),
  32. this, SLOT(onClicked()));
  33. m_CarlifeLink = new QPushButton(QString("Carlife"), this);
  34. m_CarlifeLink->setGeometry(width() / 6 * 2, 0, width() / 6, height());
  35. QObject::connect(m_CarlifeLink, SIGNAL(clicked()),
  36. this, SLOT(onClicked()));
  37. m_HiCarLink = new QPushButton(QString("HiCar"), this);
  38. m_HiCarLink->setGeometry(width() / 6 * 3, 0, width() / 6, height());
  39. QObject::connect(m_HiCarLink, SIGNAL(clicked()),
  40. this, SLOT(onClicked()));
  41. m_MirrorLink = new QPushButton(QString("Mirror"), this);
  42. m_MirrorLink->setGeometry(width() / 6 * 4, 0, width() / 6, height());
  43. QObject::connect(m_MirrorLink, SIGNAL(clicked()),
  44. this, SLOT(onClicked()));
  45. m_EasyConnectLink = new QPushButton(QString("Easy Connect"), this);
  46. m_EasyConnectLink->setGeometry(width() / 6 * 5, 0, width() / 6, height());
  47. QObject::connect(m_EasyConnectLink, SIGNAL(clicked()),
  48. this, SLOT(onClicked()));
  49. QObject::connect(this, SIGNAL(Change(bool)), this, SLOT(onUIChanged(bool)));
  50. mQRCodeWindow = new QRCodeWindow(this);
  51. mQRCodeWindow->hide();
  52. QObject::connect(this, SIGNAL(ChangeQRCode(bool)), this, SLOT(onChangeQRCode(bool)));
  53. QObject::connect(this, SIGNAL(QrcodeInfo(char*)), mQRCodeWindow, SLOT(onQrcodeInfo(char*)));
  54. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  55. mpLinkAssist = new LinkAssist();
  56. mpLinkAssist->RegisterUsbCallback(std::bind(&MainWindow::usb_state,this, std::placeholders::_1,std::placeholders::_2));
  57. mPlayer = mpLinkAssist->Initialize(Carplay);
  58. // Start(Mirror);
  59. }
  60. MainWindow::~MainWindow()
  61. {
  62. delete ui;
  63. delete mpLinkAssist;
  64. }
  65. void MainWindow::mousePressEvent(QMouseEvent *event)
  66. {
  67. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  68. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  69. if(mPlayer){
  70. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Press);
  71. // mPlayer->RequestStatus(QUERYTIME);
  72. // string a = "test";
  73. // mPlayer->RequestStatus(QUERYINPUT, (void*)a.c_str());
  74. }
  75. }
  76. void MainWindow::mouseReleaseEvent(QMouseEvent *event)
  77. {
  78. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  79. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  80. if(mPlayer)
  81. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Up);
  82. }
  83. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  84. {
  85. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  86. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  87. if(mPlayer)
  88. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Move);
  89. }
  90. void MainWindow::onClicked()
  91. {
  92. const QPushButton* const ptr = static_cast<const QPushButton* const >(sender());
  93. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  94. if(mConnectStatus == CONNECT_STATUS_DEVICE_ATTACHED)
  95. {
  96. if (ptr == m_AutoLink) {
  97. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  98. #ifdef USE_AUTO
  99. Start(Android_Auto, Wired);
  100. #endif
  101. } else if (ptr == m_CarplayLink) {
  102. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  103. #ifdef USE_CARPLAY
  104. Start(Carplay, Wired);
  105. #endif
  106. } else if (ptr == m_CarlifeLink) {
  107. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  108. #ifdef USE_CARLIFE
  109. Start(Carlife, Wired);
  110. #endif
  111. } else if(ptr == m_HiCarLink){
  112. #ifdef USE_HICAR
  113. Start(HiCar, Wired);
  114. #endif
  115. }
  116. else if(ptr == m_MirrorLink){
  117. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  118. #ifdef USE_MIRROR
  119. Start(Mirror,Wired);
  120. #endif
  121. } else if(ptr == m_EasyConnectLink){
  122. #ifdef USE_EASYCONNECT
  123. Start(ECLink, Wired);
  124. #endif
  125. }
  126. }
  127. else if(mConnectStatus == CONNECT_STATUS_CONNECT_SUCCEED){
  128. if(mIsRunningBackGround){
  129. mPlayer->SetForeground();
  130. emit Change(false);
  131. }
  132. }
  133. else if(mConnectStatus == CONNECT_STATUS_DISCONNECTED
  134. || mConnectStatus == CONNECT_STATUS_DEVICE_DEATTACHED
  135. || mConnectStatus == CONNECT_STATUS_APP_EXIT
  136. || mConnectStatus == CONNECT_STATUS_CONNECT_FAILED
  137. || mConnectStatus == CONNECT_STATUS_INTERRUPTED_BY_APP)
  138. {
  139. if(ptr == m_EasyConnectLink){
  140. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  141. #ifdef USE_EASYCONNECT
  142. /* system("insmod /lib/modules/4.19.192/kernel/drivers/net/wireless/realtek/rtl8821cs/rtl8821cs.ko");
  143. system("ifconfig wlan1 up");
  144. system("ifconfig wlan1 192.168.2.1");
  145. system("udhcpd /etc/udhcpd_p2p.conf");
  146. system("wpa_supplicant -Dnl80211 -iwlan1 -c /etc/p2p_supplicant.conf -B");
  147. system("wpa_cli -i wlan1 p2p_group_add persistent");
  148. system("wpa_cli -i wlan1 wps_pbc");
  149. printf("width = %d, height = %d\r\n",width(), height());
  150. sleep(2);
  151. mQRCodeWindow->show();
  152. */
  153. Start(ECLink, Wireless);
  154. #endif
  155. }
  156. /*
  157. else if(ptr == m_CarplayLink){
  158. #ifdef USE_CARPLAY
  159. Start(Carplay, Wireless);
  160. #endif
  161. }
  162. */
  163. }
  164. }
  165. void MainWindow::app_status(AppStatusMessage appStatusMessage, void *reserved)
  166. {
  167. // lock_guard<mutex> lock(mStateMutex);
  168. if(appStatusMessage == APP_FOREGROUND){
  169. printf("++ app_foreground ++\r\n");
  170. mIsRunningBackGround = false;
  171. emit Change(false);
  172. printf("-- app_foreground --\r\n");
  173. }
  174. else if(appStatusMessage == APP_BACKGROUND){
  175. printf("++ app_background ++\r\n");
  176. mIsRunningBackGround = true;
  177. emit Change(true);
  178. printf("-- app_background --\r\n");
  179. }
  180. else if(appStatusMessage == APP_RESERVED){
  181. long long time = (long long )reserved;
  182. //char *ctime(long *clock);
  183. struct tm *tdate;
  184. time_t t = time;
  185. tdate=localtime(&t);
  186. char *ptime = ctime(&t);
  187. printf("app_reserved long time = %lld, string time =%s\r\n", time, ptime);
  188. }
  189. else if(appStatusMessage == APP_QRCODE){
  190. char* rqcode = (char* )reserved;
  191. emit QrcodeInfo(rqcode);
  192. printf("rqcode = %s\r\n", rqcode);
  193. }
  194. else if(appStatusMessage == APP_LICENSE){
  195. License *pLicense = (License*)reserved;
  196. printf("activate = %d, msg = %s\r\n", pLicense->activate, pLicense->msg.c_str());
  197. }
  198. else if(appStatusMessage == APP_INPUTINFO){
  199. InputInfo *pInputInfo = (InputInfo*)reserved;
  200. printf("inputType = %d\r\n", pInputInfo->inputType);
  201. }
  202. else if(appStatusMessage == APP_VRTEXT){
  203. VRTextInfo *pVRTextInfo = (VRTextInfo*)reserved;
  204. printf("vr type = %d\r\n", pVRTextInfo->type);
  205. }
  206. else if(appStatusMessage == APP_VOICE_CMD){
  207. int cmd = (int )reserved;
  208. printf("cmd = %d\r\n", cmd);
  209. }
  210. else if(appStatusMessage == APP_MUSIC_STARTED){
  211. //mPlayer->SendKey(KEY_MUSIC_PLAY);
  212. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  213. }
  214. else if(appStatusMessage == APP_MUSIC_STOPPED){
  215. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  216. }
  217. else if(appStatusMessage == APP_VOICE_DUCK){
  218. DuckInfo *pDuckInfo = (DuckInfo*)reserved;
  219. printf("duck appStatusMessage inDurationSecs = %lf, inVolume = %lf\r\n", pDuckInfo->inDurationSecs, pDuckInfo->volume);
  220. }
  221. else if(appStatusMessage == APP_VOICE_UNDUCK){
  222. double* inDurationSecs = (double*) reserved;
  223. printf("unduck appStatusMessage inDurationSecs = %lf\r\n", *inDurationSecs);
  224. }
  225. }
  226. void MainWindow::onUIChanged(bool visible)
  227. {
  228. printf("++ ui visible %d ++\r\n",visible);
  229. m_CarplayLink->setVisible(visible);
  230. m_CarlifeLink->setVisible(visible);
  231. m_AutoLink->setVisible(visible);
  232. m_HiCarLink->setVisible(visible);
  233. m_MirrorLink->setVisible(visible);
  234. m_EasyConnectLink->setVisible(visible);
  235. printf("-- ui visible %d --\r\n",visible);
  236. }
  237. void MainWindow::onChangeQRCode(bool visible)
  238. {
  239. if(visible){
  240. mQRCodeWindow->show();
  241. }
  242. else
  243. mQRCodeWindow->hide();
  244. }
  245. void MainWindow::carlink_connect_state(ConnectedStatus status, PhoneType type)
  246. {
  247. switch (status)
  248. {
  249. case CONNECT_STATUS_CONNECTING:
  250. {
  251. // todo 正在连接
  252. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  253. mChangeMode = true;
  254. break;
  255. }
  256. case CONNECT_STATUS_CONNECT_SUCCEED:
  257. {
  258. // todo 连接成功
  259. mChangeMode = false;
  260. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  261. emit Change(false);
  262. emit ChangeQRCode(false);
  263. mPlayer->RequestStatus(QUERYTIME);
  264. printf("connect succeed\r\n");
  265. break;
  266. }
  267. case CONNECT_STATUS_CONNECT_FAILED:
  268. case CONNECT_STATUS_DISCONNECTED:
  269. case CONNECT_STATUS_APP_EXIT:
  270. case CONNECT_STATUS_INTERRUPTED_BY_APP:
  271. {
  272. // todo 连接断开
  273. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  274. printf("connect disconnected :%d\r\n",status);
  275. Stop();
  276. emit Change(true);
  277. mChangeMode = false;
  278. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  279. break;
  280. }
  281. default:
  282. break;
  283. }
  284. mConnectStatus = status;
  285. mPhonetype = type;
  286. }
  287. void MainWindow::usb_state(ConnectedStatus status, PhoneType type)
  288. {
  289. std::lock_guard<std::mutex> lock(mMutex);
  290. mConnectStatus = status;
  291. mPhonetype = type;
  292. printf("=== usb state = %d ===\r\n",status);
  293. if(status == CONNECT_STATUS_DEVICE_ATTACHED){
  294. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  295. if(!mChangeMode){
  296. // Start(Carlife, Wired);
  297. }
  298. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  299. }
  300. else if(status == CONNECT_STATUS_DEVICE_DEATTACHED){
  301. /*
  302. if(mPlayer){
  303. mPlayer->SetInserted(false, UnKnown);
  304. }
  305. */
  306. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  307. }
  308. }
  309. void MainWindow::Start(LinkType linkType, LinkMode linkMode)
  310. {
  311. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  312. mPlayer = mpLinkAssist->Initialize(linkType);
  313. mPlayer->GetIniConfig(mpLinkAssist);
  314. mPlayer->RegisterConnectCallback(std::bind(&MainWindow::carlink_connect_state,this, std::placeholders::_1,std::placeholders::_2));
  315. if(linkMode == Wireless)
  316. {
  317. //printf("str bt address %s\r\n", mstrBtAddress.c_str());
  318. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  319. if(linkType == Carlife)
  320. mPlayer->SendIphoneMacAddress("192.168.2.20");
  321. if(!mstrBtAddress.empty()){
  322. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  323. mPlayer->SendPhoneBluetooth(mstrBtAddress);
  324. }
  325. if(!(mWifiInfo.ssid.empty()| mWifiInfo.passphrase.empty() | mWifiInfo.channel_id.empty())){
  326. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  327. mPlayer->SendCarWifi(mWifiInfo);
  328. }
  329. }
  330. if(linkType == ECLink){
  331. mPlayer->SendCarBluetooth("car","12:34:56:78:90", "0000");
  332. mPlayer->SendLisenceCode("TEST036514313165461313");
  333. }
  334. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  335. mPlayer->RegisterAppStatusCallback(std::bind(&MainWindow::app_status,this, std::placeholders::_1,std::placeholders::_2));
  336. mPlayer->Initialize(linkMode, mPhonetype);
  337. mPlayer->Start();
  338. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  339. }
  340. void MainWindow::Stop()
  341. {
  342. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  343. if(mpLinkAssist)
  344. mpLinkAssist->Release();
  345. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  346. }