factory.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "factory.h"
  2. #include "bsp/bsp_driver.h"
  3. #include "prot/can_message.h"
  4. #include "prot/can_foc_msg.h"
  5. #include "foc/samples.h"
  6. #include "libs/utils.h"
  7. #include "libs/logger.h"
  8. #include "os/os_task.h"
  9. static u8 factory_mode = 0;
  10. void can_process_factory_message(can_message_t *can_message){
  11. uint8_t response[32];
  12. uint8_t rsplen;
  13. encoder_can_key(response, can_message->key);
  14. response[2] = 0;
  15. rsplen = 3;
  16. switch(can_message->key) {
  17. case BUILD_CMD_KEY(0xE0):
  18. factory_mode = decode_u8(can_message->data);
  19. break;
  20. case BUILD_CMD_KEY(0xE1):
  21. {
  22. if (factory_mode == 0) {
  23. response[2] = 1;
  24. break;
  25. }
  26. u8 item = decode_u8(can_message->data);
  27. if (item == 1) { //3相驱动测试
  28. u8 mask = decode_u8((u8 *)can_message->data + 1);
  29. pwm_3phase_sides(mask);
  30. }else if (item == 2) {//获取所有电压的采集值
  31. can_response_vols(can_message->src, can_message->key);
  32. return;
  33. }else if (item == 3) { //读取gpio状态
  34. encode_u16(response + 3, GPIOA_VALUE);
  35. encode_u16(response + 5, GPIOB_VALUE);
  36. encode_u16(response + 7, GPIOC_VALUE);
  37. encode_u16(response + 9, GPIOD_VALUE);
  38. encode_u16(response + 11, GPIOE_VALUE);
  39. rsplen += 10;
  40. }else if (item == 4) { // u phase detect
  41. int count = 20;
  42. s16 uvw[3] = {0, 0, 0};
  43. s16 uvw_total[3] = {0, 0, 0};
  44. if (can_message->len < 2) {
  45. response[2] = 2; //长度错误
  46. break;
  47. }
  48. u8 detect = decode_u8((u8 *)can_message->data + 1);
  49. gpio_phase_u_detect(detect?true:false);
  50. while(count-- > 0) {
  51. delay_us(100);
  52. sample_uvw_phases_raw(uvw);
  53. uvw_total[0] += uvw[0];
  54. uvw_total[1] += uvw[1];
  55. uvw_total[2] += uvw[2];
  56. }
  57. encode_u16(response + 3, uvw_total[0]/20);
  58. encode_u16(response + 5, uvw_total[1]/20);
  59. encode_u16(response + 7, uvw_total[2]/20);
  60. gpio_phase_u_detect(false);
  61. rsplen += 6;
  62. }
  63. break;
  64. }
  65. default:
  66. rsplen = 0;
  67. break;
  68. }
  69. if (rsplen > 0) {
  70. can_send_response(can_message->src, response, rsplen);
  71. }
  72. }
  73. u8 factory_get_mode(void) {
  74. return factory_mode;
  75. }
  76. bool factory_is_running(void) {
  77. return (factory_mode == 0);
  78. }