Files
B_Current_Ctrl/APP/monitor_task.c
T
2025-09-16 17:31:08 +08:00

491 lines
10 KiB
C

#include "FreeRTOS.h"
#include "cmsis_os.h"
#include "drv_uart.h"
#include "middle/ParsePack.h"
#include "monitor_task.h"
#include "device_task.h"
#include "drv_power.h"
#include "drv_relay.h"
#include "drv_fan.h"
#include "control.h"
Parser_t parser;
Packer_t packer;
uint32_T mode;
int32_T bat_type;
int32_T bat_num;
int32_T run_state;
real32_T cmd_current;
real32_T bat_capacity;
uint32_t getParam = 0;
uint32_t NormalTestMode = 0;//0 normal 1 test
uint32_t send_tick = 0;
void StartMonitorTask(void * argument)
{
uint8_t buff[256];
uint16_t len;
Parser_init(&parser);
Packer_init(&packer);
init_uart_fifos();
for(;;)
{
osDelay(5);
send_tick++;
//监控任务
//执行UI工作,执行状态监控工作
len = UART_RX_FIFO_read(&hub_rx, buff, sizeof(buff));
if(len)
{
int rst = -1;
for(int i = 0;i<len;i++)
{
rst = Parser_char(&parser, buff[i]);
switch(rst)
{
case 0://设置系统
{
uint32_t cmd;
uint32_t value;
union { uint32_t W; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
cmd = src.W;
src.B[0] = parser.buff[4];
src.B[1] = parser.buff[5];
src.B[2] = parser.buff[6];
src.B[3] = parser.buff[7];
value = src.W;
if(cmd != 0)
{
NormalTestMode = 1;
}
switch(cmd)
{
case 0:
{
NormalTestMode = 0x00;//normal
}break;
case 1:
{
power_set(value);
}break;
case 2:
{
relay_set(0,value);
}break;
case 3:
{
relay_set(1,value);
}break;
case 4:
{
fan_set(value);
}break;
}
}break;
case 1://设置参数
{
union { uint32_t W; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
getParam = src.W;
}break;
case 0x02://电压P
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
voltage_p = src.F;
}break;
case 0x03://电压I
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
voltage_i = src.F;
}break;
case 0x04://电压d
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
voltage_d = src.F;
}break;
case 0x05://电流p
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
current_p = src.F;
}break;
case 0x06://电流I
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
current_i = src.F;
}break;
case 0x07://电流d
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
current_d = src.F;
}break;
case 0x10://设置运行模式
{
union { uint32_t W; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
mode = src.W;
}break;
case 0x11://设置运行状态
{
union { int32_t w; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
run_state = src.w;
}break;
case 0x12://设置电池数量
{
union { int32_t w; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
bat_num = src.w;
}break;
case 0x13://电池类型
{
union { int32_t w; uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
bat_type = src.w;
}break;
case 0x14://电池充电电流
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
cmd_current = src.F;
}break;
case 0x15://电池容量
{
union { float F;uint8_t B[4];}src;
src.B[0] = parser.buff[0];
src.B[1] = parser.buff[1];
src.B[2] = parser.buff[2];
src.B[3] = parser.buff[3];
bat_capacity = src.F * 0.001;//Ah
}break;
}
}
}
//=======================周期消息================================
//send meg
if(!(send_tick % 20))//10Hz
{
uint8_t send_buff[200];
size_t send_size = 0;
size_t send_len = 0;
union {float F; uint32_t W;int32_t w; uint16_t H[2];int16_t h[2]; uint8_t B[4];}src;
src.F = voltage_pwr;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_buck_in;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_buck_out;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_bat;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_current;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_temp;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = control_Y.cmd_all_voltage;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = control_Y.cmd_all_current;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
send_size = Packer_pack(&packer,0x10,send_buff,send_len);
UART_TX_FIFO_write(&hub_tx,packer.buff,send_size);
}
if(!(send_tick % 40))//5Hz
{
uint8_t send_buff[200];
size_t send_size = 0;
size_t send_len = 0;
union {float F; uint32_t W;int32_t w; uint16_t H[2];int16_t h[2]; uint8_t B[4];}src;
for(int i = 0;i<24;i++)
{
src.F = voltage_bat_sv[i];
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
}
send_size = Packer_pack(&packer,0x11,send_buff,send_len);
UART_TX_FIFO_write(&hub_tx,packer.buff,send_size);
}
if(!(send_tick % 200))//1Hz
{
uint8_t send_buff[200];
size_t send_size = 0;
size_t send_len = 0;
union {float F; uint32_t W;int32_t w; uint16_t H[2];int16_t h[2]; uint8_t B[4];}src;
src.W = power_state();
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.W = relay_state(0);
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.W = relay_state(1);
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.W = fan_state();
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
send_size = Packer_pack(&packer,0x12,send_buff,send_len);
UART_TX_FIFO_write(&hub_tx,packer.buff,send_size);
}
//==========================事件消息=====================================
if((getParam & 0x01) == 0x01)//读取PID
{
getParam &= 0xFFFFFFFE;//清除标志位
uint8_t send_buff[200];
size_t send_size = 0;
size_t send_len = 0;
union {float F; uint32_t W;int32_t w; uint16_t H[2];int16_t h[2]; uint8_t B[4];}src;
src.F = voltage_p;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_i;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = voltage_d;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = current_p;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = current_i;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
src.F = current_d;
send_buff[send_len++] = src.B[0];
send_buff[send_len++] = src.B[1];
send_buff[send_len++] = src.B[2];
send_buff[send_len++] = src.B[3];
send_size = Packer_pack(&packer,0x01,send_buff,send_len);
UART_TX_FIFO_write(&hub_tx,packer.buff,send_size);
}
}
}