📄 portdirection.c
字号:
ptr->basisInfo.serialNum[1] = *(&ptrSetCmd->cmdFirstData+1);
ptr->basisInfo.serialNum[2] = *(&ptrSetCmd->cmdFirstData+2);
break;
case SET_LONGITUDE: //经度
ptr->basisInfo.longitude[0] = *(&ptrSetCmd->cmdFirstData+0);
ptr->basisInfo.longitude[1] = *(&ptrSetCmd->cmdFirstData+1);
ptr->basisInfo.longitude[2] = *(&ptrSetCmd->cmdFirstData+2);
break;
case SET_DEIMENSIONALITY: //维度
ptr->basisInfo.dimensionality[0] = *(&ptrSetCmd->cmdFirstData+0);
ptr->basisInfo.dimensionality[1] = *(&ptrSetCmd->cmdFirstData+1);
ptr->basisInfo.dimensionality[2] = *(&ptrSetCmd->cmdFirstData+2);
break;
case SET_RFSW: //射频开关
if(0x01==ptrSetCmd->cmdFirstData)
{
ptr->sycInfo.state[0]|=0x01;
}
else
{
ptr->sycInfo.state[0]&=0xfe;
}
break;
case SET_UPATT: //上行衰减
ptr->sycInfo.rauUpAtt = ptrSetCmd->cmdFirstData;
break;
case SET_DWATT: //下行衰减
ptr->sycInfo.rauDwAtt = ptrSetCmd->cmdFirstData;
break;
case SET_UPALC: //上行alc
ptr->sycInfo.rauUpAlc = ptrSetCmd->cmdFirstData;
break;
case SET_DWALC: //下行alc
ptr->sycInfo.rauDwAlc = ptrSetCmd->cmdFirstData;
break;
case SET_DWGAIN: //下行增益
//没有
break;
case SET_SLOT: //时隙比
ptr->sycInfo.slotSet = ptrSetCmd->cmdFirstData;
break;
default:
break;
}
cnt += ptrSetCmd->len;
}
}
///////////////////////
//消息压入队列
//cmd 消息头指针
//len 消息长度
//cnt 重发次数
//全局变量 setCmdBuf
void pushInfoToQueue(uint8 *cmd, uint8 len, uint8 cnt)
{
/*
OSSchedLock();
setCmdBuf.setCmd[setCmdBuf.wrPtr].sendCnt=cnt;
myDatGroup(0x00, setCmdBuf.setCmd[setCmdBuf.wrPtr].buf, cmd, len);
if(++setCmdBuf.wrPtr>=SET_CMD_LEN)
setCmdBuf.wrPtr=0;
OSSchedUnlock();
*/
myDatGroup(0x00, cmdBuf[cmdBufCnt], cmd, len);
OSQPost(setCmdMsgQueue, (void *)cmdBuf[cmdBufCnt]);
if(++cmdBufCnt>=CMD_BUF_LEN)
cmdBufCnt=0;
}
/////////////////////////////
//南向设置命令解析
//cmd 内部协议层头指针
//datLen 内部协议的长度(从地址到数据)
//返回 0-返回设置不成功
// 1-返回成功
// 3-等待返回
// 4-不需要返回
#define SET_ACK_ERR 4
#define SET_ACK_OK 1
#define SET_ACK_WAIT 2
#define SET_ACK_NULL 3
uint8 southSetCmdDisposal(uint8 *cmd, int16 datLen)
{
uint8 addr, addr_1, addr_0, flag=0;
//int16 n=0;
MY_PROTOCAL *ptrMyProtocal;
DEVICE_INFO *ptrDevice;
SET_CMD * ptrSetCmd;
ptrMyProtocal = (MY_PROTOCAL *)(cmd);
addr_0 = checkAddr(ptrMyProtocal->addr, deviceLevel);
if(deviceAddr== addr_0)
{//本机地址
if(STA_SET == ptrMyProtocal->state)
{//设置命令
addr = checkAddr(ptrMyProtocal->addr, deviceLevel+1);
addr_1 = checkAddr(ptrMyProtocal->addr, deviceLevel+2);
if(0==addr)
{//设置本机基本信息
ptrSetCmd = (SET_CMD * )&ptrMyProtocal->firstData;
if(0x39!=ptrSetCmd->cmd) //0x39是设置地址
{
ptrDevice = &expandDevice.expandInfo;
setPro(ptrDevice, &ptrMyProtocal->firstData, datLen-4); //去掉地址和命令
flag=SET_ACK_OK; //发送应答
}
}
else if(addr>0 && addr<9)
{//设置下属设备
if(0x01==expandDevice.devicePort[addr-1].portCheckEnable)
{//检查此端口有无设备
if(0==addr_1)
{//设置下属
ptrDevice = &expandDevice.devicePort[addr-1].mainDevice;
if(ptrDevice->flag && 0x00==(ptrDevice->sycInfo.state[1]&0x06))
{//设备是否在线和是否离线
setPro(ptrDevice, &ptrMyProtocal->firstData, datLen-4); //把数据保存
//2008-07-03 add, 往下转发时,去掉本机地址
setAddr(&ptrMyProtocal->addr[0], deviceLevel, 0);
pushInfoToQueue(&ptrMyProtocal->addr[0], datLen, 3);
flag = SET_ACK_WAIT;
}
else
{
flag = SET_ACK_ERR;
}
}
else if(addr_1>0 && addr_1<9)
{//设置下属的下属的某一个
ptrDevice = &expandDevice.devicePort[addr-1].slaveDevice[addr_1-1];
if(ptrDevice->flag && 0x00==(ptrDevice->sycInfo.state[1]&0x06))
{
setPro(ptrDevice, &ptrMyProtocal->firstData, datLen-4);
//2008-07-03 add
setAddr(&ptrMyProtocal->addr[0], deviceLevel, 0);
pushInfoToQueue(&ptrMyProtocal->addr[0], datLen, 3);
flag = SET_ACK_WAIT;
}
else
{
flag = SET_ACK_ERR;
}
}
else
{//地址不对,不应答
flag = 0;
}
}
else
{//端口无设备,回答错误
flag = SET_ACK_ERR;
}
}
else
{//地址不对不应答
flag = 0;
}
}
}
else if(0xff==ptrMyProtocal->addr[0] && 0xff==ptrMyProtocal->addr[1])
//&& 0xff==ptrMyProtocal->addr[2])
{//广播
//2008-07-03 add, 防止设置地址被向下广播, 增加判断条件
ptrSetCmd = (SET_CMD * )&ptrMyProtocal->firstData;
if(0x39!=ptrSetCmd->cmd) //0x39是设置地址
{
pushInfoToQueue(&ptrMyProtocal->addr[0], datLen, 3);
}
flag = SET_ACK_NULL;
}
else
{
flag = 0;
}
return(flag);
}
////////////////////////////////////////////////////////////////////////////
//协议解析(解析内部协议)南向
//参数:
//type 接口类型(串口,RS485等)
//recapa 内部协议数据的头指针******************************************重点
//data_count 内部协议数据长度**********************************************重点
//返回: 0x55-操作本机的数据(需要向上发数)
//全局变量:
/*
static uint8 buf[1424];
static uint8 txBuf[1424];
INT8S protocolDisposalSouth(UART_HANDLER type ,INT8U *recapa , INT32U data_count)
{
uint16 cnt=0;
struct TS* ptrTS;
MY_PROTOCAL *ptrMyProtocal;
uint8 flag=0xaa;
uint8 waitCnt=0;
void * msg;
ptrMyProtocal = (MY_PROTOCAL *)(recapa);
debugInfo.recSouthDatCnt++;
if(STA_SYC==ptrMyProtocal->state)
{//同步
//if(deviceAddr==checkAddr(ptrMyProtocal->addr, deviceLevel))
//{//检查本机地址
// debugInfo.recSouthSycCnt++;
// cnt = ackSycDataGroup(buf);
// cnt = myDatGroup(0x00, txBuf, buf, cnt);
// WriteCom(type, txBuf, cnt, 200);
// flag=0x55;
//}
}
else if(STA_QUERY==ptrMyProtocal->state)
{//查询
if(deviceAddr==checkAddr(ptrMyProtocal->addr, deviceLevel))
{//检查是否本机地址
debugInfo.recSouthBasCnt++;
expandDevice.expandInfo.sycInfo.state[1] &= ~0x80; //清除配置变更标志
cnt = ackQueryDataGroup(buf);
cnt = myDatGroup(0x00, txBuf, buf, cnt);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
}
else if(STA_SET==ptrMyProtocal->state)
{//设置
flag = southSetCmdDisposal(&ptrMyProtocal->addr[0], data_count);
if(SET_ACK_OK==flag)
{//设置本机,成功应答
cnt = myDatGroup(0x00, txBuf, recapa, 4);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
else if(SET_ACK_ERR==flag)
{
recapa[3] |= 0x80; //错误标志
cnt = myDatGroup(0x00, txBuf, recapa, 4);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
else if(SET_ACK_WAIT==flag)
{
OSQFlush(upSendSetAckMsgQueue);
for(waitCnt=0; waitCnt<80; waitCnt++)
{
OSTimeDly(OS_TICKS_PER_SEC/10); //等待应答就延时一段时间
msg = OSQAccept(upSendSetAckMsgQueue);
if((void*)0 != msg)
{
ptrTS = (struct TS*)msg;
WriteCom(type, (uint8*)msg, ptrTS->datLen[0]+(ptrTS->datLen[1]<<8)+10, 200);
flag=0x55;
break;
}
}
}
else
{
;
}
SaveAllParameter();
}
else if(0xa0==ptrMyProtocal->state && 1==localEnable)
{//看门狗
if(0x01==ptrMyProtocal->firstData)
{//开看门狗
//wdEnable = 1;
//InitHartWdt();
}
else
{//关看门狗
wdEnable = 0;
DisableHartWdt();
}
SaveAllParameter();
cnt = myDatGroup(0x00, txBuf, recapa, 4);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
else if(0xa1==ptrMyProtocal->state && 1==localEnable)
{//设置延时参数
if(0x01<ptrMyProtocal->firstData)
{
WriteFram(0x000b,(INT8U *)(&ptrMyProtocal->firstData), 1);
cnt = myDatGroup(0x00, txBuf, recapa, 4);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
}
else if(0xa2==ptrMyProtocal->state && 1==localEnable)
{//设置端口电源
uint8 temp;
temp = (ptrMyProtocal->firstData>>4)&0x0f;
if(temp>0 && temp<9)
{
if(ptrMyProtocal->firstData&0x01)
{
powerAlarmState[temp-1].controlEnable = 1;
}
else
{
powerAlarmState[temp-1].controlEnable = 0;
}
cnt = myDatGroup(0x00, txBuf, recapa, 4);
WriteCom(type, txBuf, cnt, 200);
flag=0x55;
}
}
return(flag);
}*/
//检查配置变更上报
void checkChange(uint8 * desPtr, uint8 * srcPtr)
{
uint8 cnt=0, flag=0;
for(cnt=0; cnt<3; cnt++)
{
if(desPtr[cnt+4] != desPtr[cnt+4])
{
flag = 1;
}
}
if(1==flag)
{
expandDevice.expandInfo.sycInfo.state[1] |= 0x80; //本机配置变更
}
}
/*******************************************************************************************************
** 函数名称: INT32U GetSouthingData(void
** 功能描述: 读取南向接口返回数据
** 输 入: 无
** 输 出: 0---没有读取到数据
>0---读取到数据的字节数
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年12月21日
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GetData(UART_HANDLER uart, uint8 *buf)
{
INT32S recchar = 0;
uint8 cnt=0, loopcount=0, rec_count=0;
while(1)
{
recchar = uartgetc(uart);
if(recchar == -1)
{
OSTimeDly(1);
if(loopcount++>10)
{
break;
}
}
else
{
buf[rec_count++] = (uint8)recchar;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -