public void InitRecording(ProgramSetting setting)
 {
     Mouse.OverrideCursor = Cursors.Wait;
     Busy.IsBusy          = true; //Enable busy indicator to bolck main window
     //Use background thread to execute initialization
     ThreadPool.QueueUserWorkItem((object state) =>
     {
         SensorInfos.Clear();
         string conf = File.ReadAllText(setting.SensorConfPath);
         SensorInfos.AddRange(JsonConvert.DeserializeObject <List <SensorInfo> >(conf));
         SelectedSensor = SensorInfos[0];
         WindSensor     = SensorInfos.Find(t => t.SensorType == SensorInfo.Types.Anemometer); //Find Anemometer
         if (WindSensor == null)
         {
             MessageBox.Show("No anemometer found in sensor list.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
         }
         else
         {
             Application.Current.Dispatcher.Invoke(() => //Use invoke to refresh UI elements
             {
                 WindInfo.DataContext = WindSensor.SensorData;
             });
         }
         dataLogger    = new DataLoger();
         string result = dataLogger.Init(setting);
         if (result == "Error") //If the Tapis is not available, abort init.
         {
             MessageBox.Show("Unable to refresh Tapis token.Please creat token manually.");
             return;
         }
         if (SerialCOM.IsOpen)
         {
             SerialCOM.Close();
         }
         SerialCOM.InitCOM(setting.PortName, setting.BaudRate, new SerialDataReceivedEventHandler(SerialPort_DataReceived));
         sensorWatcher.SetTimer(SensorInfos);
         Application.Current.Dispatcher.Invoke(() => //Use invoke to refresh UI elements
         {
             NodeList.Items.Refresh();
             sciChartSurface.DataContext = SelectedSensor.SensorData.PlotControl;
             sll.DataContext             = SelectedSensor.SensorData.PlotControl;
             lll.DataContext             = SelectedSensor.SensorData.PlotControl;
             Status.DataContext          = SelectedSensor.SensorData;
             CloudStatus.DataContext     = dataLogger;
             StateManager           = new StateManager(dataLogger, SerialCOM, dataBaseUtils, this, StateManager.State.Recording);
             ModeStatus.DataContext = StateManager;
             Mouse.OverrideCursor   = null;
             Busy.IsBusy            = false; //Disable busy indicator.
         });
     }, null);
 }
        /// <summary>
        /// Data received event.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!isCollecting)
            {
                return;
            }
            byte[] data = new byte[36];
            try
            {
                while (SerialCOM.serialPort.ReadByte() != 255)
                {
                    ;
                }
                while (SerialCOM.serialPort.BytesToRead < 36)
                {
                    ;
                }
                SerialCOM.serialPort.Read(data, 0, 36);
            }
            catch (Exception ex)
            {
                Logger.Debug(ex, "Cannot read data from serial port.");
                return;
            }
            DataPackage dataPackage = DataPackage.Decode(data);

            if (dataPackage == null || !dataPackage.passCrc32)
            {
                return;
            }
            dataBaseUtils?.PostData(dataPackage);
            dataLogger.AddData(dataPackage.DataString);
            SensorInfo sensorInfo = SensorInfos.Find(x => x.SensorID == dataPackage.SensorID);

            if (sensorInfo == null)
            {
                //Add undefined sensor to list.
                SensorInfo info = new SensorInfo()
                {
                    Name       = "Undefind" + dataPackage.SensorID.ToString(),
                    SensorID   = dataPackage.SensorID,
                    SensorType = (SensorInfo.Types)(dataPackage.SensorTYpe - 1),
                    NetWorkID  = dataPackage.NetworkID,
                };
                SensorInfos.Add(info);
                Application.Current.Dispatcher.Invoke(() => //Use invoke to refresh UI elements
                {
                    NodeList.Items.Refresh();
                });
                sensorInfo = info;
                //Set as Anemometer if it is not found before.
                if (WindSensor == null && info.SensorType == SensorInfo.Types.Anemometer)
                {
                    WindSensor = info;
                }
            }
            if (sensorInfo.SensorType != (SensorInfo.Types)(dataPackage.SensorTYpe - 1))
            {
                return;
            }
            //Add data to sensor data class and plot
            sensorInfo.SensorData.GetSensorData(dataPackage);
            if (sensorInfo == SelectedSensor)
            {
                using (sciChartSurface.SuspendUpdates())
                {
                    SelectedSensor.SensorData.PlotControl.RefreshLimit(DateTime.Now);
                    LineSeries.DataSeries = SelectedSensor.SensorData.PressureLine;
                }
            }
            if (sensorInfo == WindSensor)
            {
                using (sciChartSurface.SuspendUpdates())
                {
                    WindSeries.DataSeries = WindSensor.SensorData.WindPlot;
                }
            }
        }