usb_device_list_template.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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
  4. in compliance with this license.
  5. Copyright (c) Dynastream Innovations Inc. 2016
  6. All rights reserved.
  7. */
  8. #include "types.h"
  9. #include <vector>
  10. #include <functional>
  11. //#include "usb_device_handle_si.hpp"
  12. //#include "usb_device_handle_libusb.hpp"
  13. //#include <list>
  14. //using namespace std;
  15. /*
  16. struct SI
  17. {
  18. static const USHORT ANT_VID = 0x0FCF;
  19. static const USHORT ANT_PID = 0x1004;
  20. //defines used by AutoInit
  21. static const UCHAR ANT_PRODUCT_DESCRIPTION[255];
  22. static const USHORT DEFAULT_BAUD_RATE = 50000;
  23. };
  24. const UCHAR SI::ANT_PRODUCT_DESCRIPTION[255] = "Dynastream USB Interface Board"; //"ANT USB Stick"
  25. auto_ptr<const ANTDeviceList> ANTDeviceList::GetDeviceList(ULONG ulDeviceTypeField_)
  26. {
  27. return auto_ptr<const ANTDeviceList>(new ANTDeviceList(ulDeviceTypeField_));
  28. }
  29. /*
  30. void USBDeviceList::FreeDeviceList(const USBDeviceList*& pclDeviceList_)
  31. {
  32. delete pclDeviceList_;
  33. pclDeviceList_ = NULL;
  34. return;
  35. }
  36. *//*
  37. ANTDeviceList::ANTDeviceList(ULONG ulDeviceTypeField_)
  38. : USBDeviceList()
  39. {
  40. if( (ulDeviceTypeField_ & DeviceType::SI_LABS) != 0)
  41. {
  42. const list<const USBDeviceSI*> clDeviceSIList = USBDeviceHandleSI::GetDeviceList(); //!!There is a list copy here!
  43. //clDeviceList.insert(clDeviceList.end(), clDeviceSIList.begin(), clDeviceSIList.end()); //!!do we have to make an iterator?
  44. Add(clDeviceSIList.begin(), clDeviceSIList.end());
  45. }
  46. if( (ulDeviceTypeField_ & DeviceType::LIBUSB) != 0)
  47. {
  48. const list<const USBDeviceLibusb*> clDeviceLibusbList = USBDeviceHandleLibusb::GetDeviceList();
  49. //clDeviceList.insert(clDeviceList.end(), clDeviceLibusbList.begin(), clDeviceLibusbList.end()); //!!do we have to make an iterator?
  50. Add(clDeviceLibusbList.begin(), clDeviceLibusbList.end());
  51. }
  52. //ulSize = clDeviceList.size();
  53. return;
  54. }
  55. ANTDeviceList::~ANTDeviceList()
  56. {
  57. /*
  58. list<const USBDevice*>::iterator i;
  59. for(i = clDeviceList.begin(); i != clDeviceList.end(); i++)
  60. {
  61. const USBDevice*& pclDevice = *i;
  62. if(pclDevice != NULL)
  63. {
  64. delete pclDevice; //!!Make sure the device specific lists do not delete what they give to us
  65. pclDevice = NULL;
  66. }
  67. }
  68. clDeviceList.clear();
  69. ulSize = 0;
  70. *//*
  71. return;
  72. }
  73. */
  74. #define USBTemplateDeviceList USBDeviceList<USBDeviceType>
  75. /*
  76. template <typename USBDeviceType>
  77. template<typename Container_>
  78. USBTemplateDeviceList::USBDeviceList(const Container_& tContainer_)
  79. {
  80. Add(tContainer_.begin(), tContainer_.end());
  81. return;
  82. }
  83. */
  84. template <typename USBDeviceType>
  85. USBTemplateDeviceList::~USBDeviceList()
  86. {
  87. Clear();
  88. return;
  89. }
  90. template <typename USBDeviceType>
  91. template <typename InputIterator>
  92. USBTemplateDeviceList::USBDeviceList(InputIterator tFirst_, InputIterator tLast_)
  93. {
  94. Add(tFirst_, tLast_);
  95. return;
  96. }
  97. template <typename USBDeviceType>
  98. USBTemplateDeviceList::USBDeviceList(const USBTemplateDeviceList& clDeviceList_)
  99. {
  100. Add(clDeviceList_);
  101. return;
  102. }
  103. template <typename USBDeviceType>
  104. template<typename USBDeviceType_>
  105. USBTemplateDeviceList::USBDeviceList(const USBDeviceList<USBDeviceType_>& clDeviceList_)
  106. {
  107. Add(clDeviceList_);
  108. return;
  109. }
  110. template <typename USBDeviceType>
  111. USBTemplateDeviceList& USBTemplateDeviceList::operator=(const USBTemplateDeviceList& clDeviceList_)
  112. {
  113. if(this == &clDeviceList_)
  114. return *this;
  115. Clear();
  116. Add(clDeviceList_);
  117. return *this;
  118. }
  119. template <typename USBDeviceType>
  120. template<typename USBDeviceType_>
  121. USBTemplateDeviceList& USBTemplateDeviceList::operator=(const USBDeviceList<USBDeviceType_>& clDeviceList_)
  122. {
  123. if(this == &clDeviceList_)
  124. return *this;
  125. Clear();
  126. Add(clDeviceList_);
  127. return *this;
  128. }
  129. template <typename USBDeviceType>
  130. template <typename InputIterator>
  131. void USBTemplateDeviceList::Add(InputIterator tFirst_, InputIterator tLast_)
  132. {
  133. for(InputIterator i=tFirst_; i != tLast_; i++)
  134. Add(*i);
  135. //insert(clDeviceList.end(), tFirst_, tLast_);
  136. return;
  137. }
  138. template <typename USBDeviceType>
  139. template <typename USBDeviceType_>
  140. void USBTemplateDeviceList::Add(const USBDeviceList<USBDeviceType_>& clDeviceList_)
  141. {
  142. ULONG ulSize = clDeviceList_.GetSize();
  143. for(ULONG i=0; i<ulSize; i++)
  144. Add(clDeviceList_[i]); //!!keep track of iterator ourselves?
  145. //insert(clDeviceList.end(), clDeviceList_.clDeviceList.begin(), clDeviceList_.clDeviceList.end()); //!!do we have to make an iterator?
  146. return;
  147. }
  148. template <typename USBDeviceType>
  149. void USBTemplateDeviceList::Add(const USBDeviceType& tDevice_) //!!Return the address of the element? Then we don't need GetAddress().
  150. {
  151. //Container::const_iterator clIterator;
  152. //advance(clIterator, ulSize);
  153. clDeviceList.insert(clDeviceList.end(), new USBDeviceType(tDevice_));
  154. //clDeviceList.push_back(tDevice_); //!! container universal?
  155. return;
  156. }
  157. template <typename USBDeviceType>
  158. void USBTemplateDeviceList::Clear()
  159. {
  160. size_t uiSize = clDeviceList.size();
  161. for(size_t i=0; i<uiSize; i++)
  162. delete clDeviceList[i];
  163. clDeviceList.clear();
  164. return;
  165. }
  166. template <typename USBDeviceType>
  167. USBTemplateDeviceList USBTemplateDeviceList::GetSubList(typename USBDeviceList::CompareFunc pfCompareFunc_) const //!!Copy!
  168. {
  169. USBTemplateDeviceList clSubList;
  170. if(pfCompareFunc_ == NULL)
  171. return clSubList;
  172. typename Container::const_iterator clIterator;
  173. for(clIterator = clDeviceList.begin(); clIterator != clDeviceList.end(); clIterator++)
  174. {
  175. USBDeviceType const& tDevice = **clIterator;
  176. if(pfCompareFunc_(tDevice) == TRUE)
  177. clSubList.Add(tDevice);
  178. }
  179. return clSubList;
  180. }
  181. template <typename USBDeviceType>
  182. const USBDeviceType& USBTemplateDeviceList::operator[](ULONG ulNum_) const
  183. {
  184. if(ulNum_ >= clDeviceList.size())
  185. throw 0; //!!
  186. typename Container::const_iterator clIterator;
  187. clIterator = clDeviceList.begin();
  188. std::advance(clIterator, ulNum_);
  189. return **clIterator;
  190. }
  191. template <typename USBDeviceType>
  192. const USBDeviceType* USBTemplateDeviceList::GetAddress(ULONG ulNum_) const
  193. {
  194. if(ulNum_ >= clDeviceList.size())
  195. throw 0; //!!
  196. typename Container::const_iterator clIterator;
  197. clIterator = clDeviceList.begin();
  198. std::advance(clIterator, ulNum_);
  199. return *clIterator;
  200. }