pcba_test.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "bsp/gpio.h"
  2. #include "bsp/ml5238.h"
  3. #include "bsp/uart.h"
  4. #include "bsp/gd32_adc.h"
  5. #include "nv_storage.h"
  6. #include "pcba_test.h"
  7. int pcba_test(uint8_t *data, int len, uint8_t *response){
  8. uint8_t *payload = data + 2;
  9. int resp_len = 0;
  10. response[resp_len ++] = 0xFE;
  11. response[resp_len ++] = 0xFE;
  12. response[resp_len ++] = 0; //len
  13. response[resp_len ++] = payload[0];
  14. response[resp_len ++] = payload[1];
  15. uint8_t cmd = payload[1];
  16. if (cmd == 0x00) {
  17. response[resp_len ++] = ml5238_noop_register_rw(payload[2]);
  18. }else if (cmd == 0x01) {
  19. response[resp_len ++] = (uint8_t)nv_read_write_test();
  20. }else if (cmd == 0x02){
  21. int8_t temp;
  22. uint8_t result = 0;
  23. for (int i = 0; i < PACK_TEMPS_NUM; i++){
  24. temp = get_pack_temperature(i);
  25. if(!(((temp >= 24) && (temp <= 26))||((temp >= 63) && (temp <= 67)))){
  26. result = 1;
  27. }
  28. }
  29. response[resp_len ++] = result;
  30. }else if (cmd == 0x03) {
  31. response[resp_len ++] = 0;
  32. }else if (cmd == 0x04) {
  33. LED1_ON(0);
  34. LED3_ON(0);
  35. LED0_ON(1);
  36. LED2_ON(1);
  37. LED4_ON(1);
  38. response[resp_len ++] = 0;
  39. }else if (cmd == 0x05) {
  40. LED0_ON(0);
  41. LED2_ON(0);
  42. LED4_ON(0);
  43. LED1_ON(1);
  44. LED3_ON(1);
  45. response[resp_len ++] = 0;
  46. }else if (cmd == 0x06) {
  47. LED1_ON(0);
  48. LED3_ON(0);
  49. charger_open(0);
  50. discharger_open(0);
  51. start_aux_power(0);
  52. response[resp_len ++] = 0;
  53. }else if (cmd == 0x07) {
  54. start_aux_power(1);
  55. response[resp_len ++] = 0;
  56. }else if (cmd == 0x08) {
  57. response[resp_len ++] = io_state()->aux_lock_detect;
  58. }else if (cmd == 0x09) {
  59. start_aux_power(0);
  60. response[resp_len ++] = 0;
  61. }else if (cmd == 0x0a) {
  62. ml5238_enable_load_detect(1);
  63. delay_us(1000);
  64. response[resp_len ++] = !ml5238_is_load_disconnect();
  65. }else if (cmd == 0xb) {
  66. charger_open(0);
  67. discharger_open(0);
  68. start_aux_power(0);
  69. delay_us(1000);
  70. response[resp_len ++] = io_state()->charger_detect_irq;
  71. }else if (cmd == 0xc) {
  72. charger_open(0);
  73. discharger_open(0);
  74. start_aux_power(0);
  75. response[resp_len ++] = IS_CHARGER_IN();
  76. }else if (cmd == 0xd) {
  77. response[resp_len ++] = io_state()->aux_lock_detect;
  78. }else if (cmd == 0xe) {
  79. charger_open(1);
  80. discharger_open(1);
  81. start_aux_power(0);
  82. response[resp_len ++] = 0;
  83. system_power_down();
  84. }else if (cmd == 0xf){
  85. response[resp_len ++] = !IS_HALL1_DETECTED();
  86. response[resp_len ++] = !IS_HALL2_DETECTED();
  87. }else if (cmd == 0x10) {
  88. if (payload[2] >= 3) {
  89. charger_open(1);
  90. discharger_open(1);
  91. }else if (payload[2] == 1){
  92. charger_open(0);
  93. discharger_open(1);
  94. }else{
  95. charger_open(1);
  96. discharger_open(0);
  97. }
  98. response[resp_len ++] = 0;
  99. }else if (cmd == 0x11) {
  100. response[resp_len ++] = ml5238_is_discharging() | ml5238_is_charging()<<1;
  101. }else if (cmd == 0x22) {
  102. uint16_t health = *(uint16_t *)bms_health();
  103. response[resp_len ++] = AUX_VOL_IS_OPEN();
  104. response[resp_len ++] = health;
  105. response[resp_len ++] = health >> 8;
  106. }else if (cmd == 0xa1) {
  107. charger_open(0);
  108. discharger_open(0);
  109. start_aux_power(0);
  110. response[resp_len ++] = 0;
  111. }else if (cmd == 0x12) {
  112. uint16_t aux_power_adc = (uint16_t)adc_sample_avg(ADC_CHAN_AUX_CURR, 10);
  113. response[resp_len ++] = aux_power_adc;
  114. response[resp_len ++] = aux_power_adc >> 8;
  115. }else if (cmd == 0x13) {
  116. shark_uart_deinit(SHARK_UART1);
  117. rcu_periph_clock_enable(RCU_GPIOA);
  118. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  119. gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_3);
  120. gpio_bit_set(GPIOA, GPIO_PIN_2);
  121. response[resp_len ++] = gpio_input_bit_get(GPIOA, GPIO_PIN_3);
  122. }else if (cmd == 0x16) {
  123. gpio_bit_reset(GPIOA, GPIO_PIN_2);
  124. response[resp_len ++] = gpio_input_bit_get(GPIOA, GPIO_PIN_3);
  125. }else if (cmd == 0x14) {
  126. UART0_IR_EN(0);
  127. response[resp_len ++] = gpio_output_bit_get(GPIOC,GPIO_PIN_14);
  128. }else if (cmd == 0x15) {
  129. UART1_IR_EN(0);
  130. response[resp_len ++] = gpio_output_bit_get(GPIOF,GPIO_PIN_0);
  131. }else if (cmd == 0x17) {
  132. uint16_t vol = 0;
  133. for (int i = 0; i < CELLS_NUM; i++){
  134. if (measure_value()->cell_vol[i] > 3000 && measure_value()->cell_vol[i] < 3400) {
  135. vol = measure_value()->cell_vol[i];
  136. break;
  137. }
  138. }
  139. response[resp_len ++] = vol;
  140. response[resp_len ++] = vol >> 8;
  141. }else if (cmd == 0x18) {
  142. uint8_t result = 1;
  143. if (payload[2] == 1) {
  144. charger_open(1);
  145. discharger_open(1);
  146. result = 0;
  147. }else if (payload[2] == 2){
  148. if (measure_value()->load_current >= -5300 && measure_value()->load_current <= -4700){
  149. result = 0;
  150. }
  151. }else if (payload[2] == 3) {
  152. if (io_state()->aux_lock_detect) {
  153. result = 0;
  154. }
  155. }else if (payload[2] == 4) {
  156. charger_open(0);
  157. discharger_open(0);
  158. result = 0;
  159. }
  160. response[resp_len ++] = result;
  161. }
  162. response[2] = resp_len;
  163. return resp_len;
  164. }