JZsdk_Hal.c 6.7 KB
#include <stdio.h>

#include "JZsdkLib.h"
#include "Hal_Recv/HalRecv.h"
#include "Hal_Send/HalSend.h"
#include "JZsdk_Hal.h"
#include "BaseConfig.h"

#include "JZsdk_uart/JZsdk_Uart.h"

static s_JZsdk_Hal_Info *g_HalInfo = NULL;

s_JZsdk_Hal_Info *JZsdk_Hal_GetHalInfo()
{
    return g_HalInfo;
}

T_JZsdkReturnCode JZsdk_Hal_Init()
{
    T_JZsdkOsalHandler *pOsalHandler = JZsdk_Platform_GetOsalHandler();

    if (g_HalInfo == NULL)
    {
        g_HalInfo = pOsalHandler->Malloc(sizeof(s_JZsdk_Hal_Info));
    }

    //PSDK系列初始化
    for (int i = DEVICE_PSDK; i < UART_4G; i++)
    {
        g_HalInfo->HalPort[i].UseFlag = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].ConnectStatus = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].PortType = PORT_TYPE_PSDK;
    }

    //UART系列初始化
    for (int i = UART_4G; i < USB_DEV_1; i++)
    {
        g_HalInfo->HalPort[i].UseFlag = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].ConnectStatus = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].PortType = PORT_TYPE_UART;
    }

    //USB系列初始化
    for (int i = USB_DEV_1; i < NET_DEV_1; i++)
    {
        g_HalInfo->HalPort[i].UseFlag = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].ConnectStatus = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].PortType = PORT_TYPE_USB;
    }

    //网口系列初始化
    for (int i = NET_DEV_1; i < HAL_DATA_TRANSMISSION; i++)
    {
        g_HalInfo->HalPort[i].UseFlag = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].ConnectStatus = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].PortType = PORT_TYPE_NET;
    }   

    //特殊数据层
    for (int i = HAL_DATA_TRANSMISSION; i < HAL_MAX; i++)
    {
        g_HalInfo->HalPort[i].UseFlag = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].ConnectStatus = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
        g_HalInfo->HalPort[i].PortType = PORT_TYPE_TRANS_DATA;
    }

    JZSDK_LOG_INFO("JZsdk_Hal_Init Success");

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/**************
 * 
 *  jzsdk 获取hal的端口使用标志位
 * 
 * *********************/
int JZsdk_HalPort_UseFlag(int PortName)
{
    return g_HalInfo->HalPort[PortName].UseFlag;
}


T_JZsdkReturnCode JZsdk_HalPort_SetUseFlag(int PortName,int UseFlag)
{
    g_HalInfo->HalPort[PortName].UseFlag = UseFlag;

    //将端口添加到已使用端口列表中 或从端口中移除
 
    //如果是要添加进列表中
    if (UseFlag == JZ_FLAGCODE_ON)
    {
        //先检查列表中是否已经存在
        for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)
        {
            if (g_HalInfo->HaveUsePort[i] == PortName)
            {
                return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
            }
        }

        //如果不存在,则添加
        g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum] = PortName;
        g_HalInfo->HaveUsePortNum++;
        g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_ON;
    }

    //如果是要从列表中移除
    else if (UseFlag == JZ_FLAGCODE_OFF)
    {
        //先检查列表中是否已经存在
        for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)
        {
            if (g_HalInfo->HaveUsePort[i] == PortName)
            {
                g_HalInfo->HaveUsePort[i] = g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum - 1];
                g_HalInfo->HaveUsePortNum--;
                g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_OFF;
                g_HalInfo->HalPort[PortName].ConnectStatus = JZ_FLAGCODE_OFF;
                g_HalInfo->HalPort[PortName].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
                return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
            }
        }

        //如果本来就不存在,则直接返回
        JZSDK_LOG_INFO("hal口:%s,本来就未使用,无需移除", JZsdk_DefineCode_GetPortName(PortName));
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

//用于给初始化函数调用
static T_JZsdkReturnCode JZsdK_HalPort_Init_Info(int PortName, int UseFlag
    , int ConnectStatus, int HeartBeatStatusSend, int PortType)
{
    g_HalInfo->HalPort[PortName].UseFlag = UseFlag;
    g_HalInfo->HalPort[PortName].ConnectStatus = ConnectStatus;
    g_HalInfo->HalPort[PortName].HeartBeatStatusSend = HeartBeatStatusSend;
    g_HalInfo->HalPort[PortName].PortType = PortType;

    //记录端口
    JZsdk_HalPort_SetUseFlag(PortName, JZ_FLAGCODE_ON);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**********************
 * 
 *    hal端口 初始化函数
 *    psdk初始化 value为NULL
 *    uart初始化 value[0]为波特率
 * 
 * ******************/
T_JZsdkReturnCode JZsdk_HalPort_Init(int PortName, int Value[])
{
    T_JZsdkReturnCode ret;

    //psdk初始化
    if (PortName >= DEVICE_PSDK && PortName < UART_4G)
    {
        JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_PSDK);

        JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));

        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    //uart初始化
    if (PortName >= UART_4G && PortName < USB_DEV_1)
    {
        JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));
                
        ret = JZsdk_Uart_ReInit(PortName, Value[0]);
        if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
        {
            JZSDK_LOG_ERROR("hal%s 初始化失败",JZsdk_DefineCode_GetPortName(PortName));
            return ret;
        }

        JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_UART);

        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }
    
    //usb初始化
    if (PortName >= USB_DEV_1 && PortName < NET_DEV_1)
    {
        //还没做
    }

    //net初始化
    if (PortName >= NET_DEV_1 && PortName < HAL_DATA_TRANSMISSION)
    {
        //还没做
    }

    //数据传输初始化
    if (PortName == HAL_DATA_TRANSMISSION)
    {
        JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_TRANS_DATA);

        JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/************************
 * 
 *  HalRort Reinit
 *  专门用于已经初始化完毕端口
 *  与init的区别是, Reinit 是要调用多线程来重初始化的
 * 
 * ***************************/
T_JZsdkReturnCode JZsdk_HalPort_ReInit(int PortName, int Value[])
{
    return JZsdk_HalPort_Init(PortName, Value);
}