123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- #include "stdafx.h"
- #include "OTSSemBase.h"
- #include "otsdataconst.h"
- namespace OTSController {
- COTSSemBase::COTSSemBase()
- : m_oScanField100(CSize(SCREEN_SIZE_DEFAULT_MAG100_X, SCREEN_SIZE_DEFAULT_MAG100_Y))
- , m_bAllowRotation(FALSE)
- {
- }
- COTSSemBase::~COTSSemBase()
- {
- }
- // move SEM to the given point
- BOOL COTSSemBase::MoveSEMToPoint(const CPoint& a_poiPosition, const double& a_dRotation)
- {
- // connected?
- if (!IsConnected())
- {
- // SEM is not connected
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::MoveSEMToPoint: SEM is not connected."));
- return FALSE;
- }
- // attempt 1000 times until SEM in place
- //long nAttempTime = 2;
- double dSetPositionX = (double)a_poiPosition.x;
- double dSetPositionY = (double)a_poiPosition.y;
- double dSetPositionR = a_dRotation;
- double dOriginalPositionX = 0.0;
- double dOriginalPositionY = 0.0;
- double dGetPositionX = 0.0;
- double dGetPositionY = 0.0;
- double dGetPositionR = 0.0;
- BOOL bInPlace = FALSE;
- // allow rotation?
- if (!m_bAllowRotation)
- {
- // not allow to rotation
- // get SEM position
- if (!GetPositionXY(dOriginalPositionX, dOriginalPositionY, dGetPositionR))
- {
- // failed to call GetPositionXY method
- LogErrorTrace(__FILE__, __LINE__, "COTSSemBase::MoveSEMToPoint: failed to call GetPositionXY method.");
-
- return FALSE;
- }
-
- // don't rotation at all
- dSetPositionR = dGetPositionR;
- }
- // Move SEM to position
- if (!SetPositionXY(dSetPositionX, dSetPositionY, dSetPositionR))
- {
- LogErrorTrace(__FILE__, __LINE__, "COTSSemBase::MoveSEMToPoint: failed to call SetPositionXY method.");
- }
- //time out
- clock_t t0, dt;
- t0 = clock();
- int ttt = 20;
- while (!bInPlace)
- {
- //³¬Ê±ÅжÏ
- dt = clock() - t0;
- if (dt >= ttt * CLOCKS_PER_SEC)
- {
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::MoveSEMToPoint: failed to call SetPositionXY time out > 20s"));
- return FALSE;
- }
-
- // get SEM position
- if (!GetPositionXY(dGetPositionX, dGetPositionY, dGetPositionR))
- {
- // failed to call GetPositionXY method
- LogErrorTrace(__FILE__, __LINE__, "COTSSemBase::MoveSEMToPoint: failed to call GetPositionXY method.");
- continue;
- }
-
- // check if SEM has be in place
- if ((fabs(dSetPositionX - dGetPositionX) < POSITIONCRITERIA)
- && (fabs(dSetPositionY - dGetPositionY) < POSITIONCRITERIA))
- {
- // x, y are in place
- // allow rotation?
- if (m_bAllowRotation)
- {
- // need to check if rotation is ok
- bInPlace = fabs(dSetPositionR - dGetPositionR) < POSITIONCRITERIA;
- }
- else
- {
- // don't need to check if rotation is ok
- bInPlace = TRUE;
- }
- }
-
- }
- // in placed?
- if (!bInPlace)
- {
- LogTrace(__FILE__, __LINE__, "COTSSemBase::MoveSEMToPoint: failed to move SEM to position(%f, %f, %f). current SEM position (%f, %f, %f).",
- dSetPositionX, dSetPositionY, dSetPositionR, dGetPositionX, dGetPositionY, dGetPositionR);
- return FALSE;
- }
-
- return TRUE;
- }
- // SEM data (measure)
- BOOL COTSSemBase::GetSEMDataMsr(CSEMDataMsrPtr a_pSEMDataMsr)
- {
- // input check
- ASSERT(a_pSEMDataMsr);
- if (!a_pSEMDataMsr)
- {
- // invalid SEM data pointer
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: invalid SEM data pointer."));
- return FALSE;
- }
- // connected?
- if (!IsConnected())
- {
- // SEM is not connected
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: SEM is not connected."));
- return FALSE;
- }
- // get working distance
- double dFWD;
- if (!GetWorkingDistance(dFWD))
- {
- // failed to get working distance
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to get working distance."));
- return FALSE;
- }
-
- // get scan file size
- double dScanFieldSizeX, dScanFieldSizeY;
- if (!GetScanFieldSize( dScanFieldSizeX, dScanFieldSizeY))
- {
- // failed to get scan field size
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to get scan field size."));
- return FALSE;
- }
- // set SEM data (measure)
- a_pSEMDataMsr->SetWorkingDistance(dFWD);
- a_pSEMDataMsr->SetScanFieldSize((int)(dScanFieldSizeX + 0.5));
- a_pSEMDataMsr->SetScanFieldSize100(m_oScanField100.cx);
- // ok, return TRUE
- return TRUE;
- }
- BOOL COTSSemBase::SetSEMDataMsr(CSEMDataMsrPtr a_pSEMDataMsr)
- {
- // input check
- ASSERT(a_pSEMDataMsr);
- if (!a_pSEMDataMsr)
- {
- // invalid SEM data pointer
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: invalid SEM data pointer."));
- return FALSE;
- }
- // connected?
- if (!IsConnected())
- {
- // SEM is not connected
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: SEM is not connected."));
- return FALSE;
- }
- // set working distance
- if (!SetWorkingDistance(a_pSEMDataMsr->GetWorkingDistance()))
- {
- // failed to set working distance
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to set working distance."));
- return FALSE;
- }
- // set scan field size
- if (!SetScanFieldSizeX(a_pSEMDataMsr->GetScanFieldSize()))
- {
- // failed to set scan field size
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to set scan field size."));
- return FALSE;
- }
- // ok, return TRUE
- return TRUE;
- }
- // SEM data (general)
- BOOL COTSSemBase::GetSEMDataGnr(CSEMDataGnrPtr a_pSEMDataGnr)
- {
- // input check
- ASSERT(a_pSEMDataGnr);
- if (!a_pSEMDataGnr)
- {
- // invalid SEM data pointer
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataGnr: invalid SEM data pointer."));
- return FALSE;
- }
- // connected?
- if (!IsConnected())
- {
- // SEM is not connected
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataGnr: SEM is not connected."));
- return FALSE;
- }
- // get KV
- double dKV;
- if (!GetHighTension(dKV))
- {
- // failed to get KV
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to get kv."));
- return FALSE;
- }
- // get brightness
- double dBrightness;
- if (!GetBrightness(dBrightness))
- {
- // failed to get brightness
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to get brightness."));
- return FALSE;
- }
- // get contrast
- double dContrast;
- if (!GetContrast(dContrast))
- {
- // failed to get contrast
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::GetSEMDataMsr: failed to get contrast."));
- return FALSE;
- }
- // set SEM data (general)
- a_pSEMDataGnr->SetKV(dKV);
- a_pSEMDataGnr->SetBrightness(dBrightness);
- a_pSEMDataGnr->SetContrast(dContrast);
- // ok, return TRUE
- return TRUE;
- }
- BOOL COTSSemBase::SetSEMDataGnr(CSEMDataGnrPtr a_pSEMDataGnr)
- {
- // input check
- ASSERT(a_pSEMDataGnr);
- if (!a_pSEMDataGnr)
- {
- // invalid SEM data pointer
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::SetSEMDataGnr: invalid SEM data pointer."));
- return FALSE;
- }
- // connected?
- if (!IsConnected())
- {
- // SEM is not connected
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::SetSEMDataGnr: SEM is not connected."));
- return FALSE;
- }
- // set KV
- if (!SetHighTension(a_pSEMDataGnr->GetKV()))
- {
- // failed to set KV
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::SetSEMDataGnr: failed to set KV."));
- return FALSE;
- }
- // set brightness
- if (!SetBrightness(a_pSEMDataGnr->GetBrightness()))
- {
- // failed to set brightness
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::SetSEMDataGnr: failed to set brightness."));
- return FALSE;
- }
- // set contrast
- if (!SetContrast(a_pSEMDataGnr->GetContrast()))
- {
- // failed to set contrast
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::SetSEMDataGnr: failed to set contrast."));
- return FALSE;
- }
- // ok, return TRUE
- return TRUE;
- }
- // convert scan field size to mag.
- BOOL COTSSemBase::ScanFieldSizeToMag
- (
- double& a_dMagnification,
- double a_dScanFieldSizeX
- )
- {
- // check input scan field value
- if (a_dScanFieldSizeX < SCANFIELDSIZE_MIN)
- {
- // failed to do scan field size mag convention. input scan field size is smaller than limited.
- LogErrorTrace(__FILE__, __LINE__, _T("COTSSemBase::ScanFieldSizeToMag: failed to do scan field size mag convention. input scan field size is smaller than limited."));
- return FALSE;
- }
- // convert scan field size to magnification
- a_dMagnification = (double)(m_oScanField100.cx) * 100.0 / a_dScanFieldSizeX;
- // ok, return TRUE
- return TRUE;
- }
- // convert mag to scan field size.
- BOOL COTSSemBase::MagToScanFieldSize
- (
- double a_dMagnification,
- double& a_dScanFieldSizeX,
- double& a_dScanFieldSizeY
- )
- {
- // check mag value
- if (a_dMagnification < MAGNIFICATION_MIN)
- {
- // failed to do mag scan field size convention. input magnification is smaller than limited
- LogTrace(__FILE__, __LINE__, _T("COTSSemBase::MagToScanFieldSize: failed to do mag scan field size convention. input magnification is smaller than limited."));
- return FALSE;
- }
- // calculation scan field size and set output values
- a_dScanFieldSizeX = 100.0 * m_oScanField100.cx / a_dMagnification;
- a_dScanFieldSizeY = 100.0 * m_oScanField100.cy / a_dMagnification;
- // ok, return TRUE
- return TRUE;
- }
- }
|