711 lines
31 KiB
C
711 lines
31 KiB
C
#include "usercmd.h"
|
||
#include "flash.h"
|
||
#include "usart.h"
|
||
#include "sysport.h"
|
||
#include "user_tcp.h"
|
||
#include "userapp.h"
|
||
#include "logflash.h"
|
||
#include "key.h"
|
||
|
||
/******************************************************************************
|
||
*供外部使用的常变量定义
|
||
*******************************************************************************/
|
||
FrameQueue_s sUsercmdQueue ; //定义帧环形缓冲区,用于存放用户配置命令
|
||
|
||
/*用来保存FLASH内的配置信息*/
|
||
IAPFlash_u uIapFlash ; //定义IAPFlash_u共用体变量
|
||
APPFlash_u uAppFlash ; //定义APPFlash_u共用体变量
|
||
|
||
/*命令处理异常*/
|
||
char *noCmdErr = "命令不支持" ;
|
||
char *paramErr = "参数不合法!" ;
|
||
char *formErr = "命令格式错误!" ;
|
||
|
||
/*********************************************************************************************************************
|
||
* 名 称:void InitIapFlashConfig( IAPFlash_u *config )
|
||
* 功 能:先从FLASH读出IAPFlash信息,然后对IAPFlash_u类型的全局变量初始化,最终再写入FLASH中
|
||
* 说 明:读取RunAppNum,更新FLASH中的RunAppNum标志位
|
||
*********************************************************************************************************************/
|
||
void InitIapFlashConfig( IAPFlash_u *config )
|
||
{
|
||
InitQueueMem(&sUsercmdQueue) ; //初始化用于存放用户配置命令的环形缓冲区sUsercmdQueue
|
||
Get_uIapFlash(config) ; //从FLASH中读取IAP信息到共用体变量uIapFlash中
|
||
config->sIapFlash.Head = '[' ; //帧头初始化
|
||
config->sIapFlash.IapFlag = 0x30 ; //升级标志位初始化
|
||
#if defined APP0_CODE
|
||
config->sIapFlash.RunAppNum =0x30 ; //当前APP为APP0
|
||
strcpy((char*)config->sIapFlash.BootVers, "No Boot") ;
|
||
#elif defined APP1_CODE
|
||
config->sIapFlash.RunAppNum =0x31 ; //当前APP为APP1
|
||
#elif defined APP2_CODE
|
||
config->sIapFlash.RunAppNum =0x32 ; //当前APP为APP2
|
||
#elif defined APP3_CODE
|
||
config->sIapFlash.RunAppNum =0x33 ; //当前APP为APP3
|
||
#endif
|
||
config->sIapFlash.JumpResult = 0x31 ; //系统从boot跳转到APP成功,将JumpResult位设置为true并写入FLASH。//如果BOOT启动判断该为为false,则判定APP有问题,直接运行应急程序APP1
|
||
if((uint8_t)config->sIapFlash.FtpFolder[0] == 0xFF ) /*未配置过FtpFolder*/
|
||
{
|
||
memset( config->sIapFlash.FtpFolder, 0, FOLDER_MAXLEN) ;
|
||
strcpy( config->sIapFlash.FtpFolder, "/ABM") ; //如果未配置FtpFolder,则将默认路径设置为‘/ABM‘
|
||
}
|
||
if( (uint8_t)config->sIapFlash.FtpUsername[0] == 0xFF ) /*FLASH中存储ftp用户名的字段有效*/
|
||
{
|
||
memset( config->sIapFlash.FtpUsername, 0, USERNAME_MAXLEN) ;
|
||
strcpy( config->sIapFlash.FtpUsername, "ABM") ; //如果未配置FtpUsername,则将FTP默认用户名设置为‘ABM‘
|
||
}
|
||
if( (uint8_t)config->sIapFlash.FtpPassword[0] == 0xFF ) /*FLASH中存储ftp用户名密码的字段无效*/
|
||
{
|
||
memset( config->sIapFlash.FtpPassword, 0, PASSWORD_MAXLEN) ;
|
||
strcpy( config->sIapFlash.FtpPassword, "Shop344794749") ; //如果未配置FtpUsername,则将FTP默认用户名密码设置为‘Shop344794749
|
||
}
|
||
if( (uint8_t)config->sIapFlash.FtpIP[0] == 0xFF ) /*FLASH中存储FtpIP字段无效*/
|
||
{
|
||
memset( config->sIapFlash.FtpIP, 0, MAX_IP_LEN) ;
|
||
strcpy( config->sIapFlash.FtpIP, "121.5.217.252") ; //如果未配置FtpIP,则将FTP服务器IP设置为"121.5.217.252"
|
||
}
|
||
if( ((uint8_t)config->sIapFlash.TcpIP[0] == 0xFF) ||
|
||
((uint8_t)config->sIapFlash.TcpIP[0] == 0x00)) /*FLASH中存储FtpIP字段无效*/
|
||
{
|
||
memset( config->sIapFlash.TcpIP, 0, MAX_IP_LEN) ;
|
||
strcpy( config->sIapFlash.TcpIP, TCP_CONNECTID0_SERVERIP0) ;//如果未配置FtpIP,则将FTP服务器IP设置为TCP_CONNECTID0_SERVERIP0
|
||
}
|
||
else /*FLASH中存储FtpIP字段有效,将s_Channal0缺省IP修改为配置IP*/
|
||
{
|
||
SetAppTcpIP(&sChannal0, uIapFlash.sIapFlash.TcpIP ) ; //更新TCP服务器的IP
|
||
}
|
||
if( ((uint8_t)config->sIapFlash.TcpPort[0] == 0xFF) ||
|
||
((uint8_t)config->sIapFlash.TcpPort[0] == 0x00) ) /*FLASH中存储FtpIP字段无效*/
|
||
{
|
||
memset( config->sIapFlash.TcpPort, 0, PORT_MAXLEN) ;
|
||
char port[PORT_MAXLEN] = {0} ;
|
||
itoa(TCP_CONNECTID0_SERVERPORT0, port, 10);
|
||
strcpy( config->sIapFlash.TcpPort, port) ; //如果未配置TcpPort,则将FTP服务器IP设置为TCP_CONNECTID0_SERVERPORT0
|
||
}
|
||
else
|
||
{
|
||
SetAppTcpPort(&sChannal0, uIapFlash.sIapFlash.TcpPort ) ; //更新TCP服务器的port
|
||
}
|
||
config->sIapFlash.Tail = ']' ; //帧尾初始化
|
||
Set_uIapFlash(config) ; //将初始化信息重新写入FLASH中
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: void Get_uIapFlash(IAPFlash_u *config)
|
||
* 功能说明: 从内部flash中IAPCONFIG_AREA_ADDR地址读取一页,获取FLASH中的IAP信息
|
||
* 入口参数:
|
||
* @param1 *uIapInfo IAPFlash_u共用体变量指针
|
||
**************************************************************************************************/
|
||
void Get_uIapFlash(IAPFlash_u *config)
|
||
{
|
||
memset( config->iapFlashBuffer , 0, IAPFLASHCONFIGLEN) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN) ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: void Set_uIapFlash(IAPFlash_u *config)
|
||
* 功能说明: 将新的IAP信息写入FLASH
|
||
* 入口参数:
|
||
* @param1 *uIapInfo IAPFlash_u共用体变量指针
|
||
**************************************************************************************************/
|
||
void Set_uIapFlash(IAPFlash_u *config)
|
||
{
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, config->iapFlashBuffer, IAPFLASHCONFIGLEN) ;
|
||
}
|
||
|
||
/*********************************************************************************************************************
|
||
* 名 称:void InitAppFlashConfig( APPFlash_u *config )
|
||
* 功 能:先从FLASH读出APPFlash信息,然后对APPFlash_u类型的全局变量初始化,最终再写入FLASH中
|
||
* 说 明:先读取FLASH中存储的配置信息,然后做校验,不合法的标志位全部初始化为默认值,最后再写入FLASH
|
||
*********************************************************************************************************************/
|
||
void InitAppFlashConfig( APPFlash_u *config )
|
||
{
|
||
Get_uAppFlash(config) ; //从FLASH中读取IAP信息到共用体变量uAppFlash中
|
||
|
||
Set_uAppFlash(config) ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: void Get_uIapFlash(APPFlash_u *config)
|
||
* 功能说明: 从内部flash中APPFLASHCONFIGLEN地址读取一页,获取FLASH中的APP信息
|
||
* 入口参数:
|
||
* @param1 *uIapInfo IAPFlash_u共用体变量指针
|
||
**************************************************************************************************/
|
||
void Get_uAppFlash(APPFlash_u *config)
|
||
{
|
||
memset( config->appFlashBuffer, 0, APPFLASHCONFIGLEN) ;
|
||
Read_Flash_Byte(APPCONFIG_AREA_ADDR, config->appFlashBuffer, APPFLASHCONFIGLEN ) ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: Set_uIapFlash(APPFlash_u *config)
|
||
* 功能说明: 将新的IAP信息写入FLASH
|
||
* 入口参数:
|
||
* @param1 *uIapInfo IAPFlash_u共用体变量指针
|
||
**************************************************************************************************/
|
||
void Set_uAppFlash(APPFlash_u *config)
|
||
{
|
||
Write_Flash_OnePage(APPCONFIG_AREA_ADDR, config->appFlashBuffer, APPFLASHCONFIGLEN) ;
|
||
}
|
||
|
||
/****************************************************************************
|
||
* 名 称:void Cmd_Process( char *cmdBuf, int bufLen )
|
||
* 功 能:对用户控制命令进行处理
|
||
* 入口参数:
|
||
* @param1 cmdBuf 指向控制命令的指针
|
||
* @param2 bufLen 控制命令数据的长度
|
||
* 说 明:对用户控制命令进行处理,实际就是响应命令动作并且将新的参数保存到对应的FLASH区域
|
||
* 格 式:(L0072MAC:31FFD405524E353728902251;10&CMD_RST$X)
|
||
****************************************************************************/
|
||
void Cmd_Process( char *cmdBuf, int bufLen )
|
||
{
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
char state ;
|
||
switch( psBuf->cmdCode[1] ) /*解析操作码第2字节*/
|
||
{
|
||
case 0x30: //重启指令
|
||
{
|
||
state = RestartCmdProcess( cmdBuf, bufLen ) ;
|
||
break ;
|
||
}
|
||
case 0x31: //Config指令
|
||
{
|
||
state = GetConfigCmdProcess( cmdBuf, bufLen ) ;
|
||
break ;
|
||
}
|
||
case 0x32: //IapFlag指令
|
||
{
|
||
state = IapFlagCmdProcess( cmdBuf, bufLen ) ;
|
||
break ;
|
||
}
|
||
case 0x33: //RunAppNum指令
|
||
{
|
||
state = RunAppNumCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x34: //FtpFolder指令
|
||
{
|
||
state = FtpFolderCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x35: //FtpUsername指令
|
||
{
|
||
state = FtpUsernameCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x36: //FtpPassword指令
|
||
{
|
||
state = FtpPasswordCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x37: //FtpIP指令
|
||
{
|
||
state = FtpIPCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x38: //TcpIP指令
|
||
{
|
||
state = TcpIPCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x39: //TcpIP指令
|
||
{
|
||
state = TcpPortCmdProcess( cmdBuf, bufLen) ;
|
||
break ;
|
||
}
|
||
case 0x40: //音量等级指令
|
||
{
|
||
state = VolumeRankCmdProcess() ;
|
||
break ;
|
||
}
|
||
default : //指令号不合法,不存在该指令
|
||
{
|
||
state = 'N' ;
|
||
break ;
|
||
}
|
||
}
|
||
if( state == 'P' ) //指令负载中参数不合法
|
||
{
|
||
CmdResponse( cmdBuf, paramErr) ;
|
||
}
|
||
else if(state == 'I') //指令格式错误
|
||
{
|
||
CmdResponse( cmdBuf, formErr) ;
|
||
}
|
||
else if(state == 'N')
|
||
{
|
||
CmdResponse( cmdBuf, noCmdErr) ;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char RestartCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“软重启”命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen 命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (L0072MAC:31FFD405524E353728902251;10&CMD_RST$X)
|
||
************************************************************************************************/
|
||
char RestartCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
if( kmp((&(psBuf->loadHead)+1), "CMD_RST") == 0 ) //LOAD:CMD_RST
|
||
{
|
||
state = 'S' ; //标志指令处理成功
|
||
CmdResponse( cmdBuf, "*SET* User control device restart!") ; //通过TCP上传命令处理回码
|
||
Wait_For_Nms(1*TICK_RATE_HZ) ; //等待1S
|
||
TcpDisconnetc() ;
|
||
Wait_For_Nms(1*TICK_RATE_HZ) ; //等待1S
|
||
EC20_CLOSE() ;
|
||
WriteLogToFlash("重启命令软重启!") ;
|
||
SystemSoftReset() ;
|
||
}
|
||
else
|
||
{
|
||
state = 'P' ; //指令参数不合法
|
||
}
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char GetConfigCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“GET_IAP”命令:获取存储在内部flash中IAPCONFIG_AREA_ADDR地址的IAP配置信息
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen 命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (L0072MAC:31FFD405524E353728902251;01&GET_IAP$X)
|
||
************************************************************************************************/
|
||
char GetConfigCmdProcess(char *cmdBuf, int bufLen)
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读uIapFlash配置
|
||
if( kmp((&(psBuf->loadHead)+1), "GET_IAP") == 0 ) //LOAD:GET_IAP
|
||
{
|
||
char *backBuf = portMalloc(512) ;
|
||
Query_AppVersion((char*)gateApp.appVers) ;
|
||
snprintf(backBuf, 512, "*GET* IapFlag:[%c]! RunAppNum:[APP%c]! JumpResult:[%c]! BootVers:[%s]! AppVers:[%s]! Csq:[%s]! Ec20Vol:[%s]! \
|
||
SimIccid:[%s]! FtpUsername:[%s]! FtpPassword:[%s]! FtpFolder:[%s]! FtpIP:[%s]! TcpIP:[%s]! TcpPort:[%s]!",
|
||
uIapFlash.sIapFlash.IapFlag, uIapFlash.sIapFlash.RunAppNum, uIapFlash.sIapFlash.JumpResult, uIapFlash.sIapFlash.BootVers, gateApp.appVers,\
|
||
sEc20Param.csq, sEc20Param.ec20Voltage, sEc20Param.simICCID, uIapFlash.sIapFlash.FtpUsername,uIapFlash.sIapFlash.FtpPassword,\
|
||
uIapFlash.sIapFlash.FtpFolder, uIapFlash.sIapFlash.FtpIP, uIapFlash.sIapFlash.TcpIP, uIapFlash.sIapFlash.TcpPort) ;
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
state = 'S' ; //指令执行成功
|
||
portFree(backBuf) ;
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char IapFlagCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“IapFlag”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (L0012MAC:31FFD405524E353728902251;12&1$X)
|
||
************************************************************************************************/
|
||
char IapFlagCmdProcess(char *cmdBuf, int bufLen)
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
int len = snprintf(backBuf, 256, "*GET* IapFlag:[%c]! ", uIapFlash.sIapFlash.IapFlag) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && (kmp(psBuf->loadLen, "001") == 0) ) //SET命令&&此命令负载长度为1字节
|
||
{
|
||
if( IS_IapFlag_ALL_PERIPH( *(&(psBuf->loadHead)+1)) ) //负载参数合法校验
|
||
{
|
||
uIapFlash.sIapFlash.IapFlag = *(&(psBuf->loadHead)+1) ; //改配置:将负载值赋值给uIapFlash.sIapFlash.IapFlag
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* IapFlag:[%c]!", uIapFlash.sIapFlash.IapFlag ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else
|
||
{
|
||
state = 'P' ; //指令负载中参数不合法
|
||
}
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && (kmp(psBuf->loadLen, "001") == 0) ) //GET命令&&此命令负载长度为1字节
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char RunAppNumCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“RunAppNum”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (L0012MAC:31FFD405524E353728902251;13&1$X)
|
||
************************************************************************************************/
|
||
char RunAppNumCmdProcess( char *cmdBuf, int bufLen )
|
||
{char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
Query_AppVersion((char*)gateApp.appVers) ;
|
||
int len = snprintf(backBuf, 256, "*GET* RunAppNum:[APP%c] ! *GET* AppVersion:[%s] !", uIapFlash.sIapFlash.RunAppNum, gateApp.appVers) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && (kmp(psBuf->loadLen, "001") == 0) ) //SET命令&&此命令负载长度为1字节
|
||
{
|
||
if( IS_RunAppNum_ALL_PERIPH( *(&(psBuf->loadHead)+1) ) ) //负载参数合法
|
||
{
|
||
uIapFlash.sIapFlash.RunAppNum = *(&(psBuf->loadHead)+1) ; //改配置
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* RunAppNum:[APP%c]重启后生效!", uIapFlash.sIapFlash.RunAppNum ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载参数不合法
|
||
{
|
||
state = 'P' ; //指令负载中参数不合法
|
||
}
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && (kmp(psBuf->loadLen, "001") == 0) ) //GET命令&&此命令负载长度为1字节
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char FtpFolderCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“FtpFolder”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (L0042MAC:31FFD405524E353728902251;14&/ftp$X)
|
||
************************************************************************************************/
|
||
char FtpFolderCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* FtpFolder:[%s]!", uIapFlash.sIapFlash.FtpFolder) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.FtpFolder, 0, FOLDER_MAXLEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.FtpFolder, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpFolder拷贝到uIapFlash.sIapFlash.FtpFolder中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* FtpFolder:[%s]!", uIapFlash.sIapFlash.FtpFolder ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char FtpUsernameCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“FtpUsername”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (c0032MAC:31FFD405524E353728902251;15&ABM$X)
|
||
************************************************************************************************/
|
||
char FtpUsernameCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* FtpUsername:[%s]!", uIapFlash.sIapFlash.FtpUsername) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.FtpUsername, 0, USERNAME_MAXLEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.FtpUsername, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpUsername拷贝到uIapFlash.sIapFlash.FtpUsername中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* FtpUsername:[%s]!", uIapFlash.sIapFlash.FtpUsername ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char FtpPasswordCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“FtpPassword”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (c0130MAC:35FFDC054D52323238780843;16&Shop344794749$X)
|
||
************************************************************************************************/
|
||
char FtpPasswordCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* FtpPassword:[%s]!", uIapFlash.sIapFlash.FtpPassword) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.FtpPassword, 0, PASSWORD_MAXLEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.FtpPassword, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpPassword拷贝到uIapFlash.sIapFlash.FtpPassword中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* FtpPassword:[%s]!", uIapFlash.sIapFlash.FtpPassword ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char FtpIPCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“FtpIP”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (c0120MAC:35FFDC054D52323238780843;17&121.5.217.252$X)
|
||
************************************************************************************************/
|
||
char FtpIPCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* FtpIP:[%s]!", uIapFlash.sIapFlash.FtpIP) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.FtpIP, 0, MAX_IP_LEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.FtpIP, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpIP拷贝到uIapFlash.sIapFlash.FtpIP中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* FtpIP:[%s]!", uIapFlash.sIapFlash.FtpIP ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char TcpIPCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“TcpIP”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (c0120MAC:35FFDC054D52323238780843;18&121.5.217.252$X)
|
||
************************************************************************************************/
|
||
char TcpIPCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* TcpIP:[%s]!", uIapFlash.sIapFlash.TcpIP) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.TcpIP, 0, MAX_IP_LEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.TcpIP, (&(psBuf->loadHead)+1), loadLen) ; //将新的TcpIP拷贝到uIapFlash.sIapFlash.TcpIP中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* TcpIP:[%s]!", uIapFlash.sIapFlash.TcpIP ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: char TcpPortCmdProcess( char *cmdBuf, int bufLen )
|
||
* 说 明: 解析“TcpPort”字段命令
|
||
* 入口参数:
|
||
* @param1 *cmdBuf: 命令数据帧指针
|
||
* @param2 bufLen:命令数据帧长度
|
||
* 出口参数:
|
||
* @param1 state: 指令处理结果‘S’:成功;‘P’:参数错误;‘I’:负载格式错误
|
||
* 数据帧格式: (c0040MAC:35FFDC054D52323238780843;19&7000$X)
|
||
************************************************************************************************/
|
||
char TcpPortCmdProcess( char *cmdBuf, int bufLen )
|
||
{
|
||
char state ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
|
||
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
|
||
char *backBuf = (char*)portMalloc(256) ;
|
||
|
||
int len = snprintf(backBuf, 256, "*GET* TcpPort:[%s]!", uIapFlash.sIapFlash.TcpPort) ;
|
||
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
|
||
{
|
||
memset(uIapFlash.sIapFlash.TcpPort, 0, MAX_IP_LEN ) ;
|
||
strncpy(uIapFlash.sIapFlash.TcpPort, (&(psBuf->loadHead)+1), loadLen) ; //将新的TcpPort拷贝到uIapFlash.sIapFlash.TcpPort中
|
||
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
|
||
snprintf((backBuf+len), 256-len, "*SET* TcpPort:[%s]!", uIapFlash.sIapFlash.TcpPort ) ;
|
||
state = 'S' ; //指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
|
||
{
|
||
state = 'S' ; //读指令执行成功
|
||
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
|
||
}
|
||
else //负载(负载长度)不合法
|
||
{
|
||
state = 'I' ; //指令负载中参数不合法
|
||
}
|
||
portFree(backBuf) ;
|
||
return state ;
|
||
}
|
||
|
||
char VolumeRankCmdProcess(void)
|
||
{
|
||
return 'S' ;
|
||
}
|
||
|
||
/**************************************************************************************************
|
||
* 名 称: RunResult CmdResponse(char *cmdBuf, char *format, ...)
|
||
* 说 明: 硬件回复收到的命令帧
|
||
* 入口参数:
|
||
* @param1 pCmdcode: 接收的命令类型
|
||
* @param2 char *format,... 可变参变量
|
||
* @param3 ... :可变参数
|
||
* 出口参数:
|
||
* @param1 status: RunResult枚举类型数据
|
||
* 数据帧格式:(R0193MAC:35FFDC054D52323238780843;00&*GET* IapFlag:[0]! $X)
|
||
* 注 意: 最大负载长度为:TCP_LOADBUF_MAXLEN
|
||
************************************************************************************************************/
|
||
RunResult CmdResponse(char *cmdBuf, char *backBuf)
|
||
{
|
||
RunResult status = RUNOK ;
|
||
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
|
||
static uint8_t counter = 0x30 ;
|
||
char *upDataBuf = (char*)portMalloc(TCP_LOADBUF_MAXLEN+sizeof(TcpFrame_S)+32) ; //分配内存长度为负载长度+TcpFrame_S结构体长度
|
||
TcpFrame_S *sTcpFrameData = (TcpFrame_S *)upDataBuf ; //tcp数据帧变量
|
||
int outLen = snprintf(&(sTcpFrameData->loadHead)+1 , TCP_LOADBUF_MAXLEN, "%s", backBuf ) ; //到此为止,所有的参数情况已经汇总到upDataBuf了
|
||
if((outLen<=0)||( outLen > TCP_LOADBUF_MAXLEN))
|
||
{
|
||
ErrorLogPrintf("%s,%d:upDataBuf spillover!",__FILE__, __LINE__) ;
|
||
portFree(upDataBuf) ;
|
||
return RUNERR ;
|
||
}
|
||
sTcpFrameData->head = '(' ;
|
||
sTcpFrameData->loadLen[0] = outLen/100 + 0x30;
|
||
sTcpFrameData->loadLen[1] = outLen%100/10 + 0x30 ;
|
||
sTcpFrameData->loadLen[2] = outLen%10 + 0x30;
|
||
sTcpFrameData->frameNum = counter ;
|
||
counter ++ ;
|
||
if( counter > 0x39 ) //防止counter字符数字溢出
|
||
{
|
||
counter = 0x30 ;
|
||
}
|
||
strncpy(sTcpFrameData->macHead, "MAC:", 4) ;
|
||
GetDeviceMacAddress(sTcpFrameData->macid, STRMACID) ;
|
||
sTcpFrameData->macTail = ';' ;
|
||
memcpy(sTcpFrameData->cmdCode, psBuf->cmdCode, 2) ;
|
||
sTcpFrameData->loadHead = '&' ;
|
||
|
||
if( psBuf->frameType == TCPCMDFRAME ) //TCP server下发的命令
|
||
{
|
||
sTcpFrameData->frameType = TCPCMDBACKFRAME ;
|
||
strncat(upDataBuf, "$X)", 3) ; //TcpFrame_S结构体的最后三个字节拼接到 upDataBuf尾部
|
||
if( RW_OK != InsertQueueMemData(&sTcp0Queue, upDataBuf, strlen(upDataBuf)))
|
||
{
|
||
ErrorLogPrintf("%s,%d:sTcp0Queue spillover!", __FILE__, __LINE__) ;
|
||
}
|
||
}
|
||
else //COM上位机发来的命令
|
||
{
|
||
sTcpFrameData->frameType = COMCMDBACKFRAME ;
|
||
strncat(upDataBuf, "$X)", 3) ; //TcpFrame_S结构体的最后三个字节拼接到 upDataBuf尾部
|
||
UARTx_SendData(UART_DEBUG, upDataBuf, strlen(upDataBuf)+1) ;
|
||
}
|
||
portFree(upDataBuf) ;
|
||
|
||
return (status) ;
|
||
}
|
||
|
||
|