can_pc_message.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "bsp/bsp_driver.h"
  2. #include "can_pc_message.h"
  3. #include "libs/logger.h"
  4. #include "os/os_task.h"
  5. #include "foc/motor/motor.h"
  6. bool can_process_iap_message(can_message_t *can_message) {
  7. uint8_t response[24];
  8. uint8_t rsplen;
  9. encoder_can_key(response, can_message->key);
  10. response[2] = 0;
  11. rsplen = 3;
  12. switch(can_message->key) {
  13. case BUILD_CMD_KEY(0xF0):
  14. if (mot_contrl_get_speed(&motor.controller) > 10.0f) {
  15. response[2] = 1;
  16. iap_send_data(can_message->src, response, rsplen);
  17. return true;
  18. }
  19. fmc_write_magic(0xFFFFFFFF);
  20. iap_send_data(can_message->src, response, rsplen);
  21. delay_ms(100);
  22. system_reboot();
  23. break;
  24. case BUILD_CMD_KEY(0xF5):
  25. memcpy(response + rsplen, can_message->data, can_message->len);
  26. rsplen += can_message->len;
  27. break;
  28. case BUILD_CMD_KEY(0xF9):
  29. fmc_write_magic(IAP_MAGIC_SUCCESS);
  30. break;
  31. case BUILD_CMD_KEY(0xF6):
  32. if (can_message->len > 0 && can_message->data[0] == 0x01) {
  33. rsplen += mcu_chip_id(response + 4) + 1;
  34. response[3] = 0x00;
  35. }
  36. break;
  37. case BUILD_CMD_KEY(0xF8):
  38. iap_read_string(can_message->src, can_message->data);
  39. rsplen = 0;
  40. break;
  41. default:
  42. return false;
  43. }
  44. if (rsplen > 0) {
  45. iap_send_data(can_message->src, response, rsplen);
  46. }
  47. return true;
  48. }
  49. uint32_t iap_read_magic(void){
  50. return fmc_read_magic();
  51. }
  52. void iap_read_string(uint8_t can, const uint8_t *args)
  53. {
  54. #define buff_len 256
  55. uint8_t buff[buff_len];
  56. const char *text;
  57. uint32_t addr;
  58. uint32_t len;
  59. addr = ((uint32_t) args[2]) << 16 | ((uint32_t) args[1]) << 8 | args[0];
  60. text = (const char *) (0x08000000 + addr);
  61. len = strlen(text);
  62. if (len > buff_len) {
  63. len = buff_len;
  64. }
  65. buff[0] = 0xF8;
  66. buff[1] = CAN_MY_ADDRESS;
  67. buff[2] = 0x00;
  68. memcpy(buff + 3, args, 3);
  69. memcpy(buff + 6, text, len);
  70. iap_send_data(can, buff, len + 6);
  71. }
  72. void iap_send_data(uint8_t can, uint8_t *data, int len){
  73. can_id_t frame_id;
  74. frame_id.id=0;
  75. frame_id.src = CAN_MY_ADDRESS;
  76. frame_id.dest = can;
  77. frame_id.type = ptype_response;
  78. shark_can0_send_message(frame_id.id, data, len);
  79. }