#include "display_task.h" #include "common.h" Parser_t parser; Packer_t packer; void dispaly_encode_thread(void); void display_parse_thread(void); void StartDisplayTask(void const * argument) { Parser_init(&parser); Packer_init(&packer); for(;;) { osDelay(10); dispaly_encode_thread(); display_parse_thread(); } } //接收,发送,解析,都在这里进行 //100Hz运行 void dispaly_encode_thread(void) { static uint8_t tick_count = 0; //50Hz if(!(tick_count % 2))//tick 被2整除的时候 { //发送各种控制状态信息 uint8_t buff2send[50]; uint16_t len = 0; buff2send[len++] = charger.working; buff2send[len++] = charger.mode; buff2send[len++] = charger.step; size_t size = Packer_pack(&packer,0x0F, buff2send, len); //uart send UART_TX_FIFO_write(&ui_tx, packer.buff, size); } //20Hz if(!(tick_count % 5)) { //HUB状态 uint8_t buff2send[50]; uint16_t len = 0; for(int i = 0;i> 8; buff2send[len++] = temp; } //size_t size = Packer_pack(&packer,0x50 + charger.hub.number, buff2send, len); //uart send //UART_TX_FIFO_write(&ui_tx, packer.buff, size); } //10Hz if(!(tick_count % 10)) { //发送单节电池电压, uint8_t buff2send[50]; uint16_t len = 0; for(int i = 0;i> 8; buff2send[len++] = temp; } size_t size = Packer_pack(&packer,0x10, buff2send, len); //uart send UART_TX_FIFO_write(&ui_tx, packer.buff, size); } //5Hz if(!(tick_count % 20)) { //发送总电压,总电流,电池电压,继电器状态,电流控制的PWM uint8_t buff2send[50]; uint16_t len = 0; int16_t temp = charger.power.pwr_voltage * 100; buff2send[len++] = temp >> 8; buff2send[len++] = temp; temp = charger.power.bat_current * 100; buff2send[len++] = temp >> 8; buff2send[len++] = temp; temp = charger.power.bat_voltage * 100; buff2send[len++] = temp >> 8; buff2send[len++] = temp; uint16_t pwm = charger.relay.state(); buff2send[len++] = pwm >> 8; buff2send[len++] = pwm; pwm = charger.power.state(); buff2send[len++] = pwm >> 8; buff2send[len++] = pwm; size_t size = Packer_pack(&packer,0x11, buff2send, len); //uart send UART_TX_FIFO_write(&ui_tx, packer.buff, size); } //2Hz if(!(tick_count % 50)) { } //1Hz if(!(tick_count % 100)) { //发送温度 uint8_t buff2send[50]; uint16_t len = 0; int16_t temp = charger.fan.temperature * 10; buff2send[len++] = temp >> 8; buff2send[len++] = temp; uint16_t ctrl = charger.fan.state(); buff2send[len++] = ctrl >> 8; buff2send[len++] = ctrl; size_t size = Packer_pack(&packer,0x01, buff2send, len); //uart send UART_TX_FIFO_write(&ui_tx, packer.buff, size); } tick_count++; } void display_parse_thread(void) { //int Parser_char(Parser_t *parser, uint8_t c); uint8_t buff[256]; size_t len = UART_RX_FIFO_read(&ui_rx, buff, sizeof(buff)); if (len) { for(int i = 0;i < len;i++) { int rst = Parser_char(&parser, buff[i]); switch(rst) { case 0xFF://test { switch(parser.buff[0]) { case 1:{//风扇打开/关闭 uint16_t pwm = (uint16_t)(parser.buff[1] << 8) + parser.buff[2]; charger.fan.set(pwm); }break; case 2:{//继电器打开/关闭 uint16_t pwm = (uint16_t)(parser.buff[1] << 8) + parser.buff[2]; charger.relay.set(pwm); }break; case 3:{//电流控制 uint16_t pwm = (uint16_t)(parser.buff[1] << 8) + parser.buff[2]; charger.power.set_current(pwm); }break; } }break; case 1://停止所有工作 { }break; case 2://开始存储 { BAT_TYPE_t info; info.count = 2; info.max_voltage = 4.2; info.min_voltage = 3.3; info.name = "lipo"; info.tar_current = 10; info.tar_single = 4.2; info.tar_voltage = 7.8; info.type = 0; //硬件初始化 //流程初始化 charger.working = 1; charger.mode = 1; charger.step = 1; //转跳到充电工作模式 }break; case 3://开始平衡 { }break; case 4://开始自定义 { }break; default: { }break; } } } }