CarlifeLink.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. #include "CarlifeLink.h"
  2. #include "carlifeplayer.h"
  3. #include "util.h"
  4. #include "AudioRecord.h"
  5. #include "CCarLifeLibWrapper.h"
  6. #include "UsbHostService.h"
  7. #include "arkIphoneusbtethering.h"
  8. #include "arkusbtetheringcallbacks.h"
  9. using namespace CCarLifeLibH;
  10. #define MIRROR_WIDTH 1280
  11. #define MIRROR_HEIGHT 720
  12. static void resetUsb(int index){
  13. if(index == 0){
  14. system("echo peripheral > /sys/devices/platform/soc/e0100000.usb/musb-hdrc.0/mode");
  15. usleep(500000);
  16. system("echo otg > /sys/devices/platform/soc/e0100000.usb/musb-hdrc.0/mode");
  17. }
  18. else if(index == 1){
  19. system("echo peripheral > /sys/devices/platform/soc/e0400000.usb/musb-hdrc.1/mode");
  20. usleep(500000);
  21. system("echo otg > /sys/devices/platform/soc/e0400000.usb/musb-hdrc.1/mode");
  22. }
  23. }
  24. CarlifeLink::CarlifeLink()
  25. {
  26. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  27. #ifdef USE_CARLIFE
  28. m_pCarlifePlayer = new CarlifePlayer();
  29. mBRecorder = true;
  30. m_blongpress = false;
  31. m_bMusicVoice = false;
  32. #endif
  33. }
  34. CarlifeLink::~CarlifeLink(){
  35. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  36. #ifdef USE_CARLIFE
  37. if(m_pCarlifePlayer){
  38. delete m_pCarlifePlayer;
  39. m_pCarlifePlayer = nullptr;
  40. }
  41. #endif
  42. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  43. }
  44. #ifdef USE_CARLIFE
  45. extern int gvid;
  46. bool CarlifeLink::init(LinkMode linkMode)
  47. {
  48. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  49. if(m_pCarlifePlayer){
  50. if(mPhoneType == Phone_Android){
  51. if(mCarlifeConfig.android_link_mode == 1)
  52. m_pCarlifePlayer->SetAoaLink(true);
  53. else
  54. m_pCarlifePlayer->SetAoaLink(false);
  55. }
  56. else if(mPhoneType == Phone_IOS){
  57. if(mCarlifeConfig.ios_link_mode == 0)
  58. m_pCarlifePlayer->SetEapLink(true);
  59. else
  60. {
  61. m_pCarlifePlayer->SetEapLink(false);
  62. ArkUsbTetheringCallbacks *callbacks = new ArkUsbTetheringCallbacks();
  63. ArkIphoneUsbTethering::instance()->registerCallbacks(callbacks, m_pCarlifePlayer);
  64. }
  65. }
  66. if(linkMode == Wireless)
  67. m_pCarlifePlayer->SetUserPhoneOS(WIRELESS);
  68. m_pCarlifePlayer->SetidVendor(gvid);
  69. m_pCarlifePlayer->Initialize();
  70. m_pCarlifePlayer->SetLinkstatusCallback(std::bind(&CarlifeLink::status_callback_func,this, std::placeholders::_1,std::placeholders::_2),this);
  71. m_pCarlifePlayer->SetVideoStartCallback(std::bind(&CarlifeLink::video_start_callback_func,this, std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4),this);
  72. m_pCarlifePlayer->SetVideoInfoCallback(true, std::bind(&CarlifeLink::video_callback_func,this, std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5),this);
  73. m_pCarlifePlayer->SetAudioStartCallback(std::bind(&CarlifeLink::audio_start_callback_func,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5,std::placeholders::_6),this);
  74. m_pCarlifePlayer->SetAudioInfoCallback(std::bind(&CarlifeLink::audio_callback_func,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4),this);
  75. m_pCarlifePlayer->SetCmdPhoneNumberCallback(std::bind(&CarlifeLink::phone_number_callback_func,this,std::placeholders::_1,std::placeholders::_2),this);
  76. send_screen_size(MIRROR_WIDTH, MIRROR_HEIGHT);
  77. }
  78. return true;
  79. }
  80. void CarlifeLink::set_inserted(bool inserted, PhoneType phoneType)
  81. {
  82. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  83. if(m_pCarlifePlayer){
  84. if(phoneType == Phone_IOS)
  85. m_pCarlifePlayer->SetLinkType(IOS_CARLIFE);
  86. else if(phoneType == Phone_Android)
  87. m_pCarlifePlayer->SetLinkType(ANDROID_CARLIFE);
  88. m_pCarlifePlayer->SetInserted(inserted);
  89. mPhoneType = phoneType;
  90. }
  91. }
  92. bool CarlifeLink::release()
  93. {
  94. if(m_pCarlifePlayer){
  95. m_pCarlifePlayer->UnInitialize();
  96. delete m_pCarlifePlayer;
  97. m_pCarlifePlayer = nullptr;
  98. }
  99. }
  100. bool CarlifeLink::start()
  101. {
  102. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  103. int ret = -1; bool res = true;
  104. if(m_pCarlifePlayer){
  105. onSdkConnectStatus(CONNECT_STATUS_CONNECTING, mPhoneType);
  106. if((mCarlifeConfig.ios_link_mode == 1) && (mPhoneType == Phone_IOS)){
  107. ArkIphoneUsbTethering::instance()->init();
  108. ArkIphoneUsbTethering::instance()->start();
  109. }
  110. ret = m_pCarlifePlayer->StartLink();
  111. printf("start ret = %d\r\n",ret);
  112. }
  113. return res;
  114. }
  115. bool CarlifeLink::stop()
  116. {
  117. if(m_pCarlifePlayer){
  118. m_pCarlifePlayer->ExitProcess();
  119. if(mCarlifeConfig.ios_link_mode == 1 && mPhoneType == Phone_IOS){
  120. usbmuxd_stop();
  121. }
  122. }
  123. return true;
  124. }
  125. bool CarlifeLink::start_mirror()
  126. {
  127. if(m_pCarlifePlayer)
  128. m_pCarlifePlayer->VideoStart();
  129. return true;
  130. }
  131. bool CarlifeLink::stop_mirror()
  132. {
  133. if(m_pCarlifePlayer)
  134. m_pCarlifePlayer->VideoPause();
  135. return true;
  136. }
  137. void CarlifeLink::set_mac(string mac)
  138. {
  139. if(m_pCarlifePlayer){
  140. static char ip[128] = {0};
  141. strcpy(ip,mac.c_str());
  142. printf("ip = %d\r\n", ip);
  143. m_pCarlifePlayer->SetIPAddress(ip);
  144. }
  145. }
  146. bool CarlifeLink::send_key(KeyCode keyCode)
  147. {
  148. HardKeyCmd carlifeKey = KEYCODE_Media_Start;
  149. if(keyCode == KEY_MUSIC_PLAY){
  150. carlifeKey = KEYCODE_Media_Start;
  151. }
  152. else if(keyCode == KEY_MUSIC_PAUSE
  153. || keyCode == KEY_MUSIC_STOP){
  154. carlifeKey = KEYCODE_Media_Stop;
  155. }
  156. else if(keyCode == KEY_MUSIC_NEXT){
  157. carlifeKey = KEYCODE_Seek_Add;
  158. }
  159. else if(keyCode == KEY_MUSIC_PREVIOUS){
  160. carlifeKey = KEYCODE_Seek_Sub;
  161. }
  162. else if(keyCode == KEY_PHONE){
  163. carlifeKey = KEYCODE_TEL;
  164. }
  165. else if(keyCode == KEY_PICKUP_PHONE){
  166. carlifeKey = KEYCODE_Phone_Call;
  167. }
  168. else if(keyCode == KEY_HANGUP_PHONE){
  169. carlifeKey == KEYCODE_Phone_End;
  170. }
  171. else if(keyCode == KEY_NAVIGATION){
  172. carlifeKey = KEYCODE_Navi;
  173. }
  174. else if(keyCode == KEY_MUSIC_PLAY_PAUSE){
  175. if(m_bMusicVoice)
  176. carlifeKey = KEYCODE_Media_Stop;
  177. else
  178. carlifeKey = KEYCODE_Media_Start;
  179. }
  180. else if(keyCode == KEY_VOICE_ASSISTANT){
  181. carlifeKey = KEYCODE_VR_Start;
  182. }
  183. else if(keyCode == KEY_SYSTEM_HOME){
  184. carlifeKey = KEYCODE_Home;
  185. }
  186. else if(keyCode == KEY_CAR_BACK){
  187. keyCode == KEYCODE_Back;
  188. }
  189. else if(keyCode == KEY_CAR_OK){
  190. keyCode == KEYCODE_OK;
  191. }
  192. m_pCarlifePlayer->Key(carlifeKey);
  193. return true;
  194. }
  195. void CarlifeLink::send_touch(int x, int y, TouchCode touchCode)
  196. {
  197. if(touchCode == Touch_Press)
  198. {
  199. m_src_x[0] = x;
  200. m_src_y[0] = y;
  201. m_old_src_x[0] = x;
  202. m_old_src_y[0] = y;
  203. m_blongpress = false;
  204. if(m_pCarlifePlayer->GetPhoneOS() == IOS){
  205. m_pCarlifePlayer->Touch(m_src_x[0], m_src_y[0], mVideoFrame.dst_width, mVideoFrame.dst_height, ScreenPress);
  206. return ;
  207. }
  208. else
  209. {
  210. m_pCarlifePlayer->Touch(m_src_x[0], m_src_y[0], mVideoFrame.dst_width, mVideoFrame.dst_height, ScreenPress);
  211. }
  212. }
  213. else if(touchCode == Touch_Up)
  214. {
  215. if(m_pCarlifePlayer->GetPhoneOS() != IOS){
  216. m_pCarlifePlayer->Touch(x, y, mVideoFrame.dst_width, mVideoFrame.dst_height, ScreenRelease);
  217. }
  218. else if(m_pCarlifePlayer->GetPhoneOS() == IOS /*&& m_blongpress == false*/)
  219. {
  220. if(abs(m_old_src_x[0] - x) < 10 && abs(m_old_src_y[0] - y) < 10)
  221. {
  222. m_pCarlifePlayer->Touch(m_src_x[0], m_src_y[0], mVideoFrame.dst_width, mVideoFrame.dst_height,ScreenSingleClick);
  223. }
  224. }
  225. m_blongpress = false;
  226. }
  227. else if(touchCode == Touch_Move)
  228. {
  229. if(m_pCarlifePlayer->GetPhoneOS() == IOS && m_blongpress == false)
  230. {
  231. m_blongpress = true;
  232. m_pCarlifePlayer->Touch(x, y, mVideoFrame.dst_width, mVideoFrame.dst_height,ScreenLongPress);
  233. m_src_x[0] = x;
  234. m_src_y[0] = y;
  235. return;
  236. }
  237. m_pCarlifePlayer->Touch(x, y, mVideoFrame.dst_width, mVideoFrame.dst_height,ScreenMove);
  238. m_src_x[0] = x;
  239. m_src_y[0] = y;
  240. }
  241. }
  242. void CarlifeLink::request_status(RequestAppStatus requestAppStatus, void *reserved)
  243. {
  244. app_status(APP_RESERVED, nullptr);
  245. }
  246. bool CarlifeLink::send_wheel(WheelCode wheel, bool foucs)//foucs配置的时候生效
  247. {
  248. if(wheel == Wheel_Next){
  249. m_pCarlifePlayer->Key(KEYCODE_Selector_Next);
  250. }
  251. else if(wheel == Wheel_Previous){
  252. m_pCarlifePlayer->Key(KEYCODE_Selector_Previous);
  253. }
  254. return true;
  255. }
  256. bool CarlifeLink::send_night_mode(bool night)
  257. {
  258. }
  259. bool CarlifeLink::set_background()
  260. {
  261. m_pCarlifePlayer->SetPlayForeground(false);
  262. return true;
  263. }
  264. bool CarlifeLink::set_foreground()
  265. {
  266. m_pCarlifePlayer->SetPlayForeground(true);
  267. return true;
  268. }
  269. bool CarlifeLink::get_audio_focus()
  270. {
  271. return true;
  272. }
  273. bool CarlifeLink::release_audio_focus()
  274. {
  275. return true;
  276. }
  277. void CarlifeLink::status_callback_func(int status, void* parameter)
  278. {
  279. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  280. CarlifeLink *pthis = (CarlifeLink*)parameter;
  281. if(CMD_FAILED == status){
  282. resetUsb(0);
  283. if(mCarlifeConfig.ios_link_mode == 1 && mPhoneType == Phone_IOS)
  284. usbmuxd_stop();
  285. onSdkConnectStatus(CONNECT_STATUS_CONNECT_FAILED, UnKnown);
  286. }
  287. else if(CMD_SUCCESS == status){
  288. m_pCarlifePlayer->GetCarScreenSize(mVideoFrame.dst_width, mVideoFrame.dst_height);
  289. onSdkConnectStatus(CONNECT_STATUS_CONNECT_SUCCEED,mPhoneType);
  290. }
  291. else if(CMD_REMOVED == status){
  292. if(mCarlifeConfig.ios_link_mode == 1 && mPhoneType == Phone_IOS)
  293. usbmuxd_stop();
  294. onSdkConnectStatus(CONNECT_STATUS_DISCONNECTED, UnKnown);
  295. }
  296. else if(CMD_RECORDER_INIT == status){
  297. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  298. AudioInfo info = {16000, 1, 16};
  299. record_start(info);
  300. }
  301. else if(CMD_RECORDER_UNINIT == status){
  302. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  303. record_stop();
  304. }
  305. else if(CMD_RECORD_START == status){
  306. record_pause(false);
  307. }
  308. else if(CMD_RECORD_END == status)
  309. {
  310. record_pause(true);
  311. }
  312. else if(CMD_OPEN_CARLIFE == status){
  313. app_status(APP_NOT_RUNNING, nullptr);
  314. }
  315. else if(CMD_BACKGROUND == status){
  316. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  317. app_status(APP_BACKGROUND, nullptr);
  318. }
  319. else if(CMD_FOREGROUND == status){
  320. app_status(APP_FOREGROUND, nullptr);
  321. }
  322. else if(status >= CMD_BT_CALL_INCOMMING){
  323. bt_call_status(status);
  324. }
  325. else if(status == CMD_CALL_PHONE){
  326. bt_call_action(CALL_TYPE_DAIL, nullptr, pthis->mPhoneNumber.c_str());
  327. }
  328. else if(status == CMD_CALL_PHONE_EXIT){
  329. bt_call_action(CALL_TYPE_HANG_UP, nullptr, pthis->mPhoneNumber.c_str());
  330. }
  331. else if(status == CMD_CARLIFE_EXITED_INVOKED){
  332. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  333. resetUsb(0);
  334. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  335. }
  336. else if(status == CMD_SIRI_START){
  337. app_status(APP_VR_STARTED);
  338. }
  339. else if(status == CMD_SIRI_STOP){
  340. app_status(APP_VR_STOPPED);
  341. }
  342. else if(status == CMD_ASSIST_AUDIO_START){
  343. app_status(APP_NAVI_STARTED);
  344. }
  345. else if(status == CMD_ASSIST_AUDIO_STOP){
  346. app_status(APP_NAVI_STOPPED);
  347. }
  348. else if(status == CMD_MUSIC_START){
  349. m_bMusicVoice = true;
  350. app_status(APP_MUSIC_STARTED);
  351. }
  352. else if(status == CMD_MUSIC_STOP){
  353. m_bMusicVoice = false;
  354. app_status(APP_MUSIC_STOPPED);
  355. }
  356. }
  357. void CarlifeLink::bt_call_status(int status)
  358. {
  359. // call_action(status, nullptr, mPhoneNumber);
  360. }
  361. void CarlifeLink::usbmuxd_stop()
  362. {
  363. ArkIphoneUsbTethering::instance()->uninit();
  364. system("usbmuxd -X");
  365. }
  366. #define DUMP_REC_FILE 0
  367. #if DUMP_REC_FILE
  368. static FILE *pRecfile = NULL;
  369. #endif
  370. void CarlifeLink::record_audio_callback(unsigned char *data, int len)
  371. {
  372. #if DUMP_REC_FILE
  373. if (NULL == pRecfile) {
  374. pRecfile = fopen("/tmp/rec_in.pcm", "w");
  375. }
  376. if (pRecfile) {
  377. fwrite(data, 1, len, pRecfile);
  378. printf("rec len:%d\r\n ", len);
  379. }
  380. #endif
  381. //printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  382. if(len > 0){
  383. int ret = CCarLifeLib::getInstance()->sendVRRecordData(data, len, 0);
  384. if(ret < 0){
  385. printf("record audio callback ret = %d\r\n", ret);
  386. resetUsb(0);
  387. }
  388. }
  389. usleep(10000);
  390. //printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  391. }
  392. void CarlifeLink::send_screen_size(int width, int height)
  393. {
  394. if(m_pCarlifePlayer){
  395. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  396. m_pCarlifePlayer->GetCarScreenSize(width, height);
  397. }
  398. }
  399. void CarlifeLink::send_car_bluetooth(const string& name, const string& address, const string& pin)
  400. {
  401. m_pCarlifePlayer->SendCarBluetooth(name, address,pin);
  402. }
  403. bool CarlifeLink::open_page(AppPage appPage)
  404. {
  405. switch (appPage) {
  406. case APP_PAGE_NAVIGATION:
  407. m_pCarlifePlayer->Key(KEYCODE_Navi);
  408. break;
  409. case APP_PAGE_MAIN:
  410. m_pCarlifePlayer->Key(KEYCODE_MAIN);
  411. break;
  412. case APP_PAGE_MUSIC:
  413. m_pCarlifePlayer->Key(KEYCODE_Media);
  414. break;
  415. case APP_PAGE_VR:
  416. m_pCarlifePlayer->Key(KEYCODE_VR_Start);
  417. break;
  418. case APP_PAGE_NAVI_HOME:
  419. case APP_PAGE_4S_SHOP:
  420. case APP_PAGE_CAR_PARK:
  421. case APP_PAGE_NAVI_WORK:
  422. case APP_PAGE_NAVI_GAS_STATION:
  423. break;
  424. }
  425. return true;
  426. }
  427. void CarlifeLink::video_start_callback_func(bool start, int width, int height, void *parameter)
  428. {
  429. if(start)
  430. video_start(0, 0, width, height);
  431. else
  432. video_stop();
  433. }
  434. void CarlifeLink::video_callback_func(int width, int height, unsigned char* data, int length, void* parameter)
  435. {
  436. video_play(data, length);
  437. }
  438. void CarlifeLink::audio_start_callback_func(bool start, int type, int rate, int bit, int channel,void* parameter)
  439. {
  440. if(start)
  441. audio_start((AudioType)type, rate, bit, channel);
  442. else
  443. audio_stop((AudioType)type);
  444. }
  445. void CarlifeLink::audio_callback_func(int type, unsigned char* data, int length, void* parameter)
  446. {
  447. audio_play((AudioType)type, data, length);
  448. }
  449. void CarlifeLink::phone_number_callback_func(string number, void* parameter)
  450. {
  451. mPhoneNumber = number;
  452. }
  453. #endif