antfs_host.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /*
  2. This software is subject to the license described in the License.txt file
  3. included with this software distribution. You may not use this file except in compliance
  4. with this license.
  5. Copyright (c) Dynastream Innovations Inc. 2013
  6. All rights reserved.
  7. */
  8. #include "types.h"
  9. #include "dsi_thread.h"
  10. #include "config.h"
  11. #include "antfs_host.hpp"
  12. #include "dsi_debug.hpp"
  13. #if defined(DEBUG_FILE)
  14. #include "macros.h"
  15. #endif
  16. //#include <stdio.h>
  17. //#include <string.h>
  18. //#include <stdlib.h>
  19. //#include <time.h>
  20. //////////////////////////////////////////////////////////////////////////////////
  21. // Private Definitions
  22. //////////////////////////////////////////////////////////////////////////////////
  23. #define DEFAULT_CHANNEL_NUMBER ((UCHAR) 0)
  24. //////////////////////////////////////////////////////////////////////////////////
  25. // Public Functions
  26. //////////////////////////////////////////////////////////////////////////////////
  27. ANTFSHost::ANTFSHost()
  28. {
  29. bInitFailed = FALSE;
  30. bOpen = FALSE;
  31. eWrappedState = ANTFS_STATE_IDLE;
  32. ulHostSerialNumber = 0;
  33. hANTFSThread = (DSI_THREAD_ID)NULL; // Handle for the ANTFS thread
  34. bKillThread = FALSE;
  35. bANTFSThreadRunning = FALSE;
  36. pclMsgHandler = new DSIANTDevice();
  37. pclHost = new ANTFSHostChannel();
  38. if (DSIThread_MutexInit(&stMutexCriticalSection) != DSI_THREAD_ENONE)
  39. {
  40. bInitFailed = TRUE;
  41. }
  42. if (DSIThread_MutexInit(&stMutexResponseQueue) != DSI_THREAD_ENONE)
  43. {
  44. bInitFailed = TRUE;
  45. }
  46. if (DSIThread_CondInit(&stCondANTFSThreadExit) != DSI_THREAD_ENONE)
  47. {
  48. bInitFailed = TRUE;
  49. }
  50. if (DSIThread_CondInit(&stCondWaitForResponse) != DSI_THREAD_ENONE)
  51. {
  52. bInitFailed = TRUE;
  53. }
  54. }
  55. ///////////////////////////////////////////////////////////////////////
  56. ANTFSHost::~ANTFSHost()
  57. {
  58. this->Close();
  59. delete pclHost;
  60. delete pclMsgHandler;
  61. if (bInitFailed == FALSE)
  62. {
  63. DSIThread_MutexDestroy(&stMutexCriticalSection);
  64. DSIThread_MutexDestroy(&stMutexResponseQueue);
  65. DSIThread_CondDestroy(&stCondANTFSThreadExit);
  66. DSIThread_CondDestroy(&stCondWaitForResponse);
  67. }
  68. }
  69. ///////////////////////////////////////////////////////////////////////
  70. UCHAR ANTFSHost::GetVersion(UCHAR *pucVersionString_, UCHAR ucBufferSize_)
  71. {
  72. return pclHost->GetVersion(pucVersionString_, ucBufferSize_);
  73. }
  74. ///////////////////////////////////////////////////////////////////////
  75. BOOL ANTFSHost::Init(UCHAR ucUSBDeviceNum_, USHORT usBaudRate_)
  76. {
  77. return InitHost(ucUSBDeviceNum_, usBaudRate_, FALSE);
  78. }
  79. ///////////////////////////////////////////////////////////////////////
  80. BOOL ANTFSHost::Init(void)
  81. {
  82. return InitHost(0, 0 , TRUE);
  83. }
  84. ///////////////////////////////////////////////////////////////////////
  85. void ANTFSHost::SetChannelID(UCHAR ucDeviceType_, UCHAR ucTransmissionType_)
  86. {
  87. pclHost->SetChannelID(ucDeviceType_, ucTransmissionType_);
  88. }
  89. ///////////////////////////////////////////////////////////////////////
  90. void ANTFSHost::SetMessagePeriod(USHORT usMessagePeriod_)
  91. {
  92. pclHost->SetChannelPeriod(usMessagePeriod_);
  93. }
  94. ///////////////////////////////////////////////////////////////////////
  95. void ANTFSHost::SetNetworkkey(UCHAR ucNetworkkey[])
  96. {
  97. pclHost->SetNetworkKey(0, ucNetworkkey);
  98. }
  99. ///////////////////////////////////////////////////////////////////////
  100. void ANTFSHost::SetProximitySearch(UCHAR ucSearchThreshold_)
  101. {
  102. pclHost->SetProximitySearch(ucSearchThreshold_);
  103. }
  104. ///////////////////////////////////////////////////////////////////////
  105. ANTFS_STATE ANTFSHost::GetStatus(void)
  106. {
  107. ANT_USB_STATE eUSBState;
  108. ANTFS_HOST_STATE eANTFSState;
  109. DSIThread_MutexLock(&stMutexCriticalSection);
  110. eUSBState = pclMsgHandler->GetStatus();
  111. switch(eUSBState)
  112. {
  113. case ANT_USB_STATE_OFF:
  114. case ANT_USB_STATE_IDLE:
  115. eWrappedState = ANTFS_STATE_IDLE;
  116. break;
  117. case ANT_USB_STATE_IDLE_POLLING_USB:
  118. eWrappedState = ANTFS_STATE_IDLE_POLLING_USB;
  119. break;
  120. case ANT_USB_STATE_OPEN:
  121. eWrappedState = ANTFS_STATE_OPEN;
  122. break;
  123. }
  124. if(eWrappedState < ANTFS_STATE_OPEN)
  125. {
  126. DSIThread_MutexUnlock(&stMutexCriticalSection);
  127. return eWrappedState;
  128. }
  129. eANTFSState = pclHost->GetStatus();
  130. switch(eANTFSState)
  131. {
  132. case ANTFS_HOST_STATE_OFF:
  133. case ANTFS_HOST_STATE_IDLE:
  134. // Keep state...
  135. break;
  136. case ANTFS_HOST_STATE_REQUESTING_SESSION: // We should not get this one
  137. // Keep as Open
  138. break;
  139. case ANTFS_HOST_STATE_DISCONNECTING:
  140. eWrappedState = ANTFS_STATE_DISCONNECTING;
  141. break;
  142. case ANTFS_HOST_STATE_SEARCHING:
  143. eWrappedState = ANTFS_STATE_SEARCHING;
  144. break;
  145. case ANTFS_HOST_STATE_CONNECTED:
  146. eWrappedState = ANTFS_STATE_CONNECTED;
  147. break;
  148. case ANTFS_HOST_STATE_AUTHENTICATING:
  149. eWrappedState = ANTFS_STATE_AUTHENTICATING;
  150. break;
  151. case ANTFS_HOST_STATE_TRANSPORT:
  152. eWrappedState = ANTFS_STATE_TRANSPORT;
  153. break;
  154. case ANTFS_HOST_STATE_DOWNLOADING:
  155. eWrappedState = ANTFS_STATE_DOWNLOADING;
  156. break;
  157. case ANTFS_HOST_STATE_UPLOADING:
  158. eWrappedState = ANTFS_STATE_UPLOADING;
  159. break;
  160. case ANTFS_HOST_STATE_ERASING:
  161. eWrappedState = ANTFS_STATE_ERASING;
  162. break;
  163. case ANTFS_HOST_STATE_SENDING:
  164. eWrappedState = ANTFS_STATE_SENDING;
  165. break;
  166. case ANTFS_HOST_STATE_RECEIVING:
  167. eWrappedState = ANTFS_STATE_RECEIVING;
  168. break;
  169. }
  170. DSIThread_MutexUnlock(&stMutexCriticalSection);
  171. return eWrappedState;
  172. }
  173. ///////////////////////////////////////////////////////////////////////
  174. void ANTFSHost::Close(void)
  175. {
  176. #if defined(DEBUG_FILE)
  177. DSIDebug::ThreadWrite("ANTFSHost::Close(): Closing ANTFS...");
  178. #endif
  179. DSIThread_MutexLock(&stMutexCriticalSection);
  180. // Stop the response thread
  181. bKillThread = TRUE;
  182. #if defined(DEBUG_FILE)
  183. DSIDebug::ThreadWrite("ANTFSHost::Close(): SetEvent(stCondWaitForResponse).");
  184. #endif
  185. DSIThread_MutexLock(&stMutexResponseQueue);
  186. DSIThread_CondSignal(&stCondWaitForResponse);
  187. clResponseQueue.Clear();
  188. DSIThread_MutexUnlock(&stMutexResponseQueue);
  189. if (hANTFSThread)
  190. {
  191. if (bANTFSThreadRunning == TRUE)
  192. {
  193. #if defined(DEBUG_FILE)
  194. DSIDebug::ThreadWrite("ANTFSHost::Close(): Killing thread.");
  195. #endif
  196. if (DSIThread_CondTimedWait(&stCondANTFSThreadExit, &stMutexCriticalSection, 9000) != DSI_THREAD_ENONE)
  197. {
  198. #if defined(DEBUG_FILE)
  199. DSIDebug::ThreadWrite("ANTFSHost::Close(): Thread not dead.");
  200. DSIDebug::ThreadWrite("ANTFSHost::Close(): Forcing thread termination...");
  201. #endif
  202. DSIThread_DestroyThread(hANTFSThread);
  203. }
  204. else
  205. {
  206. #if defined(DEBUG_FILE)
  207. DSIDebug::ThreadWrite("ANTFSHost::Close(): Thread terminated successfully.");
  208. #endif
  209. }
  210. }
  211. DSIThread_ReleaseThreadID(hANTFSThread);
  212. hANTFSThread = (DSI_THREAD_ID)NULL;
  213. }
  214. DSIThread_MutexUnlock(&stMutexCriticalSection);
  215. pclMsgHandler->RemoveMessageProcessor((DSIANTMessageProcessor*) pclHost);
  216. pclMsgHandler->Close();
  217. bOpen = FALSE;
  218. eWrappedState = ANTFS_STATE_IDLE;
  219. #if defined(DEBUG_FILE)
  220. DSIDebug::ThreadWrite("ANTFSHost::Close(): Closed.");
  221. #endif
  222. }
  223. ///////////////////////////////////////////////////////////////////////
  224. void ANTFSHost::Cancel(void)
  225. {
  226. pclHost->Cancel();
  227. }
  228. //////////////////////////////////////////////////////////////////////////////////
  229. // ANTFS Link Layer
  230. //////////////////////////////////////////////////////////////////////////////////
  231. ///////////////////////////////////////////////////////////////////////
  232. USHORT ANTFSHost::AddSearchDevice(ANTFS_DEVICE_PARAMETERS *pstDeviceSearchMask_, ANTFS_DEVICE_PARAMETERS *pstDeviceParameters_)
  233. {
  234. return pclHost->AddSearchDevice(pstDeviceSearchMask_, pstDeviceParameters_);
  235. }
  236. ///////////////////////////////////////////////////////////////////////
  237. void ANTFSHost::RemoveSearchDevice(USHORT usHandle_)
  238. {
  239. pclHost->RemoveSearchDevice(usHandle_);
  240. }
  241. ///////////////////////////////////////////////////////////////////////
  242. void ANTFSHost::ClearSearchDeviceList(void)
  243. {
  244. pclHost->ClearSearchDeviceList();
  245. }
  246. ///////////////////////////////////////////////////////////////////////
  247. ANTFS_RETURN ANTFSHost::SearchForDevice(UCHAR ucSearchRadioFrequency_, UCHAR ucConnectedRadioFrequency_, USHORT usRadioChannelID_, BOOL bUseRequestPage_)
  248. {
  249. DSIThread_MutexLock(&stMutexCriticalSection);
  250. if ((pclMsgHandler->GetStatus() < ANT_USB_STATE_OPEN))
  251. {
  252. #if defined(DEBUG_FILE)
  253. DSIDebug::ThreadWrite("ANTFSHost::SearchForDevice(): Not in correct state.");
  254. #endif
  255. DSIThread_MutexUnlock(&stMutexCriticalSection);
  256. return ANTFS_RETURN_FAIL;
  257. }
  258. DSIThread_MutexUnlock(&stMutexCriticalSection);
  259. return pclHost->SearchForDevice(ucSearchRadioFrequency_, ucConnectedRadioFrequency_, usRadioChannelID_, bUseRequestPage_);
  260. }
  261. ///////////////////////////////////////////////////////////////////////
  262. BOOL ANTFSHost::GetFoundDeviceParameters(ANTFS_DEVICE_PARAMETERS *pstDeviceParameters_, UCHAR *aucFriendlyName_, UCHAR *pucBufferSize_)
  263. {
  264. return pclHost->GetFoundDeviceParameters(pstDeviceParameters_, aucFriendlyName_, pucBufferSize_);
  265. }
  266. ///////////////////////////////////////////////////////////////////////
  267. BOOL ANTFSHost::GetFoundDeviceChannelID(USHORT *pusDeviceNumber_, UCHAR *pucDeviceType_, UCHAR *pucTransmitType_)
  268. {
  269. return pclHost->GetFoundDeviceChannelID(pusDeviceNumber_, pucDeviceType_, pucTransmitType_);
  270. }
  271. ///////////////////////////////////////////////////////////////////////
  272. ANTFS_RETURN ANTFSHost::Authenticate(UCHAR ucAuthenticationType_, UCHAR *pucAuthenticationString_, UCHAR ucLength_, UCHAR *pucResponseBuffer_, UCHAR *pucResponseBufferSize_, ULONG ulResponseTimeout_)
  273. {
  274. return pclHost->Authenticate(ucAuthenticationType_, pucAuthenticationString_, ucLength_, pucResponseBuffer_, pucResponseBufferSize_, ulResponseTimeout_);
  275. }
  276. //////////////////////////////////////////////////////////////////////////////////
  277. // Always On Transport Layer
  278. //////////////////////////////////////////////////////////////////////////////////
  279. ///////////////////////////////////////////////////////////////////////
  280. ANTFS_RETURN ANTFSHost::Disconnect(USHORT usBlackoutTime_, UCHAR ucDisconnectType_, UCHAR ucTimeDuration_, UCHAR ucAppSpecificDuration_)
  281. {
  282. return pclHost->Disconnect(usBlackoutTime_, ucDisconnectType_, ucTimeDuration_, ucAppSpecificDuration_);
  283. }
  284. ///////////////////////////////////////////////////////////////////////
  285. ANTFS_RETURN ANTFSHost::Download(USHORT usFileIndex_, ULONG ulDataOffset_, ULONG ulMaxDataLength_, ULONG ulMaxBlockSize_)
  286. {
  287. return pclHost->Download(usFileIndex_, ulDataOffset_, ulMaxDataLength_, ulMaxBlockSize_);
  288. }
  289. ///////////////////////////////////////////////////////////////////////
  290. ANTFS_RETURN ANTFSHost::Upload(USHORT usFileIndex_, ULONG ulDataOffset_, ULONG ulDataLength_, void *pvData_, BOOL bForceOffset_, ULONG ulMaxBlockSize_)
  291. {
  292. return pclHost->Upload(usFileIndex_, ulDataOffset_, ulDataLength_, pvData_, bForceOffset_, ulMaxBlockSize_);
  293. }
  294. ///////////////////////////////////////////////////////////////////////
  295. ANTFS_RETURN ANTFSHost::ManualTransfer(USHORT usFileIndex_, ULONG ulDataOffset_, ULONG ulDataLength_, void *pvData_)
  296. {
  297. return pclHost->ManualTransfer(usFileIndex_, ulDataOffset_, ulDataLength_, pvData_);
  298. }
  299. ///////////////////////////////////////////////////////////////////////
  300. BOOL ANTFSHost::GetDownloadStatus(ULONG *pulByteProgress_, ULONG *pulTotalLength_)
  301. {
  302. return pclHost->GetDownloadStatus(pulByteProgress_, pulTotalLength_);
  303. }
  304. ///////////////////////////////////////////////////////////////////////
  305. BOOL ANTFSHost::GetTransferData(ULONG *pulDataSize_ , void *pvData_)
  306. {
  307. return pclHost->GetTransferData(pulDataSize_, pvData_);
  308. }
  309. ///////////////////////////////////////////////////////////////////////
  310. BOOL ANTFSHost::GetUploadStatus(ULONG *pulByteProgress_, ULONG *pulTotalLength_)
  311. {
  312. return pclHost->GetUploadStatus(pulByteProgress_, pulTotalLength_);
  313. }
  314. ///////////////////////////////////////////////////////////////////////
  315. ANTFS_RETURN ANTFSHost::EraseData(USHORT usDataFileIndex_)
  316. {
  317. return pclHost->EraseData(usDataFileIndex_);
  318. }
  319. //////////////////////////////////////////////////////////////////////
  320. BOOL ANTFSHost::EnablePing(BOOL bEnable_)
  321. {
  322. return pclHost->EnablePing(bEnable_);
  323. }
  324. #if defined(DEBUG_FILE)
  325. ///////////////////////////////////////////////////////////////////////
  326. void ANTFSHost::SetDebug(BOOL bDebugOn_, const char *pcDirectory_)
  327. {
  328. pclMsgHandler->SetDebug(bDebugOn_, pcDirectory_);
  329. }
  330. #endif
  331. //////////////////////////////////////////////////////////////////////////////////
  332. // Private Functions
  333. //////////////////////////////////////////////////////////////////////////////////
  334. DSI_THREAD_RETURN ANTFSHost::ANTFSThreadStart(void *pvParameter_)
  335. {
  336. #if defined(DEBUG_FILE)
  337. DSIDebug::ThreadInit("ANTFSHostWrapper");
  338. #endif
  339. ((ANTFSHost *)pvParameter_)->ANTFSThread();
  340. return 0;
  341. }
  342. ///////////////////////////////////////////////////////////////////////
  343. // ANTFS Task Thread
  344. ///////////////////////////////////////////////////////////////////////
  345. void ANTFSHost::ANTFSThread(void)
  346. {
  347. ANTFS_RESPONSE eWrappedResponse;
  348. ANT_USB_RESPONSE eUSBResponse;
  349. ANTFS_HOST_RESPONSE eANTFSResponse;
  350. bANTFSThreadRunning = TRUE;
  351. #if defined(DEBUG_FILE)
  352. DSIDebug::ThreadWrite("ANTFSHost::ANTFSThread(): Awaiting Responses..");
  353. #endif
  354. while (bKillThread == FALSE)
  355. {
  356. eWrappedResponse = ANTFS_RESPONSE_NONE;
  357. eUSBResponse = ANT_USB_RESPONSE_NONE;
  358. eANTFSResponse = ANTFS_HOST_RESPONSE_NONE;
  359. eANTFSResponse = pclHost->WaitForResponse(100);
  360. switch(eANTFSResponse)
  361. {
  362. case ANTFS_HOST_RESPONSE_NONE:
  363. eWrappedResponse = ANTFS_RESPONSE_NONE;
  364. break;
  365. case ANTFS_HOST_RESPONSE_INIT_PASS:
  366. eWrappedResponse = ANTFS_RESPONSE_NONE;
  367. break;
  368. case ANTFS_HOST_RESPONSE_SERIAL_FAIL:
  369. #if defined(DEBUG_FILE)
  370. DSIDebug::ThreadWrite("ANTFSHost::ANTFSThread(): Serial fail from ANTFSHostChannel ..");
  371. #endif
  372. eWrappedResponse = ANTFS_RESPONSE_SERIAL_FAIL;
  373. break;
  374. case ANTFS_HOST_RESPONSE_REQUEST_SESSION_FAIL:
  375. // Should not get this one, as Request Session is not included from this wrapper
  376. break;
  377. case ANTFS_HOST_RESPONSE_CONNECT_PASS:
  378. eWrappedResponse = ANTFS_RESPONSE_CONNECT_PASS;
  379. break;
  380. case ANTFS_HOST_RESPONSE_DISCONNECT_PASS:
  381. eWrappedResponse = ANTFS_RESPONSE_DISCONNECT_PASS;
  382. break;
  383. case ANTFS_HOST_RESPONSE_CONNECTION_LOST:
  384. eWrappedResponse = ANTFS_RESPONSE_CONNECTION_LOST;
  385. break;
  386. case ANTFS_HOST_RESPONSE_AUTHENTICATE_NA:
  387. eWrappedResponse = ANTFS_RESPONSE_AUTHENTICATE_NA;
  388. break;
  389. case ANTFS_HOST_RESPONSE_AUTHENTICATE_PASS:
  390. eWrappedResponse = ANTFS_RESPONSE_AUTHENTICATE_PASS;
  391. break;
  392. case ANTFS_HOST_RESPONSE_AUTHENTICATE_REJECT:
  393. eWrappedResponse = ANTFS_RESPONSE_AUTHENTICATE_REJECT;
  394. break;
  395. case ANTFS_HOST_RESPONSE_AUTHENTICATE_FAIL:
  396. eWrappedResponse = ANTFS_RESPONSE_AUTHENTICATE_FAIL;
  397. break;
  398. case ANTFS_HOST_RESPONSE_DOWNLOAD_PASS:
  399. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_PASS;
  400. break;
  401. case ANTFS_HOST_RESPONSE_DOWNLOAD_REJECT:
  402. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_REJECT;
  403. break;
  404. case ANTFS_HOST_RESPONSE_DOWNLOAD_INVALID_INDEX:
  405. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_INVALID_INDEX;
  406. break;
  407. case ANTFS_HOST_RESPONSE_DOWNLOAD_FILE_NOT_READABLE:
  408. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_FILE_NOT_READABLE;
  409. break;
  410. case ANTFS_HOST_RESPONSE_DOWNLOAD_NOT_READY:
  411. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_NOT_READY;
  412. break;
  413. case ANTFS_HOST_RESPONSE_DOWNLOAD_FAIL:
  414. eWrappedResponse = ANTFS_RESPONSE_DOWNLOAD_FAIL;
  415. break;
  416. case ANTFS_HOST_RESPONSE_UPLOAD_PASS:
  417. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_PASS;
  418. break;
  419. case ANTFS_HOST_RESPONSE_UPLOAD_REJECT:
  420. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_REJECT;
  421. break;
  422. case ANTFS_HOST_RESPONSE_UPLOAD_INVALID_INDEX:
  423. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_INVALID_INDEX;
  424. break;
  425. case ANTFS_HOST_RESPONSE_UPLOAD_FILE_NOT_WRITEABLE:
  426. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_FILE_NOT_WRITEABLE;
  427. break;
  428. case ANTFS_HOST_RESPONSE_UPLOAD_INSUFFICIENT_SPACE:
  429. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_INSUFFICIENT_SPACE;
  430. break;
  431. case ANTFS_HOST_RESPONSE_UPLOAD_FAIL:
  432. eWrappedResponse = ANTFS_RESPONSE_UPLOAD_FAIL;
  433. break;
  434. case ANTFS_HOST_RESPONSE_ERASE_PASS:
  435. eWrappedResponse = ANTFS_RESPONSE_ERASE_PASS;
  436. break;
  437. case ANTFS_HOST_RESPONSE_ERASE_FAIL:
  438. eWrappedResponse = ANTFS_RESPONSE_ERASE_FAIL;
  439. break;
  440. case ANTFS_HOST_RESPONSE_MANUAL_TRANSFER_PASS:
  441. eWrappedResponse = ANTFS_RESPONSE_MANUAL_TRANSFER_PASS;
  442. break;
  443. case ANTFS_HOST_RESPONSE_MANUAL_TRANSFER_TRANSMIT_FAIL:
  444. eWrappedResponse = ANTFS_RESPONSE_MANUAL_TRANSFER_TRANSMIT_FAIL;
  445. break;
  446. case ANTFS_HOST_RESPONSE_MANUAL_TRANSFER_RESPONSE_FAIL:
  447. eWrappedResponse = ANTFS_RESPONSE_MANUAL_TRANSFER_RESPONSE_FAIL;
  448. break;
  449. case ANTFS_HOST_RESPONSE_CANCEL_DONE:
  450. eWrappedResponse = ANTFS_RESPONSE_CANCEL_DONE;
  451. break;
  452. }
  453. if(eWrappedResponse != ANTFS_RESPONSE_NONE)
  454. {
  455. AddResponse(eWrappedResponse);
  456. }
  457. if (bKillThread)
  458. break;
  459. eUSBResponse = pclMsgHandler->WaitForResponse(100);
  460. switch(eUSBResponse)
  461. {
  462. case ANT_USB_RESPONSE_OPEN_FAIL: // Using PollUSB, so should not get this event
  463. #if defined(DEBUG_FILE)
  464. DSIDebug::ThreadWrite("ANTFSHost::ANTFSThread(): Invalid response ANT_USB_RESPONSE_OPEN_FAIL...");
  465. #endif
  466. case ANT_USB_RESPONSE_NONE:
  467. eWrappedResponse = ANTFS_RESPONSE_NONE;
  468. break;
  469. case ANT_USB_RESPONSE_OPEN_PASS:
  470. eWrappedResponse = ANTFS_RESPONSE_OPEN_PASS;
  471. if(ulHostSerialNumber == 0)
  472. {
  473. ulHostSerialNumber = pclMsgHandler->GetSerialNumber();
  474. pclHost->SetSerialNumber(ulHostSerialNumber);
  475. }
  476. break;
  477. case ANT_USB_RESPONSE_SERIAL_FAIL:
  478. #if defined(DEBUG_FILE)
  479. DSIDebug::ThreadWrite("ANTFSHost::ANTFSThread(): Serial fail from DSIANTDevice ..");
  480. #endif
  481. if(eWrappedResponse != ANTFS_RESPONSE_SERIAL_FAIL) // We do this to avoid reporting a serial failure twice
  482. eWrappedResponse = ANTFS_RESPONSE_SERIAL_FAIL;
  483. else
  484. eWrappedResponse = ANTFS_RESPONSE_NONE;
  485. break;
  486. }
  487. if(eWrappedResponse != ANTFS_RESPONSE_NONE)
  488. {
  489. AddResponse(eWrappedResponse);
  490. }
  491. } // while()
  492. #if defined(DEBUG_FILE)
  493. DSIDebug::ThreadWrite("ANTFSHost::ANTFSThread(): Exiting thread.");
  494. #endif
  495. DSIThread_MutexLock(&stMutexCriticalSection);
  496. bANTFSThreadRunning = FALSE;
  497. DSIThread_CondSignal(&stCondANTFSThreadExit);
  498. DSIThread_MutexUnlock(&stMutexCriticalSection);
  499. }
  500. ///////////////////////////////////////////////////////////////////////
  501. BOOL ANTFSHost::InitHost(UCHAR ucUSBDeviceNum_, USHORT usBaudRate_, BOOL bAutoInit_)
  502. {
  503. if (bInitFailed == TRUE)
  504. {
  505. #if defined(DEBUG_FILE)
  506. DSIDebug::ThreadWrite("ANTFSHost::InitHost(): bInitFailed == TRUE");
  507. #endif
  508. return FALSE;
  509. }
  510. if(bOpen)
  511. this->Close();
  512. bKillThread = FALSE;
  513. if(bAutoInit_)
  514. {
  515. if(pclMsgHandler->Init(TRUE) == FALSE) // Poll USB
  516. {
  517. #if defined(DEBUG_FILE)
  518. DSIDebug::ThreadWrite("ANTFSHost::InitHost(): Failed to init pclMsgHandler.");
  519. #endif
  520. return FALSE;
  521. }
  522. }
  523. else
  524. {
  525. if(pclMsgHandler->Init(ucUSBDeviceNum_, usBaudRate_, TRUE) == FALSE) // Poll USB
  526. {
  527. #if defined(DEBUG_FILE)
  528. DSIDebug::ThreadWrite("ANTFSHost::InitHost(): Failed to init pclMsgHandler.");
  529. #endif
  530. return FALSE;
  531. }
  532. }
  533. pclMsgHandler->AddMessageProcessor(DEFAULT_CHANNEL_NUMBER, (DSIANTMessageProcessor*) pclHost); // Initializes channel object
  534. if (hANTFSThread == NULL)
  535. {
  536. hANTFSThread = DSIThread_CreateThread(&ANTFSHost::ANTFSThreadStart, this);
  537. if (hANTFSThread == NULL)
  538. return FALSE;
  539. }
  540. DSIThread_MutexLock(&stMutexResponseQueue);
  541. clResponseQueue.Clear();
  542. DSIThread_MutexUnlock(&stMutexResponseQueue);
  543. bOpen = TRUE;
  544. return TRUE;
  545. }
  546. ///////////////////////////////////////////////////////////////////////
  547. void ANTFSHost::AddResponse(ANTFS_RESPONSE eResponse_)
  548. {
  549. DSIThread_MutexLock(&stMutexResponseQueue);
  550. clResponseQueue.AddResponse(eResponse_);
  551. DSIThread_CondSignal(&stCondWaitForResponse);
  552. DSIThread_MutexUnlock(&stMutexResponseQueue);
  553. }
  554. ///////////////////////////////////////////////////////////////////////
  555. //Returns a response if there is one ready, otherwise waits the specified time for one to occur
  556. ANTFS_RESPONSE ANTFSHost::WaitForResponse(ULONG ulMilliseconds_)
  557. {
  558. ANTFS_RESPONSE stResponse = ANTFS_RESPONSE_NONE;
  559. if (bKillThread == TRUE)
  560. return ANTFS_RESPONSE_NONE;
  561. //Wait for response
  562. DSIThread_MutexLock(&stMutexResponseQueue);
  563. if(clResponseQueue.isEmpty())
  564. {
  565. UCHAR ucResult = DSIThread_CondTimedWait(&stCondWaitForResponse, &stMutexResponseQueue, ulMilliseconds_);
  566. switch(ucResult)
  567. {
  568. case DSI_THREAD_ENONE:
  569. stResponse = clResponseQueue.GetResponse();
  570. break;
  571. case DSI_THREAD_ETIMEDOUT:
  572. stResponse = ANTFS_RESPONSE_NONE;
  573. break;
  574. case DSI_THREAD_EOTHER:
  575. #if defined(DEBUG_FILE)
  576. DSIDebug::ThreadWrite("ANTFSHost::WaitForResponse(): CondTimedWait() Failed!");
  577. #endif
  578. stResponse = ANTFS_RESPONSE_NONE;
  579. break;
  580. default:
  581. #if defined(DEBUG_FILE)
  582. DSIDebug::ThreadWrite("ANTFSHost::WaitForResponse(): Error Unknown");
  583. #endif
  584. stResponse = ANTFS_RESPONSE_NONE;
  585. break;
  586. }
  587. }
  588. else
  589. {
  590. stResponse = clResponseQueue.GetResponse();
  591. }
  592. DSIThread_MutexUnlock(&stMutexResponseQueue);
  593. return stResponse;
  594. }