OxfordControllerWrapper.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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_dataLock = gcnew Object();
  75. m_nCollectedPixelCounts = 0;
  76. m_nCollectedChordsCount = 0;
  77. }
  78. OxfordControllerState m_nState;
  79. OxfordControllerCommand m_nCommand;
  80. double m_dPositionX;
  81. double m_dPositionY;
  82. double m_dWorkingDistance;
  83. double m_dMagnification;
  84. double m_dHighVotage;
  85. bool m_bBeamOn;
  86. bool m_bBeamBlank;
  87. bool m_bExternal;
  88. long m_nImageWidth;
  89. long m_nImageHeight;
  90. double m_dPixelSize;
  91. BYTE* m_pImageBits;
  92. double m_dBeamPositionX;
  93. double m_dBeamPositionY;
  94. long* m_pSpectrumData;
  95. OxfordXrayData* m_pXrayDataList; //multi points
  96. long m_nAcTime; // xray collect time
  97. DWORD m_nBufferSize;
  98. // feature计数控制
  99. long m_nXrayDataCount;
  100. long m_nCollectedXrayCounts;
  101. // 当前feature的chords数控制
  102. long m_nChordsNum;
  103. long m_nCollectedChordsCount;
  104. // 当前feature的pixel数控制
  105. long m_nCollectedPixelCounts;
  106. long m_nPixelNum;
  107. List<Element^ >^ m_listElementResult;
  108. System::String^ m_sElementResult; //one point
  109. // should lock data every time read / write
  110. //Object^ m_dataLock;
  111. };
  112. public:
  113. OxfordControllerWrapper(void);
  114. ~OxfordControllerWrapper();
  115. !OxfordControllerWrapper();
  116. void CloseClient();
  117. bool Init();
  118. bool IsConnected();
  119. bool GetPositionXY(double& a_dPosX, double& a_dPosY);
  120. bool SetPositionXY(const double a_dPosX, const double a_dPosY);
  121. bool GetWorkingDistance(double& a_dWorkingDistance);
  122. bool SetWorkingDistance(double a_dWorkingDistance);
  123. bool GetMagnification(double& a_dMagnification);
  124. bool SetMagnification(double a_dMagnification);
  125. bool GetHighVoltage(double& a_dHighVoltage);
  126. bool SetHighVoltage(double a_dHighVoltage);
  127. bool GetBeamOn(bool& a_bBeamOn);
  128. bool SetBeamOn(bool a_bBeamOn);
  129. bool GetBeamBlank(bool& a_bBeamBlank);
  130. bool SetBeamBlank(bool a_bBeamBlank);
  131. bool GetExternalScan(bool& a_bExternal);
  132. bool SetExternalScan(bool a_bExternal);
  133. bool SetBeamPosition(const double a_dPosX, const double a_dPosY);
  134. bool CollectXrayPoint(const double a_dPosX, const double a_dPosY, const long a_nAcTime, long* a_pSpectrumData, DWORD a_nBufferSize);
  135. bool CollectXrayPoint(const long a_nAcTime, long* a_pSpectrumData, DWORD a_nBufferSize);
  136. bool CollectXrayPoints(const long a_nAcTime, OxfordXrayData* a_pXrayDataList, const long a_nXrayDataCount, DWORD a_nBufferSize);
  137. bool CollectXrayArea(const long a_nAcTimeMilliseconds, OxfordXrayData* a_pXrayDataList, const long a_nXrayDataCount, DWORD a_nBufferSize);
  138. bool SetScanSpeed(const long a_nMilliseconds);
  139. bool GetImageSize(long& a_nWidth, long& a_nHeight);
  140. bool SetImageSize(const long a_nWidth, const long a_nHeight);
  141. bool CollectImage(BYTE* a_pImageBits);
  142. bool CollectImage(int a);
  143. bool QuantifySpectrum(unsigned char* cResult);
  144. bool IsStageUpdate()
  145. {
  146. return m_bIsStageUpdated;
  147. }
  148. bool StopXrayCollecting();
  149. protected:
  150. bool GetPositionXYFromController(double& a_dPosX, double& a_dPosY);
  151. bool SetPositionXYToController(const double a_dPosX, const double a_dPosY);
  152. bool GetWorkingDistanceFromController(double& a_dWorkingDistance);
  153. bool SetWorkingDistanceToController(double a_dWorkingDistance);
  154. bool GetMagnificationFromController(double& a_dMagnification);
  155. bool SetMagnificationToController(double a_dMagnification);
  156. bool GetHighVoltageFromController(double& a_dHighVoltage);
  157. bool SetHighVoltageToController(double a_dHighVoltage);
  158. bool GetBeamOnFromController(bool& a_bBeamOn);
  159. bool SetBeamOnToController(bool a_bBeamOn);
  160. bool GetBeamBlankFromController(bool& a_bBeamBlank);
  161. bool SetBeamBlankToController(bool a_bBeamBlank);
  162. bool GetExternalScanFromController(bool& a_bExternal);
  163. bool SetExternalScanToController(bool a_bExternal);
  164. bool SetCurrentBeamPosition();
  165. bool IsXrayCollecting();
  166. bool IsImageCollecting();
  167. bool IsQuantifySpectrumCollecting();
  168. IStageConditions^ GetStageConditions();
  169. void OnMicroscopeColumnUpdated(Object^ sender, OINA::Extender::MicroscopeControl::ColumnEventArgs^ e)
  170. {
  171. m_bIsColumnUpdated = true;
  172. }
  173. void OnMicroscopeStageUpdated(Object^ sender, OINA::Extender::MicroscopeControl::StageEventArgs^ e)
  174. {
  175. m_bIsStageUpdated = true;
  176. //LogTrace(__FILE__, __LINE__, _T("StageUpdated!"));
  177. }
  178. void OnMicroscopeCompleted(Object^ sender, OINA::Extender::MicroscopeControl::CompletedEventArgs^ e)
  179. {
  180. if ((int)e->Control == (int)MicroscopeControl::MicroscopeControlType::Stage)
  181. {
  182. if (e->Success)
  183. {
  184. LogTrace(__FILE__, __LINE__, _T("StageUpdated!"));
  185. m_bIsStageUpdated = true;
  186. }
  187. }
  188. }
  189. bool m_bIsStageUpdated;
  190. bool m_bIsColumnUpdated;
  191. bool IsMicroscopeColumnConnected();
  192. bool IsMicroscopeStageConnected();
  193. bool StartXrayCollecting(const long a_nAcTime);
  194. void OnXrayAcquisitionFinished(Object^ sender, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<OINA::Extender::Data::Ed::IEdSpectrum^>^ e);
  195. void OnXrayChordlistFinished(Object^ sender, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<OINA::Extender::Data::Ed::IEdMap^>^ e);
  196. bool ConvertSpectrumData(IEdSpectrum^ a_spectrum, long* a_pSpectrumData, int a_nBufferSize);
  197. bool StartImageCollecting();
  198. bool StopImageCollecting();
  199. void OnImageAcquisitionFinished(Object^ /*sender*/, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs<array<OINA::Extender::Data::Image::IElectronImage^ >^ >^ e);
  200. void OnController_PixelProcessed(Object^ /*sender*/, OINA::Extender::EventArgs<OINA::Extender::Processing::Quant::IPixelSEMQuantStatus^ >^ e);
  201. void OnController_ExperimentFinished(Object^ /*sender*/, OINA::Extender::Acquisition::AcquisitionFinishedEventArgs^ e);
  202. bool ReadImageData(IElectronImage^ a_electronImage, BYTE* a_pImageBits);
  203. void XraySpectrumProcess(OINA::Extender::Data::Ed::IEdSpectrum^ spectrum);
  204. void LogMessage(CString a_sMessage);
  205. IMicroscopeController^ CreateMicroscopeController();
  206. IEdSpectrumAcquisitionController^ CreateEdsSpectrumController();
  207. IEdSpectrumSettings^ GetEdsSpectrumSettings();
  208. IImageAcquisitionController^ CreateImageAcqusitionController();
  209. IImageAcquisitionSettings^ GetImageAcqusitionSettings();
  210. // IQuantCalibrationController^ CreateQuantCalibrationController();
  211. // IQuantCalibrationSettings^ GetQuantCalibrationSettings();
  212. IEdChordListAcquisitionController^ CreateChordlistController();
  213. IEdChordListSettings^ GetChordlistSettings();
  214. IMicroscopeController^ _microscopeController;
  215. IEdSpectrumAcquisitionController^ _edSpectrumController;
  216. IEdSpectrumSettings^ _edsSpectrumSettings;
  217. IEdChordListSettings^ _edsChordListSetting;
  218. IEdChordListAcquisitionController^ _edsChordListController;
  219. IEdChordListScanCapabilities^ _edsChordListScanCapablities;
  220. IImageAcquisitionController^ _imageAcqusitionController;
  221. IImageAcquisitionSettings^ _imageAcqusitionSettings;
  222. IQuantCalibrationController^ _SEMQuantController;
  223. IQuantCalibrationSettings^ _SEMQuantSettings;
  224. ISEMQuantCapabilities^ _SEMQuantCapabilities;
  225. static Object^ GetSpectrumLockObject()
  226. {
  227. if (spectrumSyncLock == nullptr)
  228. {
  229. spectrumSyncLock = gcnew Object();
  230. }
  231. return spectrumSyncLock;
  232. }
  233. static Object^ spectrumSyncLock;
  234. void ControllerThreadFunction();
  235. Thread^ _controllerThread;
  236. AutoResetEvent^ m_startControllerEvent;
  237. AutoResetEvent^ m_endControllerEvent;
  238. OxfordControllerData _oxfordControllerData;
  239. bool m_bBeamPositionSet;
  240. };
  241. ref class ManagedGlobals
  242. {
  243. public:
  244. static OxfordControllerWrapper^ oxfordController = nullptr;
  245. };