using System; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Ports; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace MacManagerForTemPatch { public partial class Form1 : Form { private bool flag_start; private bool flag_end; private byte[] mSerial_Buff; private int mSerial_Buff_idx; static private List macList; private StringCollection savedMacList; private StringCollection runTimeData; public Form1() { InitializeComponent(); runTimeData = new StringCollection(); //comboBox_comport.DataSource = SerialPort.GetPortNames(); mSerial_Buff = new byte[4096]; mSerial_Buff_idx = 0; macList = new List(); savedMacList = Properties.Settings.Default.savedmaclist; label_lastmac.Text = ""; if (savedMacList != null) { if(savedMacList.Count > 0 ) { for(int i = 0; i < savedMacList.Count; i++) { String temp = savedMacList[i]; String[] array = temp.Split(','); Console.WriteLine("data : " + temp); ListViewItem lvi = new ListViewItem((i+1).ToString()); lvi.SubItems.Add(array[0]); lvi.SubItems.Add(array[1]); lvi.SubItems.Add(array[2]); Data data = new Data(array[0], array[1], array[2]); updateList(data); } } } GetSerialPort(); } private void GetSerialPort() { // comboBox_comport.DataSource = SerialPort.GetPortNames(); comboBox_comport.Items.Clear(); try { foreach (string str in SerialPort.GetPortNames()) { comboBox_comport.Items.Add(str); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } protected override void WndProc(ref Message m) { UInt32 WM_DEVICECHANGE = 0x0219; UInt32 DBT_DEVTUP_VOLUME = 0x02; UInt32 DBT_DEVICEARRIVAL = 0x8000; UInt32 DBT_DEVICEREMOVECOMPLETE = 0x8004; if ((m.Msg == WM_DEVICECHANGE) && (m.WParam.ToInt32() == DBT_DEVICEARRIVAL))//디바이스 연결 { //int m_Count = 0; int devType = Marshal.ReadInt32(m.LParam, 4); if (devType == DBT_DEVTUP_VOLUME) { GetSerialPort(); } } if ((m.Msg == WM_DEVICECHANGE) && (m.WParam.ToInt32() == DBT_DEVICEREMOVECOMPLETE)) //디바이스 연결 해제 { int devType = Marshal.ReadInt32(m.LParam, 4); if (devType == DBT_DEVTUP_VOLUME) { GetSerialPort(); } } base.WndProc(ref m); } private void button_save_csv_Click(object sender, EventArgs e) { string fileName; SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Title = "저장 경로를 선택하세요"; saveFileDialog.OverwritePrompt = true; saveFileDialog.Filter = "CSV 파일 (*.csv)|*.csv|모든 파일 (*.*)|*.*"; saveFileDialog.FileName = "[" + macList.Count.ToString() + "]TemPatchMacAddress_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".csv"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { fileName = saveFileDialog.FileName; ListViewToCSV(listView_maclist, fileName, false); //public static void ListViewToCSV(ListView listView, string filePath, bool includeHidden) } } private void button_open_Click(object sender, EventArgs e) { if (!serialPort.IsOpen) //시리얼포트가 열려 있지 않으면 { serialPort.PortName = comboBox_comport.Text; serialPort.BaudRate = 115200; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; serialPort.RtsEnable = false; serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); try { serialPort.Open(); //label_comport_status.Text = "Port Opened"; } catch { //MessageBox.Show("사용중인 시리얼 포트 입니다."); MessageBox.Show("Already used in serial port."); } } else //시리얼포트가 열려 있으면 { //label_comport_status.Text = "Port already Opened.."; serialPort.Close(); } if (serialPort.IsOpen) { comboBox_comport.Enabled = false; //COM포트설정 콤보박스 비활성화 ((Button)(sender)).Text = "CLOSE"; } else { comboBox_comport.Enabled = true; //COM포트설정 콤보박스 비활성화 ((Button)(sender)).Text = "OPEN"; } } private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { this.Invoke(new EventHandler(SerialReceived)); } catch { Console.WriteLine("error : " + e); } } private void updateList(Data data) { macList.Add(data); ListViewItem lvi = new ListViewItem((macList.Count).ToString()); //lvi.SubItems.Add(); lvi.SubItems.Add(data.MacAddr); lvi.SubItems.Add(data.Write_Date); lvi.SubItems.Add(data.Write_Time); listView_maclist.Items.Add(lvi); String tempbuf = data.MacAddr + ',' + data.Write_Date + ',' + data.Write_Time; //savedMacList.Add(tempbuf); runTimeData.Add(tempbuf); Properties.Settings.Default.savedmaclist = runTimeData; Properties.Settings.Default.Save(); listView_maclist.EnsureVisible(macList.Count - 1); foreach (ListViewItem item in listView_maclist.Items) { item.BackColor = Color.Transparent; } listView_maclist.Items[macList.Count - 1].BackColor = Color.SkyBlue; label_lastmac.Text = macList.Count.ToString() + "번 " + data.MacAddr; } private void SerialReceived(object s, EventArgs e) //여기에서 수신 데이타를 사용자의 용도에 따라 처리한다. { int i_recv_size = serialPort.BytesToRead; int data_len = 0; byte[] b_tmp_buf = new byte[i_recv_size]; string recv_str = ""; if (i_recv_size == 0) return; serialPort.Read(b_tmp_buf, 0, i_recv_size); recv_str = Encoding.Default.GetString(b_tmp_buf); Console.WriteLine(recv_str); for (int i = 0; i < i_recv_size; i++) { if (b_tmp_buf[i] == '#') { flag_start = true; continue; } if (flag_start == true) { mSerial_Buff[mSerial_Buff_idx++] = b_tmp_buf[i]; if (mSerial_Buff_idx > 1) { if (b_tmp_buf[i] == '$') { flag_end = true; } if (flag_end == true) { byte[] temp = new byte[mSerial_Buff_idx-1]; Array.Copy(mSerial_Buff, temp, mSerial_Buff_idx-1); // For Debugging Console string mac = Encoding.Default.GetString(temp); Console.WriteLine("mac : " + mac); String date = DateTime.Now.ToString("yyyy-MM-dd"); String time = DateTime.Now.ToString("HH:mm:ss"); Data data = new Data(mac, date, time); mSerial_Buff_idx = 0; flag_end = false; flag_start = false; updateList(data); } } } } } public void ListViewToCSV(ListView listView, string filePath, bool includeHidden) { //make header string StringBuilder result = new StringBuilder(); WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listView.Columns[i].Text); //export data rows foreach (ListViewItem listItem in listView.Items) WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listItem.SubItems[i].Text); File.WriteAllText(filePath, result.ToString()); if (MessageBox.Show("저장이 완료되었습니다. 목록을 삭제할까요? ", "데이터 삭제", MessageBoxButtons.YesNo) == DialogResult.Yes) { macList.Clear(); listView_maclist.Items.Clear(); Properties.Settings.Default.savedmaclist.Clear(); Properties.Settings.Default.Save(); label_lastmac.Text = ""; } else { // MessageBox.Show("아니요 클릭"); } } private static void WriteCSVRow(StringBuilder result, int itemsCount, Func isColumnNeeded, Func columnValue) { bool isFirstTime = true; for (int i = 0; i < itemsCount; i++) { if (!isColumnNeeded(i)) continue; if (!isFirstTime) result.Append(","); isFirstTime = false; result.Append(String.Format("\"{0}\"", columnValue(i))); } result.AppendLine(); } private void button_removeAll_Click(object sender, EventArgs e) { if(macList.Count > 0) { if (MessageBox.Show("목록을 삭제할까요? ", "데이터 삭제", MessageBoxButtons.YesNo) == DialogResult.Yes) { macList.Clear(); listView_maclist.Items.Clear(); Properties.Settings.Default.savedmaclist.Clear(); Properties.Settings.Default.Save(); label_lastmac.Text = ""; } } else { MessageBox.Show("삭제할 데이터가 없습니다."); } } private void button_add_test_Click(object sender, EventArgs e) { var chars = "ABCDE0123456789"; var stringChars = new char[17]; var random = new Random(); for (int i = 0; i < stringChars.Length; i++) { if (i == 2 || i == 5 || i == 8 || i == 11 || i == 14) stringChars[i] = ':'; else stringChars[i] = chars[random.Next(chars.Length)]; } var temp_mac = new String(stringChars); String date = DateTime.Now.ToString("yyyy-MM-dd"); String time = DateTime.Now.ToString("HH:mm:ss"); Data data = new Data(temp_mac, date, time); updateList(data); } } }