using System; using System.Linq; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections.ObjectModel; using SmartX; using INT_LKD.DataStore; using INT_LKD.Forms; namespace INT_LKD.DialogForms { public partial class DialogFormProgressBar : Form { #region Field private int Check; private int Code; private string USBPath = ""; private string UpdateFileDisplayPath = ""; private string UpdateFileMainboardPath = ""; private string OldFilePath = ""; private string RemoveFolderPath = ""; FileInfo[] NewFiles; public bool IsCommunicationLogOpen; // 업데이트 메인보드 public UpdateForMainBoard UpdateForMain; private Define.E_LanguageID m_Language; private FormMain m_ParentForm; #endregion #region Constructor public DialogFormProgressBar(int code, Define.E_LanguageID language, FormMain parent) { InitializeComponent(); this.smartGroupBox1.Text = ""; this.labelMessage1.Text = ""; this.labelMessage2.Text = ""; this.ParentForm = parent; this.Code = code; this.Language = language; this.buttonCancel.Visible = false; if (language == Define.E_LanguageID.Korean) { #region 한글 switch (code) { case 1: this.smartGroupBox1.Text = "Display Update"; this.labelMessage1.Text = "업데이트 중..."; this.labelMessage2.Text = "USB를 본체에서 분리하지 마십시오."; break; default: this.smartGroupBox1.Text = "Error 99"; this.labelMessage1.Text = "제조사에 문의하세요"; this.labelMessage2.Text = ""; break; } #endregion } else if (language == Define.E_LanguageID.English) { #region 영문 switch (code) { case 1: this.smartGroupBox1.Text = "Display update"; this.labelMessage1.Text = "Updating..."; this.labelMessage2.Text = "Do not remove the USB from the device."; break; default: this.smartGroupBox1.Text = "Error 99"; this.labelMessage1.Text = "Please contact a manufacturer"; break; } #endregion } else if (language == Define.E_LanguageID.Chinese) { #region 중문 switch (code) { case 1: this.labelMessage1.Text = "更新中…."; this.labelMessage2.Text = "请勿断开USB"; break; default: this.smartGroupBox1.Text = "错误 99"; this.labelMessage1.Text = "请联系厂商"; this.labelMessage2.Text = ""; break; } #endregion } else { } } public DialogFormProgressBar(int code, Define.E_LanguageID language, UpdateForMainBoard updateForMain, FormMain parent) { InitializeComponent(); this.smartGroupBox1.Text = ""; this.labelMessage1.Text = ""; this.labelMessage2.Text = ""; this.ParentForm = parent; this.Code = code; this.UpdateForMain = updateForMain; this.Language = language; if (language == Define.E_LanguageID.Korean) { #region 한글 switch (code) { case 2: this.smartGroupBox1.Text = "Mainboard Update"; this.labelMessage1.Text = "업데이트 중..."; this.labelMessage2.Text = "USB를 본체에서 분리하지 마십시오."; break; default: this.smartGroupBox1.Text = "Error 99"; this.labelMessage1.Text = "제조사에 문의하세요"; this.labelMessage2.Text = ""; break; } #endregion } else if (language == Define.E_LanguageID.English) { #region 영문 switch (code) { case 2: this.smartGroupBox1.Text = "Mainboard update"; this.labelMessage1.Text = "Updating..."; this.labelMessage2.Text = "Do not remove the USB from the device."; break; default: this.smartGroupBox1.Text = "Error 99"; this.labelMessage1.Text = "Please contact a manufacturer"; break; } #endregion } else if (language == Define.E_LanguageID.Chinese) { #region 중문 switch (code) { case 1: this.labelMessage1.Text = "更新中…."; this.labelMessage2.Text = "请勿断开USB"; break; default: this.smartGroupBox1.Text = "错误 99"; this.labelMessage1.Text = "请联系厂商"; this.labelMessage2.Text = ""; break; } #endregion } else { } } #endregion #region Property public Define.E_LanguageID Language { get { return this.m_Language; } set { this.m_Language = value; } } public FormMain ParentForm { get { return this.m_ParentForm; } private set { this.m_ParentForm = value; } } #endregion #region Method private void InitializeControl() { int x = 0, y = 0; x = Screen.PrimaryScreen.Bounds.Width / 2 - this.Size.Width / 2; y = Screen.PrimaryScreen.Bounds.Height / 2 - this.Size.Height / 2; this.Location = new Point(x, y); this.Size = new Size(452, 197); } private void InitializeDesign(Define.E_LanguageID language) { switch (language) { case Define.E_LanguageID.Chinese: this.smartGroupBox1.Text = "更新"; this.buttonCancel.ButtonText = "取消"; break; case Define.E_LanguageID.English: this.buttonCancel.ButtonText = "ESC"; break; case Define.E_LanguageID.Korean: this.buttonCancel.ButtonText = "ESC"; break; default: break; } } private void DefaultSetting() { if (this.Code == 2) this.OpenSerialPort(); if (Directory.Exists("Hard Disk\\") == true) this.USBPath = "Hard Disk\\"; else if (Directory.Exists("하드 디스크\\") == true) this.USBPath = "하드 디스크\\"; else this.USBPath = "하드 디스크\\"; this.UpdateFileDisplayPath = this.USBPath + "UpdateFiles\\"; this.UpdateFileMainboardPath = this.USBPath + "UpdateFilesMain\\ibd902m.bin"; //this.OldFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\"; this.OldFilePath = "SD Card\\Run\\"; this.RemoveFolderPath = "SD Card\\RemoveFile\\"; } #region Display Update private void ProgramUpdateDisplay() { DirectoryInfo directoryFolderUpdateFiles = new DirectoryInfo(this.UpdateFileDisplayPath); if (directoryFolderUpdateFiles.Exists == false) directoryFolderUpdateFiles.Create(); this.NewFiles = directoryFolderUpdateFiles.GetFiles(); } private void TreatmentRemoveOldFile() { bool removeFolderCheck = false; FileInfo[] oldFiles; FileInfo[] removeFiles; DirectoryInfo directoryFolderRun = new DirectoryInfo(this.OldFilePath); DirectoryInfo directoryFolderRemove = new DirectoryInfo(this.RemoveFolderPath); removeFolderCheck = directoryFolderRemove.Exists; oldFiles = directoryFolderRun.GetFiles(); if (removeFolderCheck == false) directoryFolderRemove.Create(); //else //{ // removeFiles = directoryFolderRemove.GetFiles(); // foreach (FileInfo file in removeFiles) // file.Delete(); //} foreach (FileInfo subFile in oldFiles) subFile.MoveTo(RemoveFolderPath + DateTime.Now.ToString("yyyyMMddHHmmss") + subFile.Name.ToString()); } private void TreatmentCopyNewFile(FileInfo[] newFile) { // 새 파일 복사 foreach (FileInfo subFile in newFile) subFile.CopyTo(this.OldFilePath + subFile.Name.ToString()); } #endregion #region Mainboard Update private void OpenSerialPort() { string fullPath = ""; try { if (this.smartSerialPort1.IsOpen == false) this.smartSerialPort1.Open(); } catch { } fullPath = "SD Card\\DataBackup\\UpdateLog.txt"; this.smartFileCommunicationLog.FilePathName = fullPath; this.smartFileCommunicationLog.Open(); this.IsCommunicationLogOpen = true; } public void CloseSerialPort() { if (this.IsCommunicationLogOpen == true) { this.IsCommunicationLogOpen = false; this.smartFileCommunicationLog.Close(); } this.smartSerialPort1.Close(); } public int TransferData(string command, string id) { int ret = 0; string chkSum = "cc"; StringBuilder sb = new StringBuilder(); sb.Append(command); sb.Append(id); chkSum = this.Checksumcalculator(sb.ToString()); sb.Append(chkSum); if (this.smartSerialPort1.IsOpen == true) this.smartSerialPort1.WriteFrame(sb.ToString(), SmartSerialPort.CODETYPES.ASCIICODE); // 통신 확인 로그 if (this.IsCommunicationLogOpen == true) this.smartFileCommunicationLog.StringType.Write(string.Format("Send ({0:yyyy-MM-dd HH:mm:ss}): {1}", DateTime.Now, sb.ToString())); return ret; } private string Checksumcalculator(string strTemp) { string chkSum = ""; byte[] temp; int value = 0, first = 0, second = 0; char char1, char2; if (strTemp == null || strTemp.Length == 0) chkSum = "cc"; else { temp = new UTF8Encoding().GetBytes(strTemp); for (int i = 0; i < temp.Length; i++) value += temp[i]; first = (value & 0x00f0) >> 4; if (first > 9) char1 = (char)(first + 0x37); else char1 = (char)(first + 0x30); second = value & 0x000f; if (second > 9) char2 = (char)(second + 0x37); else char2 = (char)(second + 0x30); chkSum = char1.ToString() + char2.ToString(); } return chkSum; } private string Checksumcalculator(byte[] strTemp) { string chkSum = ""; byte[] temp; int value = 0, first = 0, second = 0; char char1, char2; if (strTemp == null || strTemp.Length == 0) chkSum = "cc"; else { temp = strTemp; for (int i = 0; i < temp.Length; i++) value += temp[i]; first = (value & 0x00f0) >> 4; if (first > 9) char1 = (char)(first + 0x37); else char1 = (char)(first + 0x30); second = value & 0x000f; if (second > 9) char2 = (char)(second + 0x37); else char2 = (char)(second + 0x30); chkSum = char1.ToString() + char2.ToString(); } return chkSum; } private void SetCollectionForStringToByte(ref Collection collection, string value) { byte[] byteData; if (collection == null) return; byteData = Encoding.UTF8.GetBytes(value); for (int i = 0; i < byteData.Length; i++) collection.Add(byteData[i]); } public int TransferDataStream(string command, string id, string address, string data) { int ret = 0; string chkSum = "cc"; StringBuilder sb = new StringBuilder(); sb.Append(command); sb.Append(id); sb.Append(Helper.StringBlankFillDigits4(data.Length.ToString())); sb.Append(address); sb.Append(data); chkSum = this.Checksumcalculator(sb.ToString()); sb.Append(chkSum); if (this.smartSerialPort1.IsOpen == true) this.smartSerialPort1.WriteFrame(sb.ToString(), SmartSerialPort.CODETYPES.ASCIICODE); return ret; } public int TransferDataStream(string command, string id, string address, string index, byte[] datas) { int ret = 0, count = 0; byte[] byteData; string chkSum = "cc"; Collection byteCollection = new Collection(); // command; this.SetCollectionForStringToByte(ref byteCollection, command); // id; this.SetCollectionForStringToByte(ref byteCollection, id); // data Length count = datas.Length + index.Length; this.SetCollectionForStringToByte(ref byteCollection, Helper.StringZeroFillDigits4(count.ToString())); // address this.SetCollectionForStringToByte(ref byteCollection, address); // index this.SetCollectionForStringToByte(ref byteCollection, index); // datas for (int i = 0; i < datas.Length; i++) byteCollection.Add(datas[i]); // chkSum byteData = new byte[byteCollection.Count]; for (int i = 0; i < byteCollection.Count; i++) byteData[i] = byteCollection[i]; chkSum = this.Checksumcalculator(byteData); this.SetCollectionForStringToByte(ref byteCollection, chkSum); // collection -> byte[] byteData = new byte[byteCollection.Count]; for (int i = 0; i < byteCollection.Count; i++) byteData[i] = byteCollection[i]; if (this.smartSerialPort1.IsOpen == true) this.smartSerialPort1.WriteFrame(byteData); return ret; } private void RetryUpdateForMain(UpdateForMainBoard update) { this.TransferDataStream(CommunicationCommand.Write, CommunicationID.MainBoard, CommunicationAddress._1651_UpdateForMain, Helper.StringZeroFillDigits4(update.Index.ToString()), update.SendData); this.smartTimerUpdate.Start(); } public void SendUpdateForMain(byte[] datas) { int count = 0; if (datas.Length == 0) return; count = datas.Length / 128; if (count != 0) { this.UpdateForMain.SendData = new byte[128]; for (int i = 0; i < 128; i++) this.UpdateForMain.SendData[i] = datas[i]; } else { this.UpdateForMain.SendData = new byte[datas.Length]; for (int i = 0; i < datas.Length; i++) this.UpdateForMain.SendData[i] = datas[i]; this.UpdateForMain.IsLastData = true; } this.TransferDataStream(CommunicationCommand.Write, CommunicationID.MainBoard, CommunicationAddress._1651_UpdateForMain, Helper.StringZeroFillDigits4(this.UpdateForMain.Index.ToString()), this.UpdateForMain.SendData); if (this.UpdateForMain.ProgressBar1 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar2 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar3 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar4 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar5 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar6 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar7 == count) this.progressBarUpdate.Value += 10; else if (this.UpdateForMain.ProgressBar8 == count) this.progressBarUpdate.Value += 10; this.smartTimerUpdate.Start(); } private void ProgramUpdateMainboard() { long a = 0; int count = 0, byteCount = 0; FileStream fs = new FileStream(this.UpdateFileMainboardPath, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); a = br.BaseStream.Length; byteCount = int.Parse(a.ToString()); this.UpdateForMain.ByteData = br.ReadBytes(byteCount); count = byteCount / 128; this.UpdateForMain.SendDataCount = count; this.timerForMainBoard.Start(); } public void UpdateMainBoardFail(Define.E_LanguageID language) { this.progressBarUpdate.Visible = false; this.buttonCancel.Visible = true; switch (language) { case Define.E_LanguageID.Korean: this.labelMessage1.Text = "업데이트가 실패하였습니다."; this.labelMessage2.Text = "메인보드를 체크해 주시기 바랍니다."; break; case Define.E_LanguageID.English: this.labelMessage1.Text = "Update Fail!"; this.labelMessage2.Text = "Please Check your MainBoard"; break; case Define.E_LanguageID.Chinese: this.labelMessage1.Text = "更新失败"; this.labelMessage2.Text = "请检查主板"; break; default: break; } } private void UpdateFinish(Define.E_LanguageID language) { switch (language) { case Define.E_LanguageID.Korean: this.labelMessage1.Text = "프로그램 업데이트 완료"; this.labelMessage2.Text = "전원을 끄고 다시 켜주세요"; break; case Define.E_LanguageID.English: this.labelMessage1.Text = "Program update complete"; this.labelMessage2.Text = "Reset the system"; break; case Define.E_LanguageID.Chinese: this.labelMessage1.Text = "系统更新完成"; this.labelMessage2.Text = "关掉电源,然后在打开电源"; break; default: break; } this.Refresh(); if (this.Code == 1) { this.ParentForm.TransferData(CommunicationCommand.MainboardReboot, CommunicationID.MainBoard); //this.smartTimerReboot.Start(); } this.smartTimerReboot.Start(); } #endregion #endregion #region Override Member protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.InitializeControl(); this.DefaultSetting(); this.Check = 0; this.timerUpdate.Start(); } #endregion #region Event Handler private void smartSerialPort1_OnReadQueueEvent() { int ret = 0, index = 0; byte[] beforeData; string ack = "", data = ""; string cmd = "", address = "", lane = "", receiveData = "", error = ""; string strTemp = ""; byte[] readByte; Define.E_ResponseData response = Define.E_ResponseData.NAK; SmartSerialPort.FRAMEDATAREADSTATUS receiveDataState = SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY; try { receiveDataState = this.smartSerialPort1.ReadQueue(out readByte); strTemp = Encoding.Default.GetString(readByte, 0, readByte.Length); } catch { return; } if ((receiveDataState == SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY) || (receiveDataState == SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA)) { return; } cmd = strTemp.Substring(0, 3); try { switch (strTemp[0]) { case 'C': error = strTemp.Substring(4, 1); // 로그 if (this.IsCommunicationLogOpen == true) this.smartFileCommunicationLog.StringType.Write(string.Format("Update Receive ({0:yyyy-MM-dd HH:mm:ss}): {1}", DateTime.Now, strTemp)); switch (cmd) { case "CBU": if (error == "1") this.UpdateMainBoardFail(Language); else { this.CloseSerialPort(); this.progressBarUpdate.Value += 100; this.UpdateFinish(Language); } break; default: break; } break; case 'P': lane = strTemp.Substring(5, 1); address = strTemp.Substring(10, 4); receiveData = strTemp.Substring(14, strTemp.Length - 16); if (this.IsCommunicationLogOpen == true) this.smartFileCommunicationLog.StringType.Write(string.Format("Update Receive ({0:yyyy-MM-dd HH:mm:ss}): {1}", DateTime.Now, strTemp.Substring(0, 14))); switch (address) { case "1651": #region 업데이트 #region Value Assign try { index = int.Parse(receiveData.Substring(0, 4)); } catch { index = 0; } ack = receiveData.Substring(4, 4); #endregion if (ack == "0001") response = Define.E_ResponseData.ACK; else response = Define.E_ResponseData.NAK; if (this.UpdateForMain.Index == index) { this.smartTimerUpdate.Stop(); if (response == Define.E_ResponseData.ACK) { beforeData = new byte[this.UpdateForMain.ByteData.Length]; for (int i = 0; i < this.UpdateForMain.ByteData.Length; i++) beforeData[i] = this.UpdateForMain.ByteData[i]; if (this.UpdateForMain.IsLastData == false) { this.UpdateForMain.ByteData = new byte[beforeData.Length - 128]; for (int i = 0; i < beforeData.Length - 128; i++) this.UpdateForMain.ByteData[i] = beforeData[128 + i]; this.UpdateForMain.Index++; this.SendUpdateForMain(this.UpdateForMain.ByteData); } else { this.progressBarUpdate.Value += 10; } } else { this.RetryUpdateForMain(this.UpdateForMain); } } else { this.smartTimerUpdate.Stop(); this.UpdateMainBoardFail(this.Language); } #endregion break; default: break; } break; case 'S': break; default: break; } } catch { ret = -1; } } private void timerUpdate_Tick(object sender, EventArgs e) { this.Check += 1; if (this.Code == 1) { if (this.Check == 3) this.ProgramUpdateDisplay(); if (this.Check == 4) { this.progressBarUpdate.Value += 30; this.TreatmentRemoveOldFile(); } if (this.Check == 5) { this.progressBarUpdate.Value += 30; this.TreatmentCopyNewFile(this.NewFiles); this.progressBarUpdate.Value += 100; this.UpdateFinish(Language); } } else if (this.Code == 2) { if (this.Check == 3) this.ProgramUpdateMainboard(); } if (this.progressBarUpdate.Value == 100) this.timerUpdate.Stop(); } private void timerForMainBoard_Tick(object sender, EventArgs e) { this.timerForMainBoard.Stop(); this.SendUpdateForMain(this.UpdateForMain.ByteData); } private void smartTimerUpdate_Tick(object sender, EventArgs e) { this.smartTimerUpdate.Stop(); this.UpdateForMain.RetryCount++; if (this.UpdateForMain.RetryCount < 5) this.RetryUpdateForMain(this.UpdateForMain); else this.UpdateMainBoardFail(this.Language); } private void smartTimerReboot_Tick(object sender, EventArgs e) { this.smartTimerReboot.Stop(); SmartX.SmartConfigs.ReBoot(); } private void buttonCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.CloseSerialPort(); this.Close(); } #endregion } }