Update_Serial.cs 11 KB

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