-PRMasterAPI
public class PRMasterAPI
{
public PRMasterAPI()
{
prMaster.OnMonitoringEvent += PrMaster_OnMonitoringEvent;
}
private void PrMaster_OnMonitoringEvent(DateTime date, DateTime time, int networkID, int readerID, int userID, int groupID, int eventCode, int zoneID, int TandAID, string strEvent, string strAccessPoint, string strUserSource, string strGroup, string strNetwork, string strZone, string strTandAMode)
{
Debug.WriteLine("NEW EVENT =============");
}
public readonly PRMaster.PRMasterAutomation prMaster = new PRMaster.PRMasterAutomation();
public bool Login(string userName, string password)
{
bool loginSuccess = prMaster.Login(userName, password);
return loginSuccess;
}
public interface ISKD
{
string UniqueID { get; }
string SystemName { get; }
void Initialize();
void Initialize(string Login, string Password);
IEnumerable<ISKDArea> Areas { get; }
IEnumerable<ISKDReader> Readers { get; }
IEnumerable<ISKDReaderState> GetReaderStates();
event EventHandler<DoorStateChangedEventArgs> DoorStateChanged;
}
-SecurityRogerRacs4 : ISDK
public class SecurityRogerRacs4 : ISKD
{
private Roger.PRMasterAPI prMaster;
public event EventHandler<DoorStateChangedEventArgs> DoorStateChanged;
public SecurityRogerRacs4()
{
prMaster = new Roger.PRMasterAPI();
SystemName = "ROGER PR Master RACS4";
}
public string UniqueID { get; private set; }
public string SystemName { get; private set; }
public void Initialize()
{
prMaster.Login("Admin", "");
}
public void Initialize(string Login, string Password)
{
prMaster.Login(Login, Password);
}
public IEnumerable<ISKDArea> Areas
{
get
{
return prMaster.GetZones().Select(x => new RACS4_Area(x, this));
}
}
public IEnumerable<ISKDReader> Readers
{
get
{
List<ISKDReader> skdReaders = new List<ISKDReader>();
var areas = prMaster.GetZones();
var readers = prMaster.GetReaders();
foreach (var reader in readers)
{
RACS4_Reader newReader = new RACS4_Reader(reader, this);
Debug.WriteLine(reader.Name + ": " + reader.ZoneID);
var area = (reader.ZoneID.HasValue && areas.FirstOrDefault(a => a.ZoneID == reader.ZoneID.Value) != null) ? areas.FirstOrDefault(a => a.ZoneID == reader.ZoneID.Value) : null;
if (area != null)
newReader.Area = new RACS4_Area(area, this);
skdReaders.Add(newReader);
}
return skdReaders;
}
}
public IEnumerable<ISKDReaderState> GetReaderStates()
{
List<ISKDReaderState> states = new List<ISKDReaderState>();
var readers = Readers;
Dictionary<ISKDReader, Roger.Definitions.EventCache[]> ConEv = prMaster
.GetEventsHistory()
.GroupBy(x => x.ECReaderID)
.Select(x => new
{
Reader = readers.FirstOrDefault(reader => x.Key.HasValue && (reader.SystemObject as Roger.Definitions.Reader).ReaderID.Value == x.Key.Value),
Events = x.ToArray()
})
.Where(x => x.Reader != null)
.ToDictionary(x => x.Reader, x => x.Events);
foreach (var c in ConEv)
{
eDoorState state = eDoorState.Undefined;
eDoorMode mode = eDoorMode.Undefined;
foreach (var e in c.Value)
{
switch (e.ECCode)
{
case Roger.Definitions.EventCache.eECCode.DoorClosed:
state = eDoorState.Closed;
break;
case Roger.Definitions.EventCache.eECCode.DoorOpened:
state = eDoorState.Opened;
break;
case Roger.Definitions.EventCache.eECCode.DoorModeSwitchedToBlocked:
mode = eDoorMode.Blocked;
break;
case Roger.Definitions.EventCache.eECCode.DoorModeSwitchedToCondUnblocked:
mode = eDoorMode.Unblocked;
break;
case Roger.Definitions.EventCache.eECCode.DoorModeSwitchedToNormal:
mode = eDoorMode.Normal;
break;
case Roger.Definitions.EventCache.eECCode.DoorModeSwitchedToUnlocked:
mode = eDoorMode.Unblocked;
break;
}
}
states.Add(
new RACS4_ReaderState(
c.Key,
state,
mode
));
}
return states;
}
-MainWindows.xaml.cs
public MainWindow()
{
InitializeComponent();
roger.Initialize("ADMIN", "");
}
ISKD roger = new IntegrationSystems.SecurityRogerRacs4();
Ten kod wykonuje się dobrze w każdym momencie prawidłowo, więc nie tracę połączenia:
-MainWindows.xaml.cs
private void h6_Click(object sender, RoutedEventArgs e)
{
hList.Items.Clear();
hList.Items.Add("Stan drzwi: ");
foreach (var c in roger.GetReaderStates())
{
hList.Items.Add("---------------------------");
hList.Items.Add("Nazwa: " + c.ReaderName);
hList.Items.Add("Status: " + c.DoorState.ToString());
hList.Items.Add("Tryb: " + c.DoorMode.ToString());
hList.Items.Add("Strefa: " + c.Area.AreaName);
hList.Items.Add("ID: " + c.UniqueID);
}
}
Dziwi mnie jeszcze jedna rzecz. Niezależnie od tego, ile razy otworzę i zamknę drzwi, a za każdym razem powinien być wywołany event, wyjątek dostaję tylko raz.