main_task.c 21 KB

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