⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portdirection.c

📁 基于ARM7的ucos-ii移动收发通信编程ADS开发源码
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -