#pragma once #include"LogicDevice.h" #include "ResDataObject.h" #include "ShareMemory_Circle.h" #include "Detector_Model_Def.h" #include"DIOSLogicDeviceStructure.h" #ifndef ACQUNITLOGICEX_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "AcqUnitLogicExX64D.lib") #else #pragma comment(lib, "AcqUnitLogicExX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "AcqUnitLogicExD.lib") #else #pragma comment(lib, "AcqUnitLogicEx.lib") #endif #endif #endif #ifdef ACQUNITLOGICEX_EXPORTS #define ACQUNITLOGICEX_API __declspec(dllexport) #define ACQUNITLOGICEX_C_API extern "C" __declspec(dllexport) #else #define ACQUNITLOGICEX_API __declspec(dllimport) #define ACQUNITLOGICEX_C_API extern "C" __declspec(dllimport) #endif //------------------------ABC相关----------------------------------------------------BEGIN #define ABCO_KEY ("ABCOUTPUT") #define ABCO_ROICENTERX ("ROICENTERX") #define ABCO_ROICENTERY ("ROICENTERY") //not include centerposition. //so that the size get's (1x1) even the height and width is zero. //actual size is (width*2+1,height*2+1) #define ABCO_ROIHEIGHT ("ROIHEIGHT") #define ABCO_ROIWIDTH ("ROIWIDTH") #define ABCO_ROISHAPE ("ROISHAPE") #define ABCO_ACTIVE ("ABCO_ACTIVE") #define ABCO_HARDWARE ("ABCO_HARDWARE") #define ABCO_EXI_DEF_THRESHOLD (1000) #define ABCO_EXI_THRESHOLD ("ABCO_EXI_THRESHOLD") #define ABCO_EXI_DEF_FITWIDTH (50) #define ABCO_EXI_FITWIDTH ("ABCO_EXI_FITWIDTH") #define ABCO_EXI_DEF_MIN (0) #define ABCO_EXI_MIN ("ABCO_EXI_MIN") #define ABCO_EXI_CUR ("ABCO_EXI_CUR") #define ABCO_EXI_DEF_MAX (4096) #define ABCO_EXI_MAX ("ABCO_EXI_MAX") //voltage step is 0.1v. //and certain MCU does not support floating calculation. //so we use DWORD type val,1v => 100 #define ABCO_VOLT_DEF_MAX (1200) #define ABCO_VOLT_MAX ("ABCO_VOLT_MAX") #define ABCO_VOLT_CUR ("ABCO_VOLT_CUR") #define ABCO_VOLT_DEF_MIN (0) #define ABCO_VOLT_MIN ("ABCO_VOLT_MIN") //Ratio 1 = 1000,if we wanna change output voltage from 12v to 5v,then Ratio is (5/12 => 417) #define ABCO_VOLT_DEF_RATIO (1000) #define ABCO_VOLT_RATIO ("ABCO_VOLT_RATIO") //Auto Bright Control Output //ABCInput我们会在发生器端设计 //内嵌一个ROI,没必要定义多个ROI //详细参照文档【动态探测器定义.xlsx】 //ABC应该作为单一的单元存在,要检讨!!!! class ACQUNITLOGICEX_API AutoBrightControl_Output { string *m_pKey; string *m_ValString; ResDataObject * m_pTargetObject; //ROI 部分 //基于当前mode,取ROI区域并计算Exi //BaseJsonDataObject m_RoiCenterX; //BaseJsonDataObject m_RoiCenterY; //BaseJsonDataObject m_RoiHeight; //BaseJsonDataObject m_RoiWidth; //BaseJsonDataObject m_RoiShape;//1:elliptic 0:rectangular //ABC 部分 //Abc开关 //BaseJsonDataObject m_Active; //output by hw //看起来有2根Analog信号输出(一正一负) //Unactive情况下,两个Analog信号为0,发生器端不应该有输出剂量的变更. //至于信号值X轴对称(0->12v,0->-12v),还是偏移对称(0->12v,-12v->0),assert-check //这里要检讨:偏移对称的话,根据硬件信号就能判断是否UnActive. //据王磊讲述,没有用过负的... //Active情况下,输出为最后一张图像的ROI的模拟量(CurrentExi) //至于停止ABC控制,Analog信号输出改为0即可. //BaseJsonDataObject m_HardwareOutput; //预期想得到的Exi阈值 //10 - 2^(8*sizeof(WORD)) //BaseJsonDataObject m_ExiThreshold; //fit exi area.如果下列公式满足的话,认为ABC已经达到预期.输出Analog信号为0. //ABS(CurrentExi - ExiThreshold) < ExiFitWidth //BaseJsonDataObject m_ExiFitWidth; //无特殊情况下,缺省值应该为0. //为了将来考虑,先保留ExiMin. //BaseJsonDataObject m_ExiMin; //为预期Exi计算出来的MaxExi //BaseJsonDataObject m_ExiMax; //BaseJsonDataObject m_CurrentExi;//current exi val. //电压的上下限,如果2个Analog信号都有效的话,根据情况(X轴对称,偏移对称)设计 //BaseJsonDataObject m_VoltageOutputMax;//normally it's 12v,min step is 0.1v //BaseJsonDataObject m_VoltageOutputMin;//normally it's 0v,min step is 0.1v //输出电压的增益量 //BaseJsonDataObject m_VoltageOutputRatio;//normally it's 1. //final output analog signal //如果当前值是3V,真正的Analog输出为3V*VoltageOutputRatio //BaseJsonDataObject m_CurrentVoltageOutput; public: AutoBrightControl_Output(); virtual ~AutoBrightControl_Output(); AutoBrightControl_Output(const AutoBrightControl_Output &tValue); //base void SetKey(const char *pKey); const char *GetKey(); //基于对象 virtual void GetResDataObject(ResDataObject &obj); virtual bool SetResDataObject(ResDataObject &obj); //基于字符串 //virtual const char *GetVal(); //virtual bool SetVal(const char* pValString); //基于下标读取 const ResDataObject &operator [](const char *pKey); //行为 //设置和读取ROI //ABC开关 //Exi参数设置 //Voltage参数设置 //硬件输出开关 //Current Exi&Voltage Notify(Exi其实没必要通知) }; //------------------------ABC相关----------------------------------------------------END //------------------------IMAGE相关----------------------------------------------------BEGIN /* 关于 Fetch行为的解释 1.必须明确怎么传递图像. 图像直接Notify?还是Fetch后反馈Notify? ImageFetchFlag为0,意味着不需要Fetch,下层图像Ready了自动发Notify. 反之,就需要明确的调用Fetch命令. 明确调用Fetch命令的前提是,ImageReady为真. Fetch(Type,FrameId),Request Type:Full?Prev, FrameId: 0< FrameId <= FrameCount,反馈明确的图像,Notify为P2P形式 FrameId == 0 情况,Fetch行为反馈最后图像的Prev&Full 当ImageReady为假,Fetch命令马上返回失败. 用例: 连续采集模式下,ImageFetchFlag为假 Frame将会保存最后一张图像, 2.Fetch在任何情况下都要存在. 2.1 OfflineMode下的Image的获取. 2.2 意外掉线后的LastImage的获取. */ #define FetchImagePool ("ImageFetchPool") #define MaxFrameLimits ("MaxFrameLimits") #define ImageLeftCount ("ImageLeftCount") #define TotalFrameCount ("TotalFrameCount") #define CurrentImageIndex ("CurrentImageIndex") typedef enum _CurFramePos { FRAME_POS_CUR, FRAME_POS_FIRST, FRAME_POS_LAST, FRAME_POS_INCREASE, FRAME_POS_DECREASE, FRAME_POS_MAX }CURFRAMEPOS; typedef enum _BINNING_Mode { BINNING_ORIG, BINNING_2_2, BINNING_3_3, BINNING_4_4 }BINNING_MODE; class ACQUNITLOGICEX_API ImageFetchPoolEx : public ExJsonDataObject,public DiosLock { //共有属性 //FrameCountLimit //TotalFrameCount //LeftFrameCount //类似于Private属性,没有必要对外公开 //FirstFrameIndex //LastFrameIndex //CurrentFrameIndex //FullImageQueue Of ShareMemObject PVOID m_pFullImageQueue; //PrevImageQueue Of ShareMemObject PVOID m_pPrevImageData; // public: ImageFetchPoolEx(); virtual ~ImageFetchPoolEx(); bool SetMaxBlockSize(const char *pQueName, DWORD BlockSize, DWORD FulBlockCount, DWORD PrevBlockCount); bool SetFulImageInfo(DWORD Height, DWORD Width, DWORD Bits); bool SetPrevImageInfo(DWORD Height, DWORD Width, DWORD Bits); //void SetFulImageTrimInfo(DWORD LeftTrim, DWORD RightTrim, DWORD TopTrim, DWORD BottomTrim); //Bits:follow fullImageInfo setting //bool SetPrevImageInfo(bool Support, DWORD Height, DWORD Width, bool FetchFlag); ShareMemoryBlockID AddFrame(IMAGE_VIEW_TYPE Type, ShareMemoryBlockID ImageSmId); ShareMemoryBlockID AddFrame(IMAGE_VIEW_TYPE Type, WORD* pFrameBuff, DWORD FrameSize); ShareMemoryBlockID AddRawFrame(IMAGE_VIEW_TYPE Type,DWORD Width,DWORD Height,DWORD Bit, WORD* pImageBuff, DWORD BuffSize); ShareMemoryBlockID AddFrameWithHead(IMAGE_VIEW_TYPE Type, IMAGE imageHead,WORD* pFrameBuff, DWORD FrameSize); //先拿图,后设置位置 RET_STATUS DATA_ACTION FetchFrame(IMAGE_VIEW_TYPE Type, CURFRAMEPOS position, ShareMemoryBlockID &ImageSmId); //设置位置 RET_STATUS DATA_ACTION SetCurrentFramePosition(IMAGE_VIEW_TYPE Type, CURFRAMEPOS position); void ClearPool(); virtual ResDataObject &GetResDataObject(); virtual ResDataObject &operator [](const char *pKey); }; //------------------------IMAGE相关----------------------------------------------------END class ACQUNITLOGICEX_API AcqUnitLogicEx :public LogicDevice { ImgDataInfo* m_ImgDataInfo; GainInfoEx *m_pGainInfo; //Zoom /* 2121探测器,缺省21CM*21CM,so...Zoom X Y 应该为(21,21) 同理,4343情况就是 (43,43) 如果ZOOM切换到20*20,则此值应变为(20,20) */ ZoomInfoEx *m_pZoomInfo; //Binning /* 通常有1*1,2*2,3*3模式 极端有1*2,2*3,1*3等 */ BinningInfoEx *m_pBinningInfo; //图像信息 ImageInfoEx *m_pFullImageInfo; ImageInfoEx *m_pPrevImageInfo; //探测器曝光状态信息 ResDataObject *m_pECOMFPDState; ImageFetchPoolEx *m_pFetchPool; BaseJsonDataObject m_bNoNeedWaitImage; bool DoAddFrameNotify(IMAGE_VIEW_TYPE Type, ShareMemoryBlockID ImageSmId, bool Clear); protected: public: AcqUnitLogicEx(void); virtual ~AcqUnitLogicEx(void); //get device type virtual bool SYSTEM_CALL GetDeviceType(GUID &DevType); //get device resource virtual RET_STATUS SYSTEM_CALL GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource); //ResourceCommand Request In and Response Out virtual RET_STATUS SYSTEM_CALL Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse); //notify to lower layer virtual RET_STATUS SYSTEM_CALL CmdToLogicDev(ResDataObject PARAM_IN *pCmd); //Fetch is based on current idx RET_STATUS DATA_ACTION FetchFrame(IMAGE_VIEW_TYPE Type, CURFRAMEPOS position, ShareMemoryBlockID &ImageSmId); RET_STATUS DATA_ACTION SetCurrentFramePosition(IMAGE_VIEW_TYPE Type, CURFRAMEPOS position); RET_STATUS DATA_ACTION GetImageInfo(IMAGE_VIEW_TYPE Type, ImageInfoEx &Info); virtual RET_STATUS DATA_ACTION SetAcqImageType(XRAY_IMAGE_TYPE ImageType); RET_STATUS DATA_ACTION GetGain(float &Gain); RET_STATUS DATA_ACTION GetZoom(ZoomInfoEx &zoomInfo); RET_STATUS DATA_ACTION GetBinning(BinningInfoEx &binningInfo); virtual RET_STATUS DATA_ACTION SetDemoImage(const char *pPath); virtual bool DEVICE_SUPPORT Support_SetAcqMode(); virtual bool DEVICE_SUPPORT Support_SetGainMode();//与Support_SetAcqMode互斥 virtual bool DEVICE_SUPPORT Support_SetBinningMode();//与Support_SetAcqMode互斥 virtual bool DEVICE_SUPPORT Support_SetZoomMode();//与Support_SetAcqMode互斥 virtual RET_STATUS SYSTEM_CALL SetAcqMode(int nAcqModeIndx); virtual RET_STATUS SYSTEM_CALL SetGainMode(int GainModeIndex); virtual RET_STATUS SYSTEM_CALL SetBinningMode(int BinningModeIndex); virtual RET_STATUS SYSTEM_CALL SetZoomMode(int ZoomModeIndex); virtual bool DEVICE_SUPPORT Support_SetLSBCheckEnable(); virtual bool DEVICE_SUPPORT Support_SetLSBCheckROI(); virtual bool DEVICE_SUPPORT Support_SetSensitivity(); virtual RET_STATUS SYSTEM_CALL SetLSBCheckEnable(unsigned int Enable); virtual RET_STATUS SYSTEM_CALL SetLSBCheckROI(unsigned int X1, unsigned int Y1, unsigned int X2, unsigned int Y2); virtual RET_STATUS SYSTEM_CALL SetSensitivity(DWORD Sensitivity);//unit LSB/uGy //对内接口 bool OEM_IF SetMaxBlockSize(const char *pQueName, DWORD BlockSize, DWORD FulBlockCount, DWORD PrevBlockCount); bool OEM_IF SetFulImageInfo(DWORD Height, DWORD Width, DWORD Bits, bool FetchFlag); bool OEM_IF SetPrevImageInfo(bool Support, DWORD Height, DWORD Width, bool FetchFlag); bool OEM_IF SetCoef(const char* Coef); bool OEM_IF SetTargetEXI(const char* TargetEXI); bool FlipX(WORD*pData, UINT nWidth, UINT nHeight); bool FlipY(WORD*pData, UINT nWidth, UINT nHeight); RET_STATUS OEM_IF RotateImage(WORD* imageBuffer, int nImageHeight, int nImageWidth, int nAngle); ShareMemoryBlockID OEM_IF AddFrame(IMAGE_VIEW_TYPE Type, ShareMemoryBlockID ImageSmId); ShareMemoryBlockID OEM_IF AddFrame(IMAGE_VIEW_TYPE Type, WORD* pImageBuff, DWORD BuffSize); ShareMemoryBlockID OEM_IF AddRawFrame(IMAGE_VIEW_TYPE Type, WORD* pImageBuff, DWORD BuffSize); ShareMemoryBlockID OEM_IF AddFrameWithRawHead(IMAGE_VIEW_TYPE Type, IMAGE imageHead, WORD* pFrameBuff, DWORD FrameSize); void OEM_IF SetGain(float Gain); void OEM_IF SetBinning(DWORD &BinningX, DWORD &BinningY); void OEM_IF SetZoom(DWORD ZoomX1, DWORD ZoomY1, DWORD ZoomX2, DWORD ZoomY2); void OEM_IF ClearPool(); bool OEM_IF SendImageInfo(IMAGE_VIEW_TYPE eType, ShareMemoryBlockID dwShareMemId, unsigned long long nImageId); bool OEM_IF SetEcomFPDState(ECOM_FPD_STATE state); void OEM_IF SendNoNeedWaitImage(bool bFlag); };