From 5f1354db400b2362c08a176e9cb4fd3dcb11d719 Mon Sep 17 00:00:00 2001 From: Luc Date: Tue, 11 May 2021 08:27:34 +0200 Subject: [PATCH] Mk3 development --- MK3/MK3Base.cpp | 100 +++++++++++++++++++++++++++++++------------- MK3/MK3Base.h | 8 +++- TestMK3/Mk3Types.h | 1 + TestMK3/TestMK3.cpp | 2 + 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/MK3/MK3Base.cpp b/MK3/MK3Base.cpp index 809713d..eb71d1f 100644 --- a/MK3/MK3Base.cpp +++ b/MK3/MK3Base.cpp @@ -2,6 +2,12 @@ #include "MK3Base.h" #pragma unmanaged +HANDLE Ev1 = INVALID_HANDLE_VALUE; +void WINAPI completion(CommsHandle hComms, CompletionToken token) +{ + SetEvent(Ev1); +} + MK3::Epd2U::Epd2U(int _comport) { port = _comport; @@ -84,54 +90,82 @@ int MK3::Epd2U::StartDiscover() rv = WaitForSingleObject(Ev1, 10000); } //System::Diagnostics::Trace::WriteLine(System::String::Format("Discover DeviceCount = {0}", DeviceCount)); + return DiscRV; } -void MK3::Epd2U::Open(DWORD DeviceID) + +void MK3::Epd2U::Open(DiscoveryId DeviceID) { - CurrentDeviceID = DeviceID; + CurrentDeviceID = DeviceID.Id; if (port > 0) { - ConRV = Connect(DeviceID); - if (ConRV == 0) Error = GetErrorDetails(&ErrorSource, &ErrorReason, &ErrorData); - else { - OpenRV = OpenDevice(port, CurrentDeviceID); - if (OpenRV == 0) Error = GetErrorDetails(&ErrorSource, &ErrorReason, &ErrorData); + ConRV = Connect(epdComsHandle, DeviceID,true); + //if (ConRV == 0) Error = GetErrorDetails(&ErrorSource, &ErrorReason, &ErrorData); + //else { + Open(DeviceID); // OpenDevice(port, CurrentDeviceID); + //if (OpenRV == 0) Error = GetErrorDetails(&ErrorSource, &ErrorReason, &ErrorData); } - } + //} else { OpenRV = ConRV = 1; } } void MK3::Epd2U::Close() { - if (port > 0) CloseDevice(); + if (port > 0) { + Close();// CloseDevice(); + Disconnect(epdComsHandle); + } //DeinitComms(port); CommsInitialized = 0; } void MK3::Epd2U::DecodeFunctionFlags() { + EpdType = (FunctionFlags & 0x1F00) >> 8; } + void MK3::Epd2U::DecodeStatus() { - DetectorsOn = (OperatingStatus & 1) != 0; - EPDIssued = (OperatingStatus & 4) != 0; - EPDLocked = (OperatingStatus & 0x10) != 0; - EPDTesting = (OperatingStatus & 0x20) != 0; - EPDProcSec = (OperatingStatus & 0x40) != 0; - EPDFaulty = (OperatingStatus & 0x80) != 0; + + DetectorsOn = ((epd3status.OperatingStatus & OpStatusFlags::EpdOn)== OpStatusFlags::EpdOn) ? 1 : 0; + EPDIssued = ((epd3status.OperatingStatus & OpStatusFlags::EpdIssued)== OpStatusFlags::EpdIssued) ? 1 : 0; + EPDLocked = ((epd3status.OperatingStatus & OpStatusFlags::GainAdjustable)== OpStatusFlags::GainAdjustable) ? 0 : 1; + EPDTesting = ((epd3status.OperatingStatus & OpStatusFlags::DetectorTestRequested)== OpStatusFlags::DetectorTestRequested) ? 1 : 0; + EPDFaulty = ((epd3status.FaultStatus & FaultStatusFlags::EpdFaulty) == FaultStatusFlags::EpdFaulty) ? 1 : 0; - EPDNewFault = (ErrorStatus & 1) != 0; - EPDComFault = (ErrorStatus & 2) != 0; - EPDCalFault = (ErrorStatus & 4) != 0; - EPDDetFault = (ErrorStatus & 8) != 0; - EPDEprFault = (ErrorStatus & 0x10) != 0; - EPDTrhFault = (ErrorStatus & 0x20) != 0; - EPDOthFault = (ErrorStatus & 0x80) != 0; - AlarmDoseHP101G = (AlarmStatus & 1) != 0; - AlarmDoseHP102G = (AlarmStatus & 2) != 0; - AlarmDoseHP07N = (AlarmStatus & 4) != 0; - AlarmRateHP101G = (AlarmStatus & 8) != 0;; - AlarmRateHP102G = (AlarmStatus & 0x10) != 0; - AlarmRateHP07N = (AlarmStatus & 0x20) != 0; + //DetectorsOn = (OperatingStatus & 1) != 0; + //EPDIssued = (OperatingStatus & 4) != 0; + //EPDLocked = (OperatingStatus & 0x10) != 0; + //EPDTesting = (OperatingStatus & 0x20) != 0; + //EPDProcSec = (OperatingStatus & 0x40) != 0; + //EPDFaulty = (OperatingStatus & 0x80) != 0; + + EPDNewFault = ((epd3status.FaultStatus & FaultStatusFlags::EpdFaulty)== FaultStatusFlags::EpdFaulty) ? 1 : 0; + EPDComFault = ((epd3status.FaultStatus & FaultStatusFlags::EarlyCommsTermination) == FaultStatusFlags::EarlyCommsTermination) ? 1 : 0; + EPDCalFault = ((epd3status.FaultStatus & FaultStatusFlags::NotCalibrated) == FaultStatusFlags::NotCalibrated) ? 1 : 0; + EPDDetFault = ((epd3status.FaultStatus & FaultStatusFlags::DetectorTestFail) == FaultStatusFlags::DetectorTestFail) ? 1 : 0; + EPDEprFault = ((epd3status.FaultStatus & FaultStatusFlags::EepromFailure) == FaultStatusFlags::EepromFailure) ? 1 : 0; + EPDTrhFault = ((epd3status.FaultStatus & FaultStatusFlags::BadThreshold) == FaultStatusFlags::BadThreshold) ? 1 : 0; + + + + for (int ix =0; ix < 4;ix++ ) + { + DoseAlarmFlags status = epd3status.DoseAlarms[ix].Status; + switch ( (MeasurementId) epd3status.DoseAlarms[ix].Id) + { + case MeasurementId::Meas_Hp07: + case MeasurementId::Meas_Hp10N: + AlarmDoseHP07N = (status & DoseAlarmFlags::DoseAlarm) == DoseAlarmFlags::DoseAlarm ? 1 : 0; + AlarmRateHP07N = (status & DoseAlarmFlags::RateAlarm) == DoseAlarmFlags::RateAlarm ? 1 : 0; + break; + case MeasurementId::Meas_Hp10: + case MeasurementId::Meas_Hp10G: + AlarmDoseHP101G = (status & DoseAlarmFlags::DoseAlarm) == DoseAlarmFlags::DoseAlarm ? 1 : 0; + AlarmDoseHP102G = AlarmDoseHP101G; + AlarmRateHP101G = (status & DoseAlarmFlags::RateAlarm) == DoseAlarmFlags::RateAlarm ? 1 : 0; + AlarmRateHP102G = AlarmRateHP101G; + break; + } //OtherAlarm OtherAlarmRateHp101G = (OtherAlarms & 1) != 0; @@ -145,6 +179,14 @@ void MK3::Epd2U::DecodeStatus() } WORD MK3::Epd2U::ReadStatus() { + int32_t r; + ResetEvent(Ev1); + token = BeginReadStatus(epdComsHandle, completion); + r = Commit(epdComsHandle); + r = WaitForSingleObject(Ev1, 10000); // no time-out interval + r = EndReadStatus(epdComsHandle, token, &epd3status); + + Error = 0; ReadStatusRV = 0; memset(WearerID, 0, WearerIDLength + 1); memset(WearerName, 0, WearerNameLength + 1); @@ -161,7 +203,7 @@ WORD MK3::Epd2U::ReadStatus() return 1; } - CommitRV = ReadEpdStatus(&EpdClock, &RealTime, &IssueCount, &OffTime, &OperatingStatus, &ErrorStatus, &AlarmStatus, &OtherAlarms, &EEPROMBadSectors); + CommitRV = ReadEpdStatus(&EpdClock, &RealTime, &IssueCount, &OffTime, &OperatingStatus, &ErrorStatus, &AlarmStatus, &OtherAlarms, &EEPROMBadSectors); if (port == 0) { EpdClock = 123; ErrorStatus = 0; }; diff --git a/MK3/MK3Base.h b/MK3/MK3Base.h index d438879..27243e5 100644 --- a/MK3/MK3Base.h +++ b/MK3/MK3Base.h @@ -215,7 +215,7 @@ namespace MK3 BYTE byStatus4; int StartDiscover(); - void Open(DWORD DeviceID); + void Open(DiscoveryId DeviceID); void Close(); void DecodeFunctionFlags(); @@ -241,9 +241,15 @@ namespace MK3 WORD Issue(); ~Epd2U(); + + StatusData_t epd3status; + static HANDLE Ev1 ; static Epd2U* current; static void WINAPI discovery (CommsHandle hComms, DiscoveryId const discovered[], int32_t count); + + + }; } diff --git a/TestMK3/Mk3Types.h b/TestMK3/Mk3Types.h index 16bf652..b673d9d 100644 --- a/TestMK3/Mk3Types.h +++ b/TestMK3/Mk3Types.h @@ -238,6 +238,7 @@ typedef struct uint16_t DataLength; uint8_t Data[MAX_GRAPHIC_BYTES]; } GraphicBitmap_t; + enum class OpStatusFlags : uint32_t { EpdOn = 0x0001, EpdIssued = 0x0002, diff --git a/TestMK3/TestMK3.cpp b/TestMK3/TestMK3.cpp index 200f65a..67ab080 100644 --- a/TestMK3/TestMK3.cpp +++ b/TestMK3/TestMK3.cpp @@ -62,6 +62,8 @@ void GetEPD() r = WaitForSingleObject(Ev1, 10000); // no time-out interval std::cout << "got status\n"; r = EndReadStatus(epdComsHandle, token, &status); + + ResetEvent(Ev1); token = BeginReadDoses(epdComsHandle, new uint8_t[]{0, 1}, 2, completion); r = Commit(epdComsHandle);