forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/protocol/protocol_comm.c

287 lines
7.7 KiB
C

#include "drv_uart.h"
#include "bsp_flash.h"
#include "bsp_queue.h"
#include "db_config.h"
#include "version_manager.h"
#include "gpio_manager.h"
#include "comm_manager.h"
#include "flash_manager.h"
#include "eeprom_manager.h"
#include "bmu_manager.h"
#include "kit_data.h"
#include "protocol_comm.h"
typedef enum
{
kModbusProtocal_None,
kModbusProtocal_BlueSun,
kModbusProtocal_End,
}ModbusProtocal;
typedef enum
{
kCanProtocal_None, //使用CAN并机的时候需要将外can协议设置为闲置
kCanProtocal_Bcu,
kCanProtocal_Bcu_invt, //英威腾协议
kCanProtocal_End,
}CanProtocal;
typedef struct
{
CanCommSend send;
CanCommPoll poll;
CanCommReceive receive;
}ProtocalCanItem;
extern QueueItem inter_can_queue;
extern QueueItem exter_can_queue;
extern ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
extern const UintArgFunCall tcp_server_poll[W5500_MODBUS_NUM];
QueueItem *queue_can[kcan_dev_e_End] =
{
&exter_can_queue,
&inter_can_queue,
};
/************************************************CAN*****************************************************/
ProtocalCanItem protocal_can[kcan_dev_e_End];
void protocol_can_none_init(can_dev_e can)
{
protocol_can_set_call(can, NULL, NULL, NULL);
}
typedef void (*CanProtocalCall)(can_dev_e can);
CanProtocalCall protocol_can_init_array[kCanProtocal_End] =
{
protocol_can_none_init,
protocol_can_bcu_init,
};
/************************************************modbus*****************************************************/
void protocal_modbus_none_init(ModbusItem * const mb_item, uint8_t addr)
{
register_modbus_fun(mb_item, kModbusFun_0x01, NULL);
register_modbus_fun(mb_item, kModbusFun_0x02, NULL);
register_modbus_fun(mb_item, kModbusFun_0x03, NULL);
register_modbus_fun(mb_item, kModbusFun_0x04, NULL);
register_modbus_fun(mb_item, kModbusFun_0x06, NULL);
register_modbus_fun(mb_item, kModbusFun_0x10, NULL);
}
/************************************************Model*****************************************************/
typedef void (*UniteProtocalInit)(void * const item, uint16_t addr);
typedef enum
{
UniteProtocalType_Hmi,
UniteProtocalType_Modbus,
UniteProtocalType_Iec104,
UniteProtocalType_End,
}UniteProtocalType;
typedef struct
{
bool is_used_model;
UniteProtocalType type;
UniteProtocalInit init;
}UniteProtocol;
UniteProtocol unite_protocol_init_array[kModbusProtocal_End] =
{
false, UniteProtocalType_Modbus, protocol_modbus_bcu_init
//false, UniteProtocalType_Modbus, protocol_modbus_blusun_init
};
/************************************************Init*****************************************************/
void protocol_comm_init(void)
{
uint16_t protocol, addr;
uint32_t i, j;
bms_analyse_model_data();
//485通讯协议
for(j = 0; j < kModbusIdx_End; j++)
{
addr = get_eeprom_data(kEep_InterRS485_SlaveID_Protocol + j, kEepromDataType_High);
protocol = get_eeprom_data(kEep_InterRS485_SlaveID_Protocol + j, kEepromDataType_Low);
if((protocol < kModbusProtocal_End))// && (unite_protocol_init_array[protocol].type == UniteProtocalType_Modbus)
{
if((bms_get_modbus_model_task_num(j) > 0) && (unite_protocol_init_array[protocol].is_used_model == true))
{
modbus_rtu_array[j]->is_read_write_data = true;
bms_set_tag_data(kTagData_GateIdx, protocol);
for(i = 0; i < bms_get_modbus_model_task_num(j); i++)
{
bsp_modbus_register_task(modbus_rtu_array[j], bms_get_modbus_model_head_addr(j, i));
}
}
if(unite_protocol_init_array[protocol].init != NULL)
{
if(unite_protocol_init_array[protocol].type == UniteProtocalType_Hmi)
{
;//上位机预留
}
else
{
unite_protocol_init_array[protocol].init(modbus_rtu_array[j], addr);
}
}
}
}
for(i = 0; i < kcan_dev_e_End;i++)
{
protocol = get_eeprom_data(kEep_InterCanProtocol_Baudrate + i, kEepromDataType_High);
//测试
protocol = 1;
if((protocol < kCanProtocal_End) && (protocol_can_init_array[protocol] != NULL))
{
protocol_can_init_array[protocol](i);
}
}
}
void protocol_can_set_call(can_dev_e can, CanCommReceive rx, CanCommSend tx, CanCommPoll poll)
{
if(can < kcan_dev_e_End)
{
protocal_can[can].send = tx;
protocal_can[can].poll = poll;
protocal_can[can].receive = rx;
}
}
void protocol_can_poll(uint32_t base_time, can_dev_e can)
{
CanMsg msg;
uint32_t cnt = 0;
if(can < kcan_dev_e_End)
{
if(protocal_can[can].receive != NULL)
{
while ((bsp_queue_pop_instance(queue_can[can], (uint8_t *)&msg) == kKit_Ret_Ok) && (++cnt < 100))
{
protocal_can[can].receive(&msg, can);
}
}
if(protocal_can[can].send != NULL)
{
protocal_can[can].send(base_time, can);
}
if(protocal_can[can].poll != NULL)
{
protocal_can[can].poll(base_time, can);
}
}
}
static uint32_t inter_modbus_count = 0,inter2_modbus_count = 0,inter3_modbus_count = 0;
void modbus_rtu_inter_handler(uint32_t base_time)
{
inter_modbus_count++;
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Inter], true);
}
void modbus_rtu_extern_handler(uint32_t base_time)
{
inter2_modbus_count++;
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Exter1], true);
}
void modbus_rtu_externII_handler(uint32_t base_time)
{
inter3_modbus_count++;
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Exter2], true);
}
typedef void (* UintArgCall) (uint32_t arg);
#if W5500_MODBUS_NUM > 0
void protocol_w5500_modbus_tcp_server1_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[0]);
bsp_modbus_poll(&w5500_modbus_tcp_array[0], true);
}
#endif
#if W5500_MODBUS_NUM > 1
void protocol_w5500_modbus_tcp_server2_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[1]);
bsp_modbus_poll(&w5500_modbus_tcp_array[1], true);
}
#endif
#if W5500_MODBUS_NUM > 2
void protocol_w5500_modbus_tcp_server3_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[2]);
bsp_modbus_poll(&w5500_modbus_tcp_array[2], true);
}
#endif
#if W5500_MODBUS_NUM > 3
void protocol_w5500_modbus_tcp_server4_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[3]);
bsp_modbus_poll(&w5500_modbus_tcp_array[3], true);
}
#endif
#if W5500_MODBUS_NUM > 4
void protocol_w5500_modbus_tcp_server5_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[4]);
bsp_modbus_poll(&w5500_modbus_tcp_array[4], true);
}
#endif
#if W5500_MODBUS_NUM > 5
void protocol_w5500_modbus_tcp_server6_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[5]);
bsp_modbus_poll(&w5500_modbus_tcp_array[5], true);
}
#endif
#if W5500_MODBUS_NUM > 6
void protocol_w5500_modbus_tcp_server7_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[6]);
bsp_modbus_poll(&w5500_modbus_tcp_array[6], true);
}
#endif
#if W5500_MODBUS_NUM > 7
void protocol_w5500_modbus_tcp_server8_poll(uint32_t base_time)
{
//bsp_iec104_poll(&w5500_iec104_array[7]);
bsp_modbus_poll(&w5500_modbus_tcp_array[7], true);
}
#endif
const UintArgCall tcp_server_poll[W5500_MODBUS_NUM] =
{
protocol_w5500_modbus_tcp_server1_poll,
protocol_w5500_modbus_tcp_server2_poll,
/*
protocol_w5500_modbus_tcp_server3_poll,
protocol_w5500_modbus_tcp_server4_poll,
protocol_w5500_modbus_tcp_server5_poll,
protocol_w5500_modbus_tcp_server6_poll,
protocol_w5500_modbus_tcp_server7_poll,
protocol_w5500_modbus_tcp_server8_poll,
*/
};