using LibrarySDR.Enums; using LibrarySDR.Requests; using LibrarySDR.Responses; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LibrarySDR { public class SDSMessageDecoder { private PDUType pduType; public PDUType PduType { get { return pduType; } } private String payload; public String Payload { get { return payload; } } public static Int64 GatewayISSI; public Header header; public SDSMessageDecoder() { } public SDSMessageDecoder Decode(String hexResponse) { header = new Header(hexResponse); try { if (hexResponse.Length > 10) pduType = (PDUType)Convert.ToInt16(hexResponse.Substring(8, 2), 16); else pduType = PDUType.LIFE_SIGN_RESP; } catch(FormatException ex) { pduType = PDUType.BAD_FORMATTED; } // all other characters are from the payload if (pduType != PDUType.LIFE_SIGN_RESP || pduType != PDUType.BAD_FORMATTED) payload = hexResponse.Substring(10); switch (PduType) { case PDUType.REGISTER_RESP: { // parse the payload RegisterResponse reqResp = new RegisterResponse(Payload); // fire event OnRegisterResponseReceived?.Invoke(reqResp); break; } case PDUType.DATA_REQ_RESP: { // parse the payload SimpleTextSDSRequest textResp = new SimpleTextSDSRequest(Payload); switch(textResp.ProtocolIdentifier) { case ProtocolIdentifier.GPS: { OnLIPLocationReceived?.Invoke(textResp); break; } case ProtocolIdentifier.SimpleTextUsingSDSTL: case ProtocolIdentifier.ImmediateTextUsingSDSTL: { OnSimpleTextSDSReceived?.Invoke(textResp); break; } } break; } case PDUType.REPORT_REQ_RESP: { GwSDSReportResponse reportResoponse = new GwSDSReportResponse(Payload); // fire event OnReportReceived?.Invoke(reportResoponse); break; } case PDUType.STATUS_REQ_RESP: { StatusResponse statusResponse = new StatusResponse(Payload); if (statusResponse.DestinationISSI != GatewayISSI) OnEmergencyReceived?.Invoke(statusResponse); else // fire event OnStatusResponseReceived?.Invoke(statusResponse); break; } case PDUType.GROUP_MONITOR_EXT_RESP: { GroupMonitorExtResponse reqResp = new GroupMonitorExtResponse(Payload); // fire event OnGroupMonitorExtResponseReceived?.Invoke(reqResp); break; } case PDUType.LIFE_SIGN_RESP: { // parse the payload LifeSignResponse reqResp = new LifeSignResponse(Payload); // fire event OnLifeSignResponseReceived?.Invoke(); break; } case PDUType.GW_STATUS_REPORT_RESP: { GwStatusReportResponse gwStatusReportResponse = new GwStatusReportResponse(Payload); // fire event OnGwStatusReportResponseReceived?.Invoke(gwStatusReportResponse); break; } } return this; } #region EVENTS public delegate void ReportReceived(GwSDSReportResponse response); public event ReportReceived OnReportReceived; public delegate void StatusResponseReceived(StatusResponse response); public event StatusResponseReceived OnStatusResponseReceived; public delegate void GroupMonitorExtResponseReceived(GroupMonitorExtResponse response); public event GroupMonitorExtResponseReceived OnGroupMonitorExtResponseReceived; public delegate void GwStatusReportResponseReceived(GwStatusReportResponse response); public event GwStatusReportResponseReceived OnGwStatusReportResponseReceived; public delegate void SimpleTextSDSReceived(SimpleTextSDSRequest response); public event SimpleTextSDSReceived OnSimpleTextSDSReceived; public delegate void EmergencyReceived(StatusResponse response); public event EmergencyReceived OnEmergencyReceived; public delegate void LIPLocationReceived(SimpleTextSDSRequest response); public event LIPLocationReceived OnLIPLocationReceived; public delegate void RegisterResponseReceived(RegisterResponse response); public event RegisterResponseReceived OnRegisterResponseReceived; public delegate void LifeSignResponseReceived(); public event LifeSignResponseReceived OnLifeSignResponseReceived; #endregion } }