Mk3 development

This commit is contained in:
Luc 2021-05-11 08:27:34 +02:00
parent 861b9efa20
commit 5f1354db40
4 changed files with 81 additions and 30 deletions

View file

@ -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;
};

View file

@ -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);
};
}

View file

@ -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,

View file

@ -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);