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(); } } }
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(); } } }
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; } } }
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()); } }
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(); }
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; }
/*************************************************************************** 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); } } }
/*************************************************************************** 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 }
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); } } }
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(); } } }
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 }); }
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 }
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; } } }