コード例 #1
0
ファイル: QiClient.cs プロジェクト: CodosaurusRex/Qi-Samples
 /// <summary>
 /// Updates a stream's definition
 /// </summary>
 /// <param name="streamDef">Updated definition</param>
 /// <returns>void</returns>
 public async Task UpdateStreamAsync(QiStream streamDef)
 {
     await UpdateQiObject <QiStream>(_baseUrl + RestSampleStrings.StreamsBaseUrl + @"/" + streamDef.Id, streamDef);
 }
コード例 #2
0
ファイル: QiClient.cs プロジェクト: CodosaurusRex/Qi-Samples
 /// <summary>
 /// Create a stream on the target Qi Service
 /// </summary>
 /// <param name="streamDef">QiStream object with name, Id, type</param>
 /// <returns>void</returns>
 public async Task <string> CreateStreamAsync(QiStream streamDef)
 {
     return(await CreateQiObjectAsync <QiStream>(_baseUrl + RestSampleStrings.StreamsBaseUrl, streamDef));
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: CodosaurusRex/Qi-Samples
        public static void Main(string[] args)
        {
            // Instantiate the REST client
            Console.WriteLine("Creating a Qi REST API Client...");
            string   server   = Constants.QiServerUrl;
            QiClient qiclient = new QiClient(server);
            QiType   evtType  = null;

            try
            {
                // create types for int and double, then create properties for all the WaveData properties
                Console.WriteLine("Creating a Qi type for WaveData instances");
                QiType intType = new QiType();
                intType.Id         = "intType";
                intType.QiTypeCode = QiTypeCode.Int32;

                QiType doubleType = new QiType();
                doubleType.Id         = "doubleType";
                doubleType.QiTypeCode = QiTypeCode.Double;

                QiTypeProperty orderProperty = new QiTypeProperty();
                orderProperty.Id     = "Order";
                orderProperty.QiType = intType;
                orderProperty.IsKey  = true;

                QiTypeProperty tauProperty = new QiTypeProperty();
                tauProperty.Id     = "Tau";
                tauProperty.QiType = doubleType;

                QiTypeProperty radiansProperty = new QiTypeProperty();
                radiansProperty.Id     = "Radians";
                radiansProperty.QiType = doubleType;

                QiTypeProperty sinProperty = new QiTypeProperty();
                sinProperty.Id     = "Sin";
                sinProperty.QiType = doubleType;

                QiTypeProperty cosProperty = new QiTypeProperty();
                cosProperty.Id     = "Cos";
                cosProperty.QiType = doubleType;

                QiTypeProperty tanProperty = new QiTypeProperty();
                tanProperty.Id     = "Tan";
                tanProperty.QiType = doubleType;

                QiTypeProperty sinhProperty = new QiTypeProperty();
                sinhProperty.Id     = "Sinh";
                sinhProperty.QiType = doubleType;

                QiTypeProperty coshProperty = new QiTypeProperty();
                coshProperty.Id     = "cosh";
                coshProperty.QiType = doubleType;

                QiTypeProperty tanhProperty = new QiTypeProperty();
                tanhProperty.Id     = "Tanh";
                tanhProperty.QiType = doubleType;

                // Create a QiType for our WaveData class; the metadata proeprties are the ones we just created
                QiType type = new QiType();
                type.Name        = "WaveData";
                type.Id          = "WaveDataType";
                type.Description = "This is a type for WaveData events";
                QiTypeProperty[] props = { orderProperty, tauProperty, radiansProperty, sinProperty, cosProperty, tanProperty, sinhProperty, coshProperty, tanhProperty };
                type.Properties = props;

                //used when working against the local devonebox
                //ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
                // create the type in the Qi Service
                string evtTypeString = qiclient.CreateTypeAsync(type).Result;
                evtType = JsonConvert.DeserializeObject <QiType>(evtTypeString);

                // create a stream named evtStream
                Console.WriteLine("Creating a stream in this tenant for simple event measurements");
                QiStream stream          = new QiStream("evtStream", evtType.Id);
                string   evtStreamString = qiclient.CreateStreamAsync(stream).Result;
                QiStream evtStream       = JsonConvert.DeserializeObject <QiStream>(evtStreamString);

                #region CRUD operations
                #region Create (Insert)

                Console.WriteLine("Artificially generating 100 events and inserting them into the Qi Service");

                // How to insert a single event
                TimeSpan span = new TimeSpan(0, 1, 0);
                WaveData evt  = WaveData.Next(span, 2.0, 0);

                qiclient.CreateEventAsync("evtStream", JsonConvert.SerializeObject(evt)).Wait();

                // how to insert an a collection of events
                List <WaveData> events = new List <WaveData>();
                for (int i = 2; i < 200; i += 2)
                {
                    evt = WaveData.Next(span, 2.0, i);
                    events.Add(evt);
                    Thread.Sleep(400);
                }

                qiclient.CreateEventsAsync("evtStream", JsonConvert.SerializeObject(events)).Wait();
                Thread.Sleep(2000);

                #endregion

                #region Retrieve events
                Console.WriteLine("Retrieving the inserted events");
                Console.WriteLine("==============================");
                string     jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                WaveData[] foundEvents = JsonConvert.DeserializeObject <WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region Update events
                Console.WriteLine();
                Console.WriteLine("Updating values");

                // take the first value inserted and update
                evt = foundEvents.First <WaveData>();
                evt = WaveData.Next(span, 4.0, 0);
                qiclient.UpdateValueAsync("evtStream", JsonConvert.SerializeObject(evt)).Wait();

                // update the remaining events (same span, multiplier, order)
                List <WaveData> newEvents = new List <WaveData>();
                foreach (WaveData evnt in events)
                {
                    WaveData newEvt = WaveData.Next(span, 4.0, evnt.Order);
                    newEvents.Add(newEvt);
                    Thread.Sleep(500);
                }

                qiclient.UpdateValuesAsync("evtStream", JsonConvert.SerializeObject(events)).Wait();
                Thread.Sleep(2000);

                // check the results
                Console.WriteLine("Retrieving the updated values");
                Console.WriteLine("=============================");
                jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                foundEvents = JsonConvert.DeserializeObject <WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region stream behavior

                // illustrate how stream behaviors modify retrieval
                // First, pull three items back with GetRangeValuesAsync for range values between events.
                // The default behavior is continuous, so ExactOrCalculated should bring back interpolated values
                Console.WriteLine();
                Console.WriteLine(@"Retrieving three events without a stream behavior");
                jCollection = qiclient.GetRangeValuesAsync("evtStream", "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).Result;
                foundEvents = JsonConvert.DeserializeObject <WaveData[]>(jCollection);
                DumpEvents(foundEvents);

                // now, create a stream behavior with Discrete and attach it to the existing stream
                QiStreamBehavior behavior = new QiStreamBehavior();
                behavior.Id   = "evtStreamStepLeading";
                behavior.Mode = QiStreamMode.StepwiseContinuousLeading;
                string behaviorString = qiclient.CreateBehaviorAsync(behavior).Result;
                behavior = JsonConvert.DeserializeObject <QiStreamBehavior>(behaviorString);

                // update the stream to include this behavior
                evtStream.BehaviorId = behavior.Id;
                qiclient.UpdateStreamAsync(evtStream).Wait();

                // repeat the retrieval
                Console.WriteLine();
                Console.WriteLine("Retrieving three events with a stepwise stream behavior in effect -- compare to last retrieval");
                jCollection = qiclient.GetRangeValuesAsync("evtStream", "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).Result;
                foundEvents = JsonConvert.DeserializeObject <WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region delete events

                // remove the first value -- index is the timestamp of the event
                Console.WriteLine();
                Console.WriteLine("Deleting events");
                qiclient.RemoveValueAsync("evtStream", "0").Wait();

                // remove the rest -- start and end time indices
                qiclient.RemoveWindowValuesAsync("evtStream", "1", "198").Wait();
                Thread.Sleep(2000);

                Console.WriteLine("Checking for events");
                Console.WriteLine("===================");

                jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                foundEvents = JsonConvert.DeserializeObject <WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                Console.WriteLine("Test ran successfully");
                Console.WriteLine("====================");
                Console.WriteLine("Press any button to shutdown");
                Console.ReadLine();
                #endregion
                #endregion
            }
            catch (QiError qerr)
            {
                Console.WriteLine("Error, status code = " + qerr.Code.ToString() + "; " + qerr.Message);
                Console.WriteLine("Press ENTER to terminate");
                Console.ReadLine();
            }
            finally
            {
                try
                {
                    qiclient.DeleteStreamAsync("evtStream").Wait();
                    qiclient.DeleteBehaviorAsync("evtStreamStepLeading").Wait();
                    qiclient.DeleteTypeAsync(evtType.Id).Wait();
                }
                catch (Exception)
                {
                }
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: osisoft/Qi-Samples
        public static void Main(string[] args)
        {
            const string sampleNamespaceId = "WaveData_SampleNamespace";
            const string sampleTypeId = "WaveData_SampleType";
            const string sampleStreamId = "WaveData_SampleStream";
            const string sampleBehaviorId = "WaveData_SampleBehavior";

            // Instantiate the REST client
            Console.WriteLine("Creating a Qi REST API Client...");
            string server = Constants.QiServerUrl;
            QiClient qiclient = new QiClient(server);

            try
            {
                // create a QiNamespace
                Console.WriteLine("Creating a Qi Namespace");
                QiNamespace sampleNamespace = new QiNamespace(sampleNamespaceId);
                string evtNamespaceString = qiclient.CreateNamespaceAsync(Constants.TenantId, sampleNamespace).GetAwaiter().GetResult();

                DelayForQiConsistency();

                // create types for int and double, then create properties for all the WaveData properties
                Console.WriteLine("Creating a Qi type for WaveData instances");
                QiType sampleType = GetWaveDataTypeObject(sampleTypeId);
                
                // create the type in the Qi Service
                string evtTypeString = qiclient.CreateTypeAsync(Constants.TenantId, sampleNamespaceId, sampleType).GetAwaiter().GetResult();
                sampleType = JsonConvert.DeserializeObject<QiType>(evtTypeString);

                DelayForQiConsistency();

                // create a stream named evtStream
                Console.WriteLine("Creating a stream in this tenant for simple event measurements");
                QiStream sampleStream = new QiStream(sampleStreamId, sampleTypeId);
                string evtStreamString = qiclient.CreateStreamAsync(Constants.TenantId, sampleNamespaceId, sampleStream).GetAwaiter().GetResult();
                sampleStream = JsonConvert.DeserializeObject<QiStream>(evtStreamString);

                DelayForQiConsistency();

                #region CRUD operations

                #region Create (Insert)

                Console.WriteLine("Artificially generating 100 events and inserting them into the Qi Service");

                // How to insert a single event
                TimeSpan span = new TimeSpan(0, 1, 0);
                WaveData evt = WaveData.Next(span, 2.0, 0);

                qiclient.CreateEventAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, JsonConvert.SerializeObject(evt)).GetAwaiter().GetResult();

                // how to insert an a collection of events
                List<WaveData> events = new List<WaveData>();
                for (int i = 2; i < 200; i += 2)
                {
                    evt = WaveData.Next(span, 2.0, i);
                    events.Add(evt);
                }

                qiclient.CreateEventsAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, JsonConvert.SerializeObject(events)).GetAwaiter().GetResult();

                DelayForQiConsistency();

                #endregion

                #region Retrieve events

                Console.WriteLine("Retrieving the inserted events");
                Console.WriteLine("==============================");
                string jCollection = qiclient.GetWindowValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "0", "198").GetAwaiter().GetResult();
                WaveData[] foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);

                #endregion

                #region Update events
                Console.WriteLine();
                Console.WriteLine("Updating values");
                
                // take the first value inserted and update 
                evt = foundEvents.First<WaveData>();
                evt = WaveData.Next(span, 4.0, 0);
                qiclient.UpdateValueAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, JsonConvert.SerializeObject(evt)).GetAwaiter().GetResult();

                // update the remaining events (same span, multiplier, order)
                List<WaveData> newEvents = new List<WaveData>();
                foreach (WaveData evnt in events)
                {
                    WaveData newEvt = WaveData.Next(span, 4.0, evnt.Order);
                    newEvents.Add(newEvt);
                }

                qiclient.UpdateValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, JsonConvert.SerializeObject(events)).GetAwaiter().GetResult();

                DelayForQiConsistency();

                // check the results
                Console.WriteLine("Retrieving the updated values");
                Console.WriteLine("=============================");
                jCollection = qiclient.GetWindowValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "0", "198").GetAwaiter().GetResult();
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region stream behavior

                // illustrate how stream behaviors modify retrieval
                // First, pull three items back with GetRangeValuesAsync for range values between events.
                // The default behavior is continuous, so ExactOrCalculated should bring back interpolated values
                Console.WriteLine();
                Console.WriteLine(@"Retrieving three events without a stream behavior");
                jCollection = qiclient.GetRangeValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).GetAwaiter().GetResult();
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);

                // now, create a stream behavior with Discrete and attach it to the existing stream
                QiStreamBehavior sampleBehavior = new QiStreamBehavior()
                {
                    Id = sampleBehaviorId,
                    Mode = QiStreamMode.StepwiseContinuousLeading
                };

                string behaviorString = qiclient.CreateBehaviorAsync(Constants.TenantId, sampleNamespaceId, sampleBehavior).GetAwaiter().GetResult();
                sampleBehavior = JsonConvert.DeserializeObject<QiStreamBehavior>(behaviorString);

                DelayForQiConsistency();

                // update the stream to include this behavior
                sampleStream.BehaviorId = sampleBehaviorId;
                qiclient.UpdateStreamAsync(Constants.TenantId, sampleNamespaceId, sampleStream).GetAwaiter().GetResult();

                DelayForQiConsistency();

                // repeat the retrieval
                Console.WriteLine();
                Console.WriteLine("Retrieving three events with a stepwise stream behavior in effect -- compare to last retrieval");
                jCollection = qiclient.GetRangeValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).GetAwaiter().GetResult();
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region delete events

                // remove the first value -- index is the timestamp of the event
                Console.WriteLine();
                Console.WriteLine("Deleting events");
                qiclient.RemoveValueAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "0").GetAwaiter().GetResult();

                // remove the rest -- start and end time indices
                qiclient.RemoveWindowValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "1", "198").GetAwaiter().GetResult();

                DelayForQiConsistency();

                Console.WriteLine("Checking for events");
                Console.WriteLine("===================");

                jCollection = qiclient.GetWindowValuesAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId, "0", "198").GetAwaiter().GetResult();
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                Console.WriteLine("Test ran successfully");
                Console.WriteLine("====================");
                Console.WriteLine("Press any button to shutdown");
                Console.ReadLine();

                #endregion

                #endregion
            }
            catch (QiError qerr)
            {
                PrintError("Error in Qi Service", qerr);
                Console.WriteLine("Press ENTER to terminate");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                PrintError("Unexpected Error: ", e);
            }
            finally
            {
                Console.WriteLine("Deleting the stream out of the Qi Service");
                HandleQiCallAsync(async () => await qiclient.DeleteStreamAsync(Constants.TenantId, sampleNamespaceId, sampleStreamId)).GetAwaiter().GetResult();

                Console.WriteLine("Deleting the behavior out of the Qi Service");
                HandleQiCallAsync(async () => await qiclient.DeleteBehaviorAsync(Constants.TenantId, sampleNamespaceId, sampleBehaviorId)).GetAwaiter().GetResult();

                Console.WriteLine("Deleting the type out of the Qi Service");
                HandleQiCallAsync(async () => await qiclient.DeleteTypeAsync(Constants.TenantId, sampleNamespaceId, sampleTypeId)).GetAwaiter().GetResult();
            }
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: CodosaurusRex/Qi-Samples
        public static void Main(string[] args)
        {
            // Instantiate the REST client
            Console.WriteLine("Creating a Qi REST API Client...");
            string server = Constants.QiServerUrl;
            QiClient qiclient = new QiClient(server);
            QiType evtType = null;

            try
            {
                // create types for int and double, then create properties for all the WaveData properties
                Console.WriteLine("Creating a Qi type for WaveData instances");
                QiType intType = new QiType();
                intType.Id = "intType";
                intType.QiTypeCode = QiTypeCode.Int32;

                QiType doubleType = new QiType();
                doubleType.Id = "doubleType";
                doubleType.QiTypeCode = QiTypeCode.Double;

                QiTypeProperty orderProperty = new QiTypeProperty();
                orderProperty.Id = "Order";
                orderProperty.QiType = intType;
                orderProperty.IsKey = true;

                QiTypeProperty tauProperty = new QiTypeProperty();
                tauProperty.Id = "Tau";
                tauProperty.QiType = doubleType;

                QiTypeProperty radiansProperty = new QiTypeProperty();
                radiansProperty.Id = "Radians";
                radiansProperty.QiType = doubleType;

                QiTypeProperty sinProperty = new QiTypeProperty();
                sinProperty.Id = "Sin";
                sinProperty.QiType = doubleType;

                QiTypeProperty cosProperty = new QiTypeProperty();
                cosProperty.Id = "Cos";
                cosProperty.QiType = doubleType;

                QiTypeProperty tanProperty = new QiTypeProperty();
                tanProperty.Id = "Tan";
                tanProperty.QiType = doubleType;

                QiTypeProperty sinhProperty = new QiTypeProperty();
                sinhProperty.Id = "Sinh";
                sinhProperty.QiType = doubleType;

                QiTypeProperty coshProperty = new QiTypeProperty();
                coshProperty.Id = "cosh";
                coshProperty.QiType = doubleType;

                QiTypeProperty tanhProperty = new QiTypeProperty();
                tanhProperty.Id = "Tanh";
                tanhProperty.QiType = doubleType;

                // Create a QiType for our WaveData class; the metadata proeprties are the ones we just created
                QiType type = new QiType();
                type.Name = "WaveData";
                type.Id = "WaveDataType";
                type.Description = "This is a type for WaveData events";
                QiTypeProperty[] props = { orderProperty, tauProperty, radiansProperty, sinProperty, cosProperty, tanProperty, sinhProperty, coshProperty, tanhProperty };
                type.Properties = props;

                //used when working against the local devonebox
                //ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
                // create the type in the Qi Service
                string evtTypeString = qiclient.CreateTypeAsync(type).Result;
                evtType = JsonConvert.DeserializeObject<QiType>(evtTypeString);

                // create a stream named evtStream
                Console.WriteLine("Creating a stream in this tenant for simple event measurements");
                QiStream stream = new QiStream("evtStream", evtType.Id);
                string evtStreamString = qiclient.CreateStreamAsync(stream).Result;
                QiStream evtStream = JsonConvert.DeserializeObject<QiStream>(evtStreamString);

                #region CRUD operations
                #region Create (Insert)

                Console.WriteLine("Artificially generating 100 events and inserting them into the Qi Service");

                // How to insert a single event
                TimeSpan span = new TimeSpan(0, 1, 0);
                WaveData evt = WaveData.Next(span, 2.0, 0);

                qiclient.CreateEventAsync("evtStream", JsonConvert.SerializeObject(evt)).Wait();

                // how to insert an a collection of events
                List<WaveData> events = new List<WaveData>();
                for (int i = 2; i < 200; i += 2)
                {
                    evt = WaveData.Next(span, 2.0, i);
                    events.Add(evt);
                    Thread.Sleep(400);
                }

                qiclient.CreateEventsAsync("evtStream", JsonConvert.SerializeObject(events)).Wait();
                Thread.Sleep(2000);

                #endregion

                #region Retrieve events
                Console.WriteLine("Retrieving the inserted events");
                Console.WriteLine("==============================");
                string jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                WaveData[] foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region Update events
                Console.WriteLine();
                Console.WriteLine("Updating values");

                // take the first value inserted and update
                evt = foundEvents.First<WaveData>();
                evt = WaveData.Next(span, 4.0, 0);
                qiclient.UpdateValueAsync("evtStream", JsonConvert.SerializeObject(evt)).Wait();

                // update the remaining events (same span, multiplier, order)
                List<WaveData> newEvents = new List<WaveData>();
                foreach (WaveData evnt in events)
                {
                    WaveData newEvt = WaveData.Next(span, 4.0, evnt.Order);
                    newEvents.Add(newEvt);
                    Thread.Sleep(500);
                }

                qiclient.UpdateValuesAsync("evtStream", JsonConvert.SerializeObject(events)).Wait();
                Thread.Sleep(2000);

                // check the results
                Console.WriteLine("Retrieving the updated values");
                Console.WriteLine("=============================");
                jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region stream behavior

                // illustrate how stream behaviors modify retrieval
                // First, pull three items back with GetRangeValuesAsync for range values between events.
                // The default behavior is continuous, so ExactOrCalculated should bring back interpolated values
                Console.WriteLine();
                Console.WriteLine(@"Retrieving three events without a stream behavior");
                jCollection = qiclient.GetRangeValuesAsync("evtStream", "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).Result;
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);

                // now, create a stream behavior with Discrete and attach it to the existing stream
                QiStreamBehavior behavior = new QiStreamBehavior();
                behavior.Id = "evtStreamStepLeading";
                behavior.Mode = QiStreamMode.StepwiseContinuousLeading;
                string behaviorString = qiclient.CreateBehaviorAsync(behavior).Result;
                behavior = JsonConvert.DeserializeObject<QiStreamBehavior>(behaviorString);

                // update the stream to include this behavior
                evtStream.BehaviorId = behavior.Id;
                qiclient.UpdateStreamAsync(evtStream).Wait();

                // repeat the retrieval
                Console.WriteLine();
                Console.WriteLine("Retrieving three events with a stepwise stream behavior in effect -- compare to last retrieval");
                jCollection = qiclient.GetRangeValuesAsync("evtStream", "1", 0, 3, false, QiBoundaryType.ExactOrCalculated).Result;
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                #endregion

                #region delete events

                // remove the first value -- index is the timestamp of the event
                Console.WriteLine();
                Console.WriteLine("Deleting events");
                qiclient.RemoveValueAsync("evtStream", "0").Wait();

                // remove the rest -- start and end time indices
                qiclient.RemoveWindowValuesAsync("evtStream", "1", "198").Wait();
                Thread.Sleep(2000);

                Console.WriteLine("Checking for events");
                Console.WriteLine("===================");

                jCollection = qiclient.GetWindowValuesAsync("evtStream", "0", "198").Result;
                foundEvents = JsonConvert.DeserializeObject<WaveData[]>(jCollection);
                DumpEvents(foundEvents);
                Console.WriteLine("Test ran successfully");
                Console.WriteLine("====================");
                Console.WriteLine("Press any button to shutdown");
                Console.ReadLine();
                #endregion
                #endregion
            }
            catch (QiError qerr)
            {
                Console.WriteLine("Error, status code = " + qerr.Code.ToString() + "; " + qerr.Message);
                Console.WriteLine("Press ENTER to terminate");
                Console.ReadLine();
            }
            finally
            {
                try
                {
                    qiclient.DeleteStreamAsync("evtStream").Wait();
                    qiclient.DeleteBehaviorAsync("evtStreamStepLeading").Wait();
                    qiclient.DeleteTypeAsync(evtType.Id).Wait();
                }
                catch (Exception)
                {
                }
            }
        }