using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Data.SqlClient; namespace Send_og_modtag_com { public partial class Form1 : Form { /*Sigende navne for kommandoer*/ private const char COMMAND_TEMP_LOW = (char)0x20; private const char COMMAND_TEMP_HIGH = (char)0x21; private const char COMMAND_HEAT_ON = (char)0x22; private const char COMMAND_HEAT_OFF = (char)0x23; private const char COMMAND_HEAT_AUTO = (char)0x24; private const char COMMAND_GET_ALL = (char)0x25; private const char COMMAND_DEACTIVATE_ALARM = (char)0x26; private const string ConnString = @"Data Source=.\SQLEXPRESS;AttachDbFilename='F:\Documents\Visual Studio 2005\Projects\Send og modtag com\Send og modtag com\Home.mdf';Integrated Security=True;User Instance=True"; private SerialPort mPort; public Form1() { InitializeComponent(); comboBoxCom.SelectedIndex = 0; //sætter default comport til COM1 } /*Opretter forbindelse på COM-porten og tjekker om der er valgt COM-port og initialliserer comporten med baudrate osv. Opretter eventhandler til receivedata og åbner porten. Skriver i loggen hvis fejl opstår*/ private void btnConnect_Click(object sender, EventArgs e) { if (comboBoxCom.SelectedIndex < 0) { logmessage("Ingen Comport valgt"); return; } mPort = new SerialPort("COM" + (comboBoxCom.SelectedIndex + 1), 9600, Parity.None, 8, StopBits.One); mPort.DataReceived += new SerialDataReceivedEventHandler(this.receivedata); mPort.Open(); logmessage("Forbindelse oprettet"); btnConnect.Enabled = false; comboBoxCom.Enabled = false; panelAdmin.Enabled = true; timerReceiveData6.Enabled = true; btmnDeaktiverAlarm.Enabled = true; // timerReceiveData.Enabled = true; } /*Sikrer at logmessage kører i samme tråd og tilføjer events i loggen*/ private delegate void MyCallback(string message); private void logmessage(string message) { if (InvokeRequired) { this.Invoke(new MyCallback(logmessage), new object[] { message }); } else { richTextBoxLog.AppendText(System.DateTime.Now.ToLongTimeString() + ": " + message + "\n"); richTextBoxLog.ScrollToCaret(); } } /*Sender kommandoer og data via COM-port til board, sikre at der er forbindelse og porten er åben. Skriver i loggen*/ private void sendtoboard(char kommando, string val) { if (mPort == null) { logmessage("Ingen forbindelse oprettet"); return; } if (mPort.IsOpen == false) { logmessage("Port ikke åben"); return; } try { mPort.Write(((char)0x02) + ""); mPort.Write(kommando + ""); mPort.Write(((char)0x01) + ""); mPort.Write(val); mPort.Write(((char)0x03) + ""); } catch (Exception e) { logmessage(e.Message); } } /*Modtager data fra AVR-boardet linie for linie og splitter strengen op så data er klar til indsættelse i databasen*/ private void receivedata(object sender, EventArgs eventArgs) { try { if (mPort.BytesToRead < 1) return; string data; data = mPort.ReadLine(); char[] split = { ';' }; string[] info; info = data.Split(split); float temp1, temp2; int a, b, H, L; char digi; temp1 = System.Convert.ToSingle(info[0]); temp2 = System.Convert.ToSingle(info[1]); a = System.Convert.ToInt32(info[2]); b = System.Convert.ToInt32(info[3]); H = System.Convert.ToInt32(info[4]); L = System.Convert.ToInt32(info[5]); digi = System.Convert.ToChar(info[6]); SqlParameter paramTid = new SqlParameter(); paramTid.ParameterName = "@Tid"; paramTid.Value = System.DateTime.Now.ToString(); SqlParameter paramTEMP1 = new SqlParameter(); paramTEMP1.ParameterName = "@Temp1"; paramTEMP1.Value = temp1; SqlParameter paramTEMP2 = new SqlParameter(); paramTEMP2.ParameterName = "@Temp2"; paramTEMP2.Value = temp2; SqlParameter paramAlarm = new SqlParameter(); paramAlarm.ParameterName = "@Alarm"; paramAlarm.Value = a; SqlParameter paramBatteri = new SqlParameter(); paramBatteri.ParameterName = "@Batteri"; paramBatteri.Value = b; SqlParameter paramMax = new SqlParameter(); paramMax.ParameterName = "@MaxTemp"; paramMax.Value = H; SqlParameter paramMin = new SqlParameter(); paramMin.ParameterName = "@MinTemp"; paramMin.Value = L; SqlParameter paramDigi = new SqlParameter(); paramDigi.ParameterName = "@Digi"; paramDigi.Value = digi; SqlConnection conn = new SqlConnection(ConnString); string InsertStr = @"Insert into Home (Tid, Temp1, Temp2, Alarm, Batteri, MaxTemp, MinTemp, Digi) Values(@Tid, @Temp1, @Temp2, @Alarm, @Batteri, @MaxTemp, @MinTemp, @Digi)"; SqlCommand cmdInsert = new SqlCommand(InsertStr, conn); cmdInsert.Parameters.Add(paramTid); cmdInsert.Parameters.Add(paramTEMP1); cmdInsert.Parameters.Add(paramTEMP2); cmdInsert.Parameters.Add(paramAlarm); cmdInsert.Parameters.Add(paramBatteri); cmdInsert.Parameters.Add(paramMax); cmdInsert.Parameters.Add(paramMin); cmdInsert.Parameters.Add(paramDigi); conn.Open(); cmdInsert.ExecuteNonQuery(); conn.Close(); SqlCommand cmd = new SqlCommand("SELECT AVG(Temp1) FROM Home WHERE Alarm = 0", conn); conn.Open(); decimal averageTemp = Convert.ToDecimal(cmd.ExecuteScalar()); conn.Close(); //if (b == 1) // checkBoxBatteri.Checked = true; //else checkBoxBatteri.Checked = false; //if (a == 1) // checkBoxTemp.Checked = true; //else // checkBoxTemp.Checked = false; //textBoxTemp.Text = temp1.ToString(); //textBoxGennemsnit.Text = Math.Round(averageTemp, 1).ToString(); logmessage(info[0] + " - " + info[1] + " - " + info[2] + " - " + info[3] + " - " + info[4] + " - " + info[5] + " - " + printBinary(digi).ToString()); } catch (Exception e) { logmessage(e.Message); } } /*Sender data til AVR-board og stiller Max og Min temperatup på AVR-Boardet*/ private void btnTempSet_Click(object sender, EventArgs e) { int H; int L; if (!System.Int32.TryParse(textBoxTempMin.Text, out L)) { logmessage("Indtast et heltal!"); return; } if (!System.Int32.TryParse(textBoxTempMax.Text, out H)) { logmessage("Indtast et heltal!"); return; } if (L >= H) { logmessage(" Max. temp. er mindre end Min.!"); return; } sendtoboard(COMMAND_TEMP_LOW, L + ""); sendtoboard(COMMAND_TEMP_HIGH, H + ""); logmessage("Nye temperaturer er: Min " + L + ", Max " + H); } /*Sender kommando hvert 6. minut og datareceive behandler dataen*/ private void timerReceiveData6_Tick(object sender, EventArgs e) { sendtoboard(COMMAND_GET_ALL, ""); } /*Følgende funktioner sender bare en kommando til AVR-boardet og receivedata modtager og behandler så senere*/ private void radioBtnHeatOn_CheckedChanged(object sender, EventArgs e) { sendtoboard(COMMAND_HEAT_ON, ""); if (radioBtnHeatOn.Checked == true) logmessage("Varme manuelt tændt"); } private void radioBtnHeatOff_CheckedChanged(object sender, EventArgs e) { sendtoboard(COMMAND_HEAT_OFF, ""); if (radioBtnHeatOff.Checked == true) logmessage("Varme Manuelt slukket"); } private void radioBtnHeatAuto_CheckedChanged(object sender, EventArgs e) { sendtoboard(COMMAND_HEAT_AUTO, ""); if (radioBtnHeatAuto.Checked == true) logmessage("Varme kører på automatik"); } private void btmnDeaktiverAlarm_Click(object sender, EventArgs e) { sendtoboard(COMMAND_DEACTIVATE_ALARM, ""); logmessage("Alarmer deaktiveret"); } /*Omregner til binært til brug for visning af status for digitaleindgange*/ string printBinary(char value) { string s = ""; for (int i = 4; i >= 0; --i) { int pow2 = 1; for (int j = 0; j < i; j++) { pow2 *= 2; } if ((value & pow2) == pow2) s = s + "1"; else s = s + "0"; } return s; } } }