#include "modbus.h"

//  ModbusRtu 01帧、02帧、03帧、04帧、05帧、06帧发送函数
void (*func_modbus_send_frame[7])(u16 register_addr, u16 count, void (*Func_Send)(const u8 *data, u16 count)) = {0, mosbus_send_frame01, mosbus_send_frame02, mosbus_send_frame03, mosbus_send_frame03, mosbus_send_frame05, mosbus_send_frame06}; // modbus 6种类型帧

/****************************************************
 *  函 数 名：Count_CRC
 *  函数功能：计算CRC数据
 *  入口参数：addr: 数据指针   num: 数量
 *  说    明：无
 *****************************************************/
unsigned short count_crc(const u8 *addr, int num)
{
    unsigned short crc = 0xFFFF;
    int            i;
    while (num--)
    {
        crc ^= *addr++;
        for (i = 0; i < 8; i++)
        {
            crc = (crc & 0x0001) ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
        }
    }
    return crc;
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame01
 *  函数功能：发送空调01帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame01(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
{
    //  01    03    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame02
 *  函数功能：发送空调02帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame02(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
{
    //  01    03    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame03
 *  函数功能：发送空调03帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame03(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
{
    //  01    03    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame04
 *  函数功能：发送空调04帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame04(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
{
    //  01    03    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame05
 *  函数功能：发送空调05帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame05(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
{
    //  01    03    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}

/****************************************************
 *  函 数 名：ModbusRtu_SendFrame06
 *  函数功能：发送空调06帧
 *  入口参数：register_addr 寄存器地址   count 数量
 *  说    明：无
 ****************************************************/
void mosbus_send_frame06(u16 register_addr, u16 data, FuncSend_TypeDef Func_Send)
{
    //  01    06    地址H    地址L   数量H   数量L    CRC-L  CRC-H
    union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 6, 0, 0}; // 06帧

    ModbusRtu_03Frame_Tx_Union.Frame03.register_addr  = __REV16(register_addr);
    ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(data);
    ModbusRtu_03Frame_Tx_Union.Frame03.crc            = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
    Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
}
