OTSScanOxford.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #include "stdafx.h"
  2. #include "OTSScanOxford.h"
  3. #define TRACE_HERE /*NOP*/
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #endif
  7. namespace OTSController
  8. {
  9. COTSScanOxford::COTSScanOxford(void)
  10. {
  11. LogTrace(__FILE__, __LINE__, _T("%s controller created"), (LPCTSTR)GetName());
  12. }
  13. COTSScanOxford::~COTSScanOxford(void)
  14. {
  15. LogTrace(__FILE__, __LINE__, _T("%s controller finished"), (LPCTSTR)GetName());
  16. }
  17. // initialisation
  18. BOOL COTSScanOxford::Init()
  19. {
  20. // get bruker initialize controller
  21. if (!m_oxfordImpl)
  22. {
  23. // get bruker controller
  24. m_oxfordImpl = OxfordImpl::GetInstance();
  25. }
  26. BOOL ifconnect = true;
  27. if (!m_oxfordImpl->IsConnected())
  28. {
  29. ifconnect = m_oxfordImpl->Connect();
  30. }
  31. return ifconnect;
  32. }
  33. CSize COTSScanOxford::GetMatrixSize(int /*a_nMatrixIndex*/)
  34. {
  35. // method return value
  36. CSize oRet = CSize(0);
  37. ASSERT(m_oxfordImpl);
  38. if (!m_oxfordImpl)
  39. {
  40. return oRet;
  41. }
  42. long nWidth = 0, nHeight = 0;
  43. if (m_oxfordImpl->GetImageSize(nWidth, nHeight))
  44. {
  45. oRet.SetSize(nWidth, nHeight);
  46. }
  47. return oRet;
  48. }
  49. BOOL COTSScanOxford::MoveBeamTo(CPoint& a_beamPos)
  50. {
  51. ASSERT(m_oxfordImpl);
  52. if (!m_oxfordImpl)
  53. {
  54. return false;
  55. }
  56. bool bRet = m_oxfordImpl->SetBeamPosition(a_beamPos.x, a_beamPos.y);
  57. return bRet;
  58. }
  59. // Start Scan Table
  60. BOOL COTSScanOxford::StartScanTable (int a_nMatrixIndex, unsigned int nP, int* px, int* py)
  61. {
  62. CSize szMatrix = GetMatrixSize(a_nMatrixIndex);
  63. double stepSize = ((double)m_szScanRange.cx) /((double) szMatrix.cx);
  64. for (unsigned int i = 0 ; i < nP ; i++)
  65. {
  66. px[i] = (int) (px[i] * stepSize) ;
  67. py[i] = m_szScanRange.cy - (int) (py[i] * stepSize) ;
  68. }
  69. return true;
  70. }
  71. /// set image size
  72. /// input long nImageSize
  73. /// return true if success
  74. BOOL COTSScanOxford::SetImageSize(long newImageSize,long nHeight)
  75. {
  76. // safety check
  77. ASSERT(m_oxfordImpl);
  78. if (!m_oxfordImpl)
  79. {
  80. return false;
  81. }
  82. if (!m_oxfordImpl->SetImageSize(newImageSize, nHeight))
  83. {
  84. ASSERT(m_oxfordImpl);
  85. if (!m_oxfordImpl)
  86. {
  87. return FALSE;
  88. }
  89. }
  90. return true;
  91. }
  92. /// set dwell time
  93. /// input long a_nDwellTime
  94. /// return true if success
  95. BOOL COTSScanOxford::SetDwellTime(long nDwellTime)
  96. {
  97. // safety check
  98. ASSERT(m_oxfordImpl);
  99. if (!m_oxfordImpl)
  100. {
  101. return false;
  102. }
  103. if (!m_oxfordImpl->SetScanSpeed(nDwellTime))
  104. {
  105. ASSERT(m_oxfordImpl);
  106. if (!m_oxfordImpl)
  107. {
  108. return FALSE;
  109. }
  110. }
  111. return true;
  112. }
  113. CBSEImgPtr COTSScanOxford::AcquireBSEImage(int /*a_nMatrixIndex*/, int /*nReads*/, int /*nDwell*/)
  114. {
  115. // safety check
  116. ASSERT(m_oxfordImpl);
  117. if (!m_oxfordImpl)
  118. {
  119. return nullptr;
  120. }
  121. long nWidth, nHeight;
  122. if (!m_oxfordImpl->GetImageSize(nWidth, nHeight))
  123. {
  124. LogErrorTrace(__FILE__, __LINE__, _T("Call GetImageSize failed."));
  125. return nullptr;
  126. }
  127. long nImageSize = nWidth * nHeight;
  128. if (nImageSize <= 0)
  129. {
  130. LogErrorTrace(__FILE__, __LINE__, _T("AcquireBSEImage failed: invalid image size (%d, %d)."), nWidth, nHeight);
  131. return nullptr;
  132. }
  133. std::vector<BYTE> vecImage(nImageSize, 0);
  134. if (!m_oxfordImpl->CollectImage(&vecImage[0]))
  135. {
  136. LogErrorTrace(__FILE__, __LINE__, _T("Call CollectImage failed."));
  137. return nullptr;
  138. }
  139. CRect imageRect(0, 0, nWidth, nHeight);
  140. CBSEImgPtr bseImage(new CBSEImg(imageRect));
  141. //bseImage->SetImageRect(imageRect);
  142. bseImage->InitImageData(nWidth, nHeight);
  143. BYTE* pImageData = bseImage->GetImageDataPointer();
  144. memcpy(pImageData, &vecImage[0], nWidth * nHeight);
  145. ASSERT(m_oxfordImpl);
  146. if (!m_oxfordImpl)
  147. {
  148. return bseImage;
  149. }
  150. return bseImage;
  151. }
  152. long COTSScanOxford::GetDwellTimeByIndex(const long a_nIndex)
  153. {
  154. // dwell time
  155. if(a_nIndex < DWELLTIME_OXFORD_ID_MIN || a_nIndex > DWELLTIME_OXFORD_ID_MAX)
  156. {
  157. // error, invalid scan speed value
  158. LogErrorTrace(__FILE__, __LINE__, _T("Scan speed (Dwell time) index (%d) error."), a_nIndex);
  159. ASSERT(FALSE);
  160. return -1;
  161. }
  162. // convert dwell time index to dwell time value
  163. return DWELLTIME_OXFORD_VALUES[a_nIndex];
  164. }
  165. BOOL COTSScanOxford::SetDwellTimeByIndex(const long a_nDwellTimeIndex)
  166. {
  167. // dwell time
  168. if(a_nDwellTimeIndex < DWELLTIME_OXFORD_ID_MIN || a_nDwellTimeIndex > DWELLTIME_OXFORD_ID_MAX)
  169. {
  170. // error, invalid scan speed value
  171. LogErrorTrace(__FILE__, __LINE__, _T("Scan speed index (%d) error."), a_nDwellTimeIndex);
  172. ASSERT(m_oxfordImpl);
  173. if (!m_oxfordImpl)
  174. {
  175. return FALSE;
  176. }
  177. }
  178. // convert dwell time index to dwell time value
  179. long nDwellTimeLong = DWELLTIME_OXFORD_VALUES[a_nDwellTimeIndex];
  180. if (!SetDwellTime(nDwellTimeLong))
  181. {
  182. // error, failed to set dwell time
  183. LogErrorTrace(__FILE__, __LINE__, _T("Failed to set dwell time (%d)."), a_nDwellTimeIndex);
  184. ASSERT(m_oxfordImpl);
  185. if (!m_oxfordImpl)
  186. {
  187. return FALSE;
  188. }
  189. }
  190. return true;
  191. }
  192. BOOL COTSScanOxford::SetScanFieldSize(const int a_nWidth, const int a_nHeight)
  193. {
  194. m_nScanFieldSizeX = a_nWidth;
  195. m_nScanFieldSizeY = a_nHeight;
  196. return TRUE;
  197. }
  198. // set the SEM position
  199. BOOL COTSScanOxford::SetEMPosition(const int a_nPosX, const int a_nPosY)
  200. {
  201. m_nCurrentBSEPositionX = a_nPosX;
  202. m_nCurrentBSEPositionY = a_nPosY;
  203. return TRUE;
  204. }
  205. }