mainwindow.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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() / 5 * 0, 0, width() / 5, 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() / 5 * 1, 0, width() / 5, 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() / 5 * 2, 0, width() / 5, height());
  35. QObject::connect(m_CarlifeLink, SIGNAL(clicked()),
  36. this, SLOT(onClicked()));
  37. m_MirrorLink = new QPushButton(QString("Mirror"), this);
  38. m_MirrorLink->setGeometry(width() / 5 * 3, 0, width() / 5, height());
  39. QObject::connect(m_MirrorLink, SIGNAL(clicked()),
  40. this, SLOT(onClicked()));
  41. m_EasyConnectLink = new QPushButton(QString("Easy Connect"), this);
  42. m_EasyConnectLink->setGeometry(width() / 5 * 4, 0, width() / 5, height());
  43. QObject::connect(m_EasyConnectLink, SIGNAL(clicked()),
  44. this, SLOT(onClicked()));
  45. QObject::connect(this, SIGNAL(Change(bool)), this, SLOT(onUIChanged(bool)));
  46. mQRCodeWindow = new QRCodeWindow(this);
  47. mQRCodeWindow->hide();
  48. QObject::connect(this, SIGNAL(ChangeQRCode(bool)), this, SLOT(onChangeQRCode(bool)));
  49. QObject::connect(this, SIGNAL(QrcodeInfo(char*)), mQRCodeWindow, SLOT(onQrcodeInfo(char*)));
  50. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  51. mpLinkAssist = new LinkAssist();
  52. mpLinkAssist->RegisterUsbCallback(std::bind(&MainWindow::usb_state,this, std::placeholders::_1,std::placeholders::_2));
  53. // Start(Mirror);
  54. }
  55. MainWindow::~MainWindow()
  56. {
  57. delete ui;
  58. delete mpLinkAssist;
  59. }
  60. void MainWindow::mousePressEvent(QMouseEvent *event)
  61. {
  62. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  63. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  64. if(mPlayer){
  65. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Press);
  66. mPlayer->RequestStatus(QUERYTIME);
  67. string a = "test";
  68. mPlayer->RequestStatus(QUERYINPUT, (void*)a.c_str());
  69. }
  70. }
  71. void MainWindow::mouseReleaseEvent(QMouseEvent *event)
  72. {
  73. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  74. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  75. if(mPlayer)
  76. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Up);
  77. }
  78. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  79. {
  80. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  81. printf("x:%d,y:%d\r\n",event->pos().x(),event->pos().y());
  82. if(mPlayer)
  83. mPlayer->SendTouch(event->pos().x(),event->pos().y(), Touch_Move);
  84. }
  85. void MainWindow::onClicked()
  86. {
  87. const QPushButton* const ptr = static_cast<const QPushButton* const >(sender());
  88. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  89. if(mConnectStatus == CONNECT_STATUS_DEVICE_ATTACHED)
  90. {
  91. if (ptr == m_AutoLink) {
  92. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  93. Start(Android_Auto, Wired);
  94. } else if (ptr == m_CarplayLink) {
  95. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  96. Start(Carplay, Wired);
  97. } else if (ptr == m_CarlifeLink) {
  98. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  99. Start(Carlife, Wired);
  100. } else if(ptr == m_MirrorLink){
  101. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  102. Start(Mirror,Wired);
  103. } else if(ptr == m_EasyConnectLink){
  104. Start(ECLink, Wired);
  105. }
  106. }
  107. else if(mConnectStatus == CONNECT_STATUS_CONNECT_SUCCEED){
  108. if(mIsRunningBackGround){
  109. mPlayer->SetForeground();
  110. emit Change(false);
  111. }
  112. }
  113. else if(mConnectStatus == CONNECT_STATUS_DISCONNECTED
  114. || mConnectStatus == CONNECT_STATUS_DEVICE_DEATTACHED
  115. || mConnectStatus == CONNECT_STATUS_APP_EXIT
  116. || mConnectStatus == CONNECT_STATUS_CONNECT_FAILED
  117. || mConnectStatus == CONNECT_STATUS_INTERRUPTED_BY_APP)
  118. {
  119. if(ptr == m_EasyConnectLink){
  120. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  121. mQRCodeWindow->show();
  122. Start(ECLink, Wireless);
  123. }
  124. else if(ptr == m_CarplayLink){
  125. Start(Carplay, Wireless);
  126. }
  127. }
  128. }
  129. void MainWindow::app_status(AppStatusMessage appStatusMessage, void *reserved)
  130. {
  131. if(appStatusMessage == APP_FOREGROUND){
  132. mIsRunningBackGround = false;
  133. }
  134. else if(appStatusMessage == APP_BACKGROUND){
  135. mIsRunningBackGround = true;
  136. emit Change(true);
  137. }
  138. else if(appStatusMessage == APP_RESERVED){
  139. long long time = (long long )reserved;
  140. //char *ctime(long *clock);
  141. struct tm *tdate;
  142. time_t t = time;
  143. tdate=localtime(&t);
  144. char *ptime = ctime(&t);
  145. printf("app_reserved long time = %lld, string time =%s\r\n", time, ptime);
  146. }
  147. else if(appStatusMessage == APP_QRCODE){
  148. char* rqcode = (char* )reserved;
  149. emit QrcodeInfo(rqcode);
  150. printf("rqcode = %s\r\n", rqcode);
  151. }
  152. else if(appStatusMessage == APP_LICENSE){
  153. License *pLicense = (License*)reserved;
  154. printf("activate = %d, msg = %s\r\n", pLicense->activate, pLicense->msg.c_str());
  155. }
  156. else if(appStatusMessage == APP_INPUTINFO){
  157. ECInputInfo *pInputInfo = (ECInputInfo*)reserved;
  158. printf("inputType = %d\r\n", pInputInfo->inputType);
  159. }
  160. else if(appStatusMessage == APP_VRTEXT){
  161. ECVRTextInfo *pVRTextInfo = (ECVRTextInfo*)reserved;
  162. printf("vr type = %d\r\n", pVRTextInfo->type);
  163. }
  164. else if(appStatusMessage == APP_VOICE_CMD){
  165. int cmd = (int )reserved;
  166. printf("cmd = %d\r\n", cmd);
  167. }
  168. }
  169. void MainWindow::onUIChanged(bool visible)
  170. {
  171. m_CarplayLink->setVisible(visible);
  172. m_CarlifeLink->setVisible(visible);
  173. m_AutoLink->setVisible(visible);
  174. m_MirrorLink->setVisible(visible);
  175. m_EasyConnectLink->setVisible(visible);
  176. }
  177. void MainWindow::onChangeQRCode(bool visible)
  178. {
  179. if(visible){
  180. mQRCodeWindow->show();
  181. }
  182. else
  183. mQRCodeWindow->hide();
  184. }
  185. void MainWindow::carlink_connect_state(ConnectedStatus status, PhoneType type)
  186. {
  187. switch (status)
  188. {
  189. case CONNECT_STATUS_CONNECTING:
  190. {
  191. // todo 正在连接
  192. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  193. mChangeMode = true;
  194. break;
  195. }
  196. case CONNECT_STATUS_CONNECT_SUCCEED:
  197. {
  198. // todo 连接成功
  199. mChangeMode = false;
  200. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  201. emit Change(false);
  202. emit ChangeQRCode(false);
  203. mPlayer->RequestStatus(QUERYTIME);
  204. printf("connect succeed\r\n");
  205. break;
  206. }
  207. case CONNECT_STATUS_CONNECT_FAILED:
  208. case CONNECT_STATUS_DISCONNECTED:
  209. case CONNECT_STATUS_APP_EXIT:
  210. case CONNECT_STATUS_INTERRUPTED_BY_APP:
  211. {
  212. // todo 连接断开
  213. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  214. printf("connect disconnected :%d\r\n",status);
  215. Stop();
  216. emit Change(true);
  217. mChangeMode = false;
  218. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  219. break;
  220. }
  221. default:
  222. break;
  223. }
  224. mConnectStatus = status;
  225. mPhonetype = type;
  226. }
  227. void MainWindow::usb_state(ConnectedStatus status, PhoneType type)
  228. {
  229. std::lock_guard<std::mutex> lock(mMutex);
  230. mConnectStatus = status;
  231. mPhonetype = type;
  232. if(status == CONNECT_STATUS_DEVICE_ATTACHED){
  233. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  234. if(!mChangeMode){
  235. //Start(Mirror);
  236. }
  237. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  238. }
  239. else if(status == CONNECT_STATUS_DEVICE_DEATTACHED){
  240. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  241. }
  242. }
  243. void MainWindow::Start(LinkType linkType, LinkMode linkMode)
  244. {
  245. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  246. mPlayer = mpLinkAssist->Initialize(linkType);
  247. mPlayer->GetIniConfig(mpLinkAssist);
  248. mPlayer->RegisterConnectCallback(std::bind(&MainWindow::carlink_connect_state,this, std::placeholders::_1,std::placeholders::_2));
  249. if(linkMode == Wireless)
  250. {
  251. //printf("str bt address %s\r\n", mstrBtAddress.c_str());
  252. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  253. if(!mstrBtAddress.empty()){
  254. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  255. mPlayer->SendPhoneBluetooth(mstrBtAddress);
  256. }
  257. if(!(mWifiInfo.ssid.empty()| mWifiInfo.passphrase.empty() | mWifiInfo.channel_id.empty())){
  258. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  259. mPlayer->SendCarWifi(mWifiInfo);
  260. }
  261. }
  262. if(linkType == ECLink){
  263. mPlayer->SendCarBluetooth("car","12:34:56:78:90", "0000");
  264. mPlayer->SendLisenceCode("TEST036514313165461313");
  265. }
  266. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  267. mPlayer->RegisterAppStatusCallback(std::bind(&MainWindow::app_status,this, std::placeholders::_1,std::placeholders::_2));
  268. mPlayer->Initialize(linkMode, mPhonetype);
  269. mPlayer->Start();
  270. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  271. }
  272. void MainWindow::Stop()
  273. {
  274. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  275. if(mpLinkAssist)
  276. mpLinkAssist->Release();
  277. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  278. }