T168_111\system\ProFile :ProFile.c

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define PROFILE_C

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#include "Common.h"
#include "XCore.h"
#include "XComm.h"
#include "ProFile.h"

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/

/*None*/

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *    L O C A L   I N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

STATIC BOOL ProReady = FALSE;                                // Profile ready
STATIC CONST CHAR EndString[] = "END";

/******************************************************************************
 *                                                                            *
 *    L O C A L   U N I T I A L I Z E D   D A T A   D E F I N I T I O N S     *
 *                                                                            *
 ******************************************************************************/

STATIC ULONG ProChecksum;
STATIC CHAR *pStart;                                        // Start of profile 
STATIC CHAR *pCurrent;                                      // Scratch pointer 
#if defined(N3290)
UINT ProfileBuffer[(2*8+32)*1024/4];

#endif

/******************************************************************************
 *
 * Function:
 *    SetupProfile
 *
 * Description: 
 *        
 *
 * Input:
 *      None
 *
 * Output:
 *      None.
 *
 ******************************************************************************/
STATIC VOID SetupProfile(VOID)
{
    if (*((UCHAR *)PROFILE_ADDR) == 0xff || *((UCHAR *)PROFILE_ADDR) == 0x0)
        pStart = 0;
    else
        pStart = (CHAR *)PROFILE_ADDR;
}

STATIC VOID ToNextLine(VOID)
{
    while (*pCurrent != LF_CHAR && *pCurrent != CR_CHAR)
        ++pCurrent;
    while (*pCurrent == LF_CHAR || *pCurrent == CR_CHAR)
        ++pCurrent;
}

STATIC BOOL FindKey(CHAR *pKeyName)
{
    USHORT usKeyLen = (USHORT)strlen(pKeyName);                    // Length of key string 
    BOOL   fFound     = FALSE;                                    // Found key flag 

    if (!pStart || !pKeyName)
        return FALSE;

    while(1)
    {
        if ((ULONG)pCurrent > (ULONG)((ULONG)PROFILE_ADDR + PROFILE_MAX_LEN))
            break;
        if (strncmp(pCurrent, EndString, sizeof(EndString) - 1) == 0)    // Check for END string 
            break;
        if (strncmp(pKeyName, pCurrent, usKeyLen) == 0)            // Check for key string 
        {
            pCurrent += usKeyLen;
            while (*pCurrent == ' ' || *pCurrent == '\t')
                pCurrent++;
            if (*pCurrent == '=')
            {
                fFound = TRUE;
                break;
            }
        }
        ToNextLine();
    }

    return fFound;
}

VOID InitialProfile(VOID)
{
    // Calculate profile checksum
    ProChecksum = 0;
    for (pCurrent = (CHAR *)PROFILE_ADDR; pCurrent < PROFILE_ADDR + PROFILE_MAX_LEN; pCurrent++)
        ProChecksum += *pCurrent;

    ProReady = FALSE;

    SetupProfile();
    if (!pStart)
        return;    

    for (pCurrent = pStart; pCurrent < PROFILE_ADDR + PROFILE_MAX_LEN; pCurrent++)
    {
        if (strncmp(pCurrent, EndString, sizeof(EndString) - 1) == 0)
        {
            ProReady = TRUE;
            break;
        }
    }
}

BOOL IsProfileReady(VOID)
{
    if (!ProReady)
        return FALSE;

    SetupProfile();
    if (!pStart)
        return FALSE;

    return TRUE;
}

ULONG GetProfileChecksum(VOID)
{
    return ProChecksum;
}

/*这段代码是一个函数 GetProfileInt,用于从配置文件中获取一个整数值。
函数的参数包括一个键名 pKeyName 和一个指向浮点数的指针 fData。函数会尝试从配置文件中找到与给定键名匹配的值,并将其转换为浮点数后存储在 fData 中。
函数内部的实现逻辑如下:
*/
BOOL GetProfileInt(CHAR *pKeyName, FLOAT *fData)
{
    CHAR Buffer[12];
    INT Index;

    if (!ProReady)             //首先,检查配置文件是否已准备好,如果没有准备好,则返回 FALSE。
        return FALSE;

    SetupProfile();             //调用 SetupProfile 函数来设置配置文件的环境。
    if (!pStart)                //检查配置文件是否已经打开,如果没有打开,则返回 FALSE。
        return FALSE;    

    pCurrent = pStart;          //将当前位置指针 pCurrent 设置为配置文件的起始位置。
    *fData = 0;                    //将 fData 的值初始化为 0。

    if (!FindKey(pKeyName))     //使用 FindKey 函数在配置文件中查找与给定键名匹配的值。如果找不到,则返回 FALSE。
        return FALSE;

    pCurrent++;                 //将 pCurrent 指向下一个字符,并跳过空格和制表符。
    while (*pCurrent == ' ' ||  *pCurrent == '\t')
        pCurrent++;

      Index = 0;                   //声明一个字符数组 Buffer 用于存储键值的字符。进入循环,将字符逐个读取到 Buffer 中,直到遇到换行符或回车符为止。
    while (*pCurrent != LF_CHAR && *pCurrent != CR_CHAR)  
        Buffer[Index++] = *pCurrent++;

    Buffer[Index] = 0;           //将 Buffer 最后一个字符设为 0,表示字符串的结束。

    *fData = atof((CONST CHAR*)Buffer); //使用 atof 函数将 Buffer 中的字符串转换为浮点数,并将结果存储在 fData 中。
    return TRUE;                 //返回 TRUE,表示成功获取配置文件中的值
}

BOOL GetProfileString(CHAR *pKeyName, CHAR *pReturned)
{
    if (!ProReady)
        return FALSE;

    SetupProfile();
    if (!pStart)
        return FALSE;

    pCurrent = pStart;
    *pReturned = '\0';

    if (!FindKey(pKeyName))
        return FALSE;

    pCurrent++;
    while (*pCurrent == ' ' ||  *pCurrent == '\t')
        pCurrent++;

    if (*pCurrent != '"')
        return FALSE;

    pCurrent++;
    while (*pCurrent != LF_CHAR && *pCurrent != CR_CHAR && *pCurrent != '"')
        *pReturned++ = *pCurrent++;   

    *pReturned = '\0';   
    return TRUE;
}

VOID *ProfileAddress(VOID)
{
    if (!ProReady)
        return (VOID *)0;

    SetupProfile();
    if (!pStart)
        return (VOID *)0;

    return (VOID *)pStart;
}

UINT ProfileLength(VOID)
{
    INT Length = 0;

    if (!ProReady)
        return Length;

    SetupProfile();
    if (!pStart)
        return Length;

    for (pCurrent = pStart; pCurrent < PROFILE_ADDR + PROFILE_MAX_LEN; pCurrent++)
    {
        if (*((UCHAR *)pCurrent) == 0xff || *((UCHAR *)pCurrent) == 0x0)
            break;

        if (strncmp(pCurrent, EndString, strlen(EndString)) == 0)
        {
            if (*(pCurrent - 1) == LF_CHAR || *(pCurrent - 1) == CR_CHAR)
            {
                Length += strlen(EndString);
                break;
            }
        }
        Length++;
    }
    return Length;
}

VOID ProfileList(VOID)
{
    INT Length;

    if (!ProReady)
        return;

    SetupProfile();
    if (!pStart)
        return;

    Length = ProfileLength();
    SendBuffer(pStart, Length);
    SendString("\r\n");
}

ProFile.h     。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

#ifndef PROFILE_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define PROFILE_H

/******************************************************************************
 *                                                                            *
 *        C O M P I L E R   D E F I N E D   I N C L U D E   F I L E S         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *            U S E R   D E F I N E D   I N C L U D E   F I L E S             *
 *                                                                            *
 ******************************************************************************/

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        G L O B A L   D E F I N E S                         *
 *                                                                            *
 ******************************************************************************/

//#define PROFILE_ADDR        (VOLATILE CHAR *)(FLASH_START_ADDR + 0x8000)
#if defined(N3290)
#define BOOT_FLASH_ADDR_END      (64*1024)
#define PROFILE_ADDR        (VOLATILE CHAR *)(FLASH_START_BUFFER_ADDR + 0x0000)
extern UINT ProfileBuffer[(2*8+32)*1024/4];
#else
#define PROFILE_ADDR        (VOLATILE CHAR *)(FLASH_START_ADDR + 0x4000)
#endif
#define PROFILE_MAX_LEN        0x7ff0


/******************************************************************************
 *                                                                            *
 *                 S T R U C T U R E   D E F I N I T I O N S                  *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *    G L O B A L   V A R I A B L E S   -   N O   I N I T I A L I Z E R S     *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *       G L O B A L   V A R I A B L E S   -   I N I T I A L I Z E R S        *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *                   F U N C T I O N   P R O T O T Y P E S                    *
 *                                                                            *
 ******************************************************************************/

VOID InitialProfile(VOID);
BOOL IsProfileReady(VOID);
ULONG GetProfileChecksum(VOID);
BOOL GetProfileInt(CHAR *, FLOAT *);
BOOL GetProfileString(CHAR *, CHAR *);
VOID *ProfileAddress(VOID);
UINT ProfileLength(VOID);
VOID ProfileList(VOID);

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值