protected void ProcessUnconfirmedServiceRequest(BacnetAddress adr, BacnetPduTypes type, BacnetUnconfirmedServices service, byte[] buffer, int offset, int length)
{
try
{
Trace.WriteLine("UnconfirmedServiceRequest", null);
if (OnUnconfirmedServiceRequest != null) OnUnconfirmedServiceRequest(this, adr, type, service, buffer, offset, length);
if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_I_AM && OnIam != null)
{
uint device_id;
uint max_adpu;
BacnetSegmentations segmentation;
ushort vendor_id;
if (Services.DecodeIamBroadcast(buffer, offset, out device_id, out max_adpu, out segmentation, out vendor_id) >= 0)
OnIam(this, adr, device_id, max_adpu, segmentation, vendor_id);
else
Trace.TraceWarning("Couldn't decode IamBroadcast");
}
else if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_WHO_IS && OnWhoIs != null)
{
int low_limit;
int high_limit;
if (Services.DecodeWhoIsBroadcast(buffer, offset, length, out low_limit, out high_limit) >= 0)
OnWhoIs(this, adr, low_limit, high_limit);
else
Trace.TraceWarning("Couldn't decode WhoIsBroadcast");
}
else if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_COV_NOTIFICATION && OnCOVNotification != null)
{
uint subscriberProcessIdentifier;
BacnetObjectId initiatingDeviceIdentifier;
BacnetObjectId monitoredObjectIdentifier;
uint timeRemaining;
ICollection<BacnetPropertyValue> values;
if (Services.DecodeCOVNotifyUnconfirmed(buffer, offset, length, out subscriberProcessIdentifier, out initiatingDeviceIdentifier, out monitoredObjectIdentifier, out timeRemaining, out values) >= 0)
OnCOVNotification(this, adr, 0, subscriberProcessIdentifier, initiatingDeviceIdentifier, monitoredObjectIdentifier, timeRemaining, false, values, BacnetMaxSegments.MAX_SEG0);
else
Trace.TraceWarning("Couldn't decode COVNotifyUnconfirmed");
}
else if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION && OnTimeSynchronize != null)
{
DateTime dateTime;
if (Services.DecodeTimeSync(buffer, offset, length, out dateTime) >= 0)
OnTimeSynchronize(this, adr, dateTime, false);
else
Trace.TraceWarning("Couldn't decode TimeSynchronize");
}
else if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION && OnTimeSynchronize != null)
{
DateTime dateTime;
if (Services.DecodeTimeSync(buffer, offset, length, out dateTime) >= 0)
OnTimeSynchronize(this, adr, dateTime, true);
else
Trace.TraceWarning("Couldn't decode TimeSynchronize");
}
else if (service == BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_EVENT_NOTIFICATION && OnEventNotify!=null) // F. Chaxel
{
BacnetEventNotificationData EventData;
if (Services.DecodeEventNotifyData(buffer, offset, length, out EventData) >= 0)
{
OnEventNotify(this, adr, EventData);
}
else
Trace.TraceWarning("Couldn't decode Event/Alarm Notification");
}
else
{
Trace.TraceWarning("Unconfirmed service not handled: " + service.ToString());
// SendUnConfirmedServiceReject(adr); ? exists ?
}
}
catch (Exception ex)
{
Trace.TraceError("Error in ProcessUnconfirmedServiceRequest: " + ex.Message);
}
}