Files
B_Current_Ctrl/APP/display_task.c
T
2025-08-28 16:37:05 +08:00

303 lines
4.5 KiB
C

#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<BAT_MAX_CHANNEL;i++)
{
int16_t temp = charger.battery[i].cur_voltage * 100;
buff2send[len++] = temp >> 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<BAT_MAX_CHANNEL;i++)
{
int16_t temp = charger.battery[i].cur_voltage * 100;
buff2send[len++] = temp >> 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;
}
}
}
}