public RSMP_Messages.AggregatedStatus CreateAndSendAggregatedStatusMessage(cRoadSideObject RoadSideObject, bool bCreateMessageOnly, out string sSendBuffer) { sSendBuffer = ""; RSMP_Messages.AggregatedStatus AggregatedStatusMessage = new RSMP_Messages.AggregatedStatus(); AggregatedStatusMessage.mType = "rSMsg"; AggregatedStatusMessage.type = "AggregatedStatus"; AggregatedStatusMessage.mId = System.Guid.NewGuid().ToString(); AggregatedStatusMessage.ntsOId = RoadSideObject.sNTSObjectId; AggregatedStatusMessage.xNId = RoadSideObject.sExternalNTSId; AggregatedStatusMessage.cId = RoadSideObject.sComponentId; if (RoadSideObject.dtLastChangedAggregatedStatus == DateTime.MinValue) { RoadSideObject.dtLastChangedAggregatedStatus = DateTime.Now; } AggregatedStatusMessage.aSTS = CreateISO8601UTCTimeStamp(RoadSideObject.dtLastChangedAggregatedStatus); AggregatedStatusMessage.fP = RoadSideObject.sFunctionalPosition.Length > 0 ? RoadSideObject.sFunctionalPosition : null; AggregatedStatusMessage.fS = RoadSideObject.sFunctionalState.Length > 0 ? RoadSideObject.sFunctionalState : null; AggregatedStatusMessage.se = (bool[])RoadSideObject.bBitStatus.Clone(); for (int iIndex = 0; iIndex < RoadSideObject.bBitStatus.GetLength(0); iIndex++) { AggregatedStatusMessage.se[iIndex] = RoadSideObject.bBitStatus[iIndex]; } sSendBuffer = JSonSerializer.SerializeObject(AggregatedStatusMessage); if (bCreateMessageOnly) { return(AggregatedStatusMessage); } if (RSMPGS.JSon.SendJSonPacket(AggregatedStatusMessage.type, AggregatedStatusMessage.mId, sSendBuffer, true)) { if (RSMPGS.MainForm.checkBox_ViewOnlyFailedPackets.Checked == false) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Sent aggregated status message, ntsOId: " + AggregatedStatusMessage.ntsOId + ", Type: " + AggregatedStatusMessage.type + ", MsgId: " + AggregatedStatusMessage.mId); } } else { if (cHelper.IsSettingChecked("BufferAndSendAggregatedStatusWhenConnect")) { cBufferedMessage BufferedMessage = new cBufferedMessage(cBufferedMessage.eMessageType.AggregatedStatus, AggregatedStatusMessage.type, AggregatedStatusMessage.mId, sSendBuffer); RSMPGS.MainForm.AddBufferedMessageToListAndListView(BufferedMessage); RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Warning, "Buffered aggregated status message, ntsOId: " + AggregatedStatusMessage.ntsOId + ", Type: " + AggregatedStatusMessage.type + ", MsgId: " + AggregatedStatusMessage.mId); } } return(AggregatedStatusMessage); }
private bool DecodeAndParseAggregatedStatusMessage(RSMP_Messages.Header packetHeader, string sJSon, bool bUseStrictProtocolAnalysis, bool bUseCaseSensitiveIds, ref bool bHasSentAckOrNack, ref string sError) { StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; bool bSuccess = false; try { RSMP_Messages.AggregatedStatus AggregatedStatus = JSonSerializer.Deserialize <RSMP_Messages.AggregatedStatus>(sJSon); cRoadSideObject RoadSideObject = cHelper.FindRoadSideObject(AggregatedStatus.ntsOId, AggregatedStatus.cId, bUseCaseSensitiveIds); if (RoadSideObject != null) { RoadSideObject.bBitStatus = AggregatedStatus.se; RoadSideObject.sFunctionalPosition = AggregatedStatus.fP; RoadSideObject.sFunctionalState = AggregatedStatus.fS; cAggregatedStatusEvent AggregatedStatusEvent = new cAggregatedStatusEvent(); AggregatedStatusEvent.sTimeStamp = UnpackISO8601UTCTimeStamp(AggregatedStatus.aSTS); AggregatedStatusEvent.sMessageId = AggregatedStatus.mId; AggregatedStatusEvent.sFunctionalPosition = AggregatedStatus.fP; AggregatedStatusEvent.sFunctionalState = AggregatedStatus.fS; for (int i = 1; i < AggregatedStatus.se.Length + 1; i++) { AggregatedStatusEvent.sBitStatus += "B" + i + ": " + AggregatedStatus.se[i - 1] + " | "; } AggregatedStatusEvent.sBitStatus.Trim(); if (RSMPGS_Main.bWriteEventsContinous) { RSMPGS.SysLog.EventLog("AggregatedStatus;{0}\tMId: {1}\tComponentId: {2}\tBitStatus: {3}\tFuncPos: {4}\tFunkState: {5}", AggregatedStatusEvent.sTimeStamp, AggregatedStatusEvent.sMessageId, AggregatedStatus.cId, AggregatedStatusEvent.sBitStatus, AggregatedStatusEvent.sFunctionalPosition, AggregatedStatusEvent.sFunctionalState); } RoadSideObject.AggregatedStatusEvents.Add(AggregatedStatusEvent); RSMPGS.MainForm.HandleAggregatedStatusListUpdate(RoadSideObject, AggregatedStatusEvent); bSuccess = true; } if (bSuccess == false) { sError = "Failed to update AggregatedStatus, could not find object, ntsOId: '" + AggregatedStatus.ntsOId + "', cId: '" + AggregatedStatus.cId + "'"; } } catch (Exception e) { sError = "Failed to deserialize packet: " + e.Message; bSuccess = false; } return(bSuccess); }
private void button_BufferedMessages_CreateRandom_Click(object sender, EventArgs e) { if (comboBox_BufferedMessages_CreateRandom_Type.SelectedIndex < 0) { return; } int iMessageCount; if (Int32.TryParse(textBox_CreateRandomMessages_Count.Text, out iMessageCount) == false || iMessageCount > 30000) { MessageBox.Show("Invalid number or too many messages (>30000)", "Create buffered messages", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (iMessageCount <= 0) { return; } Cursor.Current = Cursors.WaitCursor; Application.DoEvents(); List <cAlarmObject> AlarmObjects = new List <cAlarmObject>(); List <cStatusReturnValue> StatusReturnValues = new List <cStatusReturnValue>(); List <cStatusReturnValue> ValidStatusReturnValues = new List <cStatusReturnValue>(); List <cRoadSideObject> AggregatedStatusRoadSideObjects = new List <nsRSMPGS.cRoadSideObject>(); foreach (cRoadSideObject RoadSideObject in RSMPGS.ProcessImage.RoadSideObjects.Values) { AlarmObjects.AddRange(RoadSideObject.AlarmObjects); foreach (cStatusObject StatusObject in RoadSideObject.StatusObjects) { StatusReturnValues.AddRange(StatusObject.StatusReturnValues); ValidStatusReturnValues.AddRange(StatusObject.StatusReturnValues.FindAll(srv => srv.Value.Quality == cValue.eQuality.recent)); } if (RoadSideObject.bIsComponentGroup) { AggregatedStatusRoadSideObjects.Add(RoadSideObject); } } Random rnd = new Random(); ListView_BufferedMessages.StopSorting(); ListView_BufferedMessages.BeginUpdate(); // RSMPGS.ProcessImage.AggregatedStatusObjects string sSendBuffer; for (int iIndex = 0; iIndex < iMessageCount; iIndex++) { switch (comboBox_BufferedMessages_CreateRandom_Type.SelectedIndex) { case 0: if (AlarmObjects.Count > 0) { cAlarmObject AlarmObject = AlarmObjects[rnd.Next(0, AlarmObjects.Count - 1)]; cJSon.AlarmSpecialisation alarmSpecialisation = new cJSon.AlarmSpecialisation[] { cJSon.AlarmSpecialisation.Acknowledge, cJSon.AlarmSpecialisation.Issue, cJSon.AlarmSpecialisation.Suspend }[rnd.Next(0, 2)]; RSMP_Messages.AlarmHeaderAndBody alarmHeaderAndBody = RSMPGS.JSon.CreateAndSendAlarmMessage(AlarmObject, alarmSpecialisation, true, out sSendBuffer); cBufferedMessage BufferedMessage = new cBufferedMessage(cBufferedMessage.eMessageType.Alarm, alarmHeaderAndBody.type, alarmHeaderAndBody.mId, sSendBuffer); AddBufferedMessageToListAndListView(BufferedMessage); } break; case 1: if (AggregatedStatusRoadSideObjects.Count > 0) { cRoadSideObject RoadSideObject = AggregatedStatusRoadSideObjects[rnd.Next(0, AggregatedStatusRoadSideObjects.Count - 1)]; RSMP_Messages.AggregatedStatus aggregatedStatus = RSMPGS.JSon.CreateAndSendAggregatedStatusMessage(RoadSideObject, true, out sSendBuffer); cBufferedMessage BufferedMessage = new cBufferedMessage(cBufferedMessage.eMessageType.AggregatedStatus, aggregatedStatus.type, aggregatedStatus.mId, sSendBuffer); AddBufferedMessageToListAndListView(BufferedMessage); } break; case 2: if (StatusReturnValues.Count > 0) { cStatusReturnValue StatusReturnValue = StatusReturnValues[rnd.Next(0, StatusReturnValues.Count - 1)]; List <RSMP_Messages.Status_VTQ> sS = new List <RSMP_Messages.Status_VTQ>(); RSMP_Messages.Status_VTQ s = new RSMP_Messages.Status_VTQ(); s.sCI = StatusReturnValue.StatusObject.sStatusCodeId; s.n = StatusReturnValue.sName; s.q = StatusReturnValue.Value.Quality.ToString(); s.s = StatusReturnValue.Value.Quality == cValue.eQuality.unknown ? null : StatusReturnValue.Value.GetValue(); sS.Add(s); RSMP_Messages.StatusUpdate statusUpdate = RSMPGS.JSon.CreateAndSendStatusUpdateMessage(StatusReturnValue.StatusObject.RoadSideObject, sS, true, out sSendBuffer); cBufferedMessage BufferedMessage = new cBufferedMessage(cBufferedMessage.eMessageType.Status, statusUpdate.type, statusUpdate.mId, sSendBuffer); AddBufferedMessageToListAndListView(BufferedMessage); } break; case 3: if (ValidStatusReturnValues.Count > 0) { cStatusReturnValue StatusReturnValue = ValidStatusReturnValues[rnd.Next(0, ValidStatusReturnValues.Count - 1)]; List <RSMP_Messages.Status_VTQ> sS = new List <RSMP_Messages.Status_VTQ>(); RSMP_Messages.Status_VTQ s = new RSMP_Messages.Status_VTQ(); s.sCI = StatusReturnValue.StatusObject.sStatusCodeId; s.n = StatusReturnValue.sName; s.q = StatusReturnValue.Value.Quality.ToString(); s.s = StatusReturnValue.Value.Quality == cValue.eQuality.unknown ? null : StatusReturnValue.Value.GetValue(); sS.Add(s); RSMP_Messages.StatusUpdate statusUpdate = RSMPGS.JSon.CreateAndSendStatusUpdateMessage(StatusReturnValue.StatusObject.RoadSideObject, sS, true, out sSendBuffer); cBufferedMessage BufferedMessage = new cBufferedMessage(cBufferedMessage.eMessageType.Status, statusUpdate.type, statusUpdate.mId, sSendBuffer); AddBufferedMessageToListAndListView(BufferedMessage); } break; } //cBufferedMessage //AddBufferedMessageToListAndListView(cBufferedMessage BufferedMessage) } ListView_BufferedMessages.EndUpdate(); ListView_BufferedMessages.ResumeSorting(); Cursor.Current = Cursors.Default; }