main_task.c 21 KB

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