📄 config.c
字号:
/*
*****************************************************************************************************
*
* File name: config.c
*****************************************************************************************************
*/
#include "..\head\includes.h"
/*
*****************************************************************************************************
* 全局
*****************************************************************************************************
*/
unsigned char code *code pBaudRate[7] = {"1200","2400","4800","9600","19200","38400","57600"};
unsigned char code *code pHeartTime[9] = {"1","2","3","4","5","6","7","8","9"};
unsigned char code *code pDhcpMode[2] = {"手动配置模式", "自动指派模式"};
char code *code pComcBit[3] = {"None","Odd","Even"};
unsigned int code vBaudRate[7] = {1200,2400,4800,9600,19200,38400,57600};
unsigned int code vHeartTime[9] = {60,120,180,240,300,360,420,480,540};
_FLASH_DATA_UNION_ xdata ConfigReg;
unsigned char xdata *xdata ComparePtr=NULL;
unsigned char xdata PingIpStr[16];
unsigned char xdata ModelIdBak[ID_MAX_LEN+1];
unsigned char xdata ComcBit=0;
unsigned long xdata OnLineTime=0; //连续在线时间
unsigned int xdata SentHeartTime=0; //发送心跳包个数
unsigned char DHCPMode = 255; //大于0表示是DHCP模式,=0表示是手动分配模式
bit ModelStatu; //配置态OR运行态
/*
*****************************************************************************************************
* 函数说明,作为函数指针用
*****************************************************************************************************
*/
/*
*****************************************************************************************************
* 配置信息来源
*****************************************************************************************************
*/
#define END_CHAR_NUM 4
#define UART_COM 0 //串口配置时,只保存字符串,不对字符串解析成HEX,DEC,须重启才有效
#define HTTP_COM 1 //WEB配置时,只保存字符串,不对字符串解析成HEX,DEC 须重启才有效
#define READ_COM 2 //读出FALSH内容时对字符串的IP,MAC,PORT进行解析
#define REMOTE_COM 3 //远程配置时,只保存字符串,不对字符串解析成HEX,DEC 须重启才有效
char code EndChar[END_CHAR_NUM] ={'\r','&','\0','\r'}; //结束符
/*
*****************************************************************************************************
*FUNC: 这个配置表共被3个函数用到
*NOTE: 1:NetConfigInit() 用到前7个,因为保存在FALSH的信息是字符串,MCU初始化时须对其化为HEX或十进制数
2:ParseUartCmd() 全部用到 解析串口来的数据
3:ParseHttpCmd() 用到前7个 解析HTTP WEB 来的数据
*****************************************************************************************************
*/
typedef struct _config_item_
{
unsigned char *name;
unsigned char *string; //返回匹配的字符串
unsigned char start;
unsigned char (*exec_func)(unsigned char com); //函数指针 ,com信息来源
}_CONFIG_ITEM_;
#define UART_CONFIG_NUM 16 //UART配置共有16个
#define UART_QUERY_START 11 //查询命令从第11条开始
#define HTTP_CONFIG_NUM 11 //HTTP配置只有前11
_CONFIG_ITEM_ code ConfigTable[UART_CONFIG_NUM] =
{
"本地网卡设置:\0" , "WP-LOCALMAC=" , 12 ,(unsigned char*)Set_Local_Mac,
"本地IP设置:\0" , "WP-LOCALIP=" , 11 ,(unsigned char*)Set_Local_Ip,
"服务器IP设置:\0" , "WP-SEVERIP=" , 11 ,(unsigned char*)Set_Sever_Ip,
"服务器端口设置:\0" , "WP-SEVERPORT=" , 13 ,(unsigned char*)Set_Sever_Port,
"网关IP设置:\0" , "WP-GATEWAYIP=" , 13 ,(unsigned char*)Set_Gateway_Ip,
"子网掩码设置:\0" , "WP-MASKIP=" , 10 ,(unsigned char*)Set_Mask_Ip,
"模块ID设置:\0" , "WP-ID=" , 6 ,(unsigned char*)Set_Model_Id,
"波特率设置\0:" , "WP-BAUD=" , 8 ,(unsigned char*)Set_BaudRate,
"心跳包时间(分钟):\0", "WP-OHRT=" , 8 ,(unsigned char*)Set_Heart_Time,
"IP分配模式:\0" , "WP-DHCP=" , 8 ,(unsigned char*)Set_Dhcp_Mode,
"校验位设置:\0" , "WP-COMC=" , 8 ,(unsigned char*)Set_Comc ,
"PING IP设置:\0" , "WP-PINGIP=" , 10 ,(unsigned char*)Set_Ping_Ip ,
"日志查询:\0" , "WP-LOG" , 0 ,(unsigned char*)Query_Log ,
"查询网络配置:\0" , "WP-LIST" , 0 ,(unsigned char*)Query_Net_Config ,
"" , "WP-DEFAULT" , 0 ,(unsigned char*)Config_Default, //恢复出厂值并重启:
"" , "WP-RESET" , 0 ,(unsigned char*)Mcu_Restart //模块复位重启:
};
/*
*****************************************************************************************************
* 函数说明,作为函数指针用
*****************************************************************************************************
*/
#define CONFIG_PARSE_NUM 11 //存EEPROM参数共10个
#define READ_PARSE_NUM 6 //需要解析的有几个,IP及端口号及MAC,就是要把
#define ID_LOCALMAC 0
#define ID_LOCALIP 1
#define ID_SEVERIP 2
#define ID_SEVERPORT 3
#define ID_GETWAYIP 4
#define ID_MASKIP 5
#define ID_MODELID 6 //不须要转换
#define ID_BAUDRATE 7 //不须要转换
#define ID_HEARTTIME 8 //不须要转换
#define ID_DHCPMODE 9 //不须要转换
#define ID_COMC 10 //不须要转换
#define ID_PINGIP CONFIG_PARSE_NUM
#define ID_NETSTATU 12
#define ID_NETCONFIG 13
unsigned char xdata *xdata ConfigRegPtr[CONFIG_PARSE_NUM]= //用来拷贝配置来的字符串信息
{
ConfigReg.reg.LocalMacStr, //本地网卡地址
ConfigReg.reg.LocalIpStr, //本地IP
ConfigReg.reg.SeverIpStr, //服务器IP
ConfigReg.reg.SeverPortStr, //服务器端口
ConfigReg.reg.GetwayIpStr, //网关IP
ConfigReg.reg.MaskIpStr , //子网掩码
ConfigReg.reg.ModelIdStr, //ID 号
ConfigReg.reg.BautRateStr, //波特率
ConfigReg.reg.HeartTimeStr, //心跳包间隔时间
ConfigReg.reg.DhcpModeStr, //DHCP模式是否开启
ConfigReg.reg.WPCOMC //串口校验位
};
/*
*****************************************************************************************************
*FUNC: 参数出厂值
*NOTE:
*****************************************************************************************************
*/
void ParameterInit(unsigned char type) reentrant
{
sprintf(ConfigReg.reg.LocalIpStr, "192.168.0.99\0");
sprintf(ConfigReg.reg.SeverIpStr, "192.168.0.244\0");
sprintf(ConfigReg.reg.SeverPortStr,"8601\0");
sprintf(ConfigReg.reg.GetwayIpStr, "192.168.0.254\0");
sprintf(ConfigReg.reg.MaskIpStr, "255.255.255.0\0");
sprintf(ConfigReg.reg.ModelIdStr, "90201234\0");
sprintf(ConfigReg.reg.BautRateStr, "4\0"); //9600
sprintf(ConfigReg.reg.HeartTimeStr,"2\0"); //2分钟
sprintf(ConfigReg.reg.WPCOMC,"0"); //0: 配置传输校验位,=0为无,=1为奇,=2为偶 */
if (type == 1) { //本地配置软件出厂值重起,不改变MAC地址
sprintf(ConfigReg.reg.DhcpModeStr, "1\0");
} else if (type == 20) { //利用IO控制参数恢复出厂值时,IP为手动分配,不改变网卡地址
sprintf(ConfigReg.reg.DhcpModeStr, "0\0");
} else { //初次写FLASH,默认开启自动分配,要改变网卡地址
sprintf(ConfigReg.reg.DhcpModeStr, "1\0");
sprintf(ConfigReg.reg.LocalMacStr, "00ABCDEF0001\0");
}
}
/*
*****************************************************************************************************
*FUNC: 配置初始化, 存在FALSH的是字符串信息,初始化时要化为相应的HEX或十进制数
*NOTE: 1:先读出FALSH内容,判断FirstRun是否被修改,
2:已修改说明已配置过,对读出的字符串配置信息化为相应的HEX或十进制数
3:如果FirstRun未被修改,说明是第一次读FALSH,先要进行参数出厂值
*****************************************************************************************************
*/
#define FIRST_RUN_VALUE 101
void NetConfigInit(void)reentrant
{
unsigned char i;
unsigned char writeflag=0;
ReadFlash(ConfigReg.bytes,FLASH_DATA_NUM); //读出各字符串信息
if (ConfigReg.reg.FirstRun != FIRST_RUN_VALUE) { //是不是第一次
ConfigReg.reg.FirstRun = FIRST_RUN_VALUE; //是第一次
ParameterInit(0); //参数初始化
writeflag=10;
}
for (i=0; i<READ_PARSE_NUM; i++) { //解析须要解析的几个参数IP,MAC,PORT
ComparePtr = ConfigRegPtr[i];
if (ConfigTable[i].exec_func) {
(*(ConfigTable[i].exec_func))(READ_COM);
}
}
// 将IP,MAC,PORT,各信息化为HEX或十进制数 但波特率及心跳包间隔时间,ID不被转换,因为这几个只用到字符串型
if ((ConfigReg.reg.BautRateStr[0] < '1') || (ConfigReg.reg.BautRateStr[0] > '7')) {
ConfigReg.reg.BautRateStr[0] = '4'; //1:1200 2:2400 3:4800 4:9600 5:19200,6:38400,7:57600 默认9600
ConfigReg.reg.BautRateStr[1] = 0;
writeflag=10;
}
if ((ConfigReg.reg.HeartTimeStr[0] < '1') || (ConfigReg.reg.HeartTimeStr[0] > '9')) {
ConfigReg.reg.HeartTimeStr[0] = '2'; //1:1MIN 2:2MIN 3:3MIN 4:4MIN 5:MIN 默认2MIN
ConfigReg.reg.HeartTimeStr[1] = 0;
writeflag=10;
}
if ((ConfigReg.reg.WPCOMC[0] != '0') && (ConfigReg.reg.WPCOMC[0] != '1')
&& (ConfigReg.reg.WPCOMC[0] != '2')) {
ConfigReg.reg.WPCOMC[0] = '0'; // 0: NONE 1:OLD 2:EVEN
ConfigReg.reg.WPCOMC[1] = 0;
writeflag=10;
}
ComcBit = ConfigReg.reg.WPCOMC[0];
if (ConfigReg.reg.DhcpModeStr[0] != '0') { //说明DHCP自动指派是开启状态
DHCPMode = 1;
} else {
DHCPMode = 0; //DHCP关闭状态不需要做DHCP请求bBound为已连成功
bBound = TRUE;
}
HeartTimeOutBak = vHeartTime[ConfigReg.reg.HeartTimeStr[0]-0x31]-3; //减去3S误差
for (i=0; i<ID_MAX_LEN; i++) {
ModelIdBak[i] = ConfigReg.reg.ModelIdStr[i]; //取模块ID,保证设置参数后只有重起后数据才有效
}
ModelIdBak[ID_MAX_LEN] = 0;
if (writeflag > 0) {
WriteFlash(ConfigReg.bytes,FLASH_DATA_NUM); //有非法数据及第一次配置须重写入到FALSH
}
}
/*
*****************************************************************************************************
*FUNC: 参数出厂值
*NOTE:
*****************************************************************************************************
*/
#define DEFAULT_PIN_SEC 5000 //常低电平5秒恢复出厂值,IP为手动分配模式
void DefaultPin(void)
{
static unsigned int xdata count=0; //如果该脚为低电平,10mS累加一次
if (DEFAULT_PIN == 0) {
if ((++count % 10) == 0) { //运行灯闪烁频繁
RUN_LED =~RUN_LED;
}
if (count >= (DEFAULT_PIN_SEC/10)) {
LED(CONNECT_LED,ON);
HintMsg(14,NULL); //提示恢复出厂值
ParameterInit(20); //参数初始化
ConfigReg.reg.FirstRun = FIRST_RUN_VALUE; //下次上电按这次的出厂值运行
McuRst(SAVE_EXIT);
}
} else {
count = 0;
}
}
/*
*****************************************************************************************************
* 根据ACKCODE取出相应的ACK提示信息 配置ACK类形
*****************************************************************************************************
*/
#define CONFIG_ACK_NUM 9
char code *code ConfigAckMsg[CONFIG_ACK_NUM]=
{
"值为空不修改\0" ,
"成功\0" ,
"值错误,失败\0" ,
"长度错误,失败\0" ,
"提交失败\0" ,
"用户名错误\0" ,
"密码错误\0" ,
"该参数不可修改\0",
"配置来源错误\0"
};
void OutAckMsg(unsigned char ack, unsigned char code *name,unsigned char com)
{
unsigned char xdata pack[100];
unsigned char length=0;
unsigned char *ptr;
if (ack > (CONFIG_ACK_NUM-1)) {
ack = CONFIG_ACK_NUM-1;
}
if (com == UART_COM) { //串口回显提示
Uart0Putf("\r\n");
Uart0Putf(name);
Uart0Putf(ConfigAckMsg[ack]);
Uart0Putf("\r\n");
} else if (com == REMOTE_COM) { //远程回显提示
ptr = name ;
while (*ptr) {
pack[length++] = *ptr++;
}
ptr = ConfigAckMsg[ack] ;
while (*ptr) {
pack[length++] = *ptr++;
}
FramePush(pack,length);
}
}
/*
*****************************************************************************************************
*FUNC:
*NOTE:
*****************************************************************************************************
*/
bit Parse_Length(unsigned char xdata *buf,unsigned char max_length,unsigned char endchar,unsigned char *len)
{
unsigned char i;
for (i=0; i<(max_length+1); i++) {
if (*(buf+i) == endchar){
*len = i; //返回长度
return TRUE;
}
}
return FALSE;
}
/*
*****************************************************************************************************
*FUNC:
*NOTE:
*****************************************************************************************************
*/
#define PARSE_OTHER_TYPE 0
#define PARSE_IP_TYPE 1
#define PARSE_MAC_TYPE 5
bit Parse_Value(unsigned char xdata *buf,unsigned char length,unsigned char parse_type,unsigned char *dot)
{
unsigned char i;
for (i=0; i<length; i++) {
if (parse_type == PARSE_IP_TYPE) { //ip可以有个'.'
if (((*(buf+i) < '0') || (*(buf+i) > '9')) && (*(buf+i) != '.')) {
return FALSE;
} else if (*(buf+i) == '.') {
*dot+=1; //统计'.'个数,IP大于3个'.'说明值错误
}
} else if (parse_type == PARSE_MAC_TYPE) { //可以有A-F,a-f,0-9
if ( (*(buf+i) < '0') || ((*(buf+i) > '9') && (*(buf+i) < 'A')) ||
(*(buf+i) > 'f') || ((*(buf+i) > 'F') && (*(buf+i) < 'a')) ) {
return FALSE;
}
} else {
if ((*(buf+i) < '0') || (*(buf+i) > '9')) {
return FALSE;
}
}
}
return TRUE;
}
/*
*****************************************************************************************************
*FUNC:
*NOTE:
;
*****************************************************************************************************
*/
unsigned char Copy_Config_Data(unsigned char com,unsigned char id,unsigned char length)reentrant
{
unsigned char i;
//拷贝数据到缓冲,准备存入FALSH
if (id < CONFIG_PARSE_NUM) {
for (i=0; i<length; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -