C语言设计模式(面向对象一)

NBModule.h

#ifndef _NBMODULEFRAME_H__
#define _NBMODULEFRAME_H__


#include "total.h"



enum NBModuleStat_Enum
{
    SuccessStat = 0,
    WillOpClPowerStat,  // 需要关机开机解决的状态
    WillResetStat,           // 需要复位解决的状态
    OpreErrorStat          //  操作模组错误多次,解救不回来,不再操作
};


typedef struct NBModuleData_S
{
    char iccid[21];   // iccid
    char csq;         // 信号质量
    char RegMobileNetState;     // 注册基站状态   1成功 0失败
    char ConnectMqttState;      // mqtt连接状态 1是成功 0 失败
}NBModuleData_S;


typedef struct NBModuleFrame_S
{
    uint8_t commonfunc_num;
    uint8_t PowerControlNum;                // 电源开关机控制次数
    uint8_t MaxPowerControlNum;             // 最大电源开关机次数
    uint8_t ResetControlNum;                // 复位次数
    uint8_t MaxResetControlNum;             // 允许最大的复位次数

    int16_t (*GprsMqttSetUp)(struct NBModuleFrame_S *pNBModule);      // 组网与mqtt建立过程
    int16_t (*OpenModulePower)(void);       // 开电源
    int16_t (*CloseModulePower)(void);      // 关电源
    int16_t (*ResetModule)(void);           // 复位
    int16_t (*CommonFunc[6])(void);         // 普通联网过程
    int16_t (*MqttConfig)(void);
    int16_t (*MqttOpen)(void);
    int16_t (*MqttSub)(void);
    int16_t (*MqttPub)(uint8_t *mutual_buf, uint16_t mutual_len, char *pubTopic);
}NBModuleFrame_S;



uint8_t NBModuleFrame_S_Init(struct NBModuleFrame_S *NBModule);


extern struct NBModuleData_S g_NBModuleData;    // NB模组数据导为全局


#endif

NBModule.c

#include "NBModuleFrame.h"


struct NBModuleData_S g_NBModuleData;


/*************************************
 *
 * Funciton Name     : OpenModulePower_F
 * Function          : 模组开机
 *
 *
 *************************************/
static int16_t OpenModulePower_F(void)
{
return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : CloseModulePower_F
 * Function          : 模组关机
 *
 *
 *************************************/
static int16_t CloseModulePower_F(void)
{

    return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : ResetModule_F
 * Function          : 复位模组
 *
 *
 *************************************/
static int16_t ResetModule_F(void)
{
return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : ATCmd_F
 * Function          : AT命令
 *
 *
 *************************************/
static int16_t ATCmd_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATEcho_F
 * Function          : 关回显
 *
 *
 *************************************/
static int16_t ATEcho_F(void)
{
    return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATICCID_F
 * Function          : 查询ICCID
 *
 *
 *************************************/
static int16_t ATICCID_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATCgreg_F
 * Function          : 查询注网是否成功
 *
 *
 *************************************/
static int16_t ATCgreg_F(void)
{
   return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATCsq_F
 * Function          : 查询信号质量
 *
 *
 *************************************/
static int16_t ATCsq_F(void)
{
   return WillOpClPowerStat;
}



/*************************************
 *
 * Funciton Name     : ATMqttConfig_F
 * Function          : 配置连接Mqtt的服务器IP端口、客户端ID(NB_Client_ICCID)、
 *                    300keeplive、user、password、clean(1:客户端段线时服务器丢弃客户端信息)、encrypt(0不加密)
 *
 *
 *************************************/
static int16_t ATMqttConfig_F(void)
{
return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATMqttOpen_F
 * Function          
 *
 *
 *************************************/
static int16_t ATMqttOpen_F(void)
{
 return WillOpClPowerStat;
}

/*************************************
 *
 * Funciton Name     : ATMqttSub_F
 * Function          : 
 *************************************/
static int16_t ATMqttSub_F(void)
{
  return WillOpClPowerStat;
}


/*************************************
 *
 * Funciton Name     : ATMqttPub_F
 * Function          
 *
 *************************************/
static int16_t ATMqttPub_F(uint8_t *mutual_buf, uint16_t mutual_len, char *pubTopic)
{
   return SuccessStat;
}

/*************************************
 *
 * Funciton Name     : GprsMqttSetUp_F
 * Function          : 模组网络建立过程
 *
 *
 *************************************/
static int16_t GprsMqttSetUp_F(struct NBModuleFrame_S *pNBModule)
{
    uint8_t Fori = 0;
    int16_t ret = 0;


    
    pNBModule->OpenModulePower();       // 开机
    pNBModule->PowerControlNum = 0;
    pNBModule->ResetControlNum = 0;

GoExe:
    for ( Fori = 0; Fori < pNBModule->commonfunc_num; Fori++ )
    {
        ret = pNBModule->CommonFunc[Fori]();

        if ( ret == WillOpClPowerStat )    // 需要开关机解决
        {
            if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超过最大允许的开关机次数
            {
                return OpreErrorStat;
            }

            pNBModule->CloseModulePower();  // 关机

            
            pNBModule->OpenModulePower();   // 开机

            Fori = 0;
        }
        else if ( ret == WillResetStat )    // 需要复位解决
        {
            if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超过最大允许的复位次数
            {
                return OpreErrorStat;
            }

            Fori = 0;
    
            // 复位
            pNBModule->ResetModule();
        }
    }

    ret = pNBModule->MqttConfig();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超过最大允许的开关机次数
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 关机
        

        pNBModule->OpenModulePower();   // 开机

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超过最大允许的复位次数
        {
            return OpreErrorStat;
        }

        // 复位
        pNBModule->ResetModule();

        goto GoExe;
    }


    ret = pNBModule->MqttOpen();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超过最大允许的开关机次数
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 关机
        

        pNBModule->OpenModulePower();   // 开机

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超过最大允许的复位次数
        {
            return OpreErrorStat;
        }

        // 复位
        pNBModule->ResetModule();

        goto GoExe;
    }

    ret = pNBModule->MqttSub();

    if ( ret == WillOpClPowerStat )
    {
        if ( pNBModule->PowerControlNum++ >= pNBModule->MaxPowerControlNum ) // 超过最大允许的开关机次数
        {
            return OpreErrorStat;
        }

        pNBModule->CloseModulePower();  // 关机


        pNBModule->OpenModulePower();   // 开机

        goto GoExe;
    }
    else if ( ret == WillResetStat )
    {
        if ( pNBModule->ResetControlNum++ >= pNBModule->MaxResetControlNum ) // 超过最大允许的复位次数
        {
            return OpreErrorStat;
        }

        // 复位
        pNBModule->ResetModule();

        goto GoExe;
    }
    else if ( ret == SuccessStat )
    {
        return SuccessStat;
    }


    return OpreErrorStat;
}


uint8_t NBModuleFrame_S_Init(struct NBModuleFrame_S *NBModule)
{
    uint8_t index = 0;
    
    NBModule->MaxPowerControlNum = 3;
    NBModule->MaxResetControlNum = 3;
    NBModule->PowerControlNum = 0;
    NBModule->ResetControlNum = 0;


    NBModule->CommonFunc[index++] = ATCmd_F;
    NBModule->CommonFunc[index++] = ATEcho_F;
    NBModule->CommonFunc[index++] = ATICCID_F;
    NBModule->CommonFunc[index++] = ATCgreg_F;
    NBModule->CommonFunc[index++] = ATCsq_F;
    //NBModule->CommonFunc[index++] = ATCMDNS_F;

    NBModule->OpenModulePower = OpenModulePower_F;
    NBModule->CloseModulePower = CloseModulePower_F;
    NBModule->ResetModule = ResetModule_F;
    
    NBModule->MqttConfig = ATMqttConfig_F;
    NBModule->MqttOpen = ATMqttOpen_F;
    NBModule->MqttSub = ATMqttSub_F;
    NBModule->MqttPub = ATMqttPub_F;

    NBModule->GprsMqttSetUp = GprsMqttSetUp_F;

    NBModule->commonfunc_num = index;
    
    return index;
}

main.c

int main(void)
{
            struct NBModuleFrame_S NBModule;     // NB模组框架
            int16_t ret = 0;
            
            memset(&NBModule, 0, sizeof(struct NBModuleFrame_S));

            NBModuleFrame_S_Init(&NBModule);
            
            // 联网过程
            ret = NBModule.GprsMqttSetUp(&NBModule);
            
            
            if ( ret == SuccessStat )
            {
                     printf("Success\r\n");      
            }
    
}

面向对象的方法将两者结合,当低耦合时,为固有紧密耦合的元素和内容的封装提高内聚力。C不是面向对象语言,可以用于开发基于对象或面向对象的嵌入式系统。

猜你喜欢

转载自www.cnblogs.com/whylinux/p/10494561.html