main_task.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  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_ReadTemperature:
  103. if(4 == read_len){
  104. tx_offset += Read_Temperature(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  105. }else if(8 == read_len){
  106. tx_offset += Read_Temperature(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  107. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  108. }else if(14 == read_len){
  109. tx_offset += Read_Temperature(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  110. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  111. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  112. }else if(26 == read_len){
  113. tx_offset += Read_Temperature(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  114. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  115. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  116. tx_offset += Read_Angle(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  117. }else{
  118. g_mb_ctx.exception_code = INVALID_DATA;
  119. }
  120. break;
  121. case Cmd_ReadPressure:
  122. if(4 == read_len){
  123. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  124. }else if(10 == read_len){
  125. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  126. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  127. }else if(22 == read_len){
  128. tx_offset += Read_Pressure(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  129. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  130. tx_offset += Read_Angle(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  131. }else{
  132. g_mb_ctx.exception_code = INVALID_DATA;
  133. }
  134. break;
  135. case Cmd_ReadHeight:
  136. if(6 == read_len){
  137. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  138. }else if(18 == read_len){
  139. tx_offset += Read_Height(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  140. tx_offset += Read_Angle(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  141. }else{
  142. g_mb_ctx.exception_code = INVALID_DATA;
  143. }
  144. break;
  145. case Cmd_ReadAngle:
  146. if(12 == read_len){
  147. tx_offset += Read_Angle(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset);
  148. }else{
  149. g_mb_ctx.exception_code = INVALID_DATA;
  150. }
  151. break;
  152. case Cmd_RadarTrans:
  153. if(read_len <= 32){
  154. tx_offset += Read_RadarTransData(g_mb_ctx.txbuf+tx_offset, g_mb_ctx.txbuf_size-tx_offset, (uint8_t)read_len);
  155. }else{
  156. g_mb_ctx.exception_code = INVALID_DATA;
  157. }
  158. break;
  159. default:
  160. g_mb_ctx.exception_code = INVALID_COMMAND;
  161. break;
  162. };
  163. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  164. g_mb_ctx.txbuf[2] = (uint8_t)read_len;
  165. g_mb_ctx.tx_len = tx_offset;
  166. }else{
  167. g_mb_ctx.txbuf[1] |= 0x80; // func code
  168. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  169. g_mb_ctx.tx_len = 3;
  170. }
  171. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  172. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  173. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  174. rs485_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  175. }
  176. void mb_06_handle(void)
  177. {
  178. uint16_t crc;
  179. uint8_t ret_write = RET_OK;
  180. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, g_mb_ctx.rx_len);
  181. switch(g_mb_ctx.cmd){
  182. case Cmd_HardwareVersion:
  183. if(2 == g_mb_ctx.rx_len-4-2){
  184. ret_write = Write_HardwareVersion(g_mb_ctx.rxbuf+4, 2);
  185. if(RET_DATAINVALID == ret_write)
  186. g_mb_ctx.exception_code = INVALID_DATA;
  187. }else{
  188. g_mb_ctx.exception_code = INVALID_DATA;
  189. }
  190. break;
  191. case Cmd_DeviceType:
  192. if(2 == g_mb_ctx.rx_len-4-2){
  193. ret_write = Write_Devicetype(g_mb_ctx.rxbuf+4, 2);
  194. if(RET_DATAINVALID == ret_write)
  195. g_mb_ctx.exception_code = INVALID_DATA;
  196. }else{
  197. g_mb_ctx.exception_code = INVALID_DATA;
  198. }
  199. break;
  200. case Cmd_Addr:
  201. if(2 == g_mb_ctx.rx_len-4-2){
  202. ret_write = Write_Addr(g_mb_ctx.rxbuf+4, 2);
  203. if(RET_DATAINVALID == ret_write)
  204. g_mb_ctx.exception_code = INVALID_DATA;
  205. }else{
  206. g_mb_ctx.exception_code = INVALID_DATA;
  207. }
  208. break;
  209. case Cmd_Baudrate:
  210. if(2 == g_mb_ctx.rx_len-4-2){
  211. ret_write = Write_Baudrate(g_mb_ctx.rxbuf+4, 2);
  212. if(RET_DATAINVALID == ret_write)
  213. g_mb_ctx.exception_code = INVALID_DATA;
  214. }else{
  215. g_mb_ctx.exception_code = INVALID_DATA;
  216. }
  217. break;
  218. // case Cmd_SetThreshold:
  219. // if(2 == g_mb_ctx.rx_len-4-2){
  220. // ret_write = Write_Threshold(g_mb_ctx.rxbuf+4, 2);
  221. // if(RET_DATAINVALID == ret_write)
  222. // g_mb_ctx.exception_code = INVALID_DATA;
  223. // }else{
  224. // g_mb_ctx.exception_code = INVALID_DATA;
  225. // }
  226. // break;
  227. case Cmd_Reboot:
  228. //NVIC_SystemReset();
  229. ret_write = RET_NEED_REBOOT;
  230. break;
  231. case Cmd_Reset:
  232. ResetConfig();
  233. ret_write = RET_NEED_SAVE|RET_NEED_REBOOT;
  234. //NVIC_SystemReset();
  235. break;
  236. default:
  237. g_mb_ctx.exception_code = INVALID_COMMAND;
  238. break;
  239. };
  240. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  241. g_mb_ctx.tx_len = g_mb_ctx.rx_len;
  242. }else{
  243. g_mb_ctx.txbuf[1] |= 0x80; // func code
  244. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  245. g_mb_ctx.tx_len = 3;
  246. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  247. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  248. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  249. }
  250. rs485_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  251. if((ret_write&RET_NEED_SAVE) > 0 ){
  252. SaveConfig();
  253. }
  254. if((ret_write&RET_NEED_REBOOT) > 0 ){
  255. mdelay(200);
  256. NVIC_SystemReset();
  257. }
  258. }
  259. void mb_10_handle(void)
  260. {
  261. uint16_t crc;
  262. uint8_t ret_write = RET_OK;
  263. uint16_t reg_num = ((uint16_t)g_mb_ctx.rxbuf[4]<<8)|g_mb_ctx.rxbuf[5];
  264. uint16_t data_len = g_mb_ctx.rxbuf[6];
  265. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, g_mb_ctx.rx_len);
  266. // 先判段数据长度是否一致
  267. if(data_len != reg_num*2){
  268. g_mb_ctx.exception_code = INVALID_DATA;
  269. }else{
  270. if(data_len != g_mb_ctx.rx_len-7-2){
  271. g_mb_ctx.exception_code = INVALID_DATA;
  272. }
  273. }
  274. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  275. switch(g_mb_ctx.cmd){
  276. case Cmd_HardwareVersion:
  277. if(8 == data_len){
  278. ret_write |= Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  279. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7+2, 4);
  280. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7+6, 2);
  281. if(ret_write&RET_DATAINVALID)
  282. g_mb_ctx.exception_code = INVALID_DATA;
  283. }else if(6 == data_len){
  284. ret_write |= Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  285. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7+2, 4);
  286. if(ret_write&RET_DATAINVALID)
  287. g_mb_ctx.exception_code = INVALID_DATA;
  288. }else if(2 == g_mb_ctx.rx_len-4-2){
  289. ret_write = Write_HardwareVersion(g_mb_ctx.rxbuf+7, 2);
  290. if(ret_write&RET_DATAINVALID)
  291. g_mb_ctx.exception_code = INVALID_DATA;
  292. }else{
  293. g_mb_ctx.exception_code = INVALID_DATA;
  294. }
  295. break;
  296. case Cmd_DeviceID:
  297. if(6 == data_len){
  298. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7, 4);
  299. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7+4, 2);
  300. if(ret_write&RET_DATAINVALID)
  301. g_mb_ctx.exception_code = INVALID_DATA;
  302. }else if(4 == data_len){
  303. ret_write |= Write_Deviceid(g_mb_ctx.rxbuf+7, 4);
  304. if(ret_write&RET_DATAINVALID)
  305. g_mb_ctx.exception_code = INVALID_DATA;
  306. }else{
  307. g_mb_ctx.exception_code = INVALID_DATA;
  308. }
  309. break;
  310. case Cmd_DeviceType:
  311. if(2 == data_len){
  312. ret_write |= Write_Devicetype(g_mb_ctx.rxbuf+7, 2);
  313. if(ret_write&RET_DATAINVALID)
  314. g_mb_ctx.exception_code = INVALID_DATA;
  315. }else{
  316. g_mb_ctx.exception_code = INVALID_DATA;
  317. }
  318. break;
  319. case Cmd_Addr:
  320. if(4 == data_len){
  321. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7, 2);
  322. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7+2, 2);
  323. if(ret_write&RET_DATAINVALID)
  324. g_mb_ctx.exception_code = INVALID_DATA;
  325. }else if(2 == data_len){
  326. ret_write |= Write_Addr(g_mb_ctx.rxbuf+7, 2);
  327. if(ret_write&RET_DATAINVALID)
  328. g_mb_ctx.exception_code = INVALID_DATA;
  329. }else{
  330. g_mb_ctx.exception_code = INVALID_DATA;
  331. }
  332. break;
  333. case Cmd_Baudrate:
  334. if(2 == data_len){
  335. ret_write |= Write_Baudrate(g_mb_ctx.rxbuf+7, 2);
  336. if(ret_write&RET_DATAINVALID)
  337. g_mb_ctx.exception_code = INVALID_DATA;
  338. }else{
  339. g_mb_ctx.exception_code = INVALID_DATA;
  340. }
  341. break;
  342. case Cmd_RadarTrans:
  343. // if(2 == g_mb_ctx.rx_len-4-2){
  344. ret_write = Write_RadarTransData(g_mb_ctx.rxbuf+7, data_len);
  345. if(ret_write&RET_DATAINVALID)
  346. g_mb_ctx.exception_code = INVALID_DATA;
  347. // }else{
  348. // g_mb_ctx.exception_code = INVALID_DATA;
  349. // }
  350. break;
  351. default:
  352. g_mb_ctx.exception_code = INVALID_COMMAND;
  353. break;
  354. };
  355. }
  356. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  357. //只需要收到的前面6个字节的数据
  358. g_mb_ctx.tx_len = 6;
  359. }else{
  360. g_mb_ctx.txbuf[1] |= 0x80; // func code
  361. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  362. g_mb_ctx.tx_len = 3;
  363. }
  364. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  365. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  366. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  367. rs485_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  368. if((ret_write&RET_NEED_SAVE) > 0 ){
  369. SaveConfig();
  370. }
  371. if((ret_write&RET_NEED_REBOOT) > 0 ){
  372. mdelay(200);
  373. NVIC_SystemReset();
  374. }
  375. }
  376. void mb_42_handle(void)
  377. {
  378. uint16_t crc;
  379. uint8_t ret_write = RET_OK;
  380. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, 4);
  381. g_mb_ctx.tx_len = 4;
  382. if(Cmd_IapUpgrade == g_mb_ctx.cmd){
  383. 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);
  384. if(1 == iap_reboot){
  385. ret_write |= RET_NEED_REBOOT;
  386. }
  387. }else{
  388. g_mb_ctx.exception_code = INVALID_COMMAND;
  389. }
  390. if(NO_EXCEPTION == g_mb_ctx.exception_code){
  391. //啥都不用做
  392. }else{
  393. g_mb_ctx.txbuf[1] |= 0x80; // func code
  394. g_mb_ctx.txbuf[2] = g_mb_ctx.exception_code;
  395. g_mb_ctx.tx_len = 3;
  396. }
  397. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  398. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  399. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  400. rs485_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  401. if((ret_write&RET_NEED_SAVE) > 0 ){
  402. SaveConfig();
  403. }
  404. if((ret_write&RET_NEED_REBOOT) > 0 ){
  405. mdelay(200);
  406. NVIC_SystemReset();
  407. }
  408. }
  409. void mb_funccodeerror_handle(void)
  410. {
  411. uint16_t crc;
  412. //uint8_t ret_write = RET_OK;
  413. memcpy(g_mb_ctx.txbuf, g_mb_ctx.rxbuf, 4);
  414. g_mb_ctx.txbuf[1] |= 0x80;
  415. g_mb_ctx.txbuf[2] = INVALID_FUNCTION_CODE;
  416. g_mb_ctx.tx_len = 3;
  417. crc = crc16(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  418. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  419. g_mb_ctx.txbuf[g_mb_ctx.tx_len++] = (uint8_t)(crc & 0x00ff);
  420. rs485_TransmitData(g_mb_ctx.txbuf, g_mb_ctx.tx_len);
  421. }
  422. void mb_handle(void)
  423. {
  424. g_mb_ctx.func_code = g_mb_ctx.rxbuf[1];
  425. g_mb_ctx.cmd = ((uint16_t)g_mb_ctx.rxbuf[2]<<8) | g_mb_ctx.rxbuf[3];
  426. if(MB_FUNC_03 == g_mb_ctx.func_code){
  427. mb_03_handle();
  428. }else if(MB_FUNC_06 == g_mb_ctx.func_code){
  429. mb_06_handle();
  430. }else if(MB_FUNC_10 == g_mb_ctx.func_code){
  431. mb_10_handle();
  432. }else if(MB_FUNC_42 == g_mb_ctx.func_code){
  433. mb_42_handle();
  434. }else{
  435. mb_funccodeerror_handle();
  436. }
  437. }
  438. /**
  439. * Uart0_RxDataHandle
  440. *
  441. * @return none
  442. *
  443. * @brief 主任务处理函数
  444. */
  445. void Uart0_RxDataHandle(void)
  446. {
  447. g_mb_ctx.rxbuf = rs485_info.recv_buffer;
  448. g_mb_ctx.rx_len = rs485_info.recv_len;
  449. g_mb_ctx.txbuf = rs485_info.send_buffer;
  450. g_mb_ctx.txbuf_size = UART_TRANSMIT_DATA_POOL_COUNT;
  451. g_mb_ctx.tx_len = 0;
  452. g_mb_ctx.exception_code = NO_EXCEPTION;
  453. uint16_t crc;
  454. // uint16_t ret_len = 0;
  455. // uint8_t ret_write = RET_OK;
  456. if(g_mb_ctx.rx_len > 2){
  457. //check rs485 addr
  458. if(config->addr == g_mb_ctx.rxbuf[0] || BROADCAST_ADDR == g_mb_ctx.rxbuf[0]){
  459. #if 1
  460. // check crc
  461. crc = ((uint16_t)g_mb_ctx.rxbuf[g_mb_ctx.rx_len-2]<<8) | g_mb_ctx.rxbuf[g_mb_ctx.rx_len-1];
  462. if (crc == crc16(g_mb_ctx.rxbuf, g_mb_ctx.rx_len-2))
  463. {
  464. mb_handle();
  465. #if 0
  466. //copy 地址、功能码、命令、到发送buf
  467. memcpy(txbuf, (void *)rxbuf, 4);
  468. tx_len +=4;
  469. if(MODBUS_FUNC_READ == rxbuf[1]){
  470. cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3];
  471. switch(cmd){
  472. case Cmd_FirmwareVersion:
  473. ret_len = Read_FirmwareVersion(txbuf+tx_len, txbuf_size-tx_len);
  474. break;
  475. case Cmd_HardwareVersion:
  476. ret_len = Read_HardwareVersion(txbuf+tx_len, txbuf_size-tx_len);
  477. break;
  478. case Cmd_DeviceID:
  479. ret_len = Read_Deviceid(txbuf+tx_len, txbuf_size-tx_len);
  480. break;
  481. case Cmd_DeviceType:
  482. ret_len = Read_Devicetype(txbuf+tx_len, txbuf_size-tx_len);
  483. break;
  484. case Cmd_Addr:
  485. ret_len = Read_Addr(txbuf+tx_len, txbuf_size-tx_len);
  486. break;
  487. case Cmd_Baudrate:
  488. ret_len = Read_Baudrate(txbuf+tx_len, txbuf_size-tx_len);
  489. break;
  490. case Cmd_LockStatus:
  491. ret_len = Read_LockStatus(txbuf+tx_len, txbuf_size-tx_len);
  492. break;
  493. default:
  494. txbuf[1] |= 0x80;
  495. txbuf[tx_len] = INVALID_COMMAND;
  496. ret_len = 1;
  497. break;
  498. };
  499. if(0 == ret_len){
  500. // error occur
  501. txbuf[1] |= 0x80;
  502. txbuf[tx_len] = DEVICE_FAULT;
  503. ret_len = 1;
  504. }
  505. tx_len += ret_len;
  506. crc = crc16(txbuf, tx_len);
  507. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  508. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  509. uart0_TransmitData(txbuf, tx_len);
  510. }else if(MODBUS_FUNC_WRITE == rxbuf[1]){
  511. ret_write = RET_OK;
  512. cmd = ((uint16_t)rxbuf[2]<<8) | rxbuf[3];
  513. switch(cmd){
  514. case Cmd_HardwareVersion:
  515. ret_write = Write_HardwareVersion(rxbuf+4, rx_len-4-2);
  516. break;
  517. case Cmd_DeviceID:
  518. ret_write = Write_Deviceid(rxbuf+4, rx_len-4-2);
  519. break;
  520. case Cmd_DeviceType:
  521. ret_write = Write_Devicetype(rxbuf+4, rx_len-4-2);
  522. break;
  523. case Cmd_Addr:
  524. ret_write = Write_Addr(rxbuf+4, rx_len-4-2);
  525. break;
  526. case Cmd_Baudrate:
  527. ret_write = Write_Baudrate(rxbuf+4, rx_len-4-2);
  528. break;
  529. case Cmd_Reboot:
  530. //NVIC_SystemReset();
  531. ret_write = RET_NEED_REBOOT;
  532. break;
  533. case Cmd_Reset:
  534. ResetConfig();
  535. ret_write = RET_NEED_SAVE|RET_NEED_REBOOT;
  536. //NVIC_SystemReset();
  537. break;
  538. case Cmd_IapUpgrade:
  539. tx_len += IAP_CmdHandle(rxbuf+tx_len, rx_len-4-2, txbuf+tx_len);
  540. if(1 == iap_reboot){
  541. ret_write |= RET_NEED_REBOOT;
  542. }
  543. break;
  544. default:
  545. ret_write = RET_CMDINVALID;
  546. break;
  547. };
  548. if((ret_write&RET_ERROR_MASK) > 0){
  549. if((ret_write&RET_DATAINVALID) > 0){
  550. txbuf[1] |= 0x80;
  551. txbuf[tx_len++] = INVALID_DATA;
  552. }else if((ret_write&RET_CMDINVALID) > 0){
  553. txbuf[1] |= 0x80;
  554. txbuf[tx_len++] = INVALID_COMMAND;
  555. }
  556. }else{
  557. if(Cmd_IapUpgrade != cmd){
  558. //copy the whole rx frame
  559. memcpy(txbuf, (void *)rxbuf, rx_len-2);
  560. tx_len =rx_len-2;
  561. }else{
  562. //升级命令,啥都不用做
  563. }
  564. }
  565. crc = crc16(txbuf, tx_len);
  566. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  567. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  568. uart0_TransmitData(txbuf, tx_len);
  569. if((ret_write&RET_NEED_SAVE) > 0 ){
  570. SaveConfig();
  571. }
  572. if((ret_write&RET_NEED_REBOOT) > 0 ){
  573. mdelay(100);
  574. NVIC_SystemReset();
  575. }
  576. }else{
  577. //function code no exist
  578. txbuf[1] |= 0x80;
  579. txbuf[tx_len++] = INVALID_FUNCTION_CODE;
  580. crc = crc16(txbuf, tx_len);
  581. txbuf[tx_len++] = (uint8_t)((crc>>8) & 0x00ff);
  582. txbuf[tx_len++] = (uint8_t)(crc & 0x00ff);
  583. uart0_TransmitData(txbuf, tx_len);
  584. }
  585. #endif
  586. }
  587. #else
  588. memcpy(txbuf, (void *)rxbuf, rx_len);
  589. tx_len +=rx_len;
  590. uart0_TransmitData(txbuf, tx_len);
  591. #endif
  592. }
  593. } //END rx_len
  594. if(g_mb_ctx.rx_len > 0){
  595. rs485_RecvData();
  596. }
  597. //处理 485 收发状态
  598. if(rs485_info.dmasend_count >= UART_DMASEND_COUNT_RESET){
  599. rs485_info.dmasend_count = 0;
  600. RS485_RX_EN;
  601. }
  602. }
  603. /**
  604. * Task_Init
  605. *
  606. * @return none
  607. *
  608. * @brief 初始化
  609. */
  610. void Task_Init(void)
  611. {
  612. rs485_Initialize();
  613. memcpy(rs485_info.send_buffer, (void *)"Booted", 6);
  614. rs485_info.send_len = 6;
  615. rs485_TransmitData(rs485_info.send_buffer, rs485_info.send_len);
  616. rs485_RecvData();
  617. }
  618. /**
  619. * Task_Handle
  620. *
  621. * @return none
  622. *
  623. * @brief 主任务处理函数
  624. */
  625. void Task_Handle(void)
  626. {
  627. Process_RunPeriod();
  628. Uart0_RxDataHandle();
  629. }