OxfordControllerWrapper.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #pragma once
  2. #include "../OTSControl/Oxford/OxfordImplConst.h"
  3. using namespace System::Collections::Generic;
  4. using namespace System::Threading;
  5. using namespace OINA::Extender;
  6. using namespace OINA::Extender::Data;
  7. using namespace OINA::Extender::Data::Ed;
  8. using namespace OINA::Extender::Data::Image;
  9. using namespace OINA::Extender::MicroscopeControl;
  10. using namespace OINA::Extender::Acquisition;
  11. using namespace OINA::Extender::Acquisition::Ed;
  12. using namespace OINA::Extender::Acquisition::Image;
  13. using namespace OINA::Extender::Acquisition::Quant;
  14. using namespace OINA::Extender::Controls;
  15. using namespace OINA::Extender::Controls::Common;
  16. using namespace OINA::Extender::Controls::Image;
  17. using namespace OINA::Extender::Controls::Spectrum;
  18. using namespace OINA::Extender::Processing;
  19. using namespace OINA::Extender::Processing::Ed;
  20. using namespace OINA::Extender::Processing::Quant;
  21. using namespace OTSController;
  22. ref class OxfordControllerWrapper
  23. {
  24. enum class OxfordControllerCommand
  25. {
  26. WAITING = 0,
  27. GET_WORKINGDISTANCE = 1,
  28. SET_WORKINGDISTANCE = 2,
  29. GET_POSITIONXY = 3,
  30. SET_POSITIONXY = 4,
  31. GET_MAGNIFICATION = 5,
  32. SET_MAGNIFICATION = 6,
  33. GET_HIGHVOTAGE = 7,
  34. SET_HIGHVOTAGE = 8,
  35. GET_BEAMON = 9,
  36. SET_BEAMON = 10,
  37. GET_BEAMBLANK = 11,
  38. SET_BEAMBLANK = 12,
  39. GET_EXTERNAL = 13,
  40. SET_EXTERNAL = 14,
  41. COLLECT_IMAGE = 15,
  42. COLLECT_XRAYPOINT = 16,
  43. COLLECT_CURRENTXRAYPOINT = 17,
  44. COLLECT_XRAYPOINTS = 18,
  45. COLLECT_QUANTIFYSPECTRUM = 19,
  46. COLLECT_XRAYCHOILDLIST = 20,
  47. STOP_ACQUISITION=21,
  48. END_MULTIPLEACQUISITION = 22,
  49. EXIT = 100,
  50. };
  51. enum class OxfordControllerState
  52. {
  53. READY = 0,
  54. WORKING = 1,
  55. SUCCEEDED = 2,
  56. FAILED = 3,
  57. ABORT = 4
  58. };
  59. ref struct Element
  60. {
  61. int m_nAotomaticNo;
  62. double m_dWeight;
  63. };
  64. //interface input/output
  65. ref struct OxfordControllerData
  66. {
  67. OxfordControllerData()
  68. : m_nState(OxfordControllerState::READY)
  69. , m_nCommand(OxfordControllerCommand::WAITING)
  70. , m_pImageBits(nullptr)
  71. , m_pXrayDataList(nullptr)
  72. , m_pSpectrumData(nullptr)
  73. {
  74. m_nCollectedPixelCounts = 0;
  75. m_nCollectedChordsCount = 0;
  76. }
  77. OxfordControllerState m_nState;
  78. OxfordControllerCommand m_nCommand;
  79. double m_dPositionX;
  80. double m_dPositionY;
  81. double m_dWorkingDistance;
  82. double m_dMagnification;
  83. double m_dHighVotage;
  84. bool m_bBeamOn;
  85. bool m_bBeamBlank;
  86. bool m_bExternal;
  87. long m_nImageWidth;
  88. long m_nImageHeight;
  89. double m_dPixelSize;
  90. BYTE* m_pImageBits;
  91. double m_dBeamPositionX;
  92. double m_dBeamPositionY;
  93. long* m_pSpectrumData;
  94. OxfordXrayData* m_pXrayDataList; //multi points
  95. long m_nAcTime; // xray collect time
  96. DWORD m_nBufferSize;
  97. // feature计数控制
  98. long m_nXrayDataCount;
  99. long m_nCollectedXrayCounts;
  100. // 当前feature的chords数控制
  101. long m_nChordsNum;
  102. long m_nCollectedChordsCount;
  103. // 当前feature的pixel数控制
  104. long m_nCollectedPixelCounts;
  105. long m_nPixelNum;
  106. List<Element^ >^ m_listElementResult;
  107. System::String^ m_sElementResult; //one point
  108. };
  109. public:
  110. OxfordControllerWrapper(void);
  111. ~OxfordControllerWrapper();
  112. !OxfordControllerWrapper();
  113. void CloseClient();
  114. bool Init();
  115. bool IsConnected();
  116. bool GetPositionXY(double& a_dPosX, double& a_dPosY);
  117. bool SetPositionXY(const double a_dPosX, const double a_dPosY);
  118. bool GetWorkingDistance(double& a_dWorkingDistance);
  119. bool SetWorkingDistance(double a_dWorkingDistance);
  120. bool GetMagnification(double& a_dMagnification);
  121. bool SetMagnification(double a_dMagnification);
  122. bool GetHighVoltage(double& a_dHighVoltage);
  123. bool SetHighVoltage(double a_dHighVoltage);
  124. bool GetBeamOn(bool& a_bBeamOn);
  125. bool SetBeamOn(bool a_bBeamOn);
  126. bool GetBeamBlank(bool& a_bBeamBlank);
  127. bool SetBeamBlank(bool a_bBeamBlank);
  128. bool GetExternalScan(bool& a_bExternal);
  129. bool SetExternalScan(bool a_bExternal);
  130. bool SetBeamPosition(const double a_dPosX, const double a_dPosY);
  131. bool CollectXrayPoint(const double a_dPosX, const double a_dPosY, const long a_nAcTime, long* a_pSpectrumData, DWORD a_nBufferSize);
  132. bool CollectXrayPoint(const long a_nAcTime, long* a_pSpectrumData, DWORD a_nBufferSize);
  133. bool CollectXrayPoints(const long a_nAcTime, OxfordXrayData* a_pXrayDataList, const long a_nXrayDataCount, DWORD a_nBufferSize);
  134. bool CollectXrayFeatures(const long a_nAcTimeMilliseconds, OxfordXrayData* a_pXrayDataList, const long a_nXrayDataCount, DWORD a_nBufferSize);
  135. bool SetScanSpeed(const long a_nMilliseconds);
  136. bool GetImageSize(long& a_nWidth, long& a_nHeight);
  137. bool SetImageSize(const long a_nWidth, const long a_nHeight);
  138. bool CollectImage(BYTE* a_pImageBits);
  139. bool CollectImage(int a);
  140. bool QuantifySpectrum(unsigned char* cResult);
  141. bool IsStageUpdate()
  142. {
  143. return m_bIsStageUpdated;
  144. }
  145. bool StopXrayCollecting();
  146. protected:
  147. bool GetPositionXYFromController(double& a_dPosX, double& a_dPosY);
  148. bool SetPositionXYToController(const double a_dPosX, const double a_dPosY);
  149. bool GetWorkingDistanceFromController(double& a_dWorkingDistance);
  150. bool SetWorkingDistanceToController(double a_dWorkingDistance);
  151. bool GetMagnificationFromController(double& a_dMagnification);
  152. bool SetMagnificationToController(double a_dMagnification);
  153. bool GetHighVoltageFromController(double& a_dHighVoltage);
  154. bool SetHighVoltageToController(double a_dHighVoltage);
  155. bool GetBeamOnFromController(bool& a_bBeamOn);
  156. bool SetBeamOnToController(bool a_bBeamOn);
  157. bool GetBeamBlankFromController(bool& a_bBeamBlank);
  158. bool SetBeamBlankToController(bool a_bBeamBlank);
  159. bool GetExternalScanFromController(bool& a_bExternal);
  160. bool SetExternalScanToController(bool a_bExternal);
  161. bool SetCurrentBeamPosition();
  162. bool IsXrayCollecting();
  163. bool IsImageCollecting();
  164. bool IsQuantifySpectrumCollecting();
  165. IStageConditions^ GetStageConditions();
  166. void OnMicroscopeColumnUpdated(Object^ sender, OINA::Extender::MicroscopeControl::ColumnEventArgs^ e)
  167. {
  168. m_bIsColumnUpdated = true;
  169. }
  170. void OnMicroscopeStageUpdated(Object^ sender, OINA::Extender::MicroscopeControl::StageEventArgs^ e)
  171. {
  172. m_bIsStageUpdated = true;
  173. //LogTrace(__FILE__, __LINE__, _T("StageUpdated!"));
  174. }
  175. void OnMicroscopeCompleted(Object^ sender, OINA::Extender::MicroscopeControl::CompletedEventArgs^ e)
  176. {
  177. if ((int)e->Control == (int)MicroscopeControl::MicroscopeControlType::Stage)
  178. {
  179. if (e->Success)
  180. {
  181. LogTrace(__FILE__, __LINE__, _T("StageUpdated!"));
  182. m_bIsStageUpdated = true;
  183. }
  184. }
  185. }
  186. bool m_bIsStageUpdated;
  187. bool m_bIsColumnUpdated;
  188. bool IsMicroscopeColumnConnected();
  189. bool IsMicroscopeStageConnected();
  190. bool StartXrayCollecting(const long a_nAcTime);
  191. void OnXrayAcquisitionFinished(Object^ sender, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<OINA::Extender::Data::Ed::IEdSpectrum^>^ e);
  192. void OnXrayChordlistFinished(Object^ sender, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<OINA::Extender::Data::Ed::IEdMap^>^ e);
  193. bool ConvertSpectrumData(IEdSpectrum^ a_spectrum, long* a_pSpectrumData, int a_nBufferSize);
  194. bool StartImageCollecting();
  195. bool StopImageCollecting();
  196. void OnImageAcquisitionFinished(Object^ /*sender*/, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<array<OINA::Extender::Data::Image::IElectronImage^ >^ >^ e);
  197. void OnController_PixelProcessed(Object^ /*sender*/, OINA::Extender::EventArgs<OINA::Extender::Processing::Quant::IPixelSEMQuantStatus^ >^ e);
  198. void OnController_ExperimentFinished(Object^ /*sender*/, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs^ e);
  199. bool ReadImageData(IElectronImage^ a_electronImage, BYTE* a_pImageBits);
  200. void XraySpectrumProcess(OINA::Extender::Data::Ed::IEdSpectrum^ spectrum);
  201. void LogMessage(CString a_sMessage);
  202. IMicroscopeController^ CreateMicroscopeController();
  203. IEdSpectrumAcquisitionController^ CreateEdsSpectrumController();
  204. IEdSpectrumSettings^ GetEdsSpectrumSettings();
  205. IImageAcquisitionController^ CreateImageAcqusitionController();
  206. IImageAcquisitionSettings^ GetImageAcqusitionSettings();
  207. // IQuantCalibrationController^ CreateQuantCalibrationController();
  208. // IQuantCalibrationSettings^ GetQuantCalibrationSettings();
  209. IEdChordListAcquisitionController^ CreateChordlistController();
  210. IEdChordListSettings^ GetChordlistSettings();
  211. IMicroscopeController^ _microscopeController;
  212. IEdSpectrumAcquisitionController^ _edSpectrumController;
  213. IEdSpectrumSettings^ _edsSpectrumSettings;
  214. IEdChordListSettings^ _edsChordListSetting;
  215. IEdChordListAcquisitionController^ _edsChordListController;
  216. IEdChordListScanCapabilities^ _edsChordListScanCapablities;
  217. IImageAcquisitionController^ _imageAcqusitionController;
  218. IImageAcquisitionSettings^ _imageAcqusitionSettings;
  219. IQuantCalibrationController^ _SEMQuantController;
  220. IQuantCalibrationSettings^ _SEMQuantSettings;
  221. ISEMQuantCapabilities^ _SEMQuantCapabilities;
  222. static Object^ GetSpectrumLockObject()
  223. {
  224. if (spectrumSyncLock == nullptr)
  225. {
  226. spectrumSyncLock = gcnew Object();
  227. }
  228. return spectrumSyncLock;
  229. }
  230. static Object^ spectrumSyncLock;
  231. void ControllerThreadFunction();
  232. Thread^ _controllerThread;
  233. AutoResetEvent^ m_startControllerEvent;
  234. AutoResetEvent^ m_endControllerEvent;
  235. OxfordControllerData _oxfordControllerData;
  236. bool m_bBeamPositionSet;
  237. };
  238. ref class ManagedGlobals
  239. {
  240. public:
  241. static OxfordControllerWrapper^ oxfordController = nullptr;
  242. };