antfs_host.cpp 23 KB

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