// HSI_Illumination.cpp : 定义 DLL 的初始化例程。 // #include "stdafx.h" #include "SevenOcean\CMMIO_SERIAL.h" #include "HSI.h" #include "HSI_Sevenocean_EF3.h" #include "HSI_Motion.h" #include "HSI_Illumination.h" #include "hidsdi.h" #include #include #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif //=========================================================================== HSI_Illumination *g_pHSI_Illumination = nullptr; const double PERCENT_PRECISION = 0.000001; //const int SO7II_SECTOR_ORDER[8] = { 5, 4, 3, 2, 1, 8, 7, 6 }; int SO7II_SECTOR_ORDER[8] = {5, 4, 3, 2, 1, 8, 7, 6}; PSP_DEVICE_INTERFACE_DETAIL_DATA m_detailData; HIDP_CAPS m_Capabilities; //=========================================================================== HSI_Illumination::HSI_Illumination() { TRACE0("HSI_Illumination Constructor!\n"); hWnd = NULL; bOfflineOnly = false; for (int i = 0; i < 64;i++) { m_cSendData[i] = 0; } m_bRS232AOpened = FALSE; m_bRS232BOpened = FALSE; m_iBuadRate = 2400; m_iSleepTime = 50; m_iSo7DoubleSurface = 0; m_iMinRings = 0; m_iMaxRings = 0; m_iMinSectors = 0; m_iMaxSectors = 0; m_iIlluminationType = 0; m_iSelectedIndex = 0; m_cSendData[0] = 2; m_cSendData[1] = 2; m_detailData = NULL; m_DeviceHandle = NULL; m_VendorID = 0x0483; m_ProductID = 0x5710; //m_cSendData[2] = 2; //m_cSendData[3] = 48; //m_cSendData[4] = 4; //m_cSendData[6] = 4; } //=========================================================================== HSI_Illumination::~HSI_Illumination() { TRACE0("HSI_Illumination Destructor!\n"); } //=========================================================================== HSI_STATUS HSI_Illumination::IsSupported(UINT &Types) { auto rStatus = HSI_STATUS_NORMAL; Types = 1; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::Startup(HWND _hWnd, bool _bOfflineOnly) { auto rStatus = HSI_STATUS_NORMAL; hWnd = _hWnd; bOfflineOnly = _bOfflineOnly; if (!bOfflineOnly) { DebugLog("Startup -> in"); if (!g_pHSI_Motion) { return HSI_STATUS_FAILED; } if (g_pHSI_Motion->m_isUseAport == 1) { DebugLog("Startup -> A"); m_SO7_SerialA.SetPort(g_pHSI_Motion->m_portAnum, m_iBuadRate); if (m_SO7_SerialA.Open()) { DebugLog("Startup -> A success"); m_bRS232AOpened = TRUE; } else { char messageAlarm[100] = ""; m_bRS232AOpened = false; sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; _itoa_s(g_pHSI_Motion->m_portAnum, messageAlarm, 30, 10); strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); EventCallback(sEvenProp); rStatus = HSI_STATUS_FAILED; } } if (g_pHSI_Motion->m_isUseBport == 1) { DebugLog("Startup -> B"); m_SO7_SerialB.SetPort(g_pHSI_Motion->m_portBnum, m_iBuadRate); if (m_SO7_SerialB.Open()) { DebugLog("Startup -> B success"); m_bRS232BOpened = TRUE; } else { char messageAlarm[100] = ""; m_bRS232BOpened = false; sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; _itoa_s(g_pHSI_Motion->m_portBnum, messageAlarm, 30, 10); strcat_s(messageAlarm, 100, "号端口MCU串口控制器打开失败"); strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, messageAlarm); EventCallback(sEvenProp); rStatus = HSI_STATUS_FAILED; } } if (g_pHSI_Motion->m_IsUseTwentySixLight == 2) { DebugLog("Startup -> 26"); if (FindTheHID() == false) { m_bSTM32UsbFlag = false; sEvenProp.Init(); sEvenProp.EventType = HSI_EVENT_ERROR; sEvenProp.EventID = HSI_EVENT_MOTION; sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "STM32 USB模式打开失败"); EventCallback(sEvenProp); rStatus = HSI_STATUS_FAILED; } DebugLog("Startup -> 26 success"); } } return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::GetLampCount(int &nLamps) { auto rStatus = HSI_STATUS_NORMAL; nLamps = 3; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::GetLampInfo(int& _LampInfo, int& _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int *NumRings, int *NumSectors, int* _Color, double *_Angle, bool &bCanBeCalibrated) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(NumRings); UNREFERENCED_PARAMETER(NumSectors); UNREFERENCED_PARAMETER(_Color); UNREFERENCED_PARAMETER(_Angle); UNREFERENCED_PARAMETER(bCanBeCalibrated); m_iMinRings = 1; m_iMaxRings = 6; m_iMinSectors = 1; m_iMaxSectors = 8; _LampInfo = m_iIlluminationType; _NumLamps = 0; _LampsType[_NumLamps][0] = HSI_ILLUMINATION_LAMP_COAXIAL; NumRings[_NumLamps] = 1; NumSectors[_NumLamps] = 1; _NumLamps++; _LampsType[_NumLamps][0] = HSI_ILLUMINATION_LAMP_SURFACE; NumRings[_NumLamps] = m_iMaxRings - m_iMinRings + 1; NumSectors[_NumLamps] = m_iMaxSectors - m_iMinSectors + 1; _NumLamps++; _LampsType[_NumLamps][0] = HSI_ILLUMINATION_LAMP_PROFILE; NumRings[_NumLamps] = 1; NumSectors[_NumLamps] = 1; _NumLamps++; _LampsType[_NumLamps][0] = HSI_ILLUMINATION_LAMP_PROFILE_OUTER; NumRings[_NumLamps] = 1; NumSectors[_NumLamps] = 1; _NumLamps++; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::GetLampState(int nLamp, bool *bBulbStates, double *Intensities, int &Color, double &Angle) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(nLamp); UNREFERENCED_PARAMETER(bBulbStates); UNREFERENCED_PARAMETER(Intensities); UNREFERENCED_PARAMETER(Color); UNREFERENCED_PARAMETER(Angle); rStatus = HSI_STATUS_NOT_SUPPORTED; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::SetLampState(int nLamp, bool *bBulbStates, double *Intensities, int Color, double Angle, bool bWait) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(nLamp); UNREFERENCED_PARAMETER(bBulbStates); UNREFERENCED_PARAMETER(Intensities); UNREFERENCED_PARAMETER(Color); UNREFERENCED_PARAMETER(Angle); UNREFERENCED_PARAMETER(bWait); rStatus = HSI_STATUS_NOT_SUPPORTED; return rStatus; } //=========================================================================== //设置控制的光源板的序号 HSI_STATUS HSI_Illumination::SetSelectedIndex(int index) { auto rStatus = HSI_STATUS_NORMAL; if (!g_pHSI_Motion) { return HSI_STATUS_FAILED; } if (g_pHSI_Motion->m_IsUseTwentySixLight == 2 && index == 0) return rStatus; if (g_pHSI_Motion->m_IsUseEF3 == 0) { if (index + 1 > g_pHSI_Motion->m_bISUseMoreLights) { return HSI_STATUS_FAILED; } } else { if (index > g_pHSI_Motion->m_bISUseMoreLights) { return HSI_STATUS_FAILED; } } m_iSelectedIndex = index; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::GetLampStateAll(int _LampInfo, int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS]) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(_LampInfo); UNREFERENCED_PARAMETER(_NumLamps); UNREFERENCED_PARAMETER(_LampsType); UNREFERENCED_PARAMETER(bBulbStates); UNREFERENCED_PARAMETER(Intensities); rStatus = HSI_STATUS_NOT_SUPPORTED; return rStatus; } //=========================================================================== HSI_STATUS HSI_Illumination::SetLampStateAll(int _LampInfo, int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS], bool bWait) { auto rStatus = HSI_STATUS_NORMAL; UNREFERENCED_PARAMETER(_LampInfo); if (!g_pHSI_Motion) { return HSI_STATUS_FAILED; } DebugLog("SetLampStateAll -> in"); m_iIlluminationType = HSI_ILLUMINATION_INFO_SO7_II; if (m_iIlluminationType == HSI_ILLUMINATION_INFO_SO7_II) { m_iMinRings = 3; m_iMaxRings = 6; m_iMinSectors = 1; m_iMaxSectors = 8; SetLampState_So7II(_NumLamps, _LampsType, bBulbStates, Intensities, bWait); } if (g_pHSI_Motion->m_IsUseSixRingEightArea == 1) { //更改六环八区扇形区域显示的位置 m_iIlluminationType = HSI_ILLUMINATION_INFO_SO7_III; for (size_t i = 0; i < 8; i++) { SO7II_SECTOR_ORDER[i] = g_pHSI_Motion->m_SixEightSubArea[i]; } } if (m_iIlluminationType == HSI_ILLUMINATION_INFO_SO7_III) { m_iMinRings = 1; m_iMaxRings = 6; m_iMinSectors = 1; m_iMaxSectors = 8; SetLampState_So7III(_NumLamps, _LampsType, bBulbStates, Intensities, bWait); } if (m_iIlluminationType == HSI_ILLUMINATION_INFO_SO7) { m_iMinRings = 1; m_iMaxRings = 2; m_iMinSectors = 1; m_iMaxSectors = 8; SetLampState_So7I(_NumLamps, _LampsType, bBulbStates, Intensities, bWait); } if (g_pHSI_Motion->m_IsUseSixRingEightArea == 2) { m_iMinRings = 1; m_iMaxRings = 2; m_iMinSectors = 1; m_iMaxSectors = 8; SetLampState_So7IIII(_NumLamps, _LampsType, bBulbStates, Intensities, bWait); } return rStatus; } //=========================================================================== BOOL HSI_Illumination::SetLampState_So7I(int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS], bool bWait) { BOOL rStatus(TRUE); UNREFERENCED_PARAMETER(bWait); UNREFERENCED_PARAMETER(bBulbStates); int iOffsetIndex(0); short LampValue(0); short LampMaxValue(255); short LampMinValue(1); for (int i = 0; i < _NumLamps; i++) { switch (_LampsType[i][0]) { case HSI_ILLUMINATION_LAMP_COAXIAL://3 { break; } case HSI_ILLUMINATION_LAMP_SURFACE: { double dMaxValue(-999.9), dTmpValue(0.0); if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_SURFACE][0]); } else { LampValue = LampMinValue; } switch (_LampsType[i][1]) { case HSI_ILLUMINATION_LAMP_CONTROL_BY_WHOLE_LAMP: { break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_RINGS: { dMaxValue = -999.9; dTmpValue = 0.0; for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS]; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { iOffsetIndex = iRing - m_iMinRings; } } else { dTmpValue = 0.0; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } } } LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dMaxValue); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_OCTANTS: { break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_SEGMENTS: { break; } default: { break; } } break; } case HSI_ILLUMINATION_LAMP_PROFILE: { break; } default: { break; } } } return rStatus; } //=========================================================================== BOOL HSI_Illumination::SetLampState_So7II(int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS], bool bWait) { DebugLog("SetLampState_So7II -> in"); UNREFERENCED_PARAMETER(_NumLamps); UNREFERENCED_PARAMETER(bBulbStates); UNREFERENCED_PARAMETER(bWait); BOOL rStatus(TRUE); BYTE LampMaxValue(0xFF); BYTE LampMinValue(0x01); BYTE cSendDataA[9] = { 0xA1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xB1 }; BYTE cSendDataB[9] = { 0xA1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xB1 }; int ampTimes = 1120; switch (_LampsType[1][1]) { case HSI_ILLUMINATION_LAMP_CONTROL_BY_WHOLE_LAMP: { int index = 2; short int tempIntensity = 0; tempIntensity = (short int)(Intensities[0][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[2][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[3][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[1][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); g_pHSI_Motion->Send_Command(m_iSelectedIndex, (const char*)m_cSendData, 64); Sleep(5); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_RINGS: { //EF3自带光源的数据发送 环形区域可控制EF3的8路 其他区域只能控制部分 int index = 2; short int tempIntensity = 0; tempIntensity = (short int)(Intensities[0][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[2][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[3][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); for (int i = 96; i > 16;) { tempIntensity = (short int)(Intensities[1][i] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); i -= 16; } g_pHSI_Motion->Send_Command(m_iSelectedIndex, (const char*)m_cSendData, 64); Sleep(5); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_OCTANTS: { int index = 2; short int tempIntensity = 0; tempIntensity = (short int)(Intensities[0][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[2][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[3][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); g_pHSI_Motion->Send_Command(m_iSelectedIndex, (const char*)m_cSendData, 64); Sleep(5); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_SEGMENTS: { int index = 2; short int tempIntensity = 0; tempIntensity = (short int)(Intensities[0][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); tempIntensity = (short int)(Intensities[2][0] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); for (int i = 0; i < 6; i++) { for (int j = 0; j < 8; j++) { tempIntensity = (short int)(Intensities[1][(i + 1)*HSI_ILLUMINATION_MAX_SECTORS + (j + 1)] * ampTimes); m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); if (index >= 64) { break; } } } g_pHSI_Motion->Send_Command(m_iSelectedIndex, (const char*)m_cSendData, 64); Sleep(5); if (g_pHSI_Motion->m_IsUseTwentySixLight == 1 || g_pHSI_Motion->m_IsUseTwentySixLight == 2) { //二十六路/八路光源板的数据发送 DebugLog("UseTwentySixLight -> in"); int index = 7; short int tempIntensity = 0; for (int i = 1; i < 5; i++) { for (int j = 0; j < 8; j++) { //共26盏灯,到[2, 66] if (i == 4 && j >= 2) { break; } if (i == 4) { if ((i * 16 + 1) + j == 65) { Intensities[1][64] = Intensities[0][0]; } else if ((i * 16 + 1) + j == 66) { Intensities[1][64] = Intensities[2][0]; } } tempIntensity = (short int)(Intensities[1][(i * 16 + 1) + j] * ampTimes); if (tempIntensity > 1120) { tempIntensity = 1120; } if (tempIntensity < 0) { tempIntensity = 0; } m_cSendData[index++] = (tempIntensity >> 8); m_cSendData[index++] = (tempIntensity & 0x00ff); } } if (g_pHSI_Motion->m_IsUseTwentySixLight == 1) { if (g_pHSI_Motion->m_bISUseMoreLights > 0) { if (g_pHSI_Motion->m_bConnected) { g_pHSI_Motion->m_selectedIndex = m_iSelectedIndex - 1; } else { g_pHSI_Motion->m_selectedIndex = m_iSelectedIndex; } for (size_t i = 0; i < 64; i++) { g_pHSI_Motion->lightdata[i] = m_cSendData[i]; } if (g_pHSI_Motion->m_Led8MotionFlag[g_pHSI_Motion->m_selectedIndex]) { g_pHSI_Motion->lightdata[0] = 0x02; g_pHSI_Motion->lightdata[1] = 0x02; g_pHSI_Motion->lightdata[2] = 0x02; g_pHSI_Motion->lightdata[6] = 0x04; g_pHSI_Motion->LightSend++; Sleep(10); } else { g_pHSI_Motion->lightdata[0] = 0x02; g_pHSI_Motion->lightdata[1] = 0x02; g_pHSI_Motion->lightdata[2] = 0x02; g_pHSI_Motion->lightdata[3] = 0x36; g_pHSI_Motion->lightdata[4] = 0x04; g_pHSI_Motion->LightSend++; Sleep(10); } } } else { m_cSendData[0] = 0x02; m_cSendData[1] = 0x02; m_cSendData[2] = 0x02; m_cSendData[3] = 0x36; m_cSendData[4] = 0x04; DebugLog("UseTwentySixLight -> in 2"); HidD_SetOutputReport(m_WriteHandle, m_cSendData, m_Capabilities.OutputReportByteLength); } } break; } default: { break; } } return rStatus; } //=========================================================================== BOOL HSI_Illumination::SetLampState_So7III(int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS], bool bWait) { //六环八区灯 DebugLog("SetLampState_So7III -> in"); BOOL rStatus(TRUE); int iOffsetIndex(0); short LampValue(0); short LampMaxValue(0X1388); short LampMinValue(0X0001); BYTE cSendDataA[23] = {0x02,0x02,0x08,0XAA, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XBB }; for (int i = 0; i < _NumLamps; i++) { switch (_LampsType[i][0]) { case HSI_ILLUMINATION_LAMP_COAXIAL://3 { if (bBulbStates[HSI_ILLUMINATION_LAMP_COAXIAL][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_COAXIAL][0]); } else { LampValue = LampMinValue; } break; } case HSI_ILLUMINATION_LAMP_SURFACE: { double dMaxValue(-999.9), dTmpValue(0.0); BYTE bTmpVal(0); int iShift(0); switch (_LampsType[i][1]) { case HSI_ILLUMINATION_LAMP_CONTROL_BY_WHOLE_LAMP: { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_SURFACE][0]); } else { LampValue = LampMinValue; } for (int i = 0; i < 6; i++) { iOffsetIndex = 4 + i * 2; cSendDataA[iOffsetIndex] = (LampValue >> 8) & 0x00ff; cSendDataA[iOffsetIndex + 1] = LampValue & 0x00ff; } for (int i = 0; i < 6; i++) { iOffsetIndex = 16 + i; cSendDataA[iOffsetIndex] = 0xff; } break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_RINGS: { dMaxValue = -999.9; dTmpValue = 0.0; for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS]; if (dTmpValue > PERCENT_PRECISION) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dTmpValue); iOffsetIndex = (iRing - m_iMinRings) * 2 + 4; cSendDataA[iOffsetIndex] = (LampValue >> 8) & 0x00ff; cSendDataA[iOffsetIndex + 1] = LampValue & 0x00ff; iOffsetIndex = 16 + (m_iMaxRings - iRing); cSendDataA[iOffsetIndex] = 0xff; } } else { dTmpValue = 0.0; } } break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_OCTANTS: { dMaxValue = -999.9; dTmpValue = 0.0; bTmpVal = 0; iShift = 0; int iSector1; for (int iSector = m_iMinSectors; iSector <= m_iMaxSectors; iSector++) { iSector1 = SO7II_SECTOR_ORDER[iSector - m_iMinSectors]; //dTmpValue=Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iSector]; if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iSector1] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iSector1]; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { iOffsetIndex = 16 + (m_iMaxRings - iRing); bTmpVal = 1; iShift = (m_iMaxSectors - iSector); bTmpVal = bTmpVal << iShift; cSendDataA[iOffsetIndex] = cSendDataA[iOffsetIndex] | bTmpVal; } } } else { dTmpValue = 0.0; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } } } LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dMaxValue); for (int i = 0; i < 6; i++) { iOffsetIndex = 4 + i * 2; cSendDataA[iOffsetIndex] = (LampValue >> 8) & 0x00ff; cSendDataA[iOffsetIndex + 1] = LampValue & 0x00ff; } break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_SEGMENTS: { double dAMaxValue[6] = { -999.9, -999.9, -999.9, -999.9, -999.9, -999.9 }; dTmpValue = 0.0; bTmpVal = 0; iShift = 0; int iSector1; for (int iSector = m_iMinSectors; iSector <= m_iMaxSectors; iSector++) { iSector1 = SO7II_SECTOR_ORDER[iSector - m_iMinSectors]; for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS + iSector1] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS + iSector1]; if (dTmpValue > dAMaxValue[iRing - m_iMinRings]) { dAMaxValue[iRing - m_iMinRings] = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { iOffsetIndex = 16 + (m_iMaxRings - iRing); bTmpVal = 1; iShift = (m_iMaxSectors - iSector); bTmpVal = bTmpVal << iShift; cSendDataA[iOffsetIndex] = cSendDataA[iOffsetIndex] | bTmpVal; } } else { dTmpValue = 0.0; if (dTmpValue > dAMaxValue[iRing - m_iMinRings]) { dAMaxValue[iRing - m_iMinRings] = dTmpValue; } } } } for (int i = 0; i < 6; i++) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dAMaxValue[i]); iOffsetIndex = 4 + i * 2; cSendDataA[iOffsetIndex] = (LampValue >> 8) & 0x00ff; cSendDataA[iOffsetIndex + 1] = LampValue & 0x00ff; } break; } default: { break; } } break; } case HSI_ILLUMINATION_LAMP_PROFILE://2 { if (bBulbStates[HSI_ILLUMINATION_LAMP_PROFILE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_PROFILE][0]); } else { LampValue = LampMinValue; } break; } case HSI_ILLUMINATION_LAMP_PROFILE_OUTER://1 { if (bBulbStates[HSI_ILLUMINATION_LAMP_PROFILE_OUTER][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_PROFILE_OUTER][0]); } else { LampValue = LampMinValue; } break; } default: { break; } } } //CString strlog(""); //for (int i = 0; i < 23;i++) //{ // strlog += (CString((const char*)cSendDataA[i]) + " "); //} //DebugLog("SetLampState_So7III -> " + strlog); DWORD iSendDataLength = 23; if (g_pHSI_Motion->m_bConnected) { if (m_iSelectedIndex == 0) { DebugLog("6_8_EF3"); g_pHSI_Motion->Send_Command(m_iSelectedIndex, (const char*)cSendDataA, 64); Sleep(10); } else { DebugLog("6_8_other"); g_pHSI_Motion->m_selectedIndex = m_iSelectedIndex - 1; if (g_pHSI_Motion->m_bISUseMoreLights > 0) { for (size_t i = 0; i < 64; i++) { g_pHSI_Motion->lightdata[i] = cSendDataA[i]; } g_pHSI_Motion->LightSend++; Sleep(10); } } } else { g_pHSI_Motion->m_selectedIndex = m_iSelectedIndex; if (g_pHSI_Motion->m_bISUseMoreLights > 0) { for (size_t i = 0; i < 64; i++) { g_pHSI_Motion->lightdata[i] = cSendDataA[i]; } g_pHSI_Motion->LightSend++; Sleep(10); } } return rStatus; } //=========================================================================== BOOL HSI_Illumination::SetLampState_So7IIII(int _NumLamps, int(*_LampsType)[HSI_ILLUMINATION_MAX_BULB_TYPE], int(*bBulbStates)[HSI_ILLUMINATION_MAX_BULBS], double(*Intensities)[HSI_ILLUMINATION_MAX_BULBS], bool bWait) { //两环八区灯 DebugLog("SetLampState_So7IIII -> in"); BOOL rStatus(TRUE); int iOffsetIndex(0); short LampValue(0); short LampMaxValue(255); short LampMinValue(1); BYTE cSendDataA[9] = { 0xA1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xB1 }; UNREFERENCED_PARAMETER(bWait); for (int i = 0; i < _NumLamps; i++) { switch (_LampsType[i][0]) { case HSI_ILLUMINATION_LAMP_COAXIAL://3 { if (bBulbStates[HSI_ILLUMINATION_LAMP_COAXIAL][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_COAXIAL][0]); } else { LampValue = LampMinValue; } cSendDataA[4] = static_cast(LampValue); break; } case HSI_ILLUMINATION_LAMP_SURFACE: { double dMaxValue(-999.9), dTmpValue(0.0); BYTE bTmpVal(0); int iShift(0); if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_SURFACE][0]); } else { LampValue = LampMinValue; } cSendDataA[2] = static_cast(LampValue); switch (_LampsType[i][1]) { case HSI_ILLUMINATION_LAMP_CONTROL_BY_WHOLE_LAMP: { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_SURFACE][0]); } else { LampValue = LampMinValue; } if (m_iSo7DoubleSurface == 0) { cSendDataA[6] = (BYTE)0xff; cSendDataA[7] = (BYTE)0xff; cSendDataA[3] = static_cast(LampValue); } break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_RINGS: { dMaxValue = -999.9; dTmpValue = 0.0; for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS]; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { iOffsetIndex = iRing - m_iMinRings; if (iOffsetIndex<2) { cSendDataA[7 - iOffsetIndex] = (BYTE)0xff; } } } else { dTmpValue = 0.0; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } } } LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dMaxValue); cSendDataA[3] = static_cast(LampValue); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_OCTANTS: { dMaxValue = -999.9; dTmpValue = 0.0; bTmpVal = 0; iShift = 0; cSendDataA[6] = 0; cSendDataA[7] = 0; for (int iSector = m_iMinSectors; iSector <= m_iMaxSectors; iSector++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iSector] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iSector]; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { iOffsetIndex = iRing - m_iMinRings; bTmpVal = 1; iShift = (m_iMaxSectors - iSector); bTmpVal = bTmpVal << iShift; if (iOffsetIndex < 2) cSendDataA[7 - iOffsetIndex] = cSendDataA[7 - iOffsetIndex] | bTmpVal; } } } else { dTmpValue = 0.0; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } } } LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dMaxValue); cSendDataA[3] = static_cast(LampValue); break; } case HSI_ILLUMINATION_LAMP_CONTROL_BY_SEGMENTS: { dMaxValue = -999.9; dTmpValue = 0.0; bTmpVal = 0; iShift = 0; cSendDataA[6] = 0; cSendDataA[7] = 0; for (int iSector = m_iMinSectors; iSector <= m_iMaxSectors; iSector++) { for (int iRing = m_iMinRings; iRing <= m_iMaxRings; iRing++) { if (bBulbStates[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS + iSector] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { dTmpValue = Intensities[HSI_ILLUMINATION_LAMP_SURFACE][iRing*HSI_ILLUMINATION_MAX_SECTORS + iSector]; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } if (dTmpValue > PERCENT_PRECISION) { iOffsetIndex = (iRing - m_iMinRings); bTmpVal = 1; iShift = (m_iMaxSectors - iSector); bTmpVal = bTmpVal << iShift; if (iOffsetIndex < 2) cSendDataA[7 - iOffsetIndex] = cSendDataA[7 - iOffsetIndex] | bTmpVal; } } else { dTmpValue = 0.0; if (dTmpValue > dMaxValue) { dMaxValue = dTmpValue; } } } } LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*dMaxValue); cSendDataA[3] = static_cast(LampValue); break; } default: { break; } } break; } case HSI_ILLUMINATION_LAMP_PROFILE: { if (bBulbStates[HSI_ILLUMINATION_LAMP_PROFILE][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_PROFILE][0]); } else { LampValue = LampMinValue; } iOffsetIndex = 2 * 2 - 1; cSendDataA[1] = static_cast(LampValue); break; } case HSI_ILLUMINATION_LAMP_PROFILE_OUTER: { if (bBulbStates[HSI_ILLUMINATION_LAMP_PROFILE_OUTER][0] == HSI_ILLUMINATION_BULB_STATE_TURN_ON) { LampValue = LampMinValue + static_cast((LampMaxValue - LampMinValue)*Intensities[HSI_ILLUMINATION_LAMP_PROFILE_OUTER][0]); } else { LampValue = LampMinValue; } break; } default: { break; } } } CString ss = ""; ss = (CString)cSendDataA; DebugLog(ss); DWORD sendDataLength = 9; if (m_bRS232AOpened) { _SendA_Command((const char*)cSendDataA, sendDataLength); } DebugLog("SetLampState_So7IIII -> out"); return rStatus; } //=========================================================================== BOOL HSI_Illumination::_SendA_Command(const char* _SendData, DWORD _SendDataLength) { BOOL rStatus(FALSE); if (m_bRS232AOpened) { DWORD iWriteByte(0); iWriteByte = m_SO7_SerialA.Send(_SendData, _SendDataLength); } return rStatus; }; //=========================================================================== BOOL HSI_Illumination::So7LightII_set_light_off() { for (size_t i = 2; i < 64; i++) { m_cSendData[i] = 0; } if (g_pHSI_Motion) { if (g_pHSI_Motion->m_bConnected) { //EF3 关闭灯光 m_cSendData[0] = 2; m_cSendData[1] = 2; g_pHSI_Motion->Send_Command(0, (const char*)m_cSendData, 64); } if (g_pHSI_Motion->m_IsUseTwentySixLight == 2) { //二十六路关闭灯光 HID通信 m_cSendData[0] = 0x02; m_cSendData[1] = 0x02; m_cSendData[2] = 0x02; m_cSendData[3] = 0x36; m_cSendData[4] = 0x04; DebugLog("UseTwentySixLight -> in 2"); HidD_SetOutputReport(m_WriteHandle, m_cSendData, m_Capabilities.OutputReportByteLength); } if (g_pHSI_Motion->m_bISUseMoreLights > 0) { for (size_t i = 0; i < g_pHSI_Motion->m_bISUseMoreLights; i++) { if (g_pHSI_Motion->m_Led8MotionFlag[i]) { //8路光源板关闭灯光 for (size_t j = 0; j < 64; j++) { g_pHSI_Motion->lightdata[j] = m_cSendData[j]; } g_pHSI_Motion->lightdata[0] = 0x02; g_pHSI_Motion->lightdata[1] = 0x02; g_pHSI_Motion->lightdata[2] = 0x02; g_pHSI_Motion->lightdata[6] = 0x04; g_pHSI_Motion->m_selectedIndex = i; g_pHSI_Motion->LightSend++; Sleep(10); } else { //26路光源板关闭灯光 for (size_t i = 5; i < 64; i++) { g_pHSI_Motion->lightdata[i] = m_cSendData[i]; } g_pHSI_Motion->lightdata[0] = 0x02; g_pHSI_Motion->lightdata[1] = 0x02; g_pHSI_Motion->lightdata[2] = 0x02; g_pHSI_Motion->lightdata[3] = 0x36; g_pHSI_Motion->lightdata[4] = 0x04; g_pHSI_Motion->LightSend++; Sleep(5); } } } } Sleep(10); return TRUE; } //=========================================================================== BOOL HSI_Illumination::So7LightIII_set_light_off() { //六环八区关灯 BYTE cSendDataA[24] = { 0X02, 0X02, 0X08, 0XAA, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XBB }; DWORD iSendDataLength = 24; if (g_pHSI_Motion && (g_pHSI_Motion->m_IsUseSixRingEightArea == 1)) { if (g_pHSI_Motion->m_bConnected) { g_pHSI_Motion->Send_Command(0, (const char*)cSendDataA, 64); Sleep(5); } if (g_pHSI_Motion->m_bISUseMoreLights > 0) { for (size_t i = 0; i < g_pHSI_Motion->m_bISUseMoreLights; i++) { g_pHSI_Motion->m_selectedIndex = i; for (size_t i = 0; i < 64; i++) { g_pHSI_Motion->lightdata[i] = cSendDataA[i]; } g_pHSI_Motion->LightSend++; Sleep(5); } } } BYTE cSendDataB[9] = { 0xA1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xB1 }; iSendDataLength = 9; if (m_bRS232AOpened) { _SendA_Command((const char*)cSendDataB, iSendDataLength); } return TRUE; } //=========================================================================== HSI_STATUS HSI_Illumination::Shutdown() { auto rStatus = HSI_STATUS_NORMAL; m_iIlluminationType = HSI_ILLUMINATION_INFO_SO7_III; if (m_iIlluminationType == HSI_ILLUMINATION_INFO_SO7_III) { So7LightIII_set_light_off(); } m_iIlluminationType = HSI_ILLUMINATION_INFO_SO7_II; if (m_iIlluminationType == HSI_ILLUMINATION_INFO_SO7_II) { So7LightII_set_light_off(); } return rStatus; } //=========================================================================== VOID HSI_Illumination::EventCallback(sHSIEventProperties& sEventProp) { if (g_pHSI_Sevenocean_EF3) { g_pHSI_Sevenocean_EF3->EventCallback(sEventProp); } } void HSI_Illumination::CreateDirectorySO(CString directoryLog) { // 文件夹不存在 if (FALSE == PathFileExists(directoryLog)) { //循环创建日志文件夹 int nCout = directoryLog.Replace('\\', '/'); int findOff = 0; for (int i = 1; im_LogIsOpen[1]) return; CString strPath = ".\\Log\\"; CreateDirectorySO(strPath); CString csLogFileFullName = strPath + "\\Light.log"; if (true) { CStdioFile outFile; if (outFile.Open(csLogFileFullName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite)) { CTime _cTime = CTime::GetCurrentTime(); CString csTime = _cTime.Format("[%m/%d %H:%M:%S"); struct _timeb timebuffer; _ftime64_s(&timebuffer); //CString milTime(""); //milTime.Format("%s", timebuffer.millitm); char ch[20] = { 0 }; _itoa_s(timebuffer.millitm,ch,10); CString strTime = csTime + CString(ch); outFile.SeekToEnd();//先定位到文件尾部 outFile.WriteString(strTime + strlog); outFile.WriteString((LPCTSTR)"\n"); } else { //DoNothing(); } outFile.Close(); } } //=========================================================================== void HSI_Illumination::TestSELight(bool flag) { BYTE cSendDataA[23] = { 0x02, 0x02, 0x08, 0XAA, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XBB }; BYTE cSendDataB[23] = { 0x02, 0x02, 0x08, 0XAA, 0X02, 0XFF, 0X02, 0XFF, 0X02, 0XFF, 0X02, 0XFF, 0X02, 0XFF, 0X02, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBB }; if (g_pHSI_Motion && g_pHSI_Motion->m_bConnected && flag) { g_pHSI_Motion->Send_Command(0, (const char*)cSendDataB, 64); Sleep(10); } else { g_pHSI_Motion->Send_Command(0, (const char*)cSendDataA, 64); Sleep(10); } } //========================光源控制器USB控制================================== //26路 HID通信 //=========================================================================== bool HSI_Illumination::FindTheHID() { HIDD_ATTRIBUTES Attributes; SP_DEVICE_INTERFACE_DATA devInfoData; bool LastDevice = FALSE; int MemberIndex = 0; LONG Result; CString UsageDescription; HidD_GetHidGuid(&m_HidGuid); m_hDevInfo = SetupDiGetClassDevs(&m_HidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); devInfoData.cbSize = sizeof(devInfoData); MemberIndex = 0; LastDevice = FALSE; do { Result = SetupDiEnumDeviceInterfaces(m_hDevInfo, 0, &m_HidGuid, MemberIndex, &devInfoData); if (Result != 0) { Result = SetupDiGetDeviceInterfaceDetail(m_hDevInfo, &devInfoData, NULL, 0, &m_Length, NULL); m_detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(m_Length); m_detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); Result = SetupDiGetDeviceInterfaceDetail(m_hDevInfo, &devInfoData, m_detailData, m_Length, &m_Required, NULL); m_DeviceHandle = CreateFile(m_detailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL); Attributes.Size = sizeof(Attributes); Result = HidD_GetAttributes(m_DeviceHandle, &Attributes); m_MyDeviceDetected = FALSE; if (Attributes.VendorID == m_VendorID) { if (Attributes.ProductID == m_ProductID) { m_MyDeviceDetected = TRUE; m_MyDevicePathName = m_detailData->DevicePath; RegisterForDeviceNotifications(); GetDeviceCapabilities(); m_bSTM32UsbFlag = true; m_WriteHandle = CreateFile(m_detailData->DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL); PrepareForOverlappedTransfer(); } else { m_bSTM32UsbFlag = false; } } else { m_bSTM32UsbFlag = false; } } else { LastDevice = TRUE; m_bSTM32UsbFlag = false; } MemberIndex = MemberIndex + 1; } while ((LastDevice == FALSE) && (m_MyDeviceDetected == FALSE)); return m_bSTM32UsbFlag; } //=========================================================================== void HSI_Illumination::CloseHandles() { if (m_DeviceHandle != INVALID_HANDLE_VALUE) { CloseHandle(m_DeviceHandle); } if (m_ReadHandle != INVALID_HANDLE_VALUE) { CloseHandle(m_ReadHandle); } if (m_WriteHandle != INVALID_HANDLE_VALUE) { CloseHandle(m_WriteHandle); } } //=========================================================================== void HSI_Illumination::RegisterForDeviceNotifications() { DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface; HDEVNOTIFY DeviceNotificationHandle; DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface); DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; DevBroadcastDeviceInterface.dbcc_classguid = m_HidGuid; DeviceNotificationHandle = RegisterDeviceNotification(hWnd, &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE); } //=========================================================================== void HSI_Illumination::GetDeviceCapabilities() { PHIDP_PREPARSED_DATA PreparsedData; HidD_GetPreparsedData(m_DeviceHandle, &PreparsedData); HidP_GetCaps(PreparsedData, &m_Capabilities); HidD_FreePreparsedData(PreparsedData); } //=========================================================================== void HSI_Illumination::PrepareForOverlappedTransfer() { m_ReadHandle = CreateFile(m_detailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (m_hEventObject == 0) { m_hEventObject = CreateEvent(NULL, TRUE, TRUE, _T("")); m_HIDOverlapped.hEvent = m_hEventObject; m_HIDOverlapped.Offset = 0; m_HIDOverlapped.OffsetHigh = 0; } }