/******************************************************************************
* *
* 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