| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #include "bsp/gpio.h"
- #include "bsp/ml5238.h"
- #include "bsp/uart.h"
- #include "bsp/gd32_adc.h"
- #include "nv_storage.h"
- #include "pcba_test.h"
- int pcba_test(uint8_t *data, int len, uint8_t *response){
- uint8_t *payload = data + 2;
- int resp_len = 0;
- response[resp_len ++] = 0xFE;
- response[resp_len ++] = 0xFE;
- response[resp_len ++] = 0; //len
- response[resp_len ++] = payload[0];
- response[resp_len ++] = payload[1];
- uint8_t cmd = payload[1];
- if (cmd == 0x00) {
- response[resp_len ++] = ml5238_noop_register_rw(payload[2]);
- }else if (cmd == 0x01) {
- response[resp_len ++] = (uint8_t)nv_read_write_test();
- }else if (cmd == 0x02){
- int8_t temp;
- uint8_t result = 0;
- for (int i = 0; i < PACK_TEMPS_NUM; i++){
- temp = get_pack_temperature(i);
- if(!(((temp >= 24) && (temp <= 26))||((temp >= 63) && (temp <= 67)))){
- result = 1;
- }
- }
- response[resp_len ++] = result;
- }else if (cmd == 0x03) {
- response[resp_len ++] = 0;
- }else if (cmd == 0x04) {
- LED1_ON(0);
- LED3_ON(0);
- LED0_ON(1);
- LED2_ON(1);
- LED4_ON(1);
- response[resp_len ++] = 0;
- }else if (cmd == 0x05) {
- LED0_ON(0);
- LED2_ON(0);
- LED4_ON(0);
- LED1_ON(1);
- LED3_ON(1);
- response[resp_len ++] = 0;
- }else if (cmd == 0x06) {
- LED1_ON(0);
- LED3_ON(0);
- charger_open(0);
- discharger_open(0);
- start_aux_power(0);
- response[resp_len ++] = 0;
- }else if (cmd == 0x07) {
- start_aux_power(1);
- response[resp_len ++] = 0;
- }else if (cmd == 0x08) {
- response[resp_len ++] = io_state()->aux_lock_detect;
- }else if (cmd == 0x09) {
- start_aux_power(0);
- response[resp_len ++] = 0;
- }else if (cmd == 0x0a) {
- ml5238_enable_load_detect(1);
- delay_us(1000);
- response[resp_len ++] = !ml5238_is_load_disconnect();
- }else if (cmd == 0xb) {
- charger_open(0);
- discharger_open(0);
- start_aux_power(0);
- delay_us(1000);
- response[resp_len ++] = io_state()->charger_detect_irq;
- }else if (cmd == 0xc) {
- charger_open(0);
- discharger_open(0);
- start_aux_power(0);
- response[resp_len ++] = IS_CHARGER_IN();
- }else if (cmd == 0xd) {
- response[resp_len ++] = io_state()->aux_lock_detect;
- }else if (cmd == 0xe) {
- charger_open(0);
- discharger_open(0);
- start_aux_power(1);
- response[resp_len ++] = 0;
- }else if (cmd == 0xf){
- response[resp_len ++] = !IS_HALL1_DETECTED();
- response[resp_len ++] = !IS_HALL2_DETECTED();
- }else if (cmd == 0x10) {
- if (payload[2] >= 3) {
- charger_open(1);
- discharger_open(1);
- }else if (payload[2] == 1){
- charger_open(0);
- discharger_open(1);
- }else{
- charger_open(1);
- discharger_open(0);
- }
- response[resp_len ++] = 0;
- }else if (cmd == 0x11) {
- response[resp_len ++] = ml5238_is_discharging() | ml5238_is_charging()<<1;
- }else if (cmd == 0x22) {
- uint16_t health = *(uint16_t *)bms_health();
- response[resp_len ++] = AUX_VOL_IS_OPEN();
- response[resp_len ++] = health;
- response[resp_len ++] = health >> 8;
- }else if (cmd == 0xa1) {
- charger_open(0);
- discharger_open(0);
- start_aux_power(0);
- response[resp_len ++] = 0;
- }else if (cmd == 0x12) {
- uint16_t aux_power_adc = (uint16_t)adc_sample_avg(ADC_CHAN_AUX_CURR, 10);
- response[resp_len ++] = aux_power_adc;
- response[resp_len ++] = aux_power_adc >> 8;
- }else if (cmd == 0x13) {
- shark_uart_deinit(SHARK_UART1);
- rcu_periph_clock_enable(RCU_GPIOA);
- gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
- gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_3);
- gpio_bit_set(GPIOA, GPIO_PIN_2);
- response[resp_len ++] = gpio_input_bit_get(GPIOA, GPIO_PIN_3);
- }else if (cmd == 0x16) {
- gpio_bit_reset(GPIOA, GPIO_PIN_2);
- response[resp_len ++] = gpio_input_bit_get(GPIOA, GPIO_PIN_3);
- }else if (cmd == 0x14) {
- UART0_IR_EN(0);
- response[resp_len ++] = gpio_output_bit_get(GPIOC,GPIO_PIN_14);
- }else if (cmd == 0x15) {
- UART1_IR_EN(0);
- response[resp_len ++] = gpio_output_bit_get(GPIOF,GPIO_PIN_0);
- }else if (cmd == 0x17) {
- uint16_t vol = 0;
- for (int i = 0; i < CELLS_NUM; i++){
- if (measure_value()->cell_vol[i] > 3000 && measure_value()->cell_vol[i] < 3400) {
- vol = measure_value()->cell_vol[i];
- break;
- }
- }
- response[resp_len ++] = vol;
- response[resp_len ++] = vol >> 8;
- }else if (cmd == 0x18) {
- uint8_t result = 1;
- if (payload[2] == 1) {
- charger_open(1);
- discharger_open(1);
- result = 0;
- }else if (payload[2] == 2){
- if (measure_value()->load_current >= -5300 && measure_value()->load_current <= -4700){
- result = 0;
- }
- }else if (payload[2] == 3) {
- if (io_state()->aux_lock_detect) {
- result = 0;
- }
- }else if (payload[2] == 4) {
- charger_open(0);
- discharger_open(0);
- result = 0;
- }
- response[resp_len ++] = result;
- }
- response[2] = resp_len;
- return resp_len;
- }
|