예제 #1
1
 public void updateSignal(Signal sig)
 {
     using (var conn = new SQLiteConnection(DataSource))
     {
         conn.Open();
         using (SQLiteCommand command = new SQLiteCommand(conn))
         {
             command.CommandText = "UPDATE Signal SET `type` = @type `at` = @at, `step` = @step, `delta` = @delta, `history_id` = @history_id WHERE `id` = @sid";
             var typeParam = SQLiteHelper.CreateParameter("@type", (int)sig.Type, DbType.Int32);
             var atParam = SQLiteHelper.CreateParameter("@at", sig.Timestamp, DbType.DateTime);
             var stepParam = SQLiteHelper.CreateParameter("@at", sig.Step, DbType.Int32);
             var deltaParam = SQLiteHelper.CreateParameter("@delta", sig.Delta, DbType.Int32);
             var historyIdParam = SQLiteHelper.CreateParameter("@history_id", sig.History.Id, DbType.Int64);
             var sIdParam = SQLiteHelper.CreateParameter("@sid", sig.Id, DbType.Int64);
             command.Parameters.Add(typeParam);
             command.Parameters.Add(atParam);
             command.Parameters.Add(deltaParam);
             command.Parameters.Add(stepParam);
             command.Parameters.Add(historyIdParam);
             command.Parameters.Add(sIdParam);
             command.ExecuteNonQuery();
         }
     }
 }
예제 #2
0
 public void deleteSignal(Signal sig)
 {
     using (var conn = new SQLiteConnection(DataSource))
     {
         conn.Open();
         using (SQLiteCommand command = new SQLiteCommand(conn))
         {
             command.CommandText = "DELETE FROM Signal WHERE `id` = @sid";
             var sIdParam = SQLiteHelper.CreateStringParameter("@sid", sig.Id);
             command.Parameters.Add(sIdParam);
             command.ExecuteNonQuery();
         }
     }
 }
예제 #3
0
        public long saveSignal(Signal sig)
        {
            using (var conn = new SQLiteConnection(DataSource))
            {
                conn.Open();
                using (SQLiteCommand command = new SQLiteCommand(conn))
                {
                    var auto_weld = sig.AutoWeld == true ? true : false;
                    command.CommandText = "INSERT INTO Signal ('type', 'at', 'step', 'delta', 'history_id', 'auto_weld') values (@type, @at, @step, @delta, @history_id, @auto_weld)";
                    var typeParam = SQLiteHelper.CreateParameter("@type", (int)sig.Type, DbType.Int32);
                    var atParam = SQLiteHelper.CreateParameter("@at", sig.Timestamp, DbType.DateTime);
                    var stepParam = SQLiteHelper.CreateParameter("@step", sig.Step, DbType.Int32);
                    var deltaParam = SQLiteHelper.CreateParameter("@delta", sig.Delta, DbType.Int32);
                    var historyIdParam = SQLiteHelper.CreateParameter("@history_id", sig.History.Id, DbType.Int64);
                    var autoWeldParam = SQLiteHelper.CreateParameter("@auto_weld", auto_weld, DbType.Boolean);
                    command.Parameters.Add(typeParam);
                    command.Parameters.Add(atParam);
                    command.Parameters.Add(deltaParam);
                    command.Parameters.Add(stepParam);
                    command.Parameters.Add(historyIdParam);
                    command.Parameters.Add(autoWeldParam);
                    command.ExecuteNonQuery();

                    // signal id
                    long sigId = -1;
                    var sql = "SELECT * FROM Signal ORDER BY `id` DESC LIMIT 1"; // Not thread safe.
                    command.CommandText = sql;
                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        sigId = reader.GetInt64(0);
                    }
                    reader.Close();
                    return sigId;
                }
            }
        }
예제 #4
0
 void SignalProcess(Signal signal)
 {
     this.UIThread(() => {
         SignalLabel.Text = signal.ToString();
     });
     if (signal.Type == SignalType.CollectStart)
     {
         this.UIThread(() => {
             DataCollectButton.PerformClick();
         });
     }
     else if (signal.Type == SignalType.AutoControlStart)
     {
         this.UIThread(() => {
             manualControl = false; // set auto control
             AutoControlButton.PerformClick();
         });
     }
     else
     {
         Console.WriteLine("SerialPort signal received in StartForm: {0}", signal.ToString());
     }
 }
