main_task.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. #include "main_task.h"
  2. #include "uart.h"
  3. #include "gpio.h"
  4. #include "cfg.h"
  5. #include "IAP.h"
  6. #include "protocol.h"
  7. #include "process.h"
  8. #include "crc16.h"
  9. #include <string.h>
  10. typedef struct _mb_ctx
  11. {
  12. uint8_t* rxbuf;
  13. uint8_t* txbuf;
  14. uint16_t rx_len; //recv data length
  15. uint16_t tx_len; //will be transfer data length
  16. uint16_t txbuf_size;
  17. uint8_t exception_code;
  18. uint8_t func_code; // function code
  19. uint16_t cmd; // register
  20. }MB_CTX;
  21. static MB_CTX g_mb_ctx;
  22. void mb_03_handle(void)
  23. {
  24. uint16_t tx_offset = 0;
  25. uint16_t crc;
  26. uint16_t ret_len = 0;
  27. uint16_t reg_num = ((uint16_t)g_mb_ctx.rxbuf[4]<<8)|g_mb_ctx.rxbuf[5];
  28. uint16_t read_len = reg_num<<1; // wanted bytes
  29. //
  30. g_mb_ctx.txbuf[0] = g_mb_ctx.rxbuf[0]; // slave addr
  31. g_mb_ctx.txbuf[1] = g_mb_ctx.rxbuf[1]; // func code
  32. g_mb_ctx.txbuf[2] = 0x00;
  33. tx_offset = 3;
  34. switch(g_mb_ctx.cmd){
  35. case Cmd_FirmwareVersion:
  36. if(16 == read_len){
  37. tx_offset += Read_FirmwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  38. }else if(18 == read_len){
  39. tx_offset += Read_FirmwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  40. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  41. }else if(22 == read_len){
  42. tx_offset += Read_FirmwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  43. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  44. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  45. }else if(24 == read_len){
  46. tx_offset += Read_FirmwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  47. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  48. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  49. tx_offset += Read_Devicetype(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  50. }else {
  51. g_mb_ctx.exception_code = INVALID_DATA;
  52. }
  53. break;
  54. case Cmd_HardwareVersion:
  55. if(2 == read_len){
  56. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  57. }else if(6 == read_len){
  58. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  59. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  60. }else if(8 == read_len){
  61. tx_offset += Read_HardwareVersion(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  62. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  63. tx_offset += Read_Devicetype(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  64. }else{
  65. g_mb_ctx.exception_code = INVALID_DATA;
  66. }
  67. break;
  68. case Cmd_DeviceID:
  69. if(4 == read_len){
  70. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  71. }else if(6 == read_len){
  72. tx_offset += Read_Deviceid(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  73. tx_offset += Read_Devicetype(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  74. }else{
  75. g_mb_ctx.exception_code = INVALID_DATA;
  76. }
  77. break;
  78. case Cmd_DeviceType:
  79. if(2 == read_len){
  80. tx_offset += Read_Devicetype(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  81. }else{
  82. g_mb_ctx.exception_code = INVALID_DATA;
  83. }
  84. break;
  85. case Cmd_Addr:
  86. if(2 == read_len){
  87. tx_offset += Read_Addr(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  88. }else if(4 == read_len){
  89. tx_offset += Read_Addr(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  90. tx_offset += Read_Baudrate(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  91. }else {
  92. g_mb_ctx.exception_code = INVALID_DATA;
  93. }
  94. break;
  95. case Cmd_Baudrate:
  96. if(2 == read_len){
  97. tx_offset += Read_Baudrate(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  98. }else{
  99. g_mb_ctx.exception_code = INVALID_DATA;
  100. }
  101. break;
  102. case Cmd_SvStatus:
  103. if(2 == read_len){
  104. tx_offset += Read_SvStatus(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  105. }else{
  106. g_mb_ctx.exception_code = INVALID_DATA;
  107. }
  108. break;
  109. default:
  110. g_mb_ctx.exception_code = INVALID_COMMAND;
  111. break;
  112. };
  113. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  114. g_mb_ctx.txbuf[2] = (uint8_t)read_len;
  115. g_mb_ctx.tx_len = tx_offset;
  116. }else{
  117. g_mb_ctx.txbuf[1] |= 0x80; // func code
  118. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  119. g_mb_ctx.tx_len = 3;
  120. }
  121. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  122. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  123. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  124. uart0_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  125. }
  126. void mb_06_handle(void)
  127. {
  128. uint16_t crc;
  129. uint8_t ret_write = RET_OK;
  130. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, g_mb_ctx.rx_len);
  131. switch(g_mb_ctx.cmd){
  132. case Cmd_HardwareVersion:
  133. if(2 == g_mb_ctx.rx_len-4-2){
  134. ret_write = Write_HardwareVersion(g_mb_ctx.rxbuf+4, 2);
  135. if(RET_DATAINVALID == ret_write)
  136. g_mb_ctx.exception_code = INVALID_DATA;
  137. }else{
  138. g_mb_ctx.exception_code = INVALID_DATA;
  139. }
  140. break;
  141. case Cmd_DeviceType:
  142. if(2 == g_mb_ctx.rx_len-4-2){
  143. ret_write = Write_Devicetype(g_mb_ctx.rxbuf+4, 2);
  144. if(RET_DATAINVALID == ret_write)
  145. g_mb_ctx.exception_code = INVALID_DATA;
  146. }else{
  147. g_mb_ctx.exception_code = INVALID_DATA;
  148. }
  149. break;
  150. case Cmd_Addr:
  151. if(2 == g_mb_ctx.rx_len-4-2){
  152. ret_write = Write_Addr(g_mb_ctx.rxbuf+4, 2);
  153. if(RET_DATAINVALID == ret_write)
  154. g_mb_ctx.exception_code = INVALID_DATA;
  155. }else{
  156. g_mb_ctx.exception_code = INVALID_DATA;
  157. }
  158. break;
  159. case Cmd_Baudrate:
  160. if(2 == g_mb_ctx.rx_len-4-2){
  161. ret_write = Write_Baudrate(g_mb_ctx.rxbuf+4, 2);
  162. if(RET_DATAINVALID == ret_write)
  163. g_mb_ctx.exception_code = INVALID_DATA;
  164. }else{
  165. g_mb_ctx.exception_code = INVALID_DATA;
  166. }
  167. break;
  168. case Cmd_Reboot:
  169. //NVIC_SystemReset();
  170. ret_write = RET_NEED_REBOOT;
  171. break;
  172. case Cmd_Reset:
  173. ResetConfig();
  174. ret_write = RET_NEED_SAVE|RET_NEED_REBOOT;
  175. //NVIC_SystemReset();
  176. break;
  177. case Cmd_SvControl:
  178. if(2 == g_mb_ctx.rx_len-4-2){
  179. ret_write = Write_SvControl(g_mb_ctx.rxbuf+4, 2);
  180. if(RET_DATAINVALID == ret_write)
  181. g_mb_ctx.exception_code = INVALID_DATA;
  182. }else{
  183. g_mb_ctx.exception_code = INVALID_DATA;
  184. }
  185. break;
  186. default:
  187. g_mb_ctx.exception_code = INVALID_COMMAND;
  188. break;
  189. };
  190. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  191. g_mb_ctx.tx_len = g_mb_ctx.rx_len;
  192. }else{
  193. g_mb_ctx.txbuf[1] |= 0x80; // func code
  194. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  195. g_mb_ctx.tx_len = 3;
  196. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  197. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  198. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  199. }
  200. uart0_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  201. if((ret_write&RET_NEED_SAVE) > 0 ){
  202. SaveConfig();
  203. }
  204. if((ret_write&RET_NEED_REBOOT) > 0 ){
  205. mdelay(200);
  206. NVIC_SystemReset();
  207. }
  208. }
  209. void mb_10_handle(void)
  210. {
  211. uint16_t crc;
  212. uint8_t ret_write = RET_OK;
  213. uint16_t reg_num = ((uint16_t)g_mb_ctx.rxbuf[4]<<8)|g_mb_ctx.rxbuf[5];
  214. uint16_t data_len = g_mb_ctx.rxbuf[6];
  215. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, g_mb_ctx.rx_len);
  216. // 先判段数据长度是否一致
  217. if(data_len != reg_num*2){
  218. g_mb_ctx.exception_code = INVALID_DATA;
  219. }else{
  220. if(data_len != g_mb_ctx.rx_len-7-2){
  221. g_mb_ctx.exception_code = INVALID_DATA;
  222. }
  223. }
  224. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  225. switch(g_mb_ctx.cmd){
  226. case Cmd_HardwareVersion:
  227. if(8 == data_len){
  228. ret_write |= Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  229. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7+2, 4);
  230. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7+6, 2);
  231. if(ret_write&RET_DATAINVALID)
  232. g_mb_ctx.exception_code = INVALID_DATA;
  233. }else if(6 == data_len){
  234. ret_write |= Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  235. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7+2, 4);
  236. if(ret_write&RET_DATAINVALID)
  237. g_mb_ctx.exception_code = INVALID_DATA;
  238. }else if(2 == g_mb_ctx.rx_len-4-2){
  239. ret_write = Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  240. if(ret_write&RET_DATAINVALID)
  241. g_mb_ctx.exception_code = INVALID_DATA;
  242. }else{
  243. g_mb_ctx.exception_code = INVALID_DATA;
  244. }
  245. break;
  246. case Cmd_DeviceID:
  247. if(6 == data_len){
  248. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7, 4);
  249. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7+4, 2);
  250. if(ret_write&RET_DATAINVALID)
  251. g_mb_ctx.exception_code = INVALID_DATA;
  252. }else if(4 == data_len){
  253. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7, 4);
  254. if(ret_write&RET_DATAINVALID)
  255. g_mb_ctx.exception_code = INVALID_DATA;
  256. }else{
  257. g_mb_ctx.exception_code = INVALID_DATA;
  258. }
  259. break;
  260. case Cmd_DeviceType:
  261. if(2 == data_len){
  262. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7, 2);
  263. if(ret_write&RET_DATAINVALID)
  264. g_mb_ctx.exception_code = INVALID_DATA;
  265. }else{
  266. g_mb_ctx.exception_code = INVALID_DATA;
  267. }
  268. break;
  269. case Cmd_Addr:
  270. if(4 == data_len){
  271. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7, 2);
  272. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7+2, 2);
  273. if(ret_write&RET_DATAINVALID)
  274. g_mb_ctx.exception_code = INVALID_DATA;
  275. }else if(2 == data_len){
  276. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7, 2);
  277. if(ret_write&RET_DATAINVALID)
  278. g_mb_ctx.exception_code = INVALID_DATA;
  279. }else{
  280. g_mb_ctx.exception_code = INVALID_DATA;
  281. }
  282. break;
  283. case Cmd_Baudrate:
  284. if(2 == data_len){
  285. ret_write |= Write_Baudrate(g_mb_ctx.rxbuf+7, 2);
  286. if(ret_write&RET_DATAINVALID)
  287. g_mb_ctx.exception_code = INVALID_DATA;
  288. }else{
  289. g_mb_ctx.exception_code = INVALID_DATA;
  290. }
  291. break;
  292. case Cmd_SvControl:
  293. if(2 == data_len){
  294. ret_write |= Write_SvControl(g_mb_ctx.rxbuf+7, 2);
  295. if(ret_write&RET_DATAINVALID)
  296. g_mb_ctx.exception_code = INVALID_DATA;
  297. }else{
  298. g_mb_ctx.exception_code = INVALID_DATA;
  299. }
  300. break;
  301. default:
  302. g_mb_ctx.exception_code = INVALID_COMMAND;
  303. break;
  304. };
  305. }
  306. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  307. //只需要收到的前面6个字节的数据
  308. g_mb_ctx.tx_len = 6;
  309. }else{
  310. g_mb_ctx.txbuf[1] |= 0x80; // func code
  311. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  312. g_mb_ctx.tx_len = 3;
  313. }
  314. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  315. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  316. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  317. uart0_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  318. if((ret_write&RET_NEED_SAVE) > 0 ){
  319. SaveConfig();
  320. }
  321. if((ret_write&RET_NEED_REBOOT) > 0 ){
  322. mdelay(200);
  323. NVIC_SystemReset();
  324. }
  325. }
  326. void mb_42_handle(void)
  327. {
  328. uint16_t crc;
  329. uint8_t ret_write = RET_OK;
  330. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, 4);
  331. g_mb_ctx.tx_len = 4;
  332. if(Cmd_IapUpgrade == g_mb_ctx.cmd){
  333. g_mb_ctx.tx_len += IAP_CmdHandle(g_mb_ctx.rxbuf+g_mb_ctx.tx_len, g_mb_ctx.rx_len-4-2, g_mb_ctx.txbuf+g_mb_ctx.tx_len);
  334. if(1 == iap_reboot){
  335. ret_write |= RET_NEED_REBOOT;
  336. }
  337. }else{
  338. g_mb_ctx.exception_code = INVALID_COMMAND;
  339. }
  340. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  341. //啥都不用做
  342. }else{
  343. g_mb_ctx.txbuf[1] |= 0x80; // func code
  344. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  345. g_mb_ctx.tx_len = 3;
  346. }
  347. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  348. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  349. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  350. uart0_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  351. if((ret_write&RET_NEED_SAVE) > 0 ){
  352. SaveConfig();
  353. }
  354. if((ret_write&RET_NEED_REBOOT) > 0 ){
  355. mdelay(200);
  356. NVIC_SystemReset();
  357. }
  358. }
  359. void mb_funccodeerror_handle(void)
  360. {
  361. uint16_t crc;
  362. uint8_t ret_write = RET_OK;
  363. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, 4);
  364. g_mb_ctx.txbuf[1] |= 0x80;
  365. g_mb_ctx.txbuf[2] = INVALID_FUNCTION_CODE;
  366. g_mb_ctx.tx_len = 3;
  367. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  368. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  369. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  370. uart0_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  371. }
  372. void mb_handle(void)
  373. {
  374. g_mb_ctx.func_code = g_mb_ctx.rxbuf[1];
  375. g_mb_ctx.cmd = ((uint16_t)g_mb_ctx.rxbuf[2]<<8) | g_mb_ctx.rxbuf[3];
  376. if(MB_FUNC_03 == g_mb_ctx.func_code){
  377. mb_03_handle();
  378. }else if(MB_FUNC_06 == g_mb_ctx.func_code){
  379. mb_06_handle();
  380. }else if(MB_FUNC_10 == g_mb_ctx.func_code){
  381. mb_10_handle();
  382. }else if(MB_FUNC_42 == g_mb_ctx.func_code){
  383. mb_42_handle();
  384. }else{
  385. mb_funccodeerror_handle();
  386. }
  387. }
  388. /**
  389. * Uart0_RxDataHandle
  390. *
  391. * @return none
  392. *
  393. * @brief 主任务处理函数
  394. */
  395. void Uart0_RxDataHandle(void)
  396. {
  397. g_mb_ctx.rxbuf = uart0_info.recv_buffer;
  398. g_mb_ctx.rx_len = uart0_info.recv_len;
  399. g_mb_ctx.txbuf = uart0_info.send_buffer;
  400. g_mb_ctx.txbuf_size = UART0_TRANSMIT_DATA_POOL_COUNT;
  401. g_mb_ctx.tx_len = 0;
  402. g_mb_ctx.exception_code = NO_EXCEPTION;
  403. uint16_t crc;
  404. uint16_t ret_len = 0;
  405. uint8_t ret_write = RET_OK;
  406. if(g_mb_ctx.rx_len > 2){
  407. //check rs485 addr
  408. if(config->addr == g_mb_ctx.rxbuf[0] || BROADCAST_ADDR == g_mb_ctx.rxbuf[0]){
  409. #if 1
  410. // check crc
  411. crc = ((uint16_t)g_mb_ctx.rxbuf[g_mb_ctx.rx_len-2]<<8) | g_mb_ctx.rxbuf[g_mb_ctx.rx_len-1];
  412. if (crc == crc16(g_mb_ctx.rxbuf, g_mb_ctx.rx_len-2))
  413. {
  414. mb_handle();
  415. #if 0
  416. //copy 地址、功能码、命令、到发送buf
  417. memcpy(txbuf, (void *)rxbuf, 2);
  418. tx_len +=2;
  419. if(MODBUS_FUNC_READ == rxbuf[1]){
  420. cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3];
  421. switch(cmd){
  422. case Cmd_FirmwareVersion:
  423. ret_len = Read_FirmwareVersion(txbuf+tx_len, txbuf_size-tx_len);
  424. break;
  425. case Cmd_HardwareVersion:
  426. ret_len = Read_HardwareVersion(txbuf+tx_len, txbuf_size-tx_len);
  427. break;
  428. case Cmd_DeviceID:
  429. ret_len = Read_Deviceid(txbuf+tx_len, txbuf_size-tx_len);
  430. break;
  431. case Cmd_DeviceType:
  432. ret_len = Read_Devicetype(txbuf+tx_len, txbuf_size-tx_len);
  433. break;
  434. case Cmd_Addr:
  435. ret_len = Read_Addr(txbuf+tx_len, txbuf_size-tx_len);
  436. break;
  437. case Cmd_Baudrate:
  438. ret_len = Read_Baudrate(txbuf+tx_len, txbuf_size-tx_len);
  439. break;
  440. case Cmd_SvStatus:
  441. ret_len = Read_SvStatus(txbuf+tx_len, txbuf_size-tx_len);
  442. break;
  443. default:
  444. txbuf[1] |= 0x80;
  445. txbuf[tx_len] = INVALID_COMMAND;
  446. ret_len = 1;
  447. break;
  448. };
  449. if(0 == ret_len){
  450. // error occur
  451. txbuf[1] |= 0x80;
  452. txbuf[tx_len] = DEVICE_FAULT;
  453. ret_len = 1;
  454. }
  455. tx_len += ret_len;
  456. crc = crc16(txbuf, tx_len);
  457. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  458. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  459. uart0_TransmitData(txbuf, tx_len);
  460. }else if(MODBUS_FUNC_WRITE == rxbuf[1]){
  461. ret_write = RET_OK;
  462. cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3];
  463. switch(cmd){
  464. case Cmd_HardwareVersion:
  465. ret_write = Write_HardwareVersion(rxbuf+4, rx_len-4-2);
  466. break;
  467. case Cmd_DeviceID:
  468. ret_write = Write_Deviceid(rxbuf+4, rx_len-4-2);
  469. break;
  470. case Cmd_DeviceType:
  471. ret_write = Write_Devicetype(rxbuf+4, rx_len-4-2);
  472. break;
  473. case Cmd_Addr:
  474. ret_write = Write_Addr(rxbuf+4, rx_len-4-2);
  475. break;
  476. case Cmd_Baudrate:
  477. ret_write = Write_Baudrate(rxbuf+4, rx_len-4-2);
  478. break;
  479. case Cmd_Reboot:
  480. //NVIC_SystemReset();
  481. ret_write = RET_NEED_REBOOT;
  482. break;
  483. case Cmd_Reset:
  484. ResetConfig();
  485. ret_write = RET_NEED_SAVE|RET_NEED_REBOOT;
  486. //NVIC_SystemReset();
  487. break;
  488. case Cmd_SvControl:
  489. ret_write = Write_SvControl(rxbuf+4, rx_len-4-2);
  490. break;
  491. case Cmd_IapUpgrade:
  492. tx_len += IAP_CmdHandle(rxbuf+tx_len, rx_len-4-2, txbuf+tx_len);
  493. if(1 == iap_reboot){
  494. ret_write |= RET_NEED_REBOOT;
  495. }
  496. break;
  497. default:
  498. ret_write = RET_CMDINVALID;
  499. break;
  500. };
  501. if((ret_write&RET_ERROR_MASK) > 0){
  502. if((ret_write&RET_DATAINVALID) > 0){
  503. txbuf[1] |= 0x80;
  504. txbuf[tx_len++] = INVALID_DATA;
  505. }else if((ret_write&RET_CMDINVALID) > 0){
  506. txbuf[1] |= 0x80;
  507. txbuf[tx_len++] = INVALID_COMMAND;
  508. }
  509. }else{
  510. if(Cmd_IapUpgrade != cmd){
  511. //copy the whole rx frame
  512. memcpy(txbuf, (void *)rxbuf, rx_len-2);
  513. tx_len =rx_len-2;
  514. }else{
  515. //升级命令,啥都不用做
  516. }
  517. }
  518. crc = crc16(txbuf, tx_len);
  519. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  520. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  521. uart0_TransmitData(txbuf, tx_len);
  522. if((ret_write&RET_NEED_SAVE) > 0 ){
  523. SaveConfig();
  524. }
  525. if((ret_write&RET_NEED_REBOOT) > 0 ){
  526. mdelay(100);
  527. NVIC_SystemReset();
  528. }
  529. }else if(){
  530. }else{
  531. //function code no exist
  532. txbuf[1] |= 0x80;
  533. txbuf[tx_len++] = INVALID_FUNCTION_CODE;
  534. crc = crc16(txbuf, tx_len);
  535. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  536. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  537. uart0_TransmitData(txbuf, tx_len);
  538. }
  539. #endif
  540. }
  541. #else
  542. memcpy(txbuf, (void *)rxbuf, rx_len);
  543. tx_len +=rx_len;
  544. uart0_TransmitData(txbuf, tx_len);
  545. #endif
  546. }
  547. } //END rx_len
  548. if(g_mb_ctx.rx_len > 0){
  549. uart0_RecvData();
  550. }
  551. //处理 485 收发状态
  552. if(uart0_info.dmasend_count >= UART_DMASEND_COUNT_RESET){
  553. uart0_info.dmasend_count = 0;
  554. RS485_RX_EN;
  555. }
  556. }
  557. /**
  558. * Task_Init
  559. *
  560. * @return none
  561. *
  562. * @brief 初始化
  563. */
  564. void Task_Init(void)
  565. {
  566. uart_Initialize();
  567. memcpy(uart0_info.send_buffer, (void *)"Booted", 6);
  568. uart0_info.send_len = 6;
  569. uart0_TransmitData(uart0_info.send_buffer, uart0_info.send_len);
  570. uart0_RecvData();
  571. }
  572. /**
  573. * Task_Handle
  574. *
  575. * @return none
  576. *
  577. * @brief 主任务处理函数
  578. */
  579. void Task_Handle(void)
  580. {
  581. Process_RunLedPrd();
  582. //Process_ThreeStatus();
  583. Uart0_RxDataHandle();
  584. }