repo time

Dependencies:   mbed MAX14720 MAX30205 USBDevice

Revision:
20:6d2af70c92ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HspGuiSourceV301/GuiDLLs/RPCSupport/DataLogging/DataLogging.cs	Tue Apr 06 06:41:40 2021 +0000
@@ -0,0 +1,1014 @@
+/*******************************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All rights Reserved.
+* 
+* This software is protected by copyright laws of the United States and
+* of foreign countries. This material may also be protected by patent laws
+* and technology transfer regulations of the United States and of foreign
+* countries. This software is furnished under a license agreement and/or a
+* nondisclosure agreement and may only be used or reproduced in accordance
+* with the terms of those agreements. Dissemination of this information to
+* any party or parties not specified in the license agreement and/or
+* nondisclosure agreement is expressly prohibited.
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using RPCSupport.Devices;
+using System.Globalization;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.IO;
+using System.Threading;
+
+namespace RPCSupport.DataLogging
+{
+    public class DataLogging : ClientDevice
+    {
+
+        public class cParametersEcg : cDeviceMethodParameters
+        {
+            public cParametersEcg(String className, String methodName) : base(className, methodName) { }
+            public int En_ecg;
+            public int Openp;
+            public int Openn;
+            public int Pol;
+            public int Calp_sel;
+            public int Caln_sel;
+            public int E_fit;
+            public int Rate;
+            public int Gain;
+            public int Dhpf;
+            public int Dlpf;
+
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                En_ecg = intArray[i++];
+                Openp = intArray[i++];
+                Openn = intArray[i++];
+                Pol = intArray[i++];
+                Calp_sel = intArray[i++];
+                Caln_sel = intArray[i++];
+                E_fit = intArray[i++];
+                Rate = intArray[i++];
+                Gain = intArray[i++];
+                Dhpf = intArray[i++];
+                Dlpf = intArray[i++];
+            }
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(En_ecg);
+                intArray.Add(Openp);
+                intArray.Add(Openn);
+                intArray.Add(Pol);
+                intArray.Add(Calp_sel);
+                intArray.Add(Caln_sel);
+                intArray.Add(E_fit);
+                intArray.Add(Rate);
+                intArray.Add(Gain);
+                intArray.Add(Dhpf);
+                intArray.Add(Dlpf);
+                return intArray.ToArray();
+            }
+
+            public void AssignByValue(
+                int En_ecg,
+                int Openp,
+                int Openn,
+                int Pol,
+                int Calp_sel,
+                int Caln_sel,
+                int E_fit,
+                int Rate,
+                int Gain,
+                int Dhpf,
+                int Dlpf)
+            {
+                this.En_ecg = En_ecg;
+                this.Openp = Openp;
+                this.Openn = Openn;
+                this.Pol = Pol;
+                this.Calp_sel = Calp_sel;
+                this.Caln_sel = Caln_sel;
+                this.E_fit = E_fit;
+                this.Rate = Rate;
+                this.Gain = Gain;
+                this.Dhpf = Dhpf;
+                this.Dlpf = Dlpf;
+            }
+        }
+//        public cParametersEcg ParametersMAX30001Ecg = new cParametersEcg();
+        
+        public class cParametersBioz : cDeviceMethodParameters
+        {
+            public cParametersBioz(String className, String methodName) : base(className, methodName) { }
+            public int En_bioz;
+            public int Openp;
+            public int Openn;
+            public int Calp_sel;
+            public int Caln_sel;
+            public int CG_mode;
+            public int B_fit;
+            public int Rate;
+            public int Ahpf;
+            public int Ext_rbias;
+            public int Gain;
+            public int Dhpf;
+            public int Dlpf;
+            public int Fcgen;
+            public int Cgmon;
+            public int Cgmag;
+            public int Phoff;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                En_bioz = intArray[i++];
+                Openp = intArray[i++];
+                Openn = intArray[i++];
+                Calp_sel = intArray[i++];
+                Caln_sel = intArray[i++];
+                CG_mode = intArray[i++];
+                B_fit = intArray[i++];
+                Rate = intArray[i++];
+                Ahpf = intArray[i++];
+                Ext_rbias = intArray[i++];
+                Gain = intArray[i++];
+                Dhpf = intArray[i++];
+                Dlpf = intArray[i++];
+                Fcgen = intArray[i++];
+                Cgmon = intArray[i++];
+                Cgmag = intArray[i++];
+                Phoff = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(En_bioz);
+                intArray.Add(Openp);
+                intArray.Add(Openn);
+                intArray.Add(Calp_sel);
+                intArray.Add(Caln_sel);
+                intArray.Add(CG_mode);
+                intArray.Add(B_fit);
+                intArray.Add(Rate);
+                intArray.Add(Ahpf);
+                intArray.Add(Ext_rbias);
+                intArray.Add(Gain);
+                intArray.Add(Dhpf);
+                intArray.Add(Dlpf);
+                intArray.Add(Fcgen);
+                intArray.Add(Cgmon);
+                intArray.Add(Cgmag);
+                intArray.Add(Phoff);
+                return intArray.ToArray();
+            }
+
+            public void AssignByValue(
+                int En_bioz,
+                int Openp,
+                int Openn,
+                int Calp_sel,
+                int Caln_sel,
+                int CG_mode,
+                int B_fit,
+                int Rate,
+                int Ahpf,
+                int Ext_rbias,
+                int Gain,
+                int Dhpf,
+                int Dlpf,
+                int Fcgen,
+                int Cgmon,
+                int Cgmag,
+                int Phoff)
+            {
+                this.En_bioz = En_bioz;
+                this.Openp = Openp;
+                this.Openn = Openn;
+                this.Calp_sel = Calp_sel;
+                this.Caln_sel = Caln_sel;
+                this.CG_mode = CG_mode;
+                this.B_fit = B_fit;
+                this.Rate = Rate;
+                this.Ahpf = Ahpf;
+                this.Ext_rbias = Ext_rbias;
+                this.Gain = Gain;
+                this.Dhpf = Dhpf;
+                this.Dlpf = Dlpf;
+                this.Fcgen = Fcgen;
+                this.Cgmon = Cgmon;
+                this.Cgmag = Cgmag;
+                this.Phoff = Phoff;
+            }
+        }
+        //public cParametersBioz ParametersMAX30001Bioz = new cParametersBioz();
+
+        public class cParametersRtoR : cDeviceMethodParameters
+        {
+            public cParametersRtoR(String className, String methodName) : base(className, methodName) { }
+            public int En_rtor;
+            public int Wndw;
+            public int Gain;
+            public int Pavg;
+            public int Ptsf;
+            public int Hoff;
+            public int Ravg;
+            public int Rhsf;
+            public int Clr_rrint;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                En_rtor = intArray[i++];
+                Wndw = intArray[i++];
+                Gain = intArray[i++];
+                Pavg = intArray[i++];
+                Ptsf = intArray[i++];
+                Hoff = intArray[i++];
+                Ravg = intArray[i++];
+                Rhsf = intArray[i++];
+                Clr_rrint = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(En_rtor);
+                intArray.Add(Wndw);
+                intArray.Add(Gain);
+                intArray.Add(Pavg);
+                intArray.Add(Ptsf);
+                intArray.Add(Hoff);
+                intArray.Add(Ravg);
+                intArray.Add(Rhsf);
+                intArray.Add(Clr_rrint);
+                return intArray.ToArray();
+            }
+
+            public void AssignByValue(
+                int En_rtor,
+                int Wndw,
+                int Gain,
+                int Pavg,
+                int Ptsf,
+                int Hoff,
+                int Ravg,
+                int Rhsf,
+                int Clr_rrint)
+            {
+                this.En_rtor = En_rtor;
+                this.Wndw = Wndw;
+                this.Gain = Gain;
+                this.Pavg = Pavg;
+                this.Ptsf = Ptsf;
+                this.Hoff = Hoff;
+                this.Ravg = Ravg;
+                this.Rhsf = Rhsf;
+                this.Clr_rrint = Clr_rrint;
+            }
+        }
+        //public cParametersRtoR ParametersMAX30001RtoR = new cParametersRtoR();
+
+        public class cParametersPace : cDeviceMethodParameters
+        {
+            public cParametersPace(String className, String methodName) : base(className, methodName) { }
+            public int En_pace;
+            public int Clr_pedge;
+            public int Pol;
+            public int Gn_diff_off;
+            public int Gain;
+            public int Aout_lbw;
+            public int Aout;
+            public int Dacp;
+            public int Dacn;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                En_pace = intArray[i++];
+                Clr_pedge = intArray[i++];
+                Pol = intArray[i++];
+                Gn_diff_off = intArray[i++];
+                Gain = intArray[i++];
+                Aout_lbw = intArray[i++];
+                Aout = intArray[i++];
+                Dacp = intArray[i++];
+                Dacn = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(En_pace);
+                intArray.Add(Clr_pedge);
+                intArray.Add(Pol);
+                intArray.Add(Gn_diff_off);
+                intArray.Add(Gain);
+                intArray.Add(Aout_lbw);
+                intArray.Add(Aout);
+                intArray.Add(Dacp);
+                intArray.Add(Dacn);
+                return intArray.ToArray();
+            }
+
+            public void AssignByValue(
+                int En_pace,
+                int Clr_pedge,
+                int Pol,
+                int Gn_diff_off,
+                int Gain,
+                int Aout_lbw,
+                int Aout,
+                int Dacp,
+                int Dacn)
+            {
+                this.En_pace = En_pace;
+                this.Clr_pedge = Clr_pedge;
+                this.Pol = Pol;
+                this.Gn_diff_off = Gn_diff_off;
+                this.Gain = Gain;
+                this.Aout = Aout;
+                this.Dacp = Dacp;
+                this.Dacn = Dacn;
+            }
+        }
+
+        public class cParametersCal : cDeviceMethodParameters
+        {
+            public cParametersCal(String className, String methodName) : base(className, methodName) { }
+            public int parameter1;
+            public int parameter2;
+            public int parameter3;
+            public int parameter4;
+            public int parameter5;
+            public int parameter6;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                parameter1 = intArray[i++];
+                parameter2 = intArray[i++];
+                parameter3 = intArray[i++];
+                parameter4 = intArray[i++];
+                parameter5 = intArray[i++];
+                parameter6 = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(parameter1);
+                intArray.Add(parameter2);
+                intArray.Add(parameter3);
+                intArray.Add(parameter4);
+                intArray.Add(parameter5);
+                intArray.Add(parameter6);
+                return intArray.ToArray();
+            }
+
+            public void AssignByValue(
+                int parameter1,
+                int parameter2,
+                int parameter3,
+                int parameter4,
+                int parameter5,
+                int parameter6
+                )
+
+            {
+                this.parameter1 = parameter1;
+                this.parameter2 = parameter2;
+                this.parameter3 = parameter3;
+                this.parameter4 = parameter4;
+                this.parameter5 = parameter5;
+                this.parameter6 = parameter6;
+            }
+        }
+       
+        //        public cParametersPace ParametersMAX30001Pace = new cParametersPace();
+        public class cParametersTemp : cDeviceMethodParameters
+        {
+            public cParametersTemp(String className, String methodName, int deviceNumber) : base(className, methodName) { this.deviceNumber = deviceNumber; }
+            public int sampleTime;  // seconds
+            private int deviceNumber;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                sampleTime = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(sampleTime);
+                return intArray.ToArray();
+            }
+        }
+//        public cParametersTemp1 ParametersMAX31725_1 = new cParametersTemp1();
+
+//        public cParametersTemp2 ParametersMAX31725_2 = new cParametersTemp2();
+
+        public class cParametersPressure : cDeviceMethodParameters
+        {
+            public cParametersPressure(String className, String methodName) : base(className, methodName) { }
+            public int sampleTime;  // seconds
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                sampleTime = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(sampleTime);
+                return intArray.ToArray();
+            }
+        }
+//        public cParametersPressure ParametersBMP280 = new cParametersPressure();
+
+        public class cParametersAccel : cDeviceMethodParameters
+        {
+            public cParametersAccel(String className, String methodName) : base(className, methodName) { fifoDepth = 1; }
+            public int sampleRate;  // Hz
+            public int fifoDepth; 
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                sampleRate = intArray[i++];
+                fifoDepth = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(sampleRate);
+                intArray.Add(fifoDepth);
+                return intArray.ToArray();
+            }
+        }
+//        public cParametersAccel ParametersLIS2DH = new cParametersAccel();
+
+        public class cParameterOpticalSpO2 : cDeviceMethodParameters
+        {
+            public cParameterOpticalSpO2(String className, String methodName) : base(className, methodName) { }
+            public int fifo_waterlevel_mark;
+            public int sample_avg;
+            public int sample_rate;
+            public int pulse_width;
+            public int red_led_current;
+            public int ir_led_current;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                fifo_waterlevel_mark = intArray[i++];
+                sample_avg = intArray[i++];
+                sample_rate = intArray[i++];
+                pulse_width = intArray[i++];
+                red_led_current = intArray[i++];
+                ir_led_current = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(fifo_waterlevel_mark);
+                intArray.Add(sample_avg);
+                intArray.Add(sample_rate);
+                intArray.Add(pulse_width);
+                intArray.Add(red_led_current);
+                intArray.Add(ir_led_current);
+                return intArray.ToArray();
+            }
+        }
+//        public cParameterOpticalSpO2 ParameterMAX30101SpO2 = new cParameterOpticalSpO2();
+
+        public class cParameterOpticalHR : cDeviceMethodParameters
+        {
+            public cParameterOpticalHR(String className, String methodName) : base(className, methodName) { }
+            public int fifo_waterlevel_mark;
+            public int sample_avg;
+            public int sample_rate;
+            public int pulse_width;
+            public int red_led_current;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                fifo_waterlevel_mark = intArray[i++];
+                sample_avg = intArray[i++];
+                sample_rate = intArray[i++];
+                pulse_width = intArray[i++];
+                red_led_current = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(fifo_waterlevel_mark);
+                intArray.Add(sample_avg);
+                intArray.Add(sample_rate);
+                intArray.Add(pulse_width);
+                intArray.Add(red_led_current);
+                return intArray.ToArray();
+            }
+        }
+//        public cParameterOpticalHR ParameterMAX30101HR = new cParameterOpticalHR();
+
+        public class cParameterOpticalMulti : cDeviceMethodParameters
+        {
+            public cParameterOpticalMulti(String className, String methodName) : base(className, methodName) { }
+            public int fifo_waterlevel_mark;
+            public int sample_avg;
+            public int sample_rate;
+            public int pulse_width;
+            public int red_led_current;
+            public int ir_led_current;
+            public int green_led_current;
+            public int slot_1;
+            public int slot_2;
+            public int slot_3;
+            public int slot_4;
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                fifo_waterlevel_mark = intArray[i++];
+                sample_avg = intArray[i++];
+                sample_rate = intArray[i++];
+                pulse_width = intArray[i++];
+                red_led_current = intArray[i++];
+                ir_led_current = intArray[i++];
+                green_led_current = intArray[i++];
+                slot_1 = intArray[i++];
+                slot_2 = intArray[i++];
+                slot_3 = intArray[i++];
+                slot_4 = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+                List<int> intArray = new List<int>();
+                intArray.Add(fifo_waterlevel_mark);
+                intArray.Add(sample_avg);
+                intArray.Add(sample_rate);
+                intArray.Add(pulse_width);
+                intArray.Add(red_led_current);
+                intArray.Add(ir_led_current);
+                intArray.Add(green_led_current);
+                intArray.Add(slot_1);
+                intArray.Add(slot_2);
+                intArray.Add(slot_3);
+                intArray.Add(slot_4);
+                return intArray.ToArray();
+            }
+        }
+
+        public class cParametersRbiasFmstr : cDeviceMethodParameters
+        {
+            public cParametersRbiasFmstr(String className, String methodName) : base(className, methodName) { }
+
+            public int en_rbias;
+            public int rbias;
+            public int rbiasp;
+            public int rbiasn;
+            public int fmstr;
+
+            public override void AssignByIntArray(int[] intArray)
+            {
+                int i = 0;
+                en_rbias = intArray[i++];
+                rbias = intArray[i++];
+                rbiasp = intArray[i++];
+                rbiasn = intArray[i++];
+                fmstr = intArray[i++];
+            }
+
+            public override int[] ToIntArray()
+            {
+                int i = 0;
+
+                List<int> intArray = new List<int>();
+                intArray.Add(en_rbias);
+                intArray.Add(rbias);
+                intArray.Add(rbiasp);
+                intArray.Add(rbiasn);
+                intArray.Add(fmstr);
+
+                return intArray.ToArray();
+            }
+
+        }
+
+        //PreCommand
+        public class cRawRPCCommand : cDeviceMethodParameters
+        {
+           public String cmdString;
+           public cRawRPCCommand(String className, String methodName) : base(className, methodName) { }
+           public void Define(String str)
+           {
+               String inStr = str.Trim();
+               if (inStr.CompareTo("null") == 0) str = "";
+               cmdString = str;
+           }
+           public override void AssignByIntArray(int[] intArray)
+            {
+                throw new NotImplementedException();
+            }
+
+            public override int[] ToIntArray()
+            {
+                throw new NotImplementedException();
+            }
+            public override String GenerateRpcCommandString()
+            {
+                String str = cmdString;
+                if (String.IsNullOrWhiteSpace(cmdString)) str = "null";
+                String cmd = String.Format("\"{0}\"", str);
+                //Console.WriteLine("cmd string  = '" + cmd + "'");
+                //Console.WriteLine("cmd string length = " + cmd.Length.ToString());
+                return cmd;
+            }
+        }
+        public cParametersEcg MAX30001_Ecg = new cParametersEcg("MAX30001", "ECG_InitStart");
+        public cParametersBioz MAX30001_Bioz = new cParametersBioz("MAX30001", "BIOZ_InitStart");
+        public cParametersRtoR MAX30001_RtoR = new cParametersRtoR("MAX30001", "RtoR_InitStart");
+        public cParametersPace MAX30001_Pace = new cParametersPace("MAX30001", "PACE_InitStart");
+        public cParametersCal MAX30001_Cal = new cParametersCal("MAX30001", "CAL_InitStart");
+        public cRawRPCCommand MAX30001_Rbias = new cRawRPCCommand("", "");
+        public cParametersRbiasFmstr MAX30001_Rbias_Fmstr = new cParametersRbiasFmstr("MAX30001", "Rbias_FMSTR_Init");
+        public cParametersTemp MAX31725_1 = new cParametersTemp("MAX30205_1", "InitStart", 1);
+        public cParametersTemp MAX31725_2 = new cParametersTemp("MAX30205_2", "InitStart", 2);
+        public cParametersPressure BMP280 = new cParametersPressure("BMP280", "InitStart");
+        public cParametersAccel LIS2DH = new cParametersAccel("LIS2DH", "InitStart");
+        public cParameterOpticalSpO2 MAX30101_SpO2 = new cParameterOpticalSpO2("MAX30101", "SpO2mode_InitStart");
+        public cParameterOpticalHR MAX30101_HR = new cParameterOpticalHR("MAX30101", "HRmode_InitStart");
+        public cParameterOpticalMulti MAX30101_Multi = new cParameterOpticalMulti("MAX30101", "Multimode_InitStart");
+        public cRawRPCCommand PreCommand = new cRawRPCCommand("", "");
+        public cRawRPCCommand PostCommand = new cRawRPCCommand("", "");
+
+        const string CLASSNAME = "Logging";
+        public DataLogging(RPCClient client)
+            : base(client)
+        {
+            InitRpcCommandList();
+        }
+        /*
+        public void StartLoggingUsb()
+        {
+            string reply;
+            reply = Call(CLASSNAME, "StartLoggingUsb");
+        }
+        */
+        private void InitStreaming()
+        {
+            client.pipeline.Discard();
+            client.streaming.Init(client.pipeline);
+            client.streaming.Start();
+            //Call(CLASSNAME, "StreamTest");
+            //CallNoReply(CLASSNAME, "StreamTest");
+        }
+
+        public void StartStreaming()
+        {
+            client.pipeline.Discard();
+            InitStreaming();
+            CallNoReply(CLASSNAME, "StartLoggingUsb");
+            //Call(CLASSNAME, "StartTest");
+        }
+
+        public void StopStreaming()
+        {
+            StopStreaming(true);
+        }
+
+        public void StopStreaming(bool connected)
+        {
+            //if (connected)
+                client.pipeline.SendSingleByte(' ');
+
+            client.streaming.Stop();
+
+            //if (connected)
+            {
+                client.pipeline.Discard();
+                Thread.Sleep(500);
+                client.pipeline.Discard();
+            }
+        }
+
+        public void MissionRead()
+        {
+            int val;
+            string reply;
+
+            reply = Call(CLASSNAME, "ReadMission");
+            reply = reply.Trim(new char[] { '\n', '\r', ' ', ':' });
+            String[] cmds = reply.Split(new char[] { ':' });
+            int i = 1;
+            foreach (String str in cmds)
+            {
+                String cmd = str.Trim();
+                if (!String.IsNullOrEmpty(cmd))
+                {
+                    Console.WriteLine(i.ToString() + ": " + cmd);
+                    i++;
+                }
+            }
+            //reply = Call(CLASSNAME, "ReadMission");
+            //reply = "/MAX30001/ECG_InitStart 01 01 01 00 02 03 1F 00 02 00 01\r\n/BMP280/InitStart 01\r\n";
+
+            // clear where it exists in mission flag
+            foreach (cDeviceMethodParameters cmd in rpcCommandList)
+            {
+                cmd.ClearExistsInDeviceMission();
+            }
+            PreCommand.ClearExistsInDeviceMission();
+            PostCommand.ClearExistsInDeviceMission();
+            //reply[0]
+            ParseRPCReadSequence(reply);
+        }
+
+        public string[] MissionStrings()
+        {
+            string reply;
+
+            reply = Call(CLASSNAME, "ReadMission");
+            reply = reply.Trim(new char[] { '\n', '\r', ' ', ':' });
+            string[] cmds = reply.Split(new string[] { ": " }, StringSplitOptions.RemoveEmptyEntries);
+
+            return cmds;
+        }
+
+        int debugMissionCmdCount;
+        public void MissionStartDefinition()
+        {
+            string reply;
+            reply = Call(CLASSNAME, "StartMissionDefine");
+            debugMissionCmdCount = 0;
+        }
+        public void MissionAppend(cDeviceMethodParameters device)
+        {
+            String cmd;
+            cmd = device.GenerateRpcCommandString();
+            Call(CLASSNAME, "AppendMissionCmd", cmd);
+            debugMissionCmdCount++;
+            Console.WriteLine(debugMissionCmdCount.ToString() + ": " + cmd);
+        }
+        public void MissionAppend(String cmdStr)
+        {
+            Call(CLASSNAME, "AppendMissionCmd", "\"" + cmdStr + "\"");
+            debugMissionCmdCount++;
+            Console.WriteLine(debugMissionCmdCount.ToString() + ": " + cmdStr);
+        }
+        public void MissionWrite()
+        {
+            int val;
+            string cmd;
+            string reply;
+            StringBuilder sbTest = new StringBuilder();
+
+            reply = Call(CLASSNAME, "EndMissionDefine");
+            reply = Call(CLASSNAME, "WriteMission");
+             //reply = Call(CLASSNAME, "ReadReg", addr.ToString("X2"));
+            //int.TryParse(reply, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val);
+//            Console.WriteLine(sbTest.ToString());
+        }
+
+        // "/MAX30001/ECG_InitStart 01 01 01 00 02 03 1F 00 02 00 01/r/n/BMP280/InitStart 01 01 01 00 02 03 1F 00 02 00 01/r/n"
+        private void ParseRPCReadSequence(String cmds)
+        {
+            int count = 0;
+            cmds = cmds.Trim(new char[] { '\n', '\r', ' ', ':' });
+            String[] cmdStrings = cmds.Split(new char[] { ':' });
+            int lastCount = cmdStrings.Length - 1;
+            foreach (String cmd in cmdStrings)
+            {
+                if (count == 0)
+                {
+                    PreCommand.Define(cmd);
+                    PreCommand.existsInDeviceMission = true;
+                }
+                else
+                    if (count == lastCount)
+                    {
+                        PostCommand.Define(cmd);
+                        PostCommand.existsInDeviceMission = true;
+                    }
+                    else
+                        ProcessRPCCmd(cmd);
+                count++;
+            }
+        }
+
+        List<cDeviceMethodParameters> rpcCommandList = new List<cDeviceMethodParameters>();
+
+        private void InitRpcCommandList()
+        {
+            rpcCommandList.Add(MAX30001_Ecg);
+            rpcCommandList.Add(MAX30001_Bioz);
+            rpcCommandList.Add(MAX30001_RtoR);
+            rpcCommandList.Add(MAX30001_Pace);
+            rpcCommandList.Add(MAX30001_Cal);
+            rpcCommandList.Add(MAX31725_1);
+            rpcCommandList.Add(MAX31725_2);
+            rpcCommandList.Add(BMP280);
+            rpcCommandList.Add(LIS2DH);
+            rpcCommandList.Add(MAX30101_SpO2);
+            rpcCommandList.Add(MAX30101_HR);
+            rpcCommandList.Add(MAX30101_Multi);
+            rpcCommandList.Add(MAX30001_Rbias_Fmstr);
+        }
+
+        private void ProcessRPCCmd(String str)
+        {
+            if (String.IsNullOrEmpty(str)) return;
+            String trimmed = str.Trim(new char[] { '\r', '\n', ' ' });
+            if (String.IsNullOrEmpty(trimmed)) return;
+            if (trimmed[0] != '/') return;
+            String trimmed2 = trimmed.Trim(new char[] { '\r', '\n', '/', ' ' });
+            String[] parts = trimmed2.Split(new char[] { '/' });
+            String className = parts[0];
+            String methodNameParameters = parts[1];
+            String methodName = methodNameParameters.Substring(0,methodNameParameters.IndexOf(' '));
+            String parameters = methodNameParameters.Substring(methodNameParameters.IndexOf(' ')).Trim();
+            foreach (cDeviceMethodParameters cmd in rpcCommandList)
+            {
+                if (cmd.AssignIfMatch(className, methodName, parameters) == true) break;
+            }
+        }
+
+        private int[] ParseHexString(String hexStr)
+        {
+            int val;
+            List<int> intList = new List<int>();
+            String[] strings = hexStr.Split(new char[] { ' ' });
+            foreach (String str in strings)
+            {
+                if (int.TryParse(str, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val))
+                {
+                    intList.Add(val);
+                }
+                else
+                {
+                    throw new Exception(String.Format("Error In hex string \"{0}\" in \"{1}\"", str, hexStr));
+                }
+            }
+            return intList.ToArray();
+        }
+
+        public void EraseMission()
+        {
+            int val;
+            string cmd;
+            string reply;
+
+            reply = Call(CLASSNAME, "EraseMission");
+        }
+
+        public void TestMission()
+        {
+            int val;
+            string cmd;
+            string reply;
+
+            reply = Call(CLASSNAME, "TestStartMission");
+        }
+
+        public void TestWriteLog()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void TestReadLog()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void TestBulkErase()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void TestLogSectorsErase()
+        {
+            throw new NotImplementedException();
+        }
+
+        public string ReadPageToString(int page, out bool allOnes)
+        {
+            String returnStr = "";
+            returnStr = CallBinary("S25FS512", "ReadPagesBinary", out allOnes, new String[] { page.ToString("X2"), page.ToString("X2") });
+            return returnStr;
+        }
+
+        public void EraseWrittenSectors()
+        {
+            int val;
+            string cmd;
+            string reply;
+
+            reply = Call(CLASSNAME, "EraseWrittenSectors");
+        }
+    }
+
+    public abstract class cDeviceMethodParameters 
+    {
+        public String className;
+        public String methodName;
+        public abstract void AssignByIntArray(int[] intArray);
+        public abstract int[] ToIntArray();
+        public bool existsInDeviceMission;
+        public bool IsExistsInDeviceMission()
+        {
+            return existsInDeviceMission;
+        }
+        public void ClearExistsInDeviceMission()
+        {
+            existsInDeviceMission = false;
+        }
+        public String ParametersToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            int[] intArray = ToIntArray();
+            foreach (int val in intArray)
+            {
+                sb.Append(val.ToString("X2") + " ");
+            }
+            return sb.ToString().Trim(new char[] { ' ', ',' });
+        }
+        public virtual String GenerateRpcCommandString()
+        {
+            String cmd = String.Format("\"/{0}/{1} {2}\"", className, methodName, ParametersToString());
+            //Console.WriteLine("cmd string  = '" + cmd + "'");
+            //Console.WriteLine("cmd string length = " + cmd.Length.ToString());
+            return cmd;
+        }
+        public cDeviceMethodParameters(String className, String methodName)
+            {
+                existsInDeviceMission = false;
+                this.className = className;
+                this.methodName = methodName;
+            }
+        public bool AssignIfMatch(String className, String methodName, String parameterStr)
+        {
+            bool match = false;
+            if (this.className.Equals(className) && this.methodName.Equals(methodName))
+            {
+                match = true;
+                existsInDeviceMission = true;
+                AssignByIntArray(ParseHexString(parameterStr));
+            }
+            return match;
+        }
+        private int[] ParseHexString(String hexStr)
+        {
+            int val;
+            List<int> intList = new List<int>();
+            String[] strings = hexStr.Split(new char[] { ' ' });
+            foreach (String str in strings)
+            {
+                if (int.TryParse(str, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val))
+                {
+                    intList.Add(val);
+                }
+                else
+                {
+                    throw new Exception(String.Format("Error In hex string \"{0}\" in \"{1}\"", str, hexStr));
+                }
+            }
+            return intList.ToArray();
+        }
+    }
+}