/**********************************************************************************/

        private void processDistributeEvent(oadrDistributeEventType distributeEvent)
        {
            lock (m_ven)
            {
                m_processEvents.processEvents(distributeEvent, distributeEvent.requestID, m_optType, m_ven);
            }
        }
Beispiel #2
0
        /**********************************************************/

        public void processEvents(oadrDistributeEventType distributeEvent, string requestID, eOptType optType, VEN2b ven)
        {
            List <string> eventIDs = new List <string>();     // track list of valid events from distributeEvent object

            // will use to match against our list of active events

            // validate the VTN id
            if (distributeEvent.vtnID != ven.VTNID)
            {
                // the VTN ID was invalid; remove all events and send an error message
                checkForRemovedEvents(eventIDs);

                m_callbacks.logSystemMessage("Invalid VTN ID: " + distributeEvent.vtnID, UserControls.Log.WebLogView.eWebLogMessageStatus.WARNING);

                CreatedEvent createdEvent = ven.createdEvent(requestID, 452, "Invalid ID");

                m_callbacks.processCreatedEvent(createdEvent, m_idToEvent, requestID);

                return;
            }

            // the VTN didn't send any events; clear all events we have stored
            if (distributeEvent.oadrEvent == null)
            {
                checkForRemovedEvents(eventIDs);
                m_callbacks.processCreatedEvent(null, m_idToEvent, requestID);
                return;
            }

            OptTypeType oadrOptType = (optType == eOptType.OptIn ? OptTypeType.optIn : OptTypeType.optOut);

            // send a createdEvent with an opt type of the incoming optType for all new events
            // that aren't canceled or completed.  optIn/out of cancelled and completed events as appropriate
            CreatedEventHelper createdEventHelper = new CreatedEventHelper();

            foreach (oadrDistributeEventTypeOadrEvent evt in distributeEvent.oadrEvent)
            {
                string eventID = evt.eiEvent.eventDescriptor.eventID;

                // validate that the event is for this VEN and MarketContext
                if (!eventValid(evt, ven, requestID, createdEventHelper))
                {
                    continue;
                }

                eventIDs.Add(eventID);

                if (!m_idToEvent.ContainsKey(eventID))
                {
                    processNewEvent(requestID, oadrOptType, createdEventHelper, evt);
                }
                else
                {
                    processExistingEvent(requestID, createdEventHelper, evt);
                }

                OadrEventWrapper eventWrapper = m_idToEvent[eventID];

                if (eventWrapper.RandomizedMinutes != 0)
                {
                    m_callbacks.logSystemMessage(string.Format("Event start time delayed due to start after parameter: event ID={0}, start after={1}, randomized minutes={2}",
                                                               eventWrapper.OadrEvent.eiEvent.eventDescriptor.eventID, eventWrapper.OadrEvent.eiEvent.eiActivePeriod.properties.tolerance.tolerate.startafter,
                                                               eventWrapper.RandomizedMinutes), UserControls.Log.WebLogView.eWebLogMessageStatus.INFO);
                }
            }

            // events in m_idToEvent but not in the incoming distributeEvent message must be
            // implicitly canceled
            checkForRemovedEvents(eventIDs);

            if (createdEventHelper.EventResponses.Count > 0)
            {
                CreatedEvent createdEvent = ven.createdEvent(createdEventHelper);

                m_callbacks.processCreatedEvent(createdEvent, m_idToEvent, requestID);
            }
            else
            {
                // still need to call this function to ensure the UI is updated with any event status changes
                m_callbacks.processCreatedEvent(null, m_idToEvent, requestID);
            }
        }
        public void generateOadrDistributeEvent()
        {
            oadrPayload payload = new oadrPayload();

            payload.oadrSignedObject = new oadrSignedObject();

            oadrDistributeEventType distributeEvent = new oadrDistributeEventType();

            distributeEvent.schemaVersion = "2.0b";

            distributeEvent.eiResponse                     = new EiResponseType();
            distributeEvent.eiResponse.requestID           = "";
            distributeEvent.eiResponse.responseCode        = "200";
            distributeEvent.eiResponse.responseDescription = "OK";

            distributeEvent.requestID = "OadrDisReq050214_092500_050";
            distributeEvent.vtnID     = "TH_VTN";

            payload.oadrSignedObject.Item = distributeEvent;

            distributeEvent.oadrEvent = new oadrDistributeEventTypeOadrEvent[1];

            oadrDistributeEventTypeOadrEvent oadrEvent = new oadrDistributeEventTypeOadrEvent();

            distributeEvent.oadrEvent[0] = oadrEvent;

            eiEventType eiEvent = new eiEventType();

            oadrEvent.eiEvent = eiEvent;

            eiEvent.eventDescriptor = new eventDescriptorType();

            eiEvent.eventDescriptor.eventID                       = "Event050214_092500_550_0";
            eiEvent.eventDescriptor.modificationNumber            = 0;
            eiEvent.eventDescriptor.modificationDateTime          = DateTime.ParseExact("2014-02-05T17:25:00Z", "yyyy-MM-ddTHH:mm:00Z", CultureInfo.InvariantCulture);
            eiEvent.eventDescriptor.modificationReason            = "Update";
            eiEvent.eventDescriptor.priority                      = 1;
            eiEvent.eventDescriptor.eiMarketContext               = new eventDescriptorTypeEiMarketContext();
            eiEvent.eventDescriptor.eiMarketContext.marketContext = "http://MarketContext1";
            eiEvent.eventDescriptor.createdDateTime               = DateTime.ParseExact("2014-02-05T17:25:00Z", "yyyy-MM-ddTHH:mm:00Z", CultureInfo.InvariantCulture);
            eiEvent.eventDescriptor.eventStatus                   = EventStatusEnumeratedType.completed;
            eiEvent.eventDescriptor.testEvent                     = "false";
            eiEvent.eventDescriptor.vtnComment                    = "Sample Payload";
            eiEvent.eventDescriptor.vtnComment                    = "comment";

            // active period
            eiEvent.eiActivePeriod                                     = new eiActivePeriodType();
            eiEvent.eiActivePeriod.properties                          = new properties();
            eiEvent.eiActivePeriod.properties.dtstart                  = new dtstart();
            eiEvent.eiActivePeriod.properties.dtstart.datetime         = DateTime.ParseExact("2014-02-05T17:35:00Z", "yyyy-MM-ddTHH:mm:00Z", CultureInfo.InvariantCulture);
            eiEvent.eiActivePeriod.properties.duration                 = new DurationPropType();
            eiEvent.eiActivePeriod.properties.duration.duration        = "PT5M";
            eiEvent.eiActivePeriod.properties.xeiNotification          = new DurationPropType();
            eiEvent.eiActivePeriod.properties.xeiNotification.duration = "PT1M";

            // signals
            eiEvent.eiEventSignals = new eiEventSignalsType();
            eiEvent.eiEventSignals.eiEventSignal = new eiEventSignalType[1];

            eiEventSignalType signal = new eiEventSignalType();

            signal.intervals                      = new IntervalType[1];
            signal.intervals[0]                   = new IntervalType();
            signal.intervals[0].duration          = new DurationPropType();
            signal.intervals[0].duration.duration = "PT5M";
            IntervalTypeUidUid uid = new IntervalTypeUidUid();

            uid.text = "0";
            signal.intervals[0].Item = uid;

            // signal payload
            signal.intervals[0].streamPayloadBase = new StreamPayloadBaseType[1];

            signalPayloadType val = new signalPayloadType();
            PayloadFloatType  pft = new PayloadFloatType();

            pft.value = (float)3.14;
            val.Item  = pft;
            signal.intervals[0].streamPayloadBase[0] = val;

            eiEvent.eiEventSignals.eiEventSignal[0] = signal;

            // signal type
            signal.signalName = SignalNameEnumeratedType.ELECTRICITY_PRICE.ToString();
            signal.signalType = SignalTypeEnumeratedType.price;
            signal.signalID   = "SIG_02";

            currencyType currency = new currencyType();

            currency.itemDescription = currencyItemDescriptionType.currencyPerKWh;
            currency.itemUnits       = ISO3AlphaCurrencyCodeContentType.USD;
            currency.siScaleCode     = SiScaleCodeType.none;

            signal.itemBase = currency;

            signal.currentValue = new currentValueType();
            PayloadFloatType pft2 = new PayloadFloatType();

            pft2.value = (float)0.0;
            signal.currentValue.Item = pft2;

            signal.eiTarget               = new EiTargetType();
            signal.eiTarget.resourceID    = new string[2];
            signal.eiTarget.resourceID[0] = "resource1";
            signal.eiTarget.resourceID[1] = "resource2";

            oadrEvent.oadrResponseRequired = ResponseRequiredType.always;

            string xml = SerializeOadrObject.serializeOjbect(payload, payload.GetType());

            Console.Out.WriteLine(xml);

            /*serializer = new XmlSerializer(typeof(eiEventSignalType));
             *
             * MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
             *
             * signal = (eiEventSignalType)serializer.Deserialize(ms);
             *
             * Assert.IsNotNull(signal);
             *
             * ms.Close();*/
        }