예제 #5
0
 private void SimulateSignal(int i)
 {
     // Simulate a start collect signal:
     Timer timer = new Timer();
     timer.Interval = 5000;
     timer.Tick += new EventHandler((s, evt) =>
     {
         timer.Stop();
         Signal signal;
         var signal1 = new Signal(SignalType.CollectStart);
         var signal2 = new Signal(SignalType.AutoControlStart);
         if (i == 0)
         {
             signal = signal1;
         }
         else
         {
             signal = signal2;
         }
         var data = signal.RawBytes;
         Console.WriteLine(string.Format("发送指令:{0}, raw: {1}", signal.ToString(), signal.ToHexString()));
         currentSerialPort.Write(data, 0, data.Length);
     });
     timer.Start();
 }
예제 #6
0
        private void SendSignalButton_Click(object sender, EventArgs e)
        {
            SerialPort p = CurrentSerialPort;
            if (p == null)
            {
                WriteToDebugBox("端口未打开。");
                return;
            }
            if (SignalSelectionComboBox.SelectedIndex < 0 || SignalSelectionComboBox.SelectedIndex >= debugSignals.Length)
            {
                return;
            }
            var combo = SignalSelectionComboBox;
            var signal = debugSignals[SignalSelectionComboBox.SelectedIndex];
            if (signal.Type == SignalType.Acceleration || signal.Type == SignalType.Deceleration)
            {
                currentStep = signal.Type == SignalType.Acceleration ? currentStep + 1 : currentStep - 1;
                signal = new Signal(signal.Type, currentStep);
            }

            var data = signal.RawBytes;
            WriteToDebugBox(string.Format("发送指令:{0}, raw: {1}", signal.ToString(), signal.ToHexString()));
            p.Write(data, 0, data.Length);
            currentSentSignal = signal;
        }
예제 #7
0
        /***************************************************************************
                               Serial port data processing
        ****************************************************************************/
        private void serialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            #if (DEBUG)
            Console.WriteLine("Serial Port Data Receivered.");
            this.UIThread(() => {
                SignalLabel.Text = "收到数据...";
            });
            #endif
            SerialPort port = (SerialPort)sender;

            int bytesInBuffer = port.BytesToRead;

            byte[] readBytes = new byte[bytesInBuffer];
            try
            {
                port.Read(readBytes, 0, bytesInBuffer);
            }
            catch (TimeoutException)
            {

                MessageBox.Show(this, "数据读取超时。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (InvalidOperationException)
            {

                MessageBox.Show(this, "非法操作。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }
            catch (Exception)
            {
                MessageBox.Show(this, "未知错误。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            for (int i = 0; i < bytesInBuffer; i++)
            {
                var b = readBytes[i];

                if (b == 0xFF)
                {
                    signalBuffer.Clear();
                    timestamp = DateTime.Now;
                }

                signalBuffer.Add(b);

                if (signalBuffer.Count == Signal.LENGTH) // Signal catch finished.
                {
            #if (DEBUG)
                    Console.Write("Signal content: ");
                    for (int j = 0; j < signalBuffer.Count; j++)
                    {
                        Console.Write("{0}", signalBuffer[j]);
                    }
                    Console.WriteLine();
            #endif
                    Signal signal = new Signal(signalBuffer.ToArray(), timestamp);
                    SignalProcess(signal);
                }
            }
        }
예제 #8
0
        /***************************************************************************
                               Serial port helper methods start
        ****************************************************************************/
        private void SignalProcess(Signal signal)
        {
            #if (DEBUG)
            string message = "";
            #endif
            if (signal.isValid())
            {
            #if (DEBUG)
                if (signal.Step != int.MaxValue)
                {
                    message = signal.Type.ToString() + " step " + signal.Step + " detected.\r\n";
                }
                else
                {
                    message = signal.Type.ToString() + " detected.\r\n";
                }
            #endif
                if (signal.Type == SignalType.AutoControlEnd)
                {
                    if (!isControlling)
                    {
                        if (counterdownTimer != null)
                        {
                            counterdownTimer.Stop();
                        }
                    }
                    else
                    {
                        timerCache.ForEach((t) => { t.Stop(); });
                        hardStop = true; // stop from signal.
                        isControlling = false; // not controlling.
                        AutoControl = false; // Auto control is over.
                        this.UIThread(() =>
                        {
                            StartWeldingButton.Enabled = true;
                            WriteToLogBox("焊接被手动终止!");
                            SaveAutoWeldHistory(); // Save Signals anyway even interupted.
                        });
                    }
                    return;
                }
                if (signal.Type == SignalType.AutoControlStart && isControlling == false)
                {
                    AutoControl = true;
                    this.UIThread(() =>
                    {
                        CountDownToWeiding();
                    });
                    signalCache.Clear();
                    return;
                }
                signalCache.Add(signal);
            }
            #if (DEBUG)
            else
            {
                message = "Invalid signal: " + signal.Type.ToString() + " step " + signal.Step + " detected.\r\n";
            }

            Console.WriteLine(message);
            #endif
        }
예제 #9
0
        private void serialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort)sender;

            int bytesInBuffer = port.BytesToRead;

            byte[] readBytes = new byte[bytesInBuffer];
            try
            {
                port.Read(readBytes, 0, bytesInBuffer);
            }
            catch (TimeoutException)
            {
                MessageBox.Show(this, "数据读取超时。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (InvalidOperationException)
            {
                MessageBox.Show(this, "非法操作。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }
            catch (Exception)
            {
                MessageBox.Show(this, "未知错误。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            #if (DEBUG)
            WriteToDebugBox(string.Format("Serial Port Data Receivered: {0}", BitConverter.ToString(readBytes)));
            #endif

            for (int i = 0; i < bytesInBuffer; i++)
            {
                var b = readBytes[i];

                if (b == 0xFF)
                {
                    signalBuffer.Clear();
                    timestamp = DateTime.Now;
                }

                signalBuffer.Add(b);

                if (signalBuffer.Count == Signal.LENGTH) // Signal catch finished.
                {
            #if (DEBUG)
                    Console.Write("Signal content: ");
                    for (int j = 0; j < signalBuffer.Count; j++)
                    {
                        Console.Write("{0}", signalBuffer[j]);
                    }
                    Console.WriteLine();
            #endif
                    Signal signal = new Signal(signalBuffer.ToArray(), timestamp);
                    signal.AutoWeld = true;
                    try
                    {
                        if (signal.Type != currentSentSignal.Type) // Currently only check signal type
                        {
                            var message = string.Format("信号传输错误:\r\n\r\n发送的信号是:{0}\r\n收到的信号是:{1}.\r\n", currentSentSignal.ToString(), signal.ToString());
                            //Ignore error.
                            this.UIThread(() =>
                            {
                                WriteToLogBox(message);
                            });
                        }
                    }
                    catch (Exception exp)
                    {
                        // Ignore
            #if DEBUG
                        Console.WriteLine(exp.StackTrace);
            #endif
                    }

                    this.UIThread(() =>
                    {
                        var message = string.Format(" - 收到响应信号“{0}”", signal.ToString());
                        WriteToLogBox(message);
                    });

                    SignalProcess(signal);
                }
            }
        }
예제 #10
0
 private void executeSignalGroup(int currentIndex)
 {
     var p = CurrentSerialPort;
     var progressBarStart = weldingProgressBar.Value;
     var signals = History.Signals;
     var signalCount = signals.Count;
     timerCache.Clear();
     for (int i = 0; i < signals.Count; i++)
     {
         var sig = signals[i];
         if (sig.Delta == 0)
         {
             var data = sig.RawBytes;
             WriteToLogBox(string.Format("发送指令({0}/{1}): {2}", i + 1, signalCount, sig.ToString()));
             p.Write(data, 0, data.Count());
             currentSentSignal = sig;
             isControlling = true;
         }
         else
         {
             Timer timer = new Timer();
             timerCache.Add(timer);
             timer.Interval = sig.Delta;
             var data = sig.RawBytes;
             var k = i;
             var ttl = sig.Delta;
             timer.Tick += new EventHandler((s, evt) =>
             {
                 timer.Stop();
                 weldingProgressBar.Value = progressBarStart + ttl;
                 WriteToLogBox(string.Format("发送指令({0}/{1}): {2}", k + 1, signalCount, sig.ToString()));
                 p.Write(data, 0, data.Count());
                 this.currentSentSignal = sig;
                 if (k == signalCount - 1) // last order
                 {
                     isControlling = false;
                     FinishUpWelding();
                 }
             });
             timer.Start();
         }
     }
 }
예제 #11
0
        private void updatePlotWithSignal(Signal signal)
        {
            this.UIThread(() => {
                ScatterSeries currentSerials = null;
                currentSpeed = 0;
                switch (signal.Type)
                {
                    case SignalType.ArcStart:
                        WriteToLogBox("\r\n焊接程序开始:\r\n");
                        currentSerials = arcScatterSeries;
                        break;
                    case SignalType.ArcEnd:
                        currentSerials = arcScatterSeries;
                        break;
                    case SignalType.SolderStart:
                        currentSerials = solderScatterSeries;
                        break;
                    case SignalType.SolderEnd:
                        currentSerials = solderScatterSeries;
                        break;
                    case SignalType.Acceleration:
                        currentSerials = accScatterSeries;
                        currentSpeed = signal.Step;
                        break;
                    case SignalType.Deceleration:
                        currentSerials = deaccScatterSeries;
                        currentSpeed = signal.Step; // TODO: Fixme, should be minus while reverse rotate.
                        break;
                    case SignalType.RotateStart:
                        currentSerials = rotateScatterSeries;
                        break;
                    case SignalType.RotateEnd:
                        currentSerials = rotateScatterSeries;
                        break;
                    case SignalType.RevolveStart:
                        currentSerials = reverseRotateScatterSeries;
                        break;
                    case SignalType.RevolveEnd:
                        currentSerials = reverseRotateScatterSeries;
                        break;
                    case SignalType.Unknown:
                        currentSerials = rotateScatterSeries; // TODO: Fix it.
                        break;
                    default:
                        currentSerials = rotateScatterSeries; // TODO: Fix it.
                        break;
                }

                WriteToLogBox("- " + signal.ToString());

                Plot.Model.InvalidatePlot(true);
                var signals = signalCache;
                var signalCount = signals.Count;

                if (signalCount == 1) // First point
                {
                    var point = new ScatterPoint(currentTime, currentSpeed, 3);
                    arcScatterSeries.Points.Add(point);
                }
                if (signalCount > 1)
                {
                    var previousSignal = signals[signalCount - 2];
                    var currentSignal = signals[signalCount - 1];

                    TimeSpan span = currentSignal.Timestamp - previousSignal.Timestamp;
                    currentTime += span.TotalSeconds;
                    var point = new ScatterPoint(currentTime, currentSpeed, 3);
                    Console.WriteLine("CurrentTime: " + currentTime);
                    if (Math.Ceiling(currentTime) >= 10)
                    {
                        axis1.Maximum = Math.Floor(currentTime + 5);
                    }
                    currentSerials.Points.Add(point);
                }
                // Create Line series
            });
        }
예제 #12
0
        private void SignalProcess(Signal signal)
        {
            #if DEBUG
            string message = "";
            #endif
            if (signal.isValid())
            {
                if (signal.Type == SignalType.CollectEnd)
                {
                    isRecording = false;
                    StopRecordAndSaveData();
                    return;
                }
                signalCache.Add(signal);
            #if DEBUG
                if (signal.Step != int.MaxValue)
                {
                    message = signal.Type.ToString() + " step " + signal.Step + " detected.\r\n";
                }
                else
                {
                    message = signal.Type.ToString() + " detected.\r\n";
                }
            #endif
                updatePlotWithSignal(signal);
            }
            #if DEBUG
            else
            {
                message = "Invalid signal: " + signal.Type.ToString() + " step " + signal.Step + " detected.\r\n";
            }

            Console.WriteLine(message);
            #endif
        }
예제 #13
-1
        public List<Signal> SignalListOfHistory(History history, bool auto_weld = false)
        {
            var signals = new List<Signal>();
            using (var conn = new SQLiteConnection(DataSource))
            {
                conn.Open();
                using (SQLiteCommand command = new SQLiteCommand(conn))
                {
                    var autoweld_value = auto_weld ? 1 : 0;
                    var sql = "SELECT * FROM Signal WHERE `history_id` = @hid and `auto_weld` = @autoweld ORDER BY `at` ASC ";
                    command.CommandText = sql;
                    var hIdParam = SQLiteHelper.CreateStringParameter("@hid", history.Id);
                    var autoweldParam = SQLiteHelper.CreateStringParameter("@autoweld", autoweld_value);
                    command.Parameters.Add(hIdParam);
                    command.Parameters.Add(autoweldParam);
                    var reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        var id = reader.GetInt64(0);
                        var type = reader.GetInt32(1);
                        var step = reader.GetInt32(2);
                        var at = (DateTime)reader.GetValue(3);
                        var delta = reader.GetInt32(4);

                        var signal = new Signal(type, step, at);
                        signal.Id = id;
                        signal.Delta = delta;
                        signal.History = history;
                        signals.Add(signal);
                    }

                    return signals;
                }
            }
        }