main_task.c 22 KB

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