Update_Serial.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. namespace RF_TRIO_PLL_ZIG
  9. {
  10. class Update_Serial
  11. {
  12. public byte[] Firmware_byte_load;
  13. byte Data_Request_Val = 0;
  14. int FirmTotalcnt = 0;
  15. int FirmCurrcnt = 0;
  16. int PreFirmSendingcnt = 0;
  17. int FirmSendingcnt = 0;
  18. int pretempupdateret = 0;
  19. bool update_ready = false;
  20. const byte blucell_stx = 0xbe;
  21. const byte blucell_etx = 0xeb;
  22. const byte Termianl_Controller_Update_Ack = 0x11;
  23. const byte Termianl_Controller_Update_Nak = 0x22;
  24. const byte Termianl_Controller_FirmwareUpdateLen = 250;
  25. const byte Termianl_Reset = 0x0A;
  26. const byte Termianl_BootStart = 0x0B;
  27. const int POLYNOMIAL = 0x131; // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
  28. Bluecell_BootProtocol Bluecell_BootProtocol = new Bluecell_BootProtocol();
  29. Download_bar download_Bar = new Download_bar();
  30. private delegate void StringSend(string Text);
  31. private delegate void VoidSend();
  32. OpenFileDialog ofd;
  33. Serial serial;
  34. private byte Data_Request_Func
  35. {
  36. get
  37. { return Data_Request_Val; }
  38. set
  39. { Data_Request_Val = value; }
  40. }
  41. public bool Update_ready { get => update_ready; set => update_ready = value; }
  42. /***
  43. *Data File open
  44. ***/
  45. public string ShowFileOpenDialog(ref Serial serial, object ofd)
  46. {
  47. byte[] tempdata = new byte[5];
  48. this.ofd = (OpenFileDialog)ofd;
  49. this.serial = (Serial)serial;
  50. //파일오픈창 생성 및 설정
  51. this.ofd.Title = "업데이터 파일 탐색기";
  52. this.ofd.FileName = "*.bin";
  53. this.ofd.Filter = "binary 파일 (*.binary,*.bin) | *.binary;, *.bin; | 모든 파일 (*.*) | *.*";
  54. //파일 오픈창 로드
  55. DialogResult dr = this.ofd.ShowDialog();
  56. //OK버튼 클릭시
  57. if (dr == DialogResult.OK)
  58. {
  59. //File명과 확장자를 가지고 온다.
  60. string fileName = this.ofd.SafeFileName;
  61. //File경로와 File명을 모두 가지고 온다.
  62. string fileFullName = this.ofd.FileName;
  63. //File경로만 가지고 온다.
  64. string filePath = fileFullName.Replace(fileName, "");
  65. this.serial.debug_hextoasciiConvert();
  66. //출력 예제용 로직
  67. // label1.Text = "File Name : " + fileName;
  68. // label2.Text = "Full Name : " + fileFullName;
  69. // label3.Text = "File Path : " + filePath;`
  70. //File경로 + 파일명 리턴
  71. this.serial.FileDownloadClass_Get(this);
  72. Data_Request_Func = 1;
  73. Firmware_byte_load = File.ReadAllBytes(this.ofd.FileName);
  74. FirmTotalcnt = Firmware_byte_load.Length / Termianl_Controller_FirmwareUpdateLen;
  75. FirmCurrcnt = 0;
  76. PreFirmSendingcnt = 0;
  77. FirmSendingcnt = 0;
  78. Update_ready = true;
  79. Bluecell_BootProtocol.Bluecell_Reset(this.serial);
  80. /*
  81. tempdata[0] = 0xbe;
  82. tempdata[1] = Termianl_Reset;
  83. tempdata[2] = 0x02;
  84. tempdata[3] = STH30_CreateCrc(tempdata, tempdata[2]);
  85. tempdata[4] = 0xeb;
  86. this.serial.Serial_DataSend(tempdata, 5);*/
  87. try
  88. {
  89. // Controller_Debug.Controller_TX_TextLoad(tempdata);
  90. }
  91. catch { }
  92. download_Bar.ShowDialog();
  93. /*Update_label.Visible = true;
  94. progressBar1.Visible = true;*/
  95. return fileFullName;
  96. }
  97. //취소버튼 클릭시 또는 ESC키로 파일창을 종료 했을경우
  98. else if (dr == DialogResult.Cancel)
  99. {
  100. return "";
  101. }
  102. return "";
  103. }
  104. public void FirmwareUpdateCheck(byte check)
  105. {
  106. byte[] temp_data = new byte[Termianl_Controller_FirmwareUpdateLen + 5];
  107. byte cnt = 3;
  108. int lastlen = 0;
  109. // FirmTotalcnt = Firmware_byte_load.Length / Termianl_Controller_FirmwareUpdateLen;
  110. lastlen = Firmware_byte_load.Length % Termianl_Controller_FirmwareUpdateLen;
  111. temp_data[0] = blucell_stx;
  112. temp_data[1] = 0xDD;
  113. if (check == Termianl_BootStart)
  114. {
  115. System.Threading.Thread.Sleep(2000);
  116. }
  117. if (Termianl_Controller_Update_Ack == check || Termianl_BootStart == check)
  118. {
  119. PreFirmSendingcnt = FirmSendingcnt;
  120. if (FirmCurrcnt != FirmTotalcnt)
  121. {
  122. temp_data[2] = Termianl_Controller_FirmwareUpdateLen + 2;
  123. for (int i = 0; i < Termianl_Controller_FirmwareUpdateLen; i++)
  124. {
  125. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  126. }
  127. FirmCurrcnt++;
  128. temp_data[Termianl_Controller_FirmwareUpdateLen + 3] = STH30_CreateCrc(temp_data, temp_data[2]);
  129. temp_data[Termianl_Controller_FirmwareUpdateLen + 4] = blucell_etx;
  130. }
  131. else
  132. {
  133. Update_ready = false;
  134. temp_data[1] = 0xEE;
  135. temp_data[2] = Convert.ToByte(lastlen + 2);
  136. for (int i = 0; i < lastlen; i++)
  137. {
  138. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  139. }
  140. temp_data[temp_data[2] + 1] = STH30_CreateCrc(temp_data, temp_data[2]);
  141. temp_data[temp_data[2] + 2] = blucell_etx;
  142. /*ownload_Bar.ShowDialog();*/
  143. this.download_Bar.Invoke(new StringSend(this.download_Bar.Progressbar), "0 %");
  144. //download_Bar.Progressbar("0 %");
  145. this.download_Bar.Progressbar_gauge_zero();
  146. this.download_Bar.FormClosed(this.download_Bar);
  147. this.serial.debug_asciitohexConvert();
  148. FirmSendingcnt = PreFirmSendingcnt = FirmCurrcnt = FirmTotalcnt = pretempupdateret = Data_Request_Val = 0;
  149. /*Update_label.Text = "0%";
  150. Update_label.Visible = false;
  151. progressBar1.Visible = false;
  152. progressBar1.Value = 0;*/
  153. // MessageBox.Show("Update Complete !!");
  154. }
  155. }
  156. else
  157. {
  158. FirmSendingcnt = PreFirmSendingcnt;
  159. if (FirmCurrcnt != FirmTotalcnt)
  160. {
  161. temp_data[2] = Termianl_Controller_FirmwareUpdateLen + 2;
  162. for (int i = 0; i < Termianl_Controller_FirmwareUpdateLen; i++)
  163. {
  164. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  165. }
  166. FirmCurrcnt++;
  167. temp_data[Termianl_Controller_FirmwareUpdateLen + 3] = STH30_CreateCrc(temp_data, temp_data[2]);
  168. temp_data[Termianl_Controller_FirmwareUpdateLen + 4] = blucell_etx;
  169. }
  170. else
  171. {
  172. Update_ready = false;
  173. temp_data[1] = 0xEE;
  174. temp_data[2] = Convert.ToByte(lastlen + 2);
  175. for (int i = 0; i < lastlen; i++)
  176. {
  177. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  178. }
  179. temp_data[temp_data[2] + 1] = STH30_CreateCrc(temp_data, temp_data[2]);
  180. temp_data[temp_data[2] + 2] = blucell_etx;
  181. /* Update_label.Visible = false;
  182. progressBar1.Visible = false;*/
  183. download_Bar.Close();
  184. }
  185. }
  186. int tempupdateret = Firmware_byte_load.Length / 100;
  187. tempupdateret = FirmSendingcnt / tempupdateret;
  188. //CheckForIllegalCrossThreadCalls = false;
  189. this.download_Bar.Update_Percent(Convert.ToString(tempupdateret));
  190. if (pretempupdateret != tempupdateret)
  191. {
  192. for (int i = 0; i <= tempupdateret - this.download_Bar.Update_get(); i++)
  193. {
  194. this.download_Bar.PerformStepup(this.download_Bar);
  195. //this.download_Bar.PerformStepinc(tempupdateret);
  196. // progressBar1.PerformStep();
  197. }
  198. pretempupdateret = tempupdateret;
  199. }
  200. //serialPort1.Write(temp_data, 0, temp_data[2] + 3);
  201. this.serial.Serial_DataSend(temp_data, temp_data[2] + 3);
  202. try
  203. {
  204. // Controller_Debug.Controller_TX_TextLoad(temp_data);
  205. }
  206. catch { }
  207. }
  208. public void Termianl__Operate(byte[] Text)
  209. {
  210. byte Type = 0;
  211. Type = Text[(int)Bluecell_ProtIndex_p.Bluecell_Type];
  212. switch (Type)
  213. {
  214. case Termianl_BootStart:
  215. case Termianl_Controller_Update_Ack:
  216. case Termianl_Controller_Update_Nak:
  217. if (Update_ready == true)
  218. FirmwareUpdateCheck(Type);
  219. break;
  220. default:
  221. // MessageBox.Show("다시 시도 해주세요.");
  222. break;
  223. }
  224. }
  225. byte STH30_CreateCrc(byte[] data, byte nbrOfBytes)
  226. {
  227. byte bit; // bit mask
  228. int crc = 0xFF; // calculated checksum
  229. byte byteCtr; // byte counter
  230. byte index = 1;
  231. // calculates 8-Bit checksum with given polynomial
  232. for (byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
  233. {
  234. crc ^= (data[index++]);
  235. for (bit = 8; bit > 0; --bit)
  236. {
  237. if (Convert.ToBoolean(crc & 0x80)) { crc = (crc << 1) ^ POLYNOMIAL; }
  238. else crc = (crc << 1);
  239. }
  240. }
  241. return (byte)crc;
  242. }
  243. }
  244. }