#include "shareMemWR.h" ShareMemWR::ShareMemWR(void) { m_pDataPtr = NULL; m_pElement = NULL; m_dwShareMemIdFullIdx = 0; for (DWORD i = 0; i < SM_API_BLOCK_COUNT; i++) { m_dwShareMemIdFull[i] = INVALID_SHAREMEM_ID; } m_dwShareMemIdPreview = INVALID_SHAREMEM_ID; pImgData = new ImgDataInfo(); pImgData->SetKey("ImgDataInfo"); m_shareMemclient.Register(); m_pImgPrev = (C2DGrayImageData*)m_shareMemclient.CreateDataElement(FUNCTION_DATATYPE_2D_GRAY_IMG); m_pImgFull = (C2DGrayImageData*)m_shareMemclient.CreateDataElement(FUNCTION_DATATYPE_2D_GRAY_IMG); } ShareMemWR::~ShareMemWR(void) { m_shareMemclient.ReleaseDataElement(m_pImgPrev); m_shareMemclient.ReleaseDataElement(m_pImgFull); if(pImgData) { delete pImgData; pImgData = NULL; } } unsigned long long &ShareMemWR::GetNextSmId() { ++m_dwShareMemIdFullIdx; if (m_dwShareMemIdFullIdx >= SM_API_BLOCK_COUNT) { m_dwShareMemIdFullIdx = 0; } return m_dwShareMemIdFull[m_dwShareMemIdFullIdx]; } //ÄÚ´æID->¿ìÊý¾Ý void * ShareMemWR::GetDataBuf(unsigned long long nShareMemID, char *&pBuff,DWORD &Size) { Size = 0; pBuff = NULL; C2DGrayImageData *pC2DGImageData = NULL; CBaseFunctionDataElement *vecReadElement = NULL; UINT nCount = 0; m_shareMemclient.ReadShareMem(nShareMemID, &vecReadElement, 1, nCount); if (nCount>0) { if (FUNCTION_DATATYPE_2D_GRAY_IMG == vecReadElement->GetDataType()) { IMG2DGRAYINFO info2d; pC2DGImageData = (C2DGrayImageData*)vecReadElement; pC2DGImageData->GetInfo(info2d); pBuff = (char*)pC2DGImageData->GetData(nCount); //info2d.nBits //info2d.nWidth //info2d.nHeight DWORD sizePerPix = (info2d.nBits + 7) / 8 ; Size = (info2d.nWidth) * (info2d.nHeight) * (sizePerPix); return pC2DGImageData; } } return NULL; } void ShareMemWR::ReleaseDataBuf(void * Handle) { if(Handle) { C2DGrayImageData *pC2DGImageData = (C2DGrayImageData*)Handle; m_shareMemclient.ReleaseDataElement(pC2DGImageData); } } //void CallGetDataBuf() //{ // CommonLogicClient WheelClient; // HANDLE notifyhandle = WheelClient.GetNotifyHandle(); // ResDataObject data; // ResDataObject ResParam; // ResDataObject ReqParam; // ResDataObject resContext; // PACKET_CMD cmd; // // WaitForSingleObject(notifyhandle, INFINITE); // while (WheelClient.IsDataArrived()) // { // //cmd = PacketAnalizer::GetPacketCmd(&rMsg); // // cmd = WheelClient.ReadCmd(data); // printf("cmd:%d\n", cmd); // if (cmd == PACKET_CMD_DATA) // { // string strKey = PacketAnalizer::GetPacketKey(&data); // ResDataObject resImg; // PacketAnalizer::GetPacketContext(&data, resImg); // // ImgDataInfo ImgData; // ImgData.SetResDataObject(resImg); // GetDataBuf(ImgData.nShareMemID, ImgData.nHeight, ImgData.nWidth, ImgData.nViewType); // } // } //} typedef enum Image_View_Type_internal { IMAGE_FULL = 0, IMAGE_PREVIEW, IMAGE_AEC_PREVIEW, IMAGE_CAL }IMAGE_VIEW_TYPE_INTERNAL; bool ShareMemWR::GetShareMemBuf(ImgDataInfo *pImgData) { //LogInfo("GetShareMemBuf start"); bool bRes = true; C2DGrayImageData *pC2DGrayImageData = NULL; if (pImgData->nViewType == IMAGE_FULL) { pC2DGrayImageData = m_pImgFull; } else if (pImgData->nViewType == IMAGE_PREVIEW) { pC2DGrayImageData = m_pImgPrev; } else if (pImgData->nViewType == IMAGE_CAL) { pC2DGrayImageData = m_pImgFull; } else { //LogInfo("eType undefine"); return false; } IMG2DGRAYINFO stInfo; stInfo.nWidth = pImgData->nWidth; stInfo.nHeight = pImgData->nHeight; stInfo.nBits = pImgData->nBit; stInfo.nFrameId = (unsigned int)pImgData->nImageID; if (pC2DGrayImageData->CreateImageData(stInfo, MEM_MEMORY)) { UINT nLen = 0; m_pDataPtr = (unsigned short*)pC2DGrayImageData->GetData(nLen); m_pElement = pC2DGrayImageData; } else { // LogInfo("m_pImg->CreateImageData return false"); return false; } // LogInfo("GetShareMemBuf done"); return bRes; } int ShareMemWR::WriteImageToShareMem(unsigned long long &dwShareMemId) { //LogInfo("WriteImageToShareMem start"); int nRes; nRes = m_shareMemclient.WriteShareMem(&m_pElement, 1, dwShareMemId); //LogInfo("WriteImageToShareMem done"); return nRes; } //bool SendImageInfo(ImgDataInfo*PImgDataInfo) //{ // string str = PImgDataInfo->GetVal(); // //LogInfo(str); // // RET_STATUS ret; // ResDataObject NotifyData; // ResDataObject resValue; // PImgDataInfo->GetResDataObject(resValue); // PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_DATA, PImgDataInfo->GetKey(), resValue); // ret = CmdFromLogicDev(&NotifyData); // // //LogInfo("SendImageInfo done"); // // return true; //} RET_STATUS ShareMemWR::BufferToNotify(void * pOemImage,DWORD ImageSize,ImgDataInfo* PImgDataInfo) { RET_STATUS Ret = RET_SUCCEED; DWORD sizePerPix = (PImgDataInfo->nBit + 7) / 8; DWORD Size = (PImgDataInfo->nWidth) * (PImgDataInfo->nHeight) * (sizePerPix); if (Size != ImageSize) { return RET_FAILED; } if (GetShareMemBuf(PImgDataInfo)) { memcpy(m_pDataPtr, pOemImage, Size); } else { //LogError("GetShareMemBuf return false"); return RET_FAILED; } if (PImgDataInfo->nViewType==IMAGE_PREVIEW) { if (WriteImageToShareMem(m_dwShareMemIdPreview) == RES_SUCCESS) { PImgDataInfo->nShareMemID = m_dwShareMemIdPreview; //SendImageInfo(PImgDataInfo); } } else { if (WriteImageToShareMem(m_dwShareMemIdFull[m_dwShareMemIdFullIdx]) == RES_SUCCESS) { PImgDataInfo->nShareMemID = m_dwShareMemIdFull[m_dwShareMemIdFullIdx]; GetNextSmId();//id++ //SendImageInfo(PImgDataInfo); } } //LogInfo("DTL_FetchFrame done"); return Ret; }