2
0

dsi_framer_ant.cpp 93 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635
  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 "defines.h"
  10. #include "antmessage.h"
  11. #include "antdefines.h"
  12. #include "checksum.h"
  13. #include "dsi_thread.h"
  14. #include "dsi_framer_ant.hpp"
  15. #include <string.h>
  16. #define WAIT_TO_FEED_TRANSFER
  17. #include "dsi_debug.hpp"
  18. #if defined(DEBUG_FILE)
  19. #define SERIAL_DEBUG
  20. #endif
  21. //////////////////////////////////////////////////////////////////////////////////
  22. // Private Definitions
  23. //////////////////////////////////////////////////////////////////////////////////
  24. #define TX_FIFO_SIZE 256
  25. #define ANT_DATA_CHANNEL_NUM_OFFSET 0
  26. #define ANT_DATA_EVENT_ID_OFFSET 1
  27. #define ANT_DATA_EVENT_CODE_OFFSET 2
  28. //#define ANT_DATA_REQUESTED_MESG_ID_OFFSET 1
  29. //////////////////////////////////////////////////////////////////////////////////
  30. // Public Class Functions
  31. //////////////////////////////////////////////////////////////////////////////////
  32. ///////////////////////////////////////////////////////////////////////
  33. DSIFramerANT::DSIFramerANT()
  34. {
  35. bInitOkay = TRUE;
  36. bClosing = FALSE;
  37. pbCancel = (volatile BOOL*)NULL;
  38. bSplitAdvancedBursts = FALSE;
  39. if (DSIThread_CondInit(&stCondMessageReady) != DSI_THREAD_ENONE)
  40. bInitOkay = FALSE;
  41. if (DSIThread_MutexInit(&stMutexCriticalSection) != DSI_THREAD_ENONE)
  42. bInitOkay = FALSE;
  43. if (DSIThread_MutexInit(&stMutexResponseRequest) != DSI_THREAD_ENONE)
  44. bInitOkay = FALSE;
  45. pclResponseListStart = (ANTMessageResponse*)NULL;
  46. Init((DSISerial*)NULL);
  47. }
  48. DSIFramerANT::DSIFramerANT(DSISerial *pclSerial_) : DSIFramer(pclSerial_)
  49. {
  50. bInitOkay = TRUE;
  51. bClosing = FALSE;
  52. pbCancel = (volatile BOOL*)NULL;
  53. bSplitAdvancedBursts = FALSE;
  54. if (DSIThread_CondInit(&stCondMessageReady) != DSI_THREAD_ENONE)
  55. bInitOkay = FALSE;
  56. if (DSIThread_MutexInit(&stMutexCriticalSection) != DSI_THREAD_ENONE)
  57. bInitOkay = FALSE;
  58. if (DSIThread_MutexInit(&stMutexResponseRequest) != DSI_THREAD_ENONE)
  59. bInitOkay = FALSE;
  60. pclResponseListStart = (ANTMessageResponse*)NULL;
  61. Init(pclSerial_);
  62. }
  63. ///////////////////////////////////////////////////////////////////////
  64. DSIFramerANT::~DSIFramerANT()
  65. {
  66. DSIThread_CondDestroy(&stCondMessageReady);
  67. DSIThread_MutexDestroy(&stMutexCriticalSection);
  68. DSIThread_MutexDestroy(&stMutexResponseRequest);
  69. }
  70. ///////////////////////////////////////////////////////////////////////
  71. void DSIFramerANT::SetSplitAdvBursts(BOOL bSplitAdvBursts_)
  72. {
  73. bSplitAdvancedBursts = bSplitAdvBursts_;
  74. }
  75. ///////////////////////////////////////////////////////////////////////
  76. void DSIFramerANT::SetCancelParameter(volatile BOOL *pbCancel_)
  77. {
  78. pbCancel = pbCancel_;
  79. }
  80. ///////////////////////////////////////////////////////////////////////
  81. volatile BOOL* DSIFramerANT::GetCancelParameter()
  82. {
  83. return pbCancel;
  84. }
  85. ///////////////////////////////////////////////////////////////////////
  86. BOOL DSIFramerANT::Init(DSISerial *pclSerial_)
  87. {
  88. ucRxIndex = 0;
  89. usMessageHead = 0;
  90. usMessageTail = 0;
  91. ucError = 0;
  92. if (pclSerial_ != NULL)
  93. pclSerial = pclSerial_;
  94. if (pclSerial == (DSISerial*)NULL)
  95. return FALSE;
  96. return bInitOkay;
  97. }
  98. ///////////////////////////////////////////////////////////////////////
  99. BOOL DSIFramerANT::WriteMessage(void *pvData_, USHORT usMessageSize_)
  100. {
  101. UCHAR aucTxFifo[TX_FIFO_SIZE];
  102. UCHAR ucTotalSize;
  103. if (usMessageSize_ > MESG_MAX_SIZE_VALUE)
  104. {
  105. #if defined(DEBUG_FILE)
  106. DSIDebug::ThreadWrite("Framer->WriteMessage(): Failed, Msg Size > MESG_MAX_SIZE_VALUE.");
  107. #endif
  108. return FALSE;
  109. }
  110. ucTotalSize = (UCHAR) usMessageSize_ + MESG_HEADER_SIZE;
  111. aucTxFifo[0] = MESG_TX_SYNC;
  112. aucTxFifo[MESG_SIZE_OFFSET] = (UCHAR) usMessageSize_;
  113. aucTxFifo[MESG_ID_OFFSET] = ((ANT_MESSAGE *) pvData_)->ucMessageID;
  114. memcpy(&aucTxFifo[MESG_DATA_OFFSET], ((ANT_MESSAGE *) pvData_)->aucData, usMessageSize_);
  115. aucTxFifo[ucTotalSize++] = CheckSum_Calc8(aucTxFifo, ucTotalSize);
  116. // Pad with two zeros.
  117. aucTxFifo[ucTotalSize++] = 0;
  118. aucTxFifo[ucTotalSize++] = 0;
  119. if (pclSerial->WriteBytes(aucTxFifo, ucTotalSize))
  120. {
  121. #if defined(SERIAL_DEBUG)
  122. if (aucTxFifo[MESG_ID_OFFSET] == 0x46)
  123. memset(&aucTxFifo[MESG_DATA_OFFSET+1],0x00,8);
  124. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Tx", aucTxFifo, ucTotalSize);
  125. #endif
  126. return TRUE;
  127. }
  128. #if defined(SERIAL_DEBUG)
  129. if (aucTxFifo[MESG_ID_OFFSET] == 0x46)
  130. memset(&aucTxFifo[MESG_DATA_OFFSET+1],0x00,8);
  131. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "***Tx Error***", aucTxFifo, ucTotalSize);
  132. #endif
  133. return FALSE;
  134. }
  135. ///////////////////////////////////////////////////////////////////////
  136. USHORT DSIFramerANT::WaitForMessage(ULONG ulMilliseconds_)
  137. {
  138. USHORT usMessageSize;
  139. DSIThread_MutexLock(&stMutexCriticalSection);
  140. usMessageSize = GetMessageSize();
  141. if ((usMessageSize == DSI_FRAMER_TIMEDOUT) && (ulMilliseconds_ != 0))
  142. {
  143. UCHAR ucStatus = DSIThread_CondTimedWait(&stCondMessageReady, &stMutexCriticalSection, ulMilliseconds_);
  144. if(ucStatus == DSI_THREAD_ENONE)
  145. {
  146. usMessageSize = GetMessageSize();
  147. }
  148. else if(ucStatus == DSI_THREAD_ETIMEDOUT)
  149. {
  150. usMessageSize = DSI_FRAMER_TIMEDOUT;
  151. }
  152. else //CondWait() failed
  153. {
  154. ucError = (UCHAR)(DSI_FRAMER_ERROR & 0xFF); //Set ucError so we can distinguish from a normal error if this ever occurs
  155. usMessageSize = DSI_FRAMER_ERROR;
  156. }
  157. }
  158. DSIThread_MutexUnlock(&stMutexCriticalSection);
  159. return usMessageSize;
  160. }
  161. ///////////////////////////////////////////////////////////////////////
  162. USHORT DSIFramerANT::GetMessage(void *pvData_, USHORT usSize_)
  163. {
  164. USHORT usRetVal;
  165. DSIThread_MutexLock(&stMutexCriticalSection);
  166. if (ucError)
  167. {
  168. ((ANT_MESSAGE *) pvData_)->ucMessageID = ucError;
  169. if (ucError == DSI_FRAMER_ANT_ESERIAL)
  170. ((ANT_MESSAGE *) pvData_)->aucData[0] = ucSerialError;
  171. ucError = 0;
  172. usRetVal = DSI_FRAMER_ERROR;
  173. }
  174. else
  175. {
  176. if ((usMessageHead - usMessageTail) != 0)
  177. {
  178. // Determine the number of bytes to copy.
  179. usRetVal = astMessageBuffer[usMessageTail].ucSize; // The reported number of bytes in the queue.
  180. if (usSize_ != 0)
  181. usRetVal = MIN(usRetVal, usSize_); // If the usSize_ parameter is non-zero, limit the number of bytes copied from the queue to usSize_.
  182. if (usRetVal > MESG_MAX_SIZE_VALUE) // Check to make sure we are not copying beyond the end of the message buffers
  183. {
  184. ((ANT_MESSAGE *) pvData_)->ucMessageID = DSI_FRAMER_ANT_EINVALID_SIZE;
  185. usRetVal = DSI_FRAMER_ERROR;
  186. }
  187. else
  188. {
  189. ((ANT_MESSAGE *) pvData_)->ucMessageID = astMessageBuffer[usMessageTail].stANTMessage.ucMessageID;
  190. memcpy(((ANT_MESSAGE *) pvData_)->aucData, astMessageBuffer[usMessageTail].stANTMessage.aucData, usRetVal);
  191. }
  192. usMessageTail++; // Rollover of usMessageTail happens automagically because our buffer size is MAX_USHORT + 1.
  193. }
  194. else
  195. {
  196. usRetVal = DSI_FRAMER_TIMEDOUT;
  197. }
  198. }
  199. DSIThread_MutexUnlock(&stMutexCriticalSection);
  200. return usRetVal;
  201. }
  202. ///////////////////////////////////////////////////////////////////////
  203. #define MESG_CHANNEL_OFFSET 0
  204. #define MESG_EVENT_ID_OFFSET 1
  205. UCHAR DSIFramerANT::GetChannelNumber(ANT_MESSAGE* pstMessage)
  206. {
  207. // Get the channel number
  208. // Returns MAX_UCHAR if this message does not have a channel field
  209. UCHAR ucANTchannel = pstMessage->aucData[MESG_CHANNEL_OFFSET] & CHANNEL_NUMBER_MASK;
  210. // Some messages do not include the channel number in the response, so
  211. // they might get processed incorrectly
  212. if(pstMessage->ucMessageID == MESG_RESPONSE_EVENT_ID)
  213. {
  214. if(pstMessage->aucData[MESG_EVENT_ID_OFFSET] == MESG_NETWORK_KEY_ID || // we would need to look at the network number to figure it out
  215. pstMessage->aucData[MESG_EVENT_ID_OFFSET] == MESG_RADIO_TX_POWER_ID || // this affects all channels
  216. pstMessage->aucData[MESG_EVENT_ID_OFFSET] == MESG_RX_EXT_MESGS_ENABLE_ID) // this affects all channels
  217. {
  218. return MAX_UCHAR;
  219. }
  220. }
  221. else if(pstMessage->ucMessageID == MESG_STARTUP_MESG_ID ||
  222. pstMessage->ucMessageID == MESG_CAPABILITIES_ID ||
  223. pstMessage->ucMessageID == MESG_VERSION_ID ||
  224. pstMessage->ucMessageID == MESG_GET_SERIAL_NUM_ID)
  225. {
  226. return MAX_UCHAR;
  227. }
  228. return ucANTchannel;
  229. }
  230. ///////////////////////////////////////////////////////////////////////
  231. void DSIFramerANT::ProcessByte(UCHAR ucByte_)
  232. {
  233. DSIThread_MutexLock(&stMutexCriticalSection);
  234. if (ucRxIndex == 0) // If we are looking for the start of a message.
  235. {
  236. if (ucByte_ == MESG_TX_SYNC) // If it is a valid first byte.
  237. {
  238. aucRxFifo[ucRxIndex++] = ucByte_; // Save it.
  239. ucCheckSum = ucByte_; // Initialize the checksum.
  240. ucRxSize = 2; // We have to init high so we can read enough bytes to determine real length
  241. }
  242. }
  243. else if (ucRxIndex == 1) // Determine RX message size.
  244. {
  245. aucRxFifo[ucRxIndex++] = ucByte_; // Save it.
  246. ucRxSize = ucByte_ + (MESG_FRAME_SIZE - MESG_SYNC_SIZE); // We just got the length.
  247. ucCheckSum ^= ucByte_; // Calculate checksum.
  248. if (ucRxSize > RX_FIFO_SIZE) // If our buffer can't handle this message, turf it.
  249. {
  250. if (ucByte_ == MESG_TX_SYNC)
  251. {
  252. aucRxFifo[0] = ucByte_; // Save the byte.
  253. ucCheckSum = ucByte_; // Initialize the checksum.
  254. ucRxSize = 2; // We have to init high so we can read enough bytes to determine real length
  255. ucRxIndex = 1; // Set the Rx Index for the next iteration.
  256. }
  257. else
  258. {
  259. ucRxIndex = 0; // Invalid size, so restart.
  260. }
  261. }
  262. }
  263. else
  264. {
  265. aucRxFifo[ucRxIndex] = ucByte_; // Save the byte.
  266. ucCheckSum ^= ucByte_; // Calculate checksum.
  267. if (ucRxIndex >= ucRxSize) // If we have received the whole message.
  268. {
  269. if (ucCheckSum == 0) // The CRC passed.
  270. {
  271. ProcessMessage(); // Process the ANT message.
  272. }
  273. else
  274. {
  275. // Set a serial error for the bad crc.
  276. ucSerialError = DSI_FRAMER_ANT_CRC_ERROR;
  277. ucError = DSI_FRAMER_ANT_ESERIAL;
  278. DSIThread_CondSignal(&stCondMessageReady);
  279. #if defined(SERIAL_DEBUG)
  280. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Bad CRC",aucRxFifo,ucRxIndex);
  281. #endif
  282. }
  283. ucRxIndex = 0; // Reset the index.
  284. }
  285. else
  286. {
  287. ucRxIndex++;
  288. }
  289. }
  290. DSIThread_MutexUnlock(&stMutexCriticalSection);
  291. }
  292. ///////////////////////////////////////////////////////////////////////
  293. void DSIFramerANT::Error(UCHAR ucError_)
  294. {
  295. DSIThread_MutexLock(&stMutexCriticalSection);
  296. ucSerialError = ucError_;
  297. ucError = DSI_FRAMER_ANT_ESERIAL;
  298. DSIThread_CondSignal(&stCondMessageReady);
  299. DSIThread_MutexUnlock(&stMutexCriticalSection);
  300. }
  301. ///////////////////////////////////////////////////////////////////////
  302. BOOL DSIFramerANT::SetNetworkKey(UCHAR ucNetworkNumber_, UCHAR *pucKey_, ULONG ulResponseTime_)
  303. {
  304. ANT_MESSAGE stMessage;
  305. stMessage.ucMessageID = MESG_NETWORK_KEY_ID;
  306. stMessage.aucData[0] = ucNetworkNumber_;
  307. memcpy(&stMessage.aucData[1], pucKey_, 8);
  308. return SendCommand(&stMessage, MESG_NETWORK_KEY_SIZE, ulResponseTime_);
  309. }
  310. ///////////////////////////////////////////////////////////////////////
  311. BOOL DSIFramerANT::UnAssignChannel(UCHAR ucANTChannel_, ULONG ulResponseTime_)
  312. {
  313. ANT_MESSAGE stMessage;
  314. stMessage.ucMessageID = MESG_UNASSIGN_CHANNEL_ID;
  315. stMessage.aucData[0] = ucANTChannel_;
  316. return SendCommand(&stMessage, MESG_UNASSIGN_CHANNEL_SIZE, ulResponseTime_);
  317. }
  318. ///////////////////////////////////////////////////////////////////////
  319. BOOL DSIFramerANT::AssignChannel(UCHAR ucANTChannel_, UCHAR ucChannelType_, UCHAR ucNetworkNumber_, ULONG ulResponseTime_)
  320. {
  321. ANT_MESSAGE stMessage;
  322. stMessage.ucMessageID = MESG_ASSIGN_CHANNEL_ID;
  323. stMessage.aucData[0] = ucANTChannel_;
  324. stMessage.aucData[1] = ucChannelType_;
  325. stMessage.aucData[2] = ucNetworkNumber_;
  326. return SendCommand(&stMessage, MESG_ASSIGN_CHANNEL_SIZE, ulResponseTime_);
  327. }
  328. ///////////////////////////////////////////////////////////////////////
  329. BOOL DSIFramerANT::AssignChannelExt(UCHAR ucANTChannel_, UCHAR* pucChannelType_, UCHAR ucSize_, UCHAR ucNetworkNumber_, ULONG ulResponseTime_)
  330. {
  331. if( (pucChannelType_ == NULL) || (ucSize_ < 1) )
  332. return FALSE;
  333. ANT_MESSAGE stMessage;
  334. stMessage.ucMessageID = MESG_ASSIGN_CHANNEL_ID;
  335. stMessage.aucData[0] = ucANTChannel_;
  336. stMessage.aucData[1] = pucChannelType_[0];
  337. stMessage.aucData[2] = ucNetworkNumber_;
  338. for(UCHAR i=1; i<ucSize_; i++)
  339. stMessage.aucData[2+i] = pucChannelType_[i];
  340. return SendCommand(&stMessage, ucSize_ + 2, ulResponseTime_);
  341. }
  342. ///////////////////////////////////////////////////////////////////////
  343. BOOL DSIFramerANT::SetChannelID(UCHAR ucANTChannel_, USHORT usDeviceNumber_, UCHAR ucDeviceType_, UCHAR ucTransmitType_, ULONG ulResponseTime_)
  344. {
  345. ANT_MESSAGE stMessage;
  346. stMessage.ucMessageID = MESG_CHANNEL_ID_ID;
  347. stMessage.aucData[0] = ucANTChannel_;
  348. stMessage.aucData[1] = (UCHAR)(usDeviceNumber_ & 0xFF);
  349. stMessage.aucData[2] = (UCHAR)((usDeviceNumber_ >>8) & 0xFF);
  350. stMessage.aucData[3] = ucDeviceType_;
  351. stMessage.aucData[4] = ucTransmitType_;
  352. return SendCommand(&stMessage, MESG_CHANNEL_ID_SIZE, ulResponseTime_);
  353. }
  354. ///////////////////////////////////////////////////////////////////////
  355. BOOL DSIFramerANT::SetChannelPeriod(UCHAR ucANTChannel_, USHORT usMessagePeriod_, ULONG ulResponseTime_)
  356. {
  357. ANT_MESSAGE stMessage;
  358. stMessage.ucMessageID = MESG_CHANNEL_MESG_PERIOD_ID;
  359. stMessage.aucData[0] = ucANTChannel_;
  360. stMessage.aucData[1] = (UCHAR)(usMessagePeriod_ & 0xFF);
  361. stMessage.aucData[2] = (UCHAR)((usMessagePeriod_ >>8) & 0xFF);
  362. return SendCommand(&stMessage, MESG_CHANNEL_MESG_PERIOD_SIZE, ulResponseTime_);
  363. }
  364. ///////////////////////////////////////////////////////////////////////
  365. BOOL DSIFramerANT::SetFastSearch(UCHAR ucANTChannel_, ULONG ulResponseTime_)
  366. {
  367. ANT_MESSAGE stMessage;
  368. stMessage.ucMessageID = 0x49;
  369. stMessage.aucData[0] = ucANTChannel_;
  370. stMessage.aucData[1] = 86;
  371. stMessage.aucData[2] = 0;
  372. return SendCommand(&stMessage, 3, ulResponseTime_);
  373. }
  374. ///////////////////////////////////////////////////////////////////////
  375. BOOL DSIFramerANT::SetLowPriorityChannelSearchTimeout(UCHAR ucANTChannel_, UCHAR ucSearchTimeout_, ULONG ulResponseTime_)
  376. {
  377. ANT_MESSAGE stMessage;
  378. stMessage.ucMessageID = MESG_SET_LP_SEARCH_TIMEOUT_ID;
  379. stMessage.aucData[0] = ucANTChannel_;
  380. stMessage.aucData[1] = ucSearchTimeout_;
  381. return SendCommand(&stMessage, MESG_SET_LP_SEARCH_TIMEOUT_SIZE, ulResponseTime_);
  382. }
  383. ///////////////////////////////////////////////////////////////////////
  384. BOOL DSIFramerANT::SetChannelSearchTimeout(UCHAR ucANTChannel_, UCHAR ucSearchTimeout_, ULONG ulResponseTime_)
  385. {
  386. ANT_MESSAGE stMessage;
  387. stMessage.ucMessageID = MESG_CHANNEL_SEARCH_TIMEOUT_ID;
  388. stMessage.aucData[0] = ucANTChannel_;
  389. stMessage.aucData[1] = ucSearchTimeout_;
  390. return SendCommand(&stMessage, MESG_CHANNEL_SEARCH_TIMEOUT_SIZE, ulResponseTime_);
  391. }
  392. ///////////////////////////////////////////////////////////////////////
  393. BOOL DSIFramerANT::SetChannelRFFrequency(UCHAR ucANTChannel_, UCHAR ucRFFrequency_, ULONG ulResponseTime_)
  394. {
  395. ANT_MESSAGE stMessage;
  396. stMessage.ucMessageID = MESG_CHANNEL_RADIO_FREQ_ID;
  397. stMessage.aucData[0] = ucANTChannel_;
  398. stMessage.aucData[1] = ucRFFrequency_;
  399. return SendCommand(&stMessage, MESG_CHANNEL_RADIO_FREQ_SIZE, ulResponseTime_);
  400. }
  401. ///////////////////////////////////////////////////////////////////////
  402. BOOL DSIFramerANT::CrystalEnable(ULONG ulResponseTime_)
  403. {
  404. ANT_MESSAGE stMessage;
  405. stMessage.ucMessageID = MESG_XTAL_ENABLE_ID;
  406. stMessage.aucData[0] = 0;
  407. return SendCommand(&stMessage, MESG_XTAL_ENABLE_SIZE, ulResponseTime_);
  408. }
  409. ///////////////////////////////////////////////////////////////////////
  410. BOOL DSIFramerANT::SetLibConfig(UCHAR ucLibConfigFlags_, ULONG ulResponseTime_)
  411. {
  412. ANT_MESSAGE stMessage;
  413. stMessage.ucMessageID = MESG_ANTLIB_CONFIG_ID;
  414. stMessage.aucData[0] = 0;
  415. stMessage.aucData[1] = ucLibConfigFlags_;
  416. return SendCommand(&stMessage, MESG_ANTLIB_CONFIG_SIZE, ulResponseTime_);
  417. }
  418. ///////////////////////////////////////////////////////////////////////
  419. BOOL DSIFramerANT::SetProximitySearch(UCHAR ucANTChannel_, UCHAR ucSearchThreshold_, ULONG ulResponseTime_)
  420. {
  421. ANT_MESSAGE stMessage;
  422. stMessage.ucMessageID = MESG_PROX_SEARCH_CONFIG_ID;
  423. stMessage.aucData[0] = ucANTChannel_;
  424. stMessage.aucData[1] = ucSearchThreshold_;
  425. return SendCommand(&stMessage, MESG_PROX_SEARCH_CONFIG_SIZE, ulResponseTime_);
  426. }
  427. ///////////////////////////////////////////////////////////////////////
  428. BOOL DSIFramerANT::ConfigEventBuffer(UCHAR ucConfig_, USHORT usSize_, USHORT usTime_, ULONG ulResponseTime_)
  429. {
  430. ANT_MESSAGE stMessage;
  431. stMessage.ucMessageID = MESG_EVENT_BUFFERING_CONFIG_ID;
  432. stMessage.aucData[0] = 0;
  433. stMessage.aucData[1] = ucConfig_;
  434. stMessage.aucData[2] = (UCHAR)(usSize_ & 0xFF);
  435. stMessage.aucData[3] = (UCHAR)((usSize_ >>8) & 0xFF);
  436. stMessage.aucData[4] = (UCHAR)(usTime_ & 0xFF);
  437. stMessage.aucData[5] = (UCHAR)((usTime_ >>8) & 0xFF);
  438. return SendCommand(&stMessage, MESG_EVENT_BUFFERING_CONFIG_SIZE, ulResponseTime_);
  439. }
  440. ///////////////////////////////////////////////////////////////////////
  441. BOOL DSIFramerANT::ConfigEventFilter(USHORT usEventFilter_, ULONG ulResponseTime_)
  442. {
  443. ANT_MESSAGE stMessage;
  444. stMessage.ucMessageID = MESG_EVENT_FILTER_CONFIG_ID;
  445. stMessage.aucData[0] = 0;
  446. stMessage.aucData[1] = (UCHAR)(usEventFilter_ & 0xFF);
  447. stMessage.aucData[2] = (UCHAR)((usEventFilter_ >>8) & 0xFF);
  448. return SendCommand(&stMessage, MESG_EVENT_FILTER_CONFIG_SIZE, ulResponseTime_);
  449. }
  450. ///////////////////////////////////////////////////////////////////////
  451. BOOL DSIFramerANT::ConfigHighDutySearch(UCHAR ucEnable_, UCHAR ucSuppressionCycles_, ULONG ulResponseTime_)
  452. {
  453. ANT_MESSAGE stMessage;
  454. stMessage.ucMessageID = MESG_HIGH_DUTY_SEARCH_MODE_ID;
  455. stMessage.aucData[0] = 0;
  456. stMessage.aucData[1] = ucEnable_;
  457. stMessage.aucData[2] = ucSuppressionCycles_;
  458. return SendCommand(&stMessage, MESG_HIGH_DUTY_SEARCH_MODE_SIZE, ulResponseTime_);
  459. }
  460. ///////////////////////////////////////////////////////////////////////
  461. BOOL DSIFramerANT::ConfigSelectiveDataUpdate(UCHAR ucANTChannel_, UCHAR ucSduConfig_, ULONG ulResponseTime_)
  462. {
  463. ANT_MESSAGE stMessage;
  464. stMessage.ucMessageID = MESG_SDU_CONFIG_ID;
  465. stMessage.aucData[0] = ucANTChannel_;
  466. stMessage.aucData[1] = ucSduConfig_;
  467. return SendCommand(&stMessage, MESG_SDU_CONFIG_SIZE, ulResponseTime_);
  468. }
  469. ///////////////////////////////////////////////////////////////////////
  470. BOOL DSIFramerANT::SetSelectiveDataUpdateMask(UCHAR ucMaskNumber_, UCHAR* pucSduMask_, ULONG ulResponseTime_)
  471. {
  472. ANT_MESSAGE stMessage;
  473. stMessage.ucMessageID = MESG_SDU_SET_MASK_ID;
  474. stMessage.aucData[0] = ucMaskNumber_;
  475. memcpy(&stMessage.aucData[1], pucSduMask_, 8);
  476. return SendCommand(&stMessage, MESG_SDU_SET_MASK_SIZE, ulResponseTime_);
  477. }
  478. ///////////////////////////////////////////////////////////////////////
  479. BOOL DSIFramerANT::ConfigUserNVM(USHORT usAddress_, UCHAR* pucData_, UCHAR ucSize_, ULONG ulResponseTime_)
  480. {
  481. if ((ucSize_ + MESG_USER_CONFIG_PAGE_SIZE) <= MESG_MAX_SIZE_VALUE)
  482. {
  483. ANT_MESSAGE stMessage;
  484. stMessage.ucMessageID = MESG_USER_CONFIG_PAGE_ID;
  485. stMessage.aucData[0] = 0;
  486. // Addr is passed in LE
  487. stMessage.aucData[1] = (UCHAR)(usAddress_ & 0xFF);
  488. stMessage.aucData[2] = (UCHAR)((usAddress_ >>8) & 0xFF);
  489. memcpy(&stMessage.aucData[3], pucData_, ucSize_);
  490. return SendCommand(&stMessage, MESG_USER_CONFIG_PAGE_SIZE+ucSize_, ulResponseTime_);
  491. }
  492. else
  493. return false;
  494. }
  495. ///////////////////////////////////////////////////////////////////////
  496. BOOL DSIFramerANT::SleepMessage(ULONG ulResponseTime_)
  497. {
  498. ANT_MESSAGE stMessage;
  499. stMessage.ucMessageID = MESG_SLEEP_ID;
  500. stMessage.aucData[0] = 0;
  501. return SendCommand(&stMessage, MESG_SLEEP_SIZE, ulResponseTime_);
  502. }
  503. ///////////////////////////////////////////////////////////////////////
  504. BOOL DSIFramerANT::ConfigFrequencyAgility(UCHAR ucANTChannel_, UCHAR ucFreq1_, UCHAR ucFreq2_, UCHAR ucFreq3_, ULONG ulResponseTime_)
  505. {
  506. ANT_MESSAGE stMessage;
  507. stMessage.ucMessageID = MESG_AUTO_FREQ_CONFIG_ID;
  508. stMessage.aucData[0] = ucANTChannel_;
  509. stMessage.aucData[1] = ucFreq1_;
  510. stMessage.aucData[2] = ucFreq2_;
  511. stMessage.aucData[3] = ucFreq3_;
  512. return SendCommand(&stMessage, MESG_AUTO_FREQ_CONFIG_SIZE, ulResponseTime_);
  513. }
  514. ///////////////////////////////////////////////////////////////////////
  515. BOOL DSIFramerANT::SetAllChannelsTransmitPower(UCHAR ucTransmitPower_, ULONG ulResponseTime_)
  516. {
  517. ANT_MESSAGE stMessage;
  518. stMessage.ucMessageID = MESG_RADIO_TX_POWER_ID;
  519. stMessage.aucData[0] = 0;
  520. stMessage.aucData[1] = ucTransmitPower_;
  521. return SendCommand(&stMessage, MESG_RADIO_TX_POWER_SIZE, ulResponseTime_);
  522. }
  523. ///////////////////////////////////////////////////////////////////////
  524. BOOL DSIFramerANT::SetChannelTransmitPower(UCHAR ucANTChannel_,UCHAR ucTransmitPower_, ULONG ulResponseTime_)
  525. {
  526. ANT_MESSAGE stMessage;
  527. stMessage.ucMessageID = MESG_CHANNEL_RADIO_TX_POWER_ID;
  528. stMessage.aucData[0] = ucANTChannel_;
  529. stMessage.aucData[1] = ucTransmitPower_;
  530. return SendCommand(&stMessage, MESG_CHANNEL_RADIO_TX_POWER_SIZE, ulResponseTime_);
  531. }
  532. ///////////////////////////////////////////////////////////////////////
  533. BOOL DSIFramerANT::InitCWTestMode(ULONG ulResponseTime_)
  534. {
  535. ANT_MESSAGE stMessage;
  536. stMessage.ucMessageID = MESG_RADIO_CW_INIT_ID;
  537. stMessage.aucData[0] = 0;
  538. return SendCommand(&stMessage, MESG_RADIO_CW_INIT_SIZE, ulResponseTime_);
  539. }
  540. ///////////////////////////////////////////////////////////////////////
  541. BOOL DSIFramerANT::SetCWTestMode(UCHAR ucTransmitPower_, UCHAR ucRFFreq_, ULONG ulResponseTime_)
  542. {
  543. ANT_MESSAGE stMessage;
  544. stMessage.ucMessageID = MESG_RADIO_CW_MODE_ID;
  545. stMessage.aucData[0] = 0;
  546. stMessage.aucData[1] = ucTransmitPower_;
  547. stMessage.aucData[2] = ucRFFreq_;
  548. return SendCommand(&stMessage, MESG_RADIO_CW_MODE_SIZE, ulResponseTime_);
  549. }
  550. ///////////////////////////////////////////////////////////////////////
  551. BOOL DSIFramerANT::AddChannelID(UCHAR ucANTChannel_, USHORT usDeviceNumber_,UCHAR ucDeviceType_, UCHAR ucTransmissionType_, UCHAR ucListIndex_, ULONG ulResponseTime_)
  552. {
  553. ANT_MESSAGE stMessage;
  554. stMessage.ucMessageID = MESG_ID_LIST_ADD_ID;
  555. stMessage.aucData[0] = ucANTChannel_;
  556. stMessage.aucData[1] = (UCHAR)(usDeviceNumber_ & 0xFF);
  557. stMessage.aucData[2] = (UCHAR)((usDeviceNumber_ >>8) & 0xFF);
  558. stMessage.aucData[3] = ucDeviceType_;
  559. stMessage.aucData[4] = ucTransmissionType_;
  560. stMessage.aucData[5] = ucListIndex_;
  561. return SendCommand(&stMessage, MESG_ID_LIST_ADD_SIZE, ulResponseTime_);
  562. }
  563. ///////////////////////////////////////////////////////////////////////
  564. BOOL DSIFramerANT::AddCryptoID(UCHAR ucANTChannel_, UCHAR* pucData_, UCHAR ucListIndex_, ULONG ulResponseTime_)
  565. {
  566. ANT_MESSAGE stMessage;
  567. stMessage.ucMessageID = MESG_CRYPTO_ID_LIST_ADD_ID;
  568. stMessage.aucData[0] = ucANTChannel_;
  569. memcpy(&stMessage.aucData[1], pucData_, 4);
  570. stMessage.aucData[5] = ucListIndex_;
  571. return SendCommand(&stMessage, MESG_CRYPTO_ID_LIST_ADD_SIZE, ulResponseTime_);
  572. }
  573. ///////////////////////////////////////////////////////////////////////
  574. BOOL DSIFramerANT::ConfigList(UCHAR ucANTChannel_, UCHAR ucListSize_, UCHAR ucExclude_, ULONG ulResponseTime_)
  575. {
  576. ANT_MESSAGE stMessage;
  577. stMessage.ucMessageID = MESG_ID_LIST_CONFIG_ID;
  578. stMessage.aucData[0] = ucANTChannel_;
  579. stMessage.aucData[1] = ucListSize_;
  580. stMessage.aucData[2] = ucExclude_;
  581. return SendCommand(&stMessage, MESG_CRYPTO_ID_LIST_CONFIG_SIZE, ulResponseTime_);
  582. }
  583. ///////////////////////////////////////////////////////////////////////
  584. BOOL DSIFramerANT::ConfigCryptoList(UCHAR ucANTChannel_, UCHAR ucListSize_, UCHAR ucBlacklist_, ULONG ulResponseTime_)
  585. {
  586. ANT_MESSAGE stMessage;
  587. stMessage.ucMessageID = MESG_CRYPTO_ID_LIST_CONFIG_ID;
  588. stMessage.aucData[0] = ucANTChannel_;
  589. stMessage.aucData[1] = ucListSize_;
  590. stMessage.aucData[2] = ucBlacklist_;
  591. return SendCommand(&stMessage, MESG_ID_LIST_CONFIG_SIZE, ulResponseTime_);
  592. }
  593. ///////////////////////////////////////////////////////////////////////
  594. BOOL DSIFramerANT::OpenRxScanMode( ULONG ulResponseTime_)
  595. {
  596. ANT_MESSAGE stMessage;
  597. stMessage.ucMessageID = MESG_OPEN_RX_SCAN_ID;
  598. stMessage.aucData[0] = 0;
  599. return SendCommand(&stMessage, MESG_OPEN_RX_SCAN_SIZE, ulResponseTime_);
  600. }
  601. ///////////////////////////////////////////////////////////////////////
  602. // Priority: Any
  603. //
  604. // Called by the application to construct and send an extended broadcast data message.
  605. // This message will be broadcast on the next synchronous channel period.
  606. ///////////////////////////////////////////////////////////////////////
  607. BOOL DSIFramerANT::SendExtBroadcastData(UCHAR ucANTChannel_, UCHAR *pucData_)
  608. {
  609. ANT_MESSAGE stMessage;
  610. stMessage.ucMessageID = MESG_EXT_BROADCAST_DATA_ID;
  611. stMessage.aucData[0] = ucANTChannel_;
  612. memcpy(&stMessage.aucData[1],pucData_, MESG_EXT_DATA_SIZE-1);
  613. return WriteMessage(&stMessage, MESG_EXT_DATA_SIZE);
  614. }
  615. ///////////////////////////////////////////////////////////////////////
  616. // Priority: Any
  617. //
  618. // Called by the application to construct and send an extended acknowledged data
  619. // mesg. This message will be transmitted on the next synchronous channel
  620. // period.
  621. ///////////////////////////////////////////////////////////////////////
  622. BOOL DSIFramerANT::SendExtAcknowledgedData(UCHAR ucANTChannel_, UCHAR *pucData_, ULONG ulResponseTime_)
  623. {
  624. return(SetupAckDataTransfer(
  625. MESG_EXT_ACKNOWLEDGED_DATA_ID,
  626. ucANTChannel_,
  627. pucData_,
  628. MESG_EXT_DATA_SIZE,
  629. ulResponseTime_));
  630. }
  631. ///////////////////////////////////////////////////////////////////////
  632. // Priority: Any
  633. //
  634. // Used to send extended burst data with individual packets. Proper sequence number
  635. // of packet is maintained by the application.
  636. ///////////////////////////////////////////////////////////////////////
  637. BOOL DSIFramerANT::SendExtBurstTransferPacket(UCHAR ucANTChannelSeq_, UCHAR *pucData_)
  638. {
  639. ANT_MESSAGE stMessage;
  640. stMessage.ucMessageID = MESG_EXT_BURST_DATA_ID;
  641. stMessage.aucData[0] = ucANTChannelSeq_;
  642. memcpy(&stMessage.aucData[1],pucData_, MESG_EXT_DATA_SIZE-1);
  643. return WriteMessage(&stMessage, MESG_EXT_DATA_SIZE);
  644. }
  645. ///////////////////////////////////////////////////////////////////////
  646. // Priority: Any
  647. //
  648. // Used to send extended burst data using a block of data. Proper sequence number
  649. // of packet is maintained by the function. Useful for testing purposes.
  650. ///////////////////////////////////////////////////////////////////////
  651. ANTFRAMER_RETURN DSIFramerANT::SendExtBurstTransfer(UCHAR ucANTChannel_, UCHAR *pucData_, ULONG ulSize_, ULONG ulResponseTime_)
  652. {
  653. return(SetupBurstDataTransfer(
  654. MESG_EXT_BURST_DATA_ID,
  655. ucANTChannel_,
  656. pucData_,
  657. ulSize_,
  658. MESG_EXT_DATA_SIZE,
  659. ulResponseTime_));
  660. }
  661. ///////////////////////////////////////////////////////////////////////
  662. // Priority: Any
  663. //
  664. // Used to force the module to use extended rx messages all the time
  665. ///////////////////////////////////////////////////////////////////////
  666. BOOL DSIFramerANT::RxExtMesgsEnable(UCHAR ucEnable_, ULONG ulResponseTime_)
  667. {
  668. ANT_MESSAGE stMessage;
  669. stMessage.ucMessageID = MESG_RX_EXT_MESGS_ENABLE_ID;
  670. stMessage.aucData[0] = 0;
  671. stMessage.aucData[1] = ucEnable_;
  672. return SendCommand(&stMessage, MESG_RX_EXT_MESGS_ENABLE_SIZE, ulResponseTime_);
  673. }
  674. ///////////////////////////////////////////////////////////////////////
  675. // Priority: Any
  676. //
  677. // Used to set a channel device ID to the module serial number
  678. ///////////////////////////////////////////////////////////////////////
  679. BOOL DSIFramerANT::SetSerialNumChannelId(UCHAR ucANTChannel_, UCHAR ucDeviceType_, UCHAR ucTransmissionType_, ULONG ulResponseTime_)
  680. {
  681. ANT_MESSAGE stMessage;
  682. stMessage.ucMessageID = MESG_SERIAL_NUM_SET_CHANNEL_ID_ID;
  683. stMessage.aucData[0] = ucANTChannel_;
  684. stMessage.aucData[1] = ucDeviceType_;
  685. stMessage.aucData[2] = ucTransmissionType_;
  686. return SendCommand(&stMessage, MESG_SERIAL_NUM_SET_CHANNEL_ID_SIZE, ulResponseTime_);
  687. }
  688. ///////////////////////////////////////////////////////////////////////
  689. // Priority: Any
  690. //
  691. // Enables the module LED to flash on RF activity
  692. ///////////////////////////////////////////////////////////////////////
  693. BOOL DSIFramerANT::EnableLED(UCHAR ucEnable_, ULONG ulResponseTime_)
  694. {
  695. ANT_MESSAGE stMessage;
  696. stMessage.ucMessageID = MESG_ENABLE_LED_FLASH_ID;
  697. stMessage.aucData[0] = 0;
  698. stMessage.aucData[1] = ucEnable_;
  699. return SendCommand(&stMessage, MESG_ENABLE_LED_FLASH_SIZE, ulResponseTime_);
  700. }
  701. ///////////////////////////////////////////////////////////////////////
  702. BOOL DSIFramerANT::ConfigAdvancedBurst_ext (BOOL bEnable_, UCHAR ucMaxPacketLength_,
  703. ULONG ulRequiredFields_, ULONG ulOptionalFields_,
  704. USHORT usStallCount_, UCHAR ucRetryCount_, ULONG ulResponseTime_)
  705. {
  706. ANT_MESSAGE stMessage;
  707. stMessage.ucMessageID = MESG_CONFIG_ADV_BURST_ID;
  708. stMessage.aucData[0] = 0;
  709. stMessage.aucData[1] = (bEnable_) ? 1 : 0;
  710. stMessage.aucData[2] = ucMaxPacketLength_;
  711. stMessage.aucData[3] = (UCHAR)(ulRequiredFields_ & 0xFF);
  712. stMessage.aucData[4] = (UCHAR)((ulRequiredFields_ >> 8) & 0xFF);
  713. stMessage.aucData[5] = (UCHAR)((ulRequiredFields_ >> 16) & 0xFF);
  714. stMessage.aucData[6] = (UCHAR)(ulOptionalFields_ & 0xFF);
  715. stMessage.aucData[7] = (UCHAR)((ulOptionalFields_ >> 8) & 0xFF);
  716. stMessage.aucData[8] = (UCHAR)((ulOptionalFields_ >> 16) & 0xFF);
  717. stMessage.aucData[9] = (UCHAR)(usStallCount_ & 0xFF);
  718. stMessage.aucData[10] = (UCHAR)((usStallCount_ >> 8) & 0xFF);
  719. stMessage.aucData[11] = ucRetryCount_;
  720. return SendCommand(&stMessage, MESG_CONFIG_ADV_BURST_SIZE_EXT, ulResponseTime_);
  721. }
  722. ///////////////////////////////////////////////////////////////////////
  723. BOOL DSIFramerANT::ConfigAdvancedBurst (BOOL bEnable_, UCHAR ucMaxPacketLength_,
  724. ULONG ulRequiredFields_, ULONG ulOptionalFields_,
  725. ULONG ulResponseTime_)
  726. {
  727. ANT_MESSAGE stMessage;
  728. stMessage.ucMessageID = MESG_CONFIG_ADV_BURST_ID;
  729. stMessage.aucData[0] = 0;
  730. stMessage.aucData[1] = (bEnable_) ? 1 : 0;
  731. stMessage.aucData[2] = ucMaxPacketLength_;
  732. stMessage.aucData[3] = (UCHAR)(ulRequiredFields_ & 0xFF);
  733. stMessage.aucData[4] = (UCHAR)((ulRequiredFields_ >> 8) & 0xFF);
  734. stMessage.aucData[5] = (UCHAR)((ulRequiredFields_ >> 16) & 0xFF);
  735. stMessage.aucData[6] = (UCHAR)(ulOptionalFields_ & 0xFF);
  736. stMessage.aucData[7] = (UCHAR)((ulOptionalFields_ >> 8) & 0xFF);
  737. stMessage.aucData[8] = (UCHAR)((ulOptionalFields_ >> 16) & 0xFF);
  738. return SendCommand(&stMessage, MESG_CONFIG_ADV_BURST_SIZE, ulResponseTime_);
  739. }
  740. ///////////////////////////////////////////////////////////////////////
  741. BOOL DSIFramerANT::EncryptedChannelEnable(UCHAR ucANTChannel_, UCHAR ucMode_,
  742. UCHAR ucVolatileKeyIndex_, UCHAR ucDecimationRate_,
  743. ULONG ulResponseTime_)
  744. {
  745. ANT_MESSAGE stMessage;
  746. stMessage.ucMessageID = MESG_ENCRYPT_ENABLE_ID;
  747. stMessage.aucData[0] = ucANTChannel_;
  748. stMessage.aucData[1] = ucMode_;
  749. stMessage.aucData[2] = ucVolatileKeyIndex_;
  750. stMessage.aucData[3] = ucDecimationRate_;
  751. return SendCommand(&stMessage, MESG_ENCRYPT_ENABLE_SIZE, ulResponseTime_);
  752. }
  753. ///////////////////////////////////////////////////////////////////////
  754. BOOL DSIFramerANT::SetCryptoKey(UCHAR ucVolatileKeyIndex_, UCHAR *pucKey_, ULONG ulResponseTime_)
  755. {
  756. ANT_MESSAGE stMessage;
  757. stMessage.ucMessageID = MESG_SET_CRYPTO_KEY_ID;
  758. stMessage.aucData[0] = ucVolatileKeyIndex_;
  759. memcpy(&stMessage.aucData[1], pucKey_, 16);
  760. return SendCommand(&stMessage, MESG_SET_CRYPTO_KEY_SIZE, ulResponseTime_);
  761. }
  762. ///////////////////////////////////////////////////////////////////////
  763. BOOL DSIFramerANT::SetCryptoID(UCHAR *pucData_, ULONG ulResponseTime_)
  764. {
  765. ANT_MESSAGE stMessage;
  766. stMessage.ucMessageID = MESG_SET_CRYPTO_INFO_ID;
  767. stMessage.aucData[0] = 0;
  768. memcpy(&stMessage.aucData[1], pucData_, 4);
  769. return SendCommand(&stMessage, MESG_SET_CRYPTO_ID_SIZE, ulResponseTime_);
  770. }
  771. ///////////////////////////////////////////////////////////////////////
  772. BOOL DSIFramerANT::SetCryptoUserInfo(UCHAR *pucData_, ULONG ulResponseTime_)
  773. {
  774. ANT_MESSAGE stMessage;
  775. stMessage.ucMessageID = MESG_SET_CRYPTO_INFO_ID;
  776. stMessage.aucData[0] = 1;
  777. memcpy(&stMessage.aucData[1], pucData_, 19);
  778. return SendCommand(&stMessage, MESG_SET_CRYPTO_USER_INFO_SIZE, ulResponseTime_);
  779. }
  780. ///////////////////////////////////////////////////////////////////////
  781. BOOL DSIFramerANT::SetCryptoRNGSeed(UCHAR *pucData_, ULONG ulResponseTime_)
  782. {
  783. ANT_MESSAGE stMessage;
  784. stMessage.ucMessageID = MESG_SET_CRYPTO_INFO_ID;
  785. stMessage.aucData[0] = 2;
  786. memcpy(&stMessage.aucData[1], pucData_, 16);
  787. return SendCommand(&stMessage, MESG_SET_CRYPTO_RNG_SEED_SIZE, ulResponseTime_);
  788. }
  789. ///////////////////////////////////////////////////////////////////////
  790. BOOL DSIFramerANT::SetCryptoInfo(UCHAR ucSetParameter_, UCHAR *pucData_, ULONG ulResponseTime_)
  791. {
  792. switch(ucSetParameter_)
  793. {
  794. case 0:
  795. default:
  796. return SetCryptoID(pucData_, ulResponseTime_);
  797. case 1:
  798. return SetCryptoUserInfo(pucData_, ulResponseTime_);
  799. case 2:
  800. return SetCryptoRNGSeed(pucData_, ulResponseTime_);
  801. }
  802. }
  803. ///////////////////////////////////////////////////////////////////////
  804. BOOL DSIFramerANT::LoadCryptoKeyNVMOp(UCHAR ucNVMKeyIndex_, UCHAR ucVolatileKeyIndex_, ULONG ulResponseTime_)
  805. {
  806. ANT_MESSAGE stMessage;
  807. stMessage.ucMessageID = MESG_NVM_CRYPTO_KEY_OPS_ID;
  808. stMessage.aucData[0] = 0;
  809. stMessage.aucData[1] = ucNVMKeyIndex_;
  810. stMessage.aucData[2] = ucVolatileKeyIndex_;
  811. return SendCommand(&stMessage, MESG_NVM_CRYPTO_KEY_LOAD_SIZE, ulResponseTime_);
  812. }
  813. ///////////////////////////////////////////////////////////////////////
  814. BOOL DSIFramerANT::StoreCryptoKeyNVMOp(UCHAR ucNVMKeyIndex_, UCHAR *pucKey_, ULONG ulResponseTime_)
  815. {
  816. ANT_MESSAGE stMessage;
  817. stMessage.ucMessageID = MESG_NVM_CRYPTO_KEY_OPS_ID;
  818. stMessage.aucData[0] = 1;
  819. stMessage.aucData[1] = ucNVMKeyIndex_;
  820. memcpy(&stMessage.aucData[2], pucKey_, 16);
  821. return SendCommand(&stMessage, MESG_NVM_CRYPTO_KEY_STORE_SIZE, ulResponseTime_);
  822. }
  823. ///////////////////////////////////////////////////////////////////////
  824. BOOL DSIFramerANT::CryptoKeyNVMOp(UCHAR ucOperation_, UCHAR ucNVMKeyIndex_, UCHAR *pucData_, ULONG ulResponseTime_)
  825. {
  826. switch(ucOperation_)
  827. {
  828. case 0:
  829. default:
  830. return LoadCryptoKeyNVMOp(ucNVMKeyIndex_, *pucData_, ulResponseTime_);
  831. case 1:
  832. return StoreCryptoKeyNVMOp(ucNVMKeyIndex_, pucData_, ulResponseTime_);
  833. }
  834. }
  835. ///////////////////////////////////////////////////////////////////////
  836. BOOL DSIFramerANT::RequestMessage(UCHAR ucChannel_, UCHAR ucMessageID_)
  837. {
  838. ANT_MESSAGE_ITEM stResponse;
  839. if (SendRequest(ucMessageID_, ucChannel_, &stResponse, 0) == FALSE)
  840. return FALSE;
  841. return TRUE;
  842. }
  843. ///////////////////////////////////////////////////////////////////////
  844. BOOL DSIFramerANT::ScriptWrite( UCHAR ucSize_, UCHAR *pucCmdData_, ULONG ulResponseTime_)
  845. {
  846. ANT_MESSAGE stMessage;
  847. stMessage.ucMessageID = MESG_SCRIPT_DATA_ID;
  848. memcpy(stMessage.aucData, pucCmdData_, ucSize_);
  849. return SendCommand(&stMessage, ucSize_, ulResponseTime_);
  850. }
  851. ///////////////////////////////////////////////////////////////////////
  852. BOOL DSIFramerANT::ScriptClear(ULONG ulResponseTime_ )
  853. {
  854. ANT_MESSAGE stMessage;
  855. stMessage.ucMessageID = MESG_SCRIPT_CMD_ID;
  856. stMessage.aucData[0] = 0;
  857. stMessage.aucData[1] = SCRIPT_CMD_FORMAT;
  858. stMessage.aucData[2] = 0;
  859. return SendCommand(&stMessage, MESG_SCRIPT_CMD_SIZE, ulResponseTime_);
  860. }
  861. ///////////////////////////////////////////////////////////////////////
  862. BOOL DSIFramerANT::ScriptSetDefaultSector( UCHAR ucSectNumber_, ULONG ulResponseTime_ )
  863. {
  864. ANT_MESSAGE stMessage;
  865. stMessage.ucMessageID = MESG_SCRIPT_CMD_ID;
  866. stMessage.aucData[0] = 0;
  867. stMessage.aucData[1] = SCRIPT_CMD_SET_DEFAULT_SECTOR;
  868. stMessage.aucData[2] = ucSectNumber_;
  869. return SendCommand(&stMessage, MESG_SCRIPT_CMD_SIZE, ulResponseTime_);
  870. }
  871. ///////////////////////////////////////////////////////////////////////
  872. BOOL DSIFramerANT::ScriptEndSector( ULONG ulResponseTime_ )
  873. {
  874. ANT_MESSAGE stMessage;
  875. stMessage.ucMessageID = MESG_SCRIPT_CMD_ID;
  876. stMessage.aucData[0] = 0;
  877. stMessage.aucData[1] = SCRIPT_CMD_END_SECTOR;
  878. stMessage.aucData[2] = 0;
  879. return SendCommand(&stMessage, MESG_SCRIPT_CMD_SIZE, ulResponseTime_);
  880. }
  881. ///////////////////////////////////////////////////////////////////////
  882. BOOL DSIFramerANT::ScriptDump( ULONG ulResponseTime_ )
  883. {
  884. ANT_MESSAGE stMessage;
  885. stMessage.ucMessageID = MESG_SCRIPT_CMD_ID;
  886. stMessage.aucData[0] = 0;
  887. stMessage.aucData[1] = SCRIPT_CMD_DUMP;
  888. stMessage.aucData[2] = 0;
  889. return SendCommand(&stMessage, MESG_SCRIPT_CMD_SIZE, ulResponseTime_);
  890. }
  891. ///////////////////////////////////////////////////////////////////////
  892. BOOL DSIFramerANT::ScriptLock( ULONG ulResponseTime_ )
  893. {
  894. ANT_MESSAGE stMessage;
  895. stMessage.ucMessageID = MESG_SCRIPT_CMD_ID;
  896. stMessage.aucData[0] = 0;
  897. stMessage.aucData[1] = SCRIPT_CMD_LOCK;
  898. stMessage.aucData[2] = 0;
  899. return SendCommand(&stMessage, MESG_SCRIPT_CMD_SIZE, ulResponseTime_);
  900. }
  901. ///////////////////////////////////////////////////////////////////////
  902. BOOL DSIFramerANT::FITSetFEState(UCHAR ucFEState_, ULONG ulResponseTime_)
  903. {
  904. ANT_MESSAGE stMessage;
  905. stMessage.ucMessageID = MESG_FIT1_SET_EQUIP_STATE_ID;
  906. stMessage.aucData[0] = 0;
  907. stMessage.aucData[1] = ucFEState_;
  908. return SendCommand(&stMessage, MESG_FIT1_SET_EQUIP_STATE_SIZE, ulResponseTime_);
  909. }
  910. ///////////////////////////////////////////////////////////////////////
  911. BOOL DSIFramerANT::FITAdjustPairingSettings(UCHAR ucSearchLv_, UCHAR ucPairLv_, UCHAR ucTrackLv_, ULONG ulResponseTime_)
  912. {
  913. ANT_MESSAGE stMessage;
  914. stMessage.ucMessageID = MESG_FIT1_SET_AGC_ID;
  915. stMessage.aucData[0] = 0;
  916. stMessage.aucData[1] = ucSearchLv_;
  917. stMessage.aucData[2] = ucPairLv_;
  918. stMessage.aucData[3] = ucTrackLv_;
  919. return SendCommand(&stMessage, MESG_FIT1_SET_AGC_SIZE, ulResponseTime_);
  920. }
  921. ///////////////////////////////////////////////////////////////////////
  922. BOOL DSIFramerANT::GetCapabilities(UCHAR *pucCapabilities_, ULONG ulResponseTime_)
  923. {
  924. ANT_MESSAGE_ITEM stResponse;
  925. if (SendRequest(MESG_CAPABILITIES_ID, 0, &stResponse, ulResponseTime_) == FALSE)
  926. return FALSE;
  927. if (pucCapabilities_ == NULL || ulResponseTime_ == 0)
  928. return TRUE;
  929. *pucCapabilities_++ = stResponse.stANTMessage.aucData[0];
  930. *pucCapabilities_++ = stResponse.stANTMessage.aucData[1];
  931. *pucCapabilities_++ = stResponse.stANTMessage.aucData[2];
  932. *pucCapabilities_ = stResponse.stANTMessage.aucData[3];
  933. return TRUE;
  934. }
  935. ///////////////////////////////////////////////////////////////////////
  936. BOOL DSIFramerANT::GetChannelID(UCHAR ucANTChannel_, USHORT *pusDeviceNumber_, UCHAR *pucDeviceType_, UCHAR *pucTransmitType_, ULONG ulResponseTime_)
  937. {
  938. ANT_MESSAGE_ITEM stResponse;
  939. if (SendRequest(MESG_CHANNEL_ID_ID, ucANTChannel_, &stResponse, ulResponseTime_) == FALSE)
  940. return FALSE;
  941. if(pusDeviceNumber_ == NULL || pucDeviceType_ == NULL || pucTransmitType_ == NULL || ulResponseTime_ == 0)
  942. return TRUE;
  943. *pusDeviceNumber_ = ((USHORT)stResponse.stANTMessage.aucData[1]|(USHORT)stResponse.stANTMessage.aucData[2]<<8);
  944. *pucDeviceType_ = stResponse.stANTMessage.aucData[3];
  945. *pucTransmitType_ = stResponse.stANTMessage.aucData[4];
  946. return TRUE;
  947. }
  948. ///////////////////////////////////////////////////////////////////////
  949. BOOL DSIFramerANT::GetChannelStatus(UCHAR ucANTChannel_, UCHAR *pucStatus_, ULONG ulResponseTime_)
  950. {
  951. ANT_MESSAGE_ITEM stResponse;
  952. if (SendRequest(MESG_CHANNEL_STATUS_ID, ucANTChannel_, &stResponse, ulResponseTime_) == FALSE)
  953. return FALSE;
  954. if (pucStatus_ == NULL || ulResponseTime_ == 0)
  955. return TRUE;
  956. *pucStatus_ = stResponse.stANTMessage.aucData[1];
  957. return TRUE;
  958. }
  959. ///////////////////////////////////////////////////////////////////////
  960. BOOL DSIFramerANT::ResetSystem(ULONG ulResponseTime_)
  961. {
  962. ANT_MESSAGE stMessage;
  963. stMessage.ucMessageID = MESG_SYSTEM_RESET_ID;
  964. stMessage.aucData[0] = 0;
  965. //// Modified SendCommand() function. ////
  966. ANTMessageResponse *pclCommandResponse = (ANTMessageResponse*)NULL;
  967. // If we are going to be waiting for a response setup the Response object
  968. if (ulResponseTime_ != 0)
  969. {
  970. pclCommandResponse = new ANTMessageResponse();
  971. pclCommandResponse->Attach(MESG_STARTUP_MESG_ID, (UCHAR*)NULL, 0, this);
  972. }
  973. // Write the command message.
  974. if (!WriteMessage(&stMessage, MESG_SYSTEM_RESET_SIZE))
  975. {
  976. #if defined(DEBUG_FILE)
  977. DSIDebug::ThreadWrite("Framer->ResetSystem(): WriteMessage Failed.");
  978. #endif
  979. if(pclCommandResponse != NULL)
  980. {
  981. delete pclCommandResponse;
  982. pclCommandResponse = (ANTMessageResponse*)NULL;
  983. }
  984. return FALSE;
  985. }
  986. // Return immediately if we aren't waiting for the response.
  987. if (ulResponseTime_ == 0)
  988. return TRUE;
  989. // Wait for the response.
  990. pclCommandResponse->WaitForResponse(ulResponseTime_);
  991. pclCommandResponse->Remove(); //detach from list
  992. // We haven't received a response in the allotted time.
  993. //if (pclCommandResponse->stMessageItem.ucSize == 0)
  994. if (pclCommandResponse->bResponseReady == FALSE)
  995. {
  996. #if defined(DEBUG_FILE)
  997. DSIDebug::ThreadWrite("Framer->ResetSystem(): Timeout.");
  998. #endif
  999. delete pclCommandResponse;
  1000. return FALSE;
  1001. }
  1002. delete pclCommandResponse;
  1003. return TRUE;
  1004. }
  1005. ///////////////////////////////////////////////////////////////////////
  1006. BOOL DSIFramerANT::OpenChannel(UCHAR ucANTChannel_, ULONG ulResponseTime_)
  1007. {
  1008. ANT_MESSAGE stMessage;
  1009. stMessage.ucMessageID = MESG_OPEN_CHANNEL_ID;
  1010. stMessage.aucData[0] = ucANTChannel_;
  1011. return SendCommand(&stMessage, MESG_OPEN_CHANNEL_SIZE, ulResponseTime_);
  1012. }
  1013. ///////////////////////////////////////////////////////////////////////
  1014. BOOL DSIFramerANT::SetRSSISearchThreshold(UCHAR ucANTChannel_, UCHAR ucSearchThreshold_, ULONG ulResponseTime_)
  1015. {
  1016. ANT_MESSAGE stMessage;
  1017. stMessage.ucMessageID = MESG_RSSI_SEARCH_THRESHOLD_ID;
  1018. stMessage.aucData[0] = ucANTChannel_;
  1019. stMessage.aucData[1] = ucSearchThreshold_;
  1020. return SendCommand(&stMessage, MESG_RSSI_SEARCH_THRESHOLD_SIZE, ulResponseTime_);
  1021. }
  1022. ///////////////////////////////////////////////////////////////////////
  1023. BOOL DSIFramerANT::CloseChannel(UCHAR ucANTChannel_, ULONG ulResponseTime_)
  1024. {
  1025. BOOL bReturn;
  1026. ANT_MESSAGE stMessage;
  1027. ANTMessageResponse *pclEventResponse = (ANTMessageResponse*)NULL;
  1028. stMessage.ucMessageID = MESG_CLOSE_CHANNEL_ID;
  1029. stMessage.aucData[0] = ucANTChannel_;
  1030. // If we are going to be waiting for a response setup the Response object to wait for the channel closed event
  1031. if (ulResponseTime_ != 0)
  1032. {
  1033. UCHAR aucDesiredData[3];
  1034. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_;
  1035. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1036. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_CHANNEL_CLOSED;
  1037. pclEventResponse = new ANTMessageResponse();
  1038. pclEventResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this);
  1039. }
  1040. bReturn = SendCommand(&stMessage, MESG_CLOSE_CHANNEL_SIZE, ulResponseTime_);
  1041. if (ulResponseTime_ == 0)
  1042. return bReturn;
  1043. if (bReturn == TRUE)
  1044. {
  1045. // Wait for the close event.
  1046. bReturn = pclEventResponse->WaitForResponse(ulResponseTime_);
  1047. }
  1048. pclEventResponse->Remove(); //detach from list
  1049. delete pclEventResponse;
  1050. return bReturn;
  1051. }
  1052. ///////////////////////////////////////////////////////////////////////
  1053. BOOL DSIFramerANT::SendBroadcastData(UCHAR ucANTChannel_, UCHAR *pucData_)
  1054. {
  1055. ANT_MESSAGE stMessage;
  1056. stMessage.ucMessageID = MESG_BROADCAST_DATA_ID;
  1057. stMessage.aucData[0] = ucANTChannel_;
  1058. memcpy(&stMessage.aucData[1],pucData_, ANT_STANDARD_DATA_PAYLOAD_SIZE);
  1059. return WriteMessage(&stMessage, ANT_STANDARD_DATA_PAYLOAD_SIZE + MESG_CHANNEL_NUM_SIZE);
  1060. }
  1061. ///////////////////////////////////////////////////////////////////////
  1062. BOOL DSIFramerANT::SendBurstDataPacket(UCHAR ucANTChannelSeq_, UCHAR *pucData_)
  1063. {
  1064. ANT_MESSAGE stMessage;
  1065. stMessage.ucMessageID = MESG_BURST_DATA_ID;
  1066. stMessage.aucData[0] = ucANTChannelSeq_;
  1067. memcpy(&stMessage.aucData[1],pucData_, MESG_DATA_SIZE-1);
  1068. return WriteMessage(&stMessage, MESG_DATA_SIZE);
  1069. }
  1070. ///////////////////////////////////////////////////////////////////////
  1071. BOOL DSIFramerANT::SendAdvancedBurstDataPacket(UCHAR ucANTChannelSeq_, UCHAR *pucData_, UCHAR ucStdPcktsPerSerialMsg_)
  1072. {
  1073. ANT_MESSAGE* stMessage = (ANT_MESSAGE*) NULL;
  1074. USHORT packetDataSize = (MESG_DATA_SIZE-1) * ucStdPcktsPerSerialMsg_;
  1075. if(!CreateAntMsg_wOptExtBuf(&stMessage, packetDataSize+1)) //reqMinSize = packetSize + seqNum
  1076. {
  1077. #if defined(DEBUG_FILE)
  1078. DSIDebug::ThreadWrite("Framer->SendAdvancedBurstDataPacket(): Failed, ucStdPcktsPerSerialMsg too big for this part");
  1079. #endif
  1080. return FALSE;
  1081. }
  1082. stMessage->ucMessageID = MESG_ADV_BURST_DATA_ID;
  1083. stMessage->aucData[0] = ucANTChannelSeq_;
  1084. memcpy(&(stMessage->aucData[1]),pucData_, packetDataSize);
  1085. BOOL result = WriteMessage(stMessage, 1 + packetDataSize); //seqNum + (payloadLength*pcktsPerSerial)
  1086. delete[] stMessage;
  1087. return result;
  1088. }
  1089. ///////////////////////////////////////////////////////////////////////
  1090. ANTFRAMER_RETURN DSIFramerANT::SendAcknowledgedData(UCHAR ucANTChannel_, UCHAR *pucData_, ULONG ulResponseTime_)
  1091. {
  1092. return(SetupAckDataTransfer(
  1093. MESG_ACKNOWLEDGED_DATA_ID,
  1094. ucANTChannel_,
  1095. pucData_,
  1096. MESG_DATA_SIZE,
  1097. ulResponseTime_));
  1098. }
  1099. ANTFRAMER_RETURN DSIFramerANT::SetupAckDataTransfer(UCHAR ucMessageID_, UCHAR ucANTChannel_, UCHAR *pucData_, UCHAR ucMaxDataSize_, ULONG ulResponseTime_)
  1100. {
  1101. ANTFRAMER_RETURN eReturn = ANTFRAMER_PASS;
  1102. ANT_MESSAGE stMessage;
  1103. ULONG ulStartTime = DSIThread_GetSystemTime();
  1104. ANTMessageResponse *pclPassResponse = (ANTMessageResponse*)NULL;
  1105. ANTMessageResponse *pclFailResponse = (ANTMessageResponse*)NULL;
  1106. ANTMessageResponse *pclErrorResponse = (ANTMessageResponse*)NULL;
  1107. volatile BOOL *pbCancel_;
  1108. BOOL bDummyCancel = FALSE;
  1109. if (pbCancel == NULL)
  1110. pbCancel_ = &bDummyCancel;
  1111. else
  1112. pbCancel_ = pbCancel;
  1113. stMessage.ucMessageID = ucMessageID_;
  1114. stMessage.aucData[0] = ucANTChannel_;
  1115. memcpy(&stMessage.aucData[1],pucData_, ucMaxDataSize_-1);
  1116. // If we are going to be waiting for a response setup the Response objects
  1117. if (ulResponseTime_ != 0)
  1118. {
  1119. UCHAR aucDesiredData[3];
  1120. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx complete
  1121. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1122. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_COMPLETED;
  1123. pclPassResponse = new ANTMessageResponse();
  1124. pclPassResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this);
  1125. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx fail
  1126. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1127. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_FAILED;
  1128. pclFailResponse = new ANTMessageResponse();
  1129. pclFailResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this, pclPassResponse->pstCondResponseReady);
  1130. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch any errors like transfer in progress.
  1131. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = ucMessageID_;
  1132. pclErrorResponse = new ANTMessageResponse();
  1133. pclErrorResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, 2, this, pclPassResponse->pstCondResponseReady);
  1134. }
  1135. if (WriteMessage(&stMessage, ucMaxDataSize_) == FALSE)
  1136. eReturn = ANTFRAMER_FAIL;
  1137. // Return immediately if we aren't waiting for the response.
  1138. if (ulResponseTime_ == 0)
  1139. return ANTFRAMER_PASS;
  1140. DSIThread_MutexLock(&stMutexResponseRequest);
  1141. if (eReturn == ANTFRAMER_PASS) //Only try to wait if we haven't failed yet
  1142. {
  1143. while((pclPassResponse->bResponseReady == FALSE) &&
  1144. (pclFailResponse->bResponseReady == FALSE) &&
  1145. (pclErrorResponse->bResponseReady == FALSE) &&
  1146. (*pbCancel_ == FALSE) &&
  1147. ((DSIThread_GetSystemTime() - ulStartTime) < ulResponseTime_))
  1148. {
  1149. DSIThread_CondTimedWait(pclPassResponse->pstCondResponseReady, &stMutexResponseRequest, 1000);
  1150. }
  1151. if (pclPassResponse->bResponseReady == FALSE) //The only time we are sucessful is if we get a tx transfer complete
  1152. {
  1153. //figure out the reason why we failed/stopped
  1154. if ((pclErrorResponse->bResponseReady == TRUE) || (pclFailResponse->bResponseReady == TRUE))
  1155. eReturn = ANTFRAMER_FAIL;
  1156. else if (*pbCancel_ == TRUE)
  1157. eReturn = ANTFRAMER_CANCELLED;
  1158. else
  1159. eReturn = ANTFRAMER_TIMEOUT;
  1160. }
  1161. }
  1162. pclPassResponse->Remove();
  1163. pclFailResponse->Remove();
  1164. pclErrorResponse->Remove();
  1165. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1166. delete pclPassResponse;
  1167. delete pclFailResponse;
  1168. delete pclErrorResponse;
  1169. return eReturn;
  1170. }
  1171. ANTFRAMER_RETURN DSIFramerANT::SetupBurstDataTransfer(UCHAR ucMessageID_, UCHAR ucANTChannel_, UCHAR * pucData_, ULONG ulSize_,UCHAR ucMaxDataSize_, ULONG ulResponseTime_)
  1172. {
  1173. ANTFRAMER_RETURN eReturn = ANTFRAMER_PASS;
  1174. ULONG ulStartTime = DSIThread_GetSystemTime();
  1175. ANTMessageResponse *pclPassResponse = (ANTMessageResponse*)NULL;
  1176. ANTMessageResponse *pclFailResponse = (ANTMessageResponse*)NULL;
  1177. ANTMessageResponse *pclErrorResponse = (ANTMessageResponse*)NULL;
  1178. ANT_MESSAGE* stMessage = (ANT_MESSAGE*)NULL;
  1179. if(!CreateAntMsg_wOptExtBuf(&stMessage, ucMaxDataSize_))
  1180. {
  1181. #if defined(DEBUG_FILE)
  1182. DSIDebug::ThreadWrite("Framer->SetupBurstDataTransfer(): Failed, ucMaxDataSize_ too big for this part");
  1183. #endif
  1184. return ANTFRAMER_INVALIDPARAM;
  1185. }
  1186. volatile BOOL *pbCancel_;
  1187. BOOL bDummyCancel = FALSE;
  1188. if (pbCancel == NULL)
  1189. pbCancel_ = &bDummyCancel;
  1190. else
  1191. pbCancel_ = pbCancel;
  1192. UCHAR aucDesiredData[3];
  1193. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx complete
  1194. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1195. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_COMPLETED;
  1196. pclPassResponse = new ANTMessageResponse();
  1197. pclPassResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this);
  1198. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx fail
  1199. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1200. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_FAILED;
  1201. pclFailResponse = new ANTMessageResponse();
  1202. pclFailResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this, pclPassResponse->pstCondResponseReady);
  1203. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch any errors like transfer in progress.
  1204. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = ucMessageID_;
  1205. pclErrorResponse = new ANTMessageResponse();
  1206. pclErrorResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, 2, this, pclPassResponse->pstCondResponseReady);
  1207. //getting error Rx will also effectively lose the transfer, but only on an AP1
  1208. stMessage->ucMessageID = ucMessageID_;
  1209. stMessage->aucData[0] = ucANTChannel_ & CHANNEL_NUMBER_MASK; // Clear the sequence bits
  1210. while ((eReturn == ANTFRAMER_PASS) && ulSize_)
  1211. {
  1212. if (ulSize_ > (UCHAR)(ucMaxDataSize_-1))
  1213. {
  1214. memcpy (&stMessage->aucData[1],pucData_,ucMaxDataSize_-1);
  1215. ulSize_ -= ucMaxDataSize_-1;
  1216. pucData_ += ucMaxDataSize_-1;
  1217. }
  1218. else
  1219. {
  1220. while((UCHAR)(ucMaxDataSize_-9) >= ulSize_)
  1221. ucMaxDataSize_ -= 8; //Shorten the last packet by 8-bytes if possible.
  1222. stMessage->aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1223. memset (&stMessage->aucData[1], 0x00, ucMaxDataSize_-1);
  1224. memcpy (&stMessage->aucData[1],pucData_,ulSize_);
  1225. ulSize_ = 0;
  1226. }
  1227. if (WriteMessage(stMessage,ucMaxDataSize_) == FALSE)
  1228. eReturn = ANTFRAMER_FAIL;
  1229. //Adjust sequence number
  1230. if ((stMessage->aucData[0] & SEQUENCE_NUMBER_MASK) == SEQUENCE_NUMBER_ROLLOVER)
  1231. stMessage->aucData[0] = SEQUENCE_NUMBER_INC | ucANTChannel_;
  1232. else
  1233. stMessage->aucData[0] += SEQUENCE_NUMBER_INC;
  1234. if (*pbCancel_ == TRUE)
  1235. eReturn = ANTFRAMER_CANCELLED;
  1236. //Abort transfer on errors, don't keep trying to send
  1237. if ((pclFailResponse->bResponseReady == TRUE) || (pclErrorResponse->bResponseReady == TRUE))
  1238. eReturn = ANTFRAMER_FAIL;
  1239. if (ulResponseTime_ != 0) //Check for errors
  1240. {
  1241. if ((DSIThread_GetSystemTime() - ulStartTime) > ulResponseTime_)
  1242. eReturn = ANTFRAMER_TIMEOUT;
  1243. }
  1244. }
  1245. DSIThread_MutexLock(&stMutexResponseRequest);
  1246. if (ulResponseTime_ != 0) //Check for errors
  1247. {
  1248. if (eReturn == ANTFRAMER_PASS) //Only try to wait if we haven't failed yet
  1249. {
  1250. while((pclPassResponse->bResponseReady == FALSE) &&
  1251. (pclFailResponse->bResponseReady == FALSE) &&
  1252. (pclErrorResponse->bResponseReady == FALSE) &&
  1253. (*pbCancel_ == FALSE) &&
  1254. ((DSIThread_GetSystemTime() - ulStartTime) < ulResponseTime_))
  1255. {
  1256. DSIThread_CondTimedWait(pclPassResponse->pstCondResponseReady, &stMutexResponseRequest, 1000);
  1257. }
  1258. if (pclPassResponse->bResponseReady == FALSE) //The only time we are sucessful is if we get a tx transfer complete
  1259. {
  1260. //figure out the reason why we failed/stopped
  1261. if ((pclErrorResponse->bResponseReady == TRUE) || (pclFailResponse->bResponseReady == TRUE))
  1262. eReturn = ANTFRAMER_FAIL;
  1263. else if (*pbCancel_ == TRUE)
  1264. eReturn = ANTFRAMER_CANCELLED;
  1265. else
  1266. eReturn = ANTFRAMER_TIMEOUT;
  1267. }
  1268. }
  1269. }
  1270. pclPassResponse->Remove();
  1271. pclFailResponse->Remove();
  1272. pclErrorResponse->Remove();
  1273. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1274. delete pclPassResponse;
  1275. delete pclFailResponse;
  1276. delete pclErrorResponse;
  1277. delete[] stMessage;
  1278. //Always return true with no timeout, so nobody relies on this return value
  1279. if(ulResponseTime_ == 0)
  1280. eReturn = ANTFRAMER_PASS;
  1281. return eReturn;
  1282. }
  1283. ///////////////////////////////////////////////////////////////////////
  1284. ANTFRAMER_RETURN DSIFramerANT::SendTransfer(UCHAR ucANTChannel_, UCHAR * pucData_, ULONG ulSize_, ULONG ulResponseTime_)
  1285. {
  1286. return(SetupBurstDataTransfer(
  1287. MESG_BURST_DATA_ID,
  1288. ucANTChannel_,
  1289. pucData_,
  1290. ulSize_,
  1291. MESG_DATA_SIZE,
  1292. ulResponseTime_));
  1293. }
  1294. ANTFRAMER_RETURN DSIFramerANT::SendAdvancedTransfer(UCHAR ucANTChannel_, UCHAR * pucData_, ULONG ulSize_, UCHAR ucStdPcktsPerSerialMsg_, ULONG ulResponseTime_)
  1295. {
  1296. return(SetupBurstDataTransfer(
  1297. MESG_ADV_BURST_DATA_ID,
  1298. ucANTChannel_,
  1299. pucData_,
  1300. ulSize_,
  1301. 1 + ((MESG_DATA_SIZE-1) * ucStdPcktsPerSerialMsg_), //seqNum + (payloadLength*pcktsPerSerial)
  1302. ulResponseTime_));
  1303. }
  1304. ///////////////////////////////////////////////////////////////////////
  1305. ANTFRAMER_RETURN DSIFramerANT::SendANTFSTransfer(UCHAR ucANTChannel_, UCHAR* pucHeader_, UCHAR* pucFooter_, UCHAR * pucData_, ULONG ulSize_, ULONG ulResponseTime_, volatile ULONG *pulProgress_)
  1306. {
  1307. ANTFRAMER_RETURN eReturn = ANTFRAMER_PASS;
  1308. ANT_MESSAGE stMessage;
  1309. ULONG ulStartTime = DSIThread_GetSystemTime();
  1310. UCHAR *pucDataSource;
  1311. ANTMessageResponse *pclPassResponse = (ANTMessageResponse*)NULL;
  1312. ANTMessageResponse *pclFailResponse = (ANTMessageResponse*)NULL;
  1313. ANTMessageResponse *pclErrorResponse = (ANTMessageResponse*)NULL;
  1314. #if defined(WAIT_TO_FEED_TRANSFER)
  1315. ANTMessageResponse *pclBroadcastResponse = (ANTMessageResponse*)NULL;
  1316. ANTMessageResponse *pclAcknowledgeResponse = (ANTMessageResponse*)NULL;
  1317. BOOL bFirstPacket = TRUE;
  1318. UCHAR ucSyncMesgCount = 0;
  1319. UCHAR ucChannelStatus;
  1320. #endif
  1321. ULONG ulDummyProgress = 0;
  1322. volatile BOOL *pbCancel_;
  1323. BOOL bDummyCancel = FALSE;
  1324. if (pbCancel == NULL)
  1325. pbCancel_ = &bDummyCancel;
  1326. else
  1327. pbCancel_ = pbCancel;
  1328. if (pulProgress_ == NULL)
  1329. pulProgress_ = &ulDummyProgress;
  1330. if (pucHeader_) //if the header is not NULL, set the data pointer and add 8 to the size
  1331. {
  1332. pucDataSource = pucHeader_;
  1333. ulSize_ += 8;
  1334. }
  1335. else
  1336. {
  1337. pucDataSource = pucData_;
  1338. }
  1339. #if defined(WAIT_TO_FEED_TRANSFER)
  1340. if(GetChannelStatus(ucANTChannel_,&ucChannelStatus, 2000) == FALSE)
  1341. return ANTFRAMER_FAIL;
  1342. if ((ucChannelStatus & STATUS_CHANNEL_STATE_MASK) != STATUS_TRACKING_CHANNEL)
  1343. return ANTFRAMER_FAIL;
  1344. #endif
  1345. // If we are going to be waiting for a response setup the Response objects
  1346. if (ulResponseTime_ != 0)
  1347. {
  1348. UCHAR aucDesiredData[3];
  1349. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx complete
  1350. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1351. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_COMPLETED;
  1352. pclPassResponse = new ANTMessageResponse();
  1353. pclPassResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this);
  1354. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx fail
  1355. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1356. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_FAILED;
  1357. pclFailResponse = new ANTMessageResponse();
  1358. pclFailResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this, pclPassResponse->pstCondResponseReady);
  1359. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch any errors like transfer in progress.
  1360. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_BURST_DATA_ID;
  1361. pclErrorResponse = new ANTMessageResponse();
  1362. pclErrorResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, 2, this, pclPassResponse->pstCondResponseReady);
  1363. //getting error Rx will also effectively lose the transfer, but only on an AP1
  1364. #if defined(WAIT_TO_FEED_TRANSFER)
  1365. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch only broadcast/acknowledged messages for this channel
  1366. pclBroadcastResponse = new ANTMessageResponse();
  1367. pclBroadcastResponse->Attach(MESG_BROADCAST_DATA_ID, aucDesiredData, 1, this, pclPassResponse->pstCondResponseReady);
  1368. pclAcknowledgeResponse = new ANTMessageResponse();
  1369. pclAcknowledgeResponse->Attach(MESG_ACKNOWLEDGED_DATA_ID, aucDesiredData, 1, this, pclPassResponse->pstCondResponseReady);
  1370. #endif
  1371. }
  1372. stMessage.ucMessageID = MESG_BURST_DATA_ID;
  1373. stMessage.aucData[0] = ucANTChannel_ & CHANNEL_NUMBER_MASK; // Clear the sequence bits
  1374. while (eReturn == ANTFRAMER_PASS && ulSize_)
  1375. {
  1376. if (*pbCancel_ == TRUE)
  1377. eReturn = ANTFRAMER_CANCELLED;
  1378. if (ulSize_ > 8)
  1379. {
  1380. memcpy (&stMessage.aucData[1],pucDataSource,8);
  1381. *pulProgress_ += 8;
  1382. ulSize_ -= 8;
  1383. }
  1384. else
  1385. {
  1386. if (pucFooter_ == (UCHAR*)NULL)
  1387. stMessage.aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1388. memset (&stMessage.aucData[1], 0x00, 8);
  1389. memcpy (&stMessage.aucData[1],pucDataSource,ulSize_);
  1390. *pulProgress_ += ulSize_;
  1391. ulSize_ = 0;
  1392. }
  1393. if (ulSize_)
  1394. {
  1395. if (pucDataSource == pucHeader_)
  1396. pucDataSource = pucData_;
  1397. else
  1398. pucDataSource += 8;
  1399. }
  1400. if (WriteMessage(&stMessage,9) == FALSE)
  1401. eReturn = ANTFRAMER_FAIL;
  1402. //Adjust sequence number
  1403. if ((stMessage.aucData[0] & SEQUENCE_NUMBER_MASK) == SEQUENCE_NUMBER_ROLLOVER)
  1404. stMessage.aucData[0] = SEQUENCE_NUMBER_INC | ucANTChannel_;
  1405. else
  1406. stMessage.aucData[0] += SEQUENCE_NUMBER_INC;
  1407. #if defined(WAIT_TO_FEED_TRANSFER)
  1408. if (bFirstPacket)
  1409. {
  1410. bFirstPacket = FALSE;
  1411. DSIThread_MutexLock(&stMutexResponseRequest);
  1412. if (eReturn == ANTFRAMER_PASS) //Only try to wait if we haven't failed yet
  1413. {
  1414. if ((pclBroadcastResponse->bResponseReady == FALSE) &&
  1415. (pclAcknowledgeResponse->bResponseReady == FALSE) &&
  1416. (pclPassResponse->bResponseReady == FALSE) &&
  1417. (pclFailResponse->bResponseReady == FALSE) &&
  1418. (pclErrorResponse->bResponseReady == FALSE) &&
  1419. (*pbCancel_ == FALSE) &&
  1420. ((DSIThread_GetSystemTime() - ulStartTime) < ulResponseTime_))
  1421. {
  1422. UCHAR ucStatus = DSIThread_CondTimedWait(pclBroadcastResponse->pstCondResponseReady, &stMutexResponseRequest, 3000); //Try to wait for the next syncronous event to send out the next packet.
  1423. if (ucStatus != DSI_THREAD_ENONE) //If we timeout
  1424. {
  1425. #if defined(DEBUG_FILE)
  1426. if(ucStatus == DSI_THREAD_EOTHER)
  1427. DSIDebug::ThreadWrite("Framer->SendFSTransfer(): CondTimedWait() Failed!");
  1428. DSIDebug::ThreadWrite("Framer->SendFSTransfer(): Wait for sync mesg failed.");
  1429. #endif
  1430. //if we didn't get a syncronous event,
  1431. stMessage.aucData[0] += SEQUENCE_NUMBER_INC; // mess up the sequence number on purpose, this will result in the transfer being cleared off of the device and will result in us exiting this function due to the sync error.
  1432. }
  1433. }
  1434. pclBroadcastResponse->bResponseReady = FALSE;
  1435. pclAcknowledgeResponse->bResponseReady = FALSE;
  1436. //reset the variables and continue on
  1437. }
  1438. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1439. }
  1440. #endif
  1441. if (ulResponseTime_ != 0) //Check for errors
  1442. {
  1443. if ((pclFailResponse->bResponseReady == TRUE) || (pclErrorResponse->bResponseReady == TRUE))
  1444. eReturn = ANTFRAMER_FAIL;
  1445. if ((DSIThread_GetSystemTime() - ulStartTime) > ulResponseTime_)
  1446. eReturn = ANTFRAMER_TIMEOUT;
  1447. }
  1448. }
  1449. if ((eReturn == ANTFRAMER_PASS) && (pucFooter_))
  1450. {
  1451. stMessage.aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1452. memcpy (&stMessage.aucData[1],pucFooter_,8);
  1453. *pulProgress_ += 8;
  1454. if (WriteMessage(&stMessage,9) == FALSE)
  1455. eReturn = ANTFRAMER_FAIL;
  1456. }
  1457. if (ulResponseTime_ != 0) //Check for errors
  1458. {
  1459. DSIThread_MutexLock(&stMutexResponseRequest);
  1460. if (eReturn == ANTFRAMER_PASS) //Only try to wait if we haven't failed yet
  1461. {
  1462. while((pclPassResponse->bResponseReady == FALSE) &&
  1463. (pclFailResponse->bResponseReady == FALSE) &&
  1464. (pclErrorResponse->bResponseReady == FALSE) &&
  1465. (*pbCancel_ == FALSE) &&
  1466. ((DSIThread_GetSystemTime() - ulStartTime) < ulResponseTime_))
  1467. {
  1468. DSIThread_CondTimedWait(pclPassResponse->pstCondResponseReady, &stMutexResponseRequest, 1000);
  1469. #if defined(WAIT_TO_FEED_TRANSFER)
  1470. if ((pclBroadcastResponse->bResponseReady == TRUE) ||
  1471. (pclAcknowledgeResponse->bResponseReady == TRUE))
  1472. {
  1473. pclBroadcastResponse->bResponseReady = FALSE;
  1474. pclAcknowledgeResponse->bResponseReady = FALSE;
  1475. if (ucSyncMesgCount++ > 2) //If we get more than 2 sync events (3 or 4) when we're waiting for our transfer to complete
  1476. {
  1477. pclErrorResponse->bResponseReady = TRUE; //Set the error response flag
  1478. }
  1479. }
  1480. #endif
  1481. }
  1482. if (pclPassResponse->bResponseReady == FALSE) //The only time we are sucessful is if we get a tx transfer complete
  1483. {
  1484. //figure out the reason why we failed/stopped
  1485. if ((pclErrorResponse->bResponseReady == TRUE) || (pclFailResponse->bResponseReady == TRUE))
  1486. eReturn = ANTFRAMER_FAIL;
  1487. else if (*pbCancel_ == TRUE)
  1488. eReturn = ANTFRAMER_CANCELLED;
  1489. else
  1490. eReturn = ANTFRAMER_TIMEOUT;
  1491. }
  1492. }
  1493. pclPassResponse->Remove();
  1494. pclFailResponse->Remove();
  1495. pclErrorResponse->Remove();
  1496. #if defined(WAIT_TO_FEED_TRANSFER)
  1497. pclBroadcastResponse->Remove();
  1498. pclAcknowledgeResponse->Remove();
  1499. #endif
  1500. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1501. delete pclPassResponse;
  1502. delete pclFailResponse;
  1503. delete pclErrorResponse;
  1504. #if defined(WAIT_TO_FEED_TRANSFER)
  1505. delete pclBroadcastResponse;
  1506. delete pclAcknowledgeResponse;
  1507. #endif
  1508. }
  1509. return eReturn;
  1510. }
  1511. ///////////////////////////////////////////////////////////////////////
  1512. ANTFRAMER_RETURN DSIFramerANT::SendANTFSClientTransfer(UCHAR ucANTChannel_, ANTFS_DATA* pstHeader_, ANTFS_DATA* pstFooter_, ANTFS_DATA* pstData_, ULONG ulResponseTime_, volatile ULONG *pulProgress_)
  1513. {
  1514. ANTFRAMER_RETURN eReturn = ANTFRAMER_PASS;
  1515. ANT_MESSAGE stMessage;
  1516. ULONG ulStartTime = DSIThread_GetSystemTime();
  1517. UCHAR *pucDataSource;
  1518. ULONG ulBlockSize;
  1519. ULONG ulTotalSize;
  1520. ANTMessageResponse *pclPassResponse = (ANTMessageResponse*)NULL;
  1521. ANTMessageResponse *pclFailResponse = (ANTMessageResponse*)NULL;
  1522. ANTMessageResponse *pclErrorResponse = (ANTMessageResponse*)NULL;
  1523. ULONG ulDummyProgress = 0;
  1524. volatile BOOL *pbCancel_;
  1525. BOOL bDummyCancel = FALSE;
  1526. if (pbCancel == NULL)
  1527. pbCancel_ = &bDummyCancel;
  1528. else
  1529. pbCancel_ = pbCancel;
  1530. if (pulProgress_ == NULL)
  1531. pulProgress_ = &ulDummyProgress;
  1532. if (pstHeader_->pucData) //if there is a header, set the data pointer
  1533. {
  1534. pucDataSource = pstHeader_->pucData;
  1535. ulBlockSize = pstHeader_->ulSize;
  1536. }
  1537. else
  1538. {
  1539. pucDataSource = pstData_->pucData;
  1540. ulBlockSize = pstData_->ulSize;
  1541. }
  1542. ulTotalSize = pstHeader_->ulSize + pstData_->ulSize + pstFooter_->ulSize;
  1543. // If we are going to be waiting for a response setup the Response objects
  1544. if (ulResponseTime_ != 0)
  1545. {
  1546. UCHAR aucDesiredData[3];
  1547. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx complete
  1548. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1549. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_COMPLETED;
  1550. pclPassResponse = new ANTMessageResponse();
  1551. pclPassResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this);
  1552. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch tx fail
  1553. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_EVENT_ID;
  1554. aucDesiredData[ANT_DATA_EVENT_CODE_OFFSET] = EVENT_TRANSFER_TX_FAILED;
  1555. pclFailResponse = new ANTMessageResponse();
  1556. pclFailResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, sizeof(aucDesiredData), this, pclPassResponse->pstCondResponseReady);
  1557. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = ucANTChannel_; //Setup response to catch any errors like transfer in progress.
  1558. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = MESG_BURST_DATA_ID;
  1559. pclErrorResponse = new ANTMessageResponse();
  1560. pclErrorResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, 2, this, pclPassResponse->pstCondResponseReady);
  1561. }
  1562. stMessage.ucMessageID = MESG_BURST_DATA_ID;
  1563. stMessage.aucData[0] = ucANTChannel_ & CHANNEL_NUMBER_MASK; // Clear the sequence bits
  1564. while (eReturn == ANTFRAMER_PASS && ulTotalSize)
  1565. {
  1566. UCHAR ucCurrentBlockSize;
  1567. if (*pbCancel_ == TRUE)
  1568. eReturn = ANTFRAMER_CANCELLED;
  1569. if (ulBlockSize > 8)
  1570. {
  1571. ucCurrentBlockSize = 8;
  1572. memcpy (&stMessage.aucData[1],pucDataSource, ucCurrentBlockSize);
  1573. *pulProgress_ += ucCurrentBlockSize;
  1574. ulTotalSize -= ucCurrentBlockSize;
  1575. ulBlockSize -= ucCurrentBlockSize;
  1576. pucDataSource += ucCurrentBlockSize;
  1577. }
  1578. else
  1579. {
  1580. ucCurrentBlockSize = (UCHAR)ulBlockSize;
  1581. memset (&stMessage.aucData[1], 0x00, 8);
  1582. memcpy (&stMessage.aucData[1],pucDataSource, ucCurrentBlockSize);
  1583. *pulProgress_ += ucCurrentBlockSize;
  1584. ulTotalSize -= ucCurrentBlockSize;
  1585. ulBlockSize = 0;
  1586. }
  1587. if (ulBlockSize == 0)
  1588. {
  1589. if(pucDataSource == (pstHeader_->pucData + pstHeader_->ulSize - ucCurrentBlockSize))
  1590. {
  1591. if(pstData_->pucData)
  1592. {
  1593. pucDataSource = pstData_->pucData;
  1594. ulBlockSize = pstData_->ulSize;
  1595. }
  1596. else if(pstFooter_->pucData)
  1597. {
  1598. pucDataSource = pstFooter_->pucData;
  1599. ulBlockSize = pstFooter_->ulSize;
  1600. }
  1601. else
  1602. {
  1603. stMessage.aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1604. }
  1605. }
  1606. else if(pucDataSource == (pstData_->pucData + pstData_->ulSize - ucCurrentBlockSize))
  1607. {
  1608. if(pstFooter_->pucData)
  1609. {
  1610. pucDataSource = pstFooter_->pucData;
  1611. ulBlockSize = pstFooter_->ulSize;
  1612. }
  1613. else
  1614. {
  1615. stMessage.aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1616. }
  1617. }
  1618. else // footer
  1619. {
  1620. stMessage.aucData[0] |= SEQUENCE_LAST_MESSAGE;
  1621. }
  1622. }
  1623. if (WriteMessage(&stMessage,9) == FALSE)
  1624. eReturn = ANTFRAMER_FAIL;
  1625. //Adjust sequence number
  1626. if ((stMessage.aucData[0] & SEQUENCE_NUMBER_MASK) == SEQUENCE_NUMBER_ROLLOVER)
  1627. stMessage.aucData[0] = SEQUENCE_NUMBER_INC | ucANTChannel_;
  1628. else
  1629. stMessage.aucData[0] += SEQUENCE_NUMBER_INC;
  1630. if (ulResponseTime_ != 0) //Check for errors
  1631. {
  1632. if ((pclFailResponse->bResponseReady == TRUE) || (pclErrorResponse->bResponseReady == TRUE))
  1633. eReturn = ANTFRAMER_FAIL;
  1634. if ((DSIThread_GetSystemTime() - ulStartTime) > ulResponseTime_)
  1635. eReturn = ANTFRAMER_TIMEOUT;
  1636. }
  1637. } // while loop
  1638. if (ulResponseTime_ != 0) //Check for errors
  1639. {
  1640. DSIThread_MutexLock(&stMutexResponseRequest);
  1641. if (eReturn == ANTFRAMER_PASS) //Only try to wait if we haven't failed yet
  1642. {
  1643. while((pclPassResponse->bResponseReady == FALSE) &&
  1644. (pclFailResponse->bResponseReady == FALSE) &&
  1645. (pclErrorResponse->bResponseReady == FALSE) &&
  1646. (*pbCancel_ == FALSE) &&
  1647. ((DSIThread_GetSystemTime() - ulStartTime) < ulResponseTime_))
  1648. {
  1649. DSIThread_CondTimedWait(pclPassResponse->pstCondResponseReady, &stMutexResponseRequest, 1000);
  1650. }
  1651. if (pclPassResponse->bResponseReady == FALSE) //The only time we are sucessful is if we get a tx transfer complete
  1652. {
  1653. //figure out the reason why we failed/stopped
  1654. if ((pclErrorResponse->bResponseReady == TRUE) || (pclFailResponse->bResponseReady == TRUE))
  1655. eReturn = ANTFRAMER_FAIL;
  1656. else if (*pbCancel_ == TRUE)
  1657. eReturn = ANTFRAMER_CANCELLED;
  1658. else
  1659. eReturn = ANTFRAMER_TIMEOUT;
  1660. }
  1661. }
  1662. pclPassResponse->Remove();
  1663. pclFailResponse->Remove();
  1664. pclErrorResponse->Remove();
  1665. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1666. delete pclPassResponse;
  1667. delete pclFailResponse;
  1668. delete pclErrorResponse;
  1669. }
  1670. return eReturn;
  1671. }
  1672. //////////////////////////////////////////////////////////////////////////////////
  1673. // Private Class Functions
  1674. //////////////////////////////////////////////////////////////////////////////////
  1675. ///////////////////////////////////////////////////////////////////////
  1676. // stMutexCriticalSection must be locked before calling this function.
  1677. ///////////////////////////////////////////////////////////////////////
  1678. USHORT DSIFramerANT::GetMessageSize(void)
  1679. {
  1680. USHORT usRetVal;
  1681. if (ucError)
  1682. usRetVal = DSI_FRAMER_ERROR;
  1683. else if ((usMessageHead - usMessageTail) != 0)
  1684. usRetVal = astMessageBuffer[usMessageTail].ucSize;
  1685. else
  1686. usRetVal = DSI_FRAMER_TIMEDOUT;
  1687. return usRetVal;
  1688. }
  1689. ///////////////////////////////////////////////////////////////////////
  1690. void DSIFramerANT::ProcessMessage(void)
  1691. {
  1692. UCHAR ucMessageID = aucRxFifo[MESG_ID_OFFSET];
  1693. UCHAR ucSize = aucRxFifo[MESG_SIZE_OFFSET]; // Set size as reported by message.
  1694. CheckResponseList();
  1695. if(ucMessageID == MESG_BURST_DATA_ID || ucMessageID == MESG_EXT_BURST_DATA_ID)
  1696. {
  1697. ucPrevSequenceNum = aucRxFifo[MESG_DATA_OFFSET] & SEQUENCE_NUMBER_MASK;
  1698. //If the burst flag only holds the SEQUENCE_LAST_MESSAGE and no sequence number
  1699. //we recode it as an acknowledged message. This is because there is a timing bug in some
  1700. //versions of the chips that had the first implementation of advanced burst support,
  1701. //such as the USBm, that cause a received ACK to be sent in this wrong format.
  1702. //Fixing it here means nobody else has to work around this bug, and this is essentially
  1703. //the same logic that is used in the ANT stack anyway.
  1704. if(ucPrevSequenceNum == SEQUENCE_LAST_MESSAGE)
  1705. {
  1706. #if defined(SERIAL_DEBUG)
  1707. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Rx - Recevied ack msg as burst packet, recoding to ack.", NULL, 0);
  1708. #endif
  1709. aucRxFifo[MESG_ID_OFFSET] = MESG_ACKNOWLEDGED_DATA_ID;
  1710. aucRxFifo[MESG_DATA_OFFSET] &= ~SEQUENCE_NUMBER_MASK; //Also remove the burst flags
  1711. ProcessMessage(); //Recurse to handle the recoded message
  1712. return; //Now we are done
  1713. }
  1714. }
  1715. if(ucMessageID == MESG_ADV_BURST_DATA_ID && bSplitAdvancedBursts) // split into normal burst messages.
  1716. {
  1717. #if defined(SERIAL_DEBUG)
  1718. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Decomposing", aucRxFifo, ucSize+4);
  1719. #endif
  1720. for(UCHAR i = 0; i * 8 < ucSize - 1; i++) //For each 8-byte packet
  1721. {
  1722. if(ucPrevSequenceNum == SEQUENCE_NUMBER_ROLLOVER) //Increment sequence num
  1723. ucPrevSequenceNum = 0;
  1724. ucPrevSequenceNum += SEQUENCE_NUMBER_INC;
  1725. if((aucRxFifo[MESG_DATA_OFFSET] & SEQUENCE_LAST_MESSAGE) != 0 && (i+1)*8 == ucSize - 1) //If the last packet.
  1726. ucPrevSequenceNum |= SEQUENCE_LAST_MESSAGE;
  1727. // Add message to the queue.
  1728. if ((USHORT)(usMessageHead - usMessageTail) < (USHORT)(sizeof(astMessageBuffer) / sizeof(ANT_MESSAGE_ITEM) - 1))
  1729. {
  1730. astMessageBuffer[usMessageHead].ucSize = 9;
  1731. astMessageBuffer[usMessageHead].stANTMessage.ucMessageID = MESG_BURST_DATA_ID;
  1732. astMessageBuffer[usMessageHead].stANTMessage.aucData[0] = ucPrevSequenceNum | (aucRxFifo[MESG_DATA_OFFSET] & CHANNEL_NUMBER_MASK);
  1733. memcpy(astMessageBuffer[usMessageHead].stANTMessage.aucData + 1, &aucRxFifo[MESG_DATA_OFFSET + 1 + i*8], 8);
  1734. usMessageHead++; // Rollover of usMessageHead happens automagically because our buffer size is MAX_USHORT + 1.
  1735. }
  1736. else
  1737. {
  1738. ucError = DSI_FRAMER_ANT_EQUEUE_OVERFLOW;
  1739. }
  1740. DSIThread_CondSignal(&stCondMessageReady);
  1741. #if defined(SERIAL_DEBUG)
  1742. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Simulated Rx", astMessageBuffer[usMessageHead-1].stANTMessage.aucData, astMessageBuffer[usMessageHead-1].ucSize);
  1743. #endif
  1744. }
  1745. }
  1746. else
  1747. {
  1748. // Add message to the queue.
  1749. if ((USHORT)(usMessageHead - usMessageTail) < (USHORT)(sizeof(astMessageBuffer) / sizeof(ANT_MESSAGE_ITEM) - 1))
  1750. {
  1751. astMessageBuffer[usMessageHead].ucSize = ucSize;
  1752. astMessageBuffer[usMessageHead].stANTMessage.ucMessageID = ucMessageID;
  1753. memcpy(astMessageBuffer[usMessageHead].stANTMessage.aucData, &aucRxFifo[MESG_DATA_OFFSET], ucSize);
  1754. usMessageHead++; // Rollover of usMessageHead happens automagically because our buffer size is MAX_USHORT + 1.
  1755. }
  1756. else
  1757. {
  1758. ucError = DSI_FRAMER_ANT_EQUEUE_OVERFLOW;
  1759. }
  1760. DSIThread_CondSignal(&stCondMessageReady);
  1761. #if defined(SERIAL_DEBUG)
  1762. DSIDebug::SerialWrite(pclSerial->GetDeviceNumber(), "Rx", aucRxFifo, ucSize + 4);
  1763. #endif
  1764. }
  1765. }
  1766. ///////////////////////////////////////////////////////////////////////
  1767. void DSIFramerANT::CheckResponseList(void)
  1768. {
  1769. ANTMessageResponse *pclResponseList;
  1770. BOOL bMatch;
  1771. DSIThread_MutexLock(&stMutexResponseRequest);
  1772. pclResponseList = pclResponseListStart;
  1773. while (pclResponseList != NULL)
  1774. {
  1775. bMatch = TRUE;
  1776. if (pclResponseList->bResponseReady == FALSE && pclResponseList->stMessageItem.stANTMessage.ucMessageID == aucRxFifo[MESG_ID_OFFSET])
  1777. {
  1778. for(int i=0; i < pclResponseList->ucBytesToMatch; i++)
  1779. {
  1780. if (pclResponseList->stMessageItem.stANTMessage.aucData[i] != aucRxFifo[MESG_DATA_OFFSET + i])
  1781. {
  1782. bMatch = FALSE; // Data byte did not match
  1783. }
  1784. }
  1785. }
  1786. else
  1787. {
  1788. bMatch = FALSE; // Mesg ID did not match
  1789. }
  1790. if (bMatch)
  1791. {
  1792. int i = pclResponseList->ucBytesToMatch;
  1793. pclResponseList->stMessageItem.ucSize = aucRxFifo[MESG_SIZE_OFFSET];
  1794. memcpy(&(pclResponseList->stMessageItem.stANTMessage.aucData[i]), &(aucRxFifo[MESG_DATA_OFFSET + i]), MESG_MAX_SIZE_VALUE - i); // Copy the rest of the message
  1795. pclResponseList->bResponseReady = TRUE;
  1796. DSIThread_CondSignal(pclResponseList->pstCondResponseReady);
  1797. }
  1798. pclResponseList = pclResponseList->pclNext;
  1799. }
  1800. DSIThread_MutexUnlock(&stMutexResponseRequest);
  1801. }
  1802. ///////////////////////////////////////////////////////////////////////
  1803. BOOL DSIFramerANT::SendCommand(ANT_MESSAGE *pstANTMessage_, USHORT usMessageSize_, ULONG ulResponseTime_)
  1804. {
  1805. ANTMessageResponse *pclCommandResponse = (ANTMessageResponse*)NULL;
  1806. // If we are going to be waiting for a response setup the Response object
  1807. if (ulResponseTime_ != 0)
  1808. {
  1809. UCHAR aucDesiredData[2];
  1810. UCHAR bytesToMatch = 2;
  1811. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = pstANTMessage_->aucData[ANT_DATA_CHANNEL_NUM_OFFSET];
  1812. aucDesiredData[ANT_DATA_EVENT_ID_OFFSET] = pstANTMessage_->ucMessageID;
  1813. //Script dump success can be determined by looking for the script cmd 0x04 dump complete code
  1814. if(pstANTMessage_->ucMessageID == MESG_SCRIPT_CMD_ID && pstANTMessage_->aucData[ANT_DATA_EVENT_ID_OFFSET] == SCRIPT_CMD_DUMP)
  1815. {
  1816. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] = SCRIPT_CMD_END_DUMP;
  1817. bytesToMatch = 1; //The second byte is the number of commands returned, which we can't guess so only match the first byte
  1818. }
  1819. else if(pstANTMessage_->ucMessageID == MESG_SCRIPT_DATA_ID)
  1820. {
  1821. //The first byte of script write is the id of the message being written, not the channel, and it is not overwritten but it is returned with the burst mask, so we need to ensure that is what we are looking for
  1822. aucDesiredData[ANT_DATA_CHANNEL_NUM_OFFSET] &= 0x1F;
  1823. }
  1824. pclCommandResponse = new ANTMessageResponse();
  1825. pclCommandResponse->Attach(MESG_RESPONSE_EVENT_ID, aucDesiredData, bytesToMatch, this);
  1826. }
  1827. // Write the command message.
  1828. if (!WriteMessage(pstANTMessage_, usMessageSize_))
  1829. {
  1830. #if defined(DEBUG_FILE)
  1831. DSIDebug::ThreadWrite("Framer->SendCommand(): WriteMessage Failed.");
  1832. #endif
  1833. if(pclCommandResponse != NULL)
  1834. {
  1835. delete pclCommandResponse;
  1836. pclCommandResponse = (ANTMessageResponse*)NULL;
  1837. }
  1838. return FALSE;
  1839. }
  1840. // Return immediately if we aren't waiting for the response.
  1841. if (ulResponseTime_ == 0)
  1842. return TRUE;
  1843. // Wait for the response.
  1844. pclCommandResponse->WaitForResponse(ulResponseTime_);
  1845. pclCommandResponse->Remove(); //detach from list
  1846. // We haven't received a response in the allotted time.
  1847. //if (pclCommandResponse->stMessageItem.ucSize == 0)
  1848. if (pclCommandResponse->bResponseReady == FALSE)
  1849. {
  1850. delete pclCommandResponse;
  1851. #if defined(DEBUG_FILE)
  1852. DSIDebug::ThreadWrite("Framer->SendCommand(): Timeout.");
  1853. #endif
  1854. return FALSE;
  1855. }
  1856. // Check the response.
  1857. if (pclCommandResponse->stMessageItem.stANTMessage.aucData[ANT_DATA_EVENT_CODE_OFFSET] != RESPONSE_NO_ERROR)
  1858. {
  1859. delete pclCommandResponse;
  1860. #if defined(DEBUG_FILE)
  1861. DSIDebug::ThreadWrite("Framer->SendCommand(): Response != RESPONSE_NO_ERROR.");
  1862. #endif
  1863. return FALSE;
  1864. }
  1865. delete pclCommandResponse;
  1866. return TRUE;
  1867. }
  1868. ///////////////////////////////////////////////////////////////////////
  1869. BOOL DSIFramerANT::SendRequest(UCHAR ucRequestedMesgID_, UCHAR ucANTChannel_ , ANT_MESSAGE_ITEM *pstANTResponse_, ULONG ulResponseTime_)
  1870. {
  1871. ANT_MESSAGE stMessage;
  1872. ANTMessageResponse *pclRequestResponse = (ANTMessageResponse*)NULL;
  1873. // Build the request message
  1874. stMessage.ucMessageID = MESG_REQUEST_ID;
  1875. stMessage.aucData[0] = ucANTChannel_;
  1876. stMessage.aucData[1] = ucRequestedMesgID_;
  1877. // If we are going to be waiting for a response setup the Response object
  1878. if ((ulResponseTime_ != 0) && (pstANTResponse_ != NULL))
  1879. {
  1880. pclRequestResponse = new ANTMessageResponse();
  1881. pclRequestResponse->Attach(ucRequestedMesgID_, (UCHAR*)NULL, 0, this);
  1882. }
  1883. // Write the command message.
  1884. if (!WriteMessage(&stMessage, MESG_REQUEST_SIZE))
  1885. {
  1886. if(pclRequestResponse != NULL)
  1887. {
  1888. delete pclRequestResponse;
  1889. pclRequestResponse = (ANTMessageResponse*)NULL;
  1890. }
  1891. return FALSE;
  1892. }
  1893. // Return immediately if we aren't waiting for the response.
  1894. if ((ulResponseTime_ == 0) || (pstANTResponse_ == NULL))
  1895. return TRUE;
  1896. // Wait for the response.
  1897. pclRequestResponse->WaitForResponse(ulResponseTime_);
  1898. pclRequestResponse->Remove();
  1899. // We haven't received a response in the allotted time.
  1900. if (pclRequestResponse->bResponseReady == FALSE)
  1901. {
  1902. delete pclRequestResponse;
  1903. return FALSE;
  1904. }
  1905. // Copy out the response
  1906. pstANTResponse_->ucSize = pclRequestResponse->stMessageItem.ucSize;
  1907. pstANTResponse_->stANTMessage.ucMessageID = pclRequestResponse->stMessageItem.stANTMessage.ucMessageID;
  1908. memcpy (pstANTResponse_->stANTMessage.aucData, pclRequestResponse->stMessageItem.stANTMessage.aucData, pclRequestResponse->stMessageItem.ucSize);
  1909. delete pclRequestResponse;
  1910. return TRUE;
  1911. }
  1912. ///////////////////////////////////////////////////////////////////////
  1913. BOOL DSIFramerANT::SendUserNvmRequest(UCHAR ucRequestedMesgID_, UCHAR ucANTChannel_ , ANT_MESSAGE_ITEM *pstANTResponse_, USHORT usAddress_, UCHAR ucSize_, ULONG ulResponseTime_)
  1914. {
  1915. ANT_MESSAGE stMessage;
  1916. ANTMessageResponse *pclRequestResponse = (ANTMessageResponse*)NULL;
  1917. // Build the request message
  1918. stMessage.ucMessageID = MESG_REQUEST_ID;
  1919. stMessage.aucData[0] = ucANTChannel_;
  1920. stMessage.aucData[1] = ucRequestedMesgID_;
  1921. stMessage.aucData[2] = (UCHAR)(usAddress_ & 0xFF);
  1922. stMessage.aucData[3] = (UCHAR)((usAddress_ >>8) & 0xFF);
  1923. stMessage.aucData[4] = ucSize_;
  1924. // If we are going to be waiting for a response setup the Response object
  1925. if ((ulResponseTime_ != 0) && (pstANTResponse_ != NULL))
  1926. {
  1927. pclRequestResponse = new ANTMessageResponse();
  1928. pclRequestResponse->Attach(ucRequestedMesgID_, (UCHAR*)NULL, 0, this);
  1929. }
  1930. // Write the command message.
  1931. if (!WriteMessage(&stMessage, MESG_REQUEST_USER_NVM_SIZE))
  1932. {
  1933. if(pclRequestResponse != NULL)
  1934. {
  1935. delete pclRequestResponse;
  1936. pclRequestResponse = (ANTMessageResponse*)NULL;
  1937. }
  1938. return FALSE;
  1939. }
  1940. // Return immediately if we aren't waiting for the response.
  1941. if ((ulResponseTime_ == 0) || (pstANTResponse_ == NULL))
  1942. return TRUE;
  1943. // Wait for the response.
  1944. pclRequestResponse->WaitForResponse(ulResponseTime_);
  1945. pclRequestResponse->Remove();
  1946. // We haven't received a response in the allotted time.
  1947. if (pclRequestResponse->bResponseReady == FALSE)
  1948. {
  1949. delete pclRequestResponse;
  1950. return FALSE;
  1951. }
  1952. // Copy out the response
  1953. pstANTResponse_->ucSize = pclRequestResponse->stMessageItem.ucSize;
  1954. pstANTResponse_->stANTMessage.ucMessageID = pclRequestResponse->stMessageItem.stANTMessage.ucMessageID;
  1955. memcpy (pstANTResponse_->stANTMessage.aucData, pclRequestResponse->stMessageItem.stANTMessage.aucData, pclRequestResponse->stMessageItem.ucSize);
  1956. delete pclRequestResponse;
  1957. return TRUE;
  1958. }
  1959. ///////////////////////////////////////////////////////////////////////
  1960. BOOL DSIFramerANT::SetUSBDescriptorString(UCHAR ucStringNum_, UCHAR *pucDescString_, UCHAR ucStringSize_, ULONG ulResponseTime_)
  1961. {
  1962. ANT_MESSAGE stMessage;
  1963. stMessage.ucMessageID = MESG_SET_USB_INFO_ID;
  1964. stMessage.aucData[0] = ucStringNum_;
  1965. UCHAR ucMesgSize = ucStringSize_ + 2; // Message size depends on string length
  1966. if(ucMesgSize > MESG_MAX_SIZE_VALUE)
  1967. ucMesgSize = MESG_MAX_SIZE_VALUE; // Check size does not exceed buffer space
  1968. // Copy the descriptor string
  1969. memcpy(&stMessage.aucData[1], pucDescString_, ucMesgSize - 2);
  1970. // Check that string is NULL terminated
  1971. if(ucStringNum_ != USB_DESCRIPTOR_VID_PID) // except for string VID/PID
  1972. {
  1973. if(stMessage.aucData[ucMesgSize-2] != 0)
  1974. {
  1975. if(ucMesgSize < MESG_MAX_SIZE_VALUE)
  1976. {
  1977. ucMesgSize++; // append NULL character at the end and adjust message size, or truncate string if too big
  1978. }
  1979. stMessage.aucData[ucMesgSize-2] = 0;
  1980. }
  1981. }
  1982. stMessage.aucData[ucMesgSize - 1] = ucMesgSize - 2;
  1983. return SendCommand(&stMessage, ucMesgSize, ulResponseTime_);
  1984. }
  1985. ///////////////////////////////////////////////////////////////////////
  1986. BOOL DSIFramerANT::GetDeviceUSBInfo(UCHAR ucDeviceNum_, UCHAR* pucProductString_, UCHAR* pucSerialString_, USHORT usBufferSize_)
  1987. {
  1988. return(pclSerial->GetDeviceUSBInfo(ucDeviceNum_, pucProductString_, pucSerialString_, usBufferSize_));
  1989. }
  1990. ///////////////////////////////////////////////////////////////////////
  1991. BOOL DSIFramerANT::GetDeviceUSBPID(USHORT& usPid_)
  1992. {
  1993. return(pclSerial->GetDevicePID(usPid_));
  1994. }
  1995. ///////////////////////////////////////////////////////////////////////
  1996. BOOL DSIFramerANT::GetDeviceUSBVID(USHORT& usVid_)
  1997. {
  1998. return(pclSerial->GetDeviceVID(usVid_));
  1999. }
  2000. ///Allocates a new standard ANT_MESSAGE struct which must be deleted after use.
  2001. BOOL DSIFramerANT::CreateAntMsg_wOptExtBuf(ANT_MESSAGE **ppstExtBufAntMsg_, ULONG ulReqMinDataSize_)
  2002. {
  2003. if(ulReqMinDataSize_ > MESG_MAX_SIZE_VALUE)
  2004. {
  2005. *ppstExtBufAntMsg_ = (ANT_MESSAGE*) NULL;
  2006. return FALSE;
  2007. }
  2008. else
  2009. {
  2010. *ppstExtBufAntMsg_ = (ANT_MESSAGE*)new UCHAR[sizeof(ANT_MESSAGE)];
  2011. return TRUE;
  2012. }
  2013. }
  2014. ///////////////////////////////////////////////////////////////////////
  2015. ///////////////////////////////////////////////////////////////////////
  2016. ///////////////////////////////////////////////////////////////////////
  2017. ANTMessageResponse::ANTMessageResponse()
  2018. {
  2019. pstCondResponseReady = &stCondResponseReady;
  2020. bResponseReady = FALSE;
  2021. pclNext = (ANTMessageResponse*)NULL;
  2022. pclFramer = (DSIFramerANT*)NULL;
  2023. if (DSIThread_CondInit(pstCondResponseReady) != DSI_THREAD_ENONE) //Init the wait object
  2024. return; //need to think of a different way to handle the failure
  2025. }
  2026. ///////////////////////////////////////////////////////////////////////
  2027. ANTMessageResponse::~ANTMessageResponse()
  2028. {
  2029. Remove();
  2030. DSIThread_CondDestroy(&stCondResponseReady);
  2031. }
  2032. ///////////////////////////////////////////////////////////////////////
  2033. BOOL ANTMessageResponse::Attach(UCHAR ucMessageID_, UCHAR *pucData_, UCHAR ucBytesToMatch_, DSIFramerANT * pclFramer_, DSI_CONDITION_VAR *pstCondResponseReady_)
  2034. {
  2035. ANTMessageResponse *pclResponse;
  2036. bResponseReady = FALSE; //Init ResponseReady
  2037. stMessageItem.stANTMessage.ucMessageID = ucMessageID_; //Set mesg ID to look for
  2038. ucBytesToMatch = ucBytesToMatch_; //Set number of data bytes to match
  2039. memcpy( &(stMessageItem.stANTMessage.aucData[0]), pucData_, ucBytesToMatch_); //Set data bytes to match
  2040. if (pstCondResponseReady_ != NULL)
  2041. pstCondResponseReady = pstCondResponseReady_;
  2042. else
  2043. pstCondResponseReady = &stCondResponseReady;
  2044. pclFramer = pclFramer_;
  2045. if (pclFramer == NULL)
  2046. return FALSE;
  2047. DSIThread_MutexLock(&(pclFramer->stMutexResponseRequest)); // Lock the mutex and begin list manipulation
  2048. pclResponse = pclFramer->pclResponseListStart;
  2049. if (pclFramer->pclResponseListStart == NULL) // Check if the list is empty
  2050. {
  2051. pclFramer->pclResponseListStart = this; // Add this reponse object to the list
  2052. }
  2053. else
  2054. {
  2055. pclResponse = pclFramer->pclResponseListStart; // If the list is not empty, walk through the list
  2056. while (pclResponse->pclNext != NULL)
  2057. {
  2058. pclResponse = pclResponse->pclNext;
  2059. }
  2060. pclResponse->pclNext = this; // Add ourself to the end of the list
  2061. }
  2062. DSIThread_MutexUnlock(&(pclFramer->stMutexResponseRequest)); // Unlock mutex when we're done
  2063. return TRUE;
  2064. }
  2065. ///////////////////////////////////////////////////////////////////////
  2066. void ANTMessageResponse::Remove()
  2067. {
  2068. ANTMessageResponse **ppclResponse;
  2069. if (pclFramer == NULL)
  2070. return;
  2071. DSIThread_MutexLock(&(pclFramer->stMutexResponseRequest)); // Lock the mutex and begin list manipulation
  2072. ppclResponse = &(pclFramer->pclResponseListStart); // Set the ppointer to point to pclResponseListStart
  2073. while (*ppclResponse != NULL) // While the pclNext is not NULL
  2074. {
  2075. if (*ppclResponse == this) // Check if pclNext is pointing to us
  2076. {
  2077. *ppclResponse = pclNext; // Remove this object from the List by changing the pointer to point to the element behind us
  2078. if (pclNext == NULL) // If we are at the end of the list, then break because we are done.
  2079. break;
  2080. }
  2081. else
  2082. {
  2083. ppclResponse = &((*ppclResponse)->pclNext); // Advance the ppointer to point to the pclNext element of the next object in the list
  2084. }
  2085. }
  2086. DSIThread_MutexUnlock(&(pclFramer->stMutexResponseRequest)); // Unlock mutex when we're done
  2087. }
  2088. ///////////////////////////////////////////////////////////////////////
  2089. BOOL ANTMessageResponse::WaitForResponse(ULONG ulMilliseconds_)
  2090. {
  2091. DSIThread_MutexLock(&(pclFramer->stMutexResponseRequest));
  2092. if ((bResponseReady == FALSE) && (ulMilliseconds_ != 0))
  2093. {
  2094. DSIThread_CondTimedWait(pstCondResponseReady, &(pclFramer->stMutexResponseRequest), ulMilliseconds_);
  2095. }
  2096. DSIThread_MutexUnlock(&(pclFramer->stMutexResponseRequest));
  2097. return bResponseReady;
  2098. }