You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

406 lines
12 KiB

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<Data> 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<Data>();
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<int, bool> isColumnNeeded, Func<int, string> 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);
}
}
}