Update_Serial.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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. tempdata[0] = 0xbe;
  80. tempdata[1] = Termianl_Reset;
  81. tempdata[2] = 0x02;
  82. tempdata[3] = STH30_CreateCrc(tempdata, tempdata[2]);
  83. tempdata[4] = 0xeb;
  84. this.serial.Serial_DataSend(tempdata, 5);
  85. try
  86. {
  87. // Controller_Debug.Controller_TX_TextLoad(tempdata);
  88. }
  89. catch { }
  90. download_Bar.ShowDialog();
  91. /*Update_label.Visible = true;
  92. progressBar1.Visible = true;*/
  93. return fileFullName;
  94. }
  95. //취소버튼 클릭시 또는 ESC키로 파일창을 종료 했을경우
  96. else if (dr == DialogResult.Cancel)
  97. {
  98. return "";
  99. }
  100. return "";
  101. }
  102. public void FirmwareUpdateCheck(byte check)
  103. {
  104. byte[] temp_data = new byte[Termianl_Controller_FirmwareUpdateLen + 5];
  105. byte cnt = 3;
  106. int lastlen = 0;
  107. // FirmTotalcnt = Firmware_byte_load.Length / Termianl_Controller_FirmwareUpdateLen;
  108. lastlen = Firmware_byte_load.Length % Termianl_Controller_FirmwareUpdateLen;
  109. temp_data[0] = blucell_stx;
  110. temp_data[1] = 0xDD;
  111. if (check == Termianl_BootStart)
  112. {
  113. System.Threading.Thread.Sleep(2000);
  114. }
  115. if (Termianl_Controller_Update_Ack == check || Termianl_BootStart == check)
  116. {
  117. PreFirmSendingcnt = FirmSendingcnt;
  118. if (FirmCurrcnt != FirmTotalcnt)
  119. {
  120. temp_data[2] = Termianl_Controller_FirmwareUpdateLen + 2;
  121. for (int i = 0; i < Termianl_Controller_FirmwareUpdateLen; i++)
  122. {
  123. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  124. }
  125. FirmCurrcnt++;
  126. temp_data[Termianl_Controller_FirmwareUpdateLen + 3] = STH30_CreateCrc(temp_data, temp_data[2]);
  127. temp_data[Termianl_Controller_FirmwareUpdateLen + 4] = blucell_etx;
  128. }
  129. else
  130. {
  131. Update_ready = false;
  132. temp_data[1] = 0xEE;
  133. temp_data[2] = Convert.ToByte(lastlen + 2);
  134. for (int i = 0; i < lastlen; i++)
  135. {
  136. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  137. }
  138. temp_data[temp_data[2] + 1] = STH30_CreateCrc(temp_data, temp_data[2]);
  139. temp_data[temp_data[2] + 2] = blucell_etx;
  140. /*ownload_Bar.ShowDialog();*/
  141. this.download_Bar.Invoke(new StringSend(this.download_Bar.Progressbar), "0 %");
  142. //download_Bar.Progressbar("0 %");
  143. this.download_Bar.Progressbar_gauge_zero();
  144. this.download_Bar.FormClosed(this.download_Bar);
  145. this.serial.debug_asciitohexConvert();
  146. FirmSendingcnt = PreFirmSendingcnt = FirmCurrcnt = FirmTotalcnt = pretempupdateret = Data_Request_Val = 0;
  147. /*Update_label.Text = "0%";
  148. Update_label.Visible = false;
  149. progressBar1.Visible = false;
  150. progressBar1.Value = 0;*/
  151. // MessageBox.Show("Update Complete !!");
  152. }
  153. }
  154. else
  155. {
  156. FirmSendingcnt = PreFirmSendingcnt;
  157. if (FirmCurrcnt != FirmTotalcnt)
  158. {
  159. temp_data[2] = Termianl_Controller_FirmwareUpdateLen + 2;
  160. for (int i = 0; i < Termianl_Controller_FirmwareUpdateLen; i++)
  161. {
  162. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  163. }
  164. FirmCurrcnt++;
  165. temp_data[Termianl_Controller_FirmwareUpdateLen + 3] = STH30_CreateCrc(temp_data, temp_data[2]);
  166. temp_data[Termianl_Controller_FirmwareUpdateLen + 4] = blucell_etx;
  167. }
  168. else
  169. {
  170. Update_ready = false;
  171. temp_data[1] = 0xEE;
  172. temp_data[2] = Convert.ToByte(lastlen + 2);
  173. for (int i = 0; i < lastlen; i++)
  174. {
  175. temp_data[cnt++] = Firmware_byte_load[FirmSendingcnt++];
  176. }
  177. temp_data[temp_data[2] + 1] = STH30_CreateCrc(temp_data, temp_data[2]);
  178. temp_data[temp_data[2] + 2] = blucell_etx;
  179. /* Update_label.Visible = false;
  180. progressBar1.Visible = false;*/
  181. download_Bar.Close();
  182. }
  183. }
  184. int tempupdateret = Firmware_byte_load.Length / 100;
  185. tempupdateret = FirmSendingcnt / tempupdateret;
  186. //CheckForIllegalCrossThreadCalls = false;
  187. this.download_Bar.Update_Percent(Convert.ToString(tempupdateret));
  188. if (pretempupdateret != tempupdateret)
  189. {
  190. for (int i = 0; i <= tempupdateret - this.download_Bar.Update_get(); i++)
  191. {
  192. this.download_Bar.PerformStepup(this.download_Bar);
  193. //this.download_Bar.PerformStepinc(tempupdateret);
  194. // progressBar1.PerformStep();
  195. }
  196. pretempupdateret = tempupdateret;
  197. }
  198. //serialPort1.Write(temp_data, 0, temp_data[2] + 3);
  199. this.serial.Serial_DataSend(temp_data, temp_data[2] + 3);
  200. try
  201. {
  202. // Controller_Debug.Controller_TX_TextLoad(temp_data);
  203. }
  204. catch { }
  205. }
  206. public void Termianl__Operate(byte[] Text)
  207. {
  208. byte Type = 0;
  209. Type = Text[Bluecell_BootProtocol.bluecell_type];
  210. switch (Type)
  211. {
  212. case Termianl_BootStart:
  213. case Termianl_Controller_Update_Ack:
  214. case Termianl_Controller_Update_Nak:
  215. if (Update_ready == true)
  216. FirmwareUpdateCheck(Type);
  217. break;
  218. default:
  219. // MessageBox.Show("다시 시도 해주세요.");
  220. break;
  221. }
  222. }
  223. byte STH30_CreateCrc(byte[] data, byte nbrOfBytes)
  224. {
  225. byte bit; // bit mask
  226. int crc = 0xFF; // calculated checksum
  227. byte byteCtr; // byte counter
  228. byte index = 1;
  229. // calculates 8-Bit checksum with given polynomial
  230. for (byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
  231. {
  232. crc ^= (data[index++]);
  233. for (bit = 8; bit > 0; --bit)
  234. {
  235. if (Convert.ToBoolean(crc & 0x80)) { crc = (crc << 1) ^ POLYNOMIAL; }
  236. else crc = (crc << 1);
  237. }
  238. }
  239. return (byte)crc;
  240. }
  241. }
  242. }