📄 com_driver.c
字号:
/****************************************************************
* COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD *
****************************************************************/
/****************************************************************
* FileName: Com_driver.c
* version: 1.00
* Purpose:
* Authors: XiaJing 2006-3-15 16:11:13
* Notes: Can be used for A2000 project(Dual Mode:TD-SCDMA & GSM)
Be released as ComDvr_DM.dll
****************************************************************/
#include <visa.h>
#include "share.h"
#include <ansi_c.h>
#include <formatio.h>
#include <rs232.h>
#include <cvirte.h>
#include <userint.h>
#include <utility.h>
#include "main.h"
//#include "commandmsg.h"
#include "basic_type.h"
#include "amthead.h"
#include "CRC32CheckModc.h"
#include "Comm.h"
//#define TESTCODE_DEBUG 1
ShareMem *sharedata=NULL;
int Rs232;
int msgpanel;
unsigned char cmdbuf[AMT_COMMAND_BUF_LENGTH];
EnumErrorCode ComRw(void);
EnumErrorCode Com_Rd(double Wt);
void Com_init(void);
/*********************************************************
//函数名:ShareM
//功能:initialize share memory
//参数: ShareMem *structure,int panel
//返回值:无
//注释:
//遗留的问题:无
*********************************************************/
void DLLEXPORT ShareM(ShareMem *structure)
{
sharedata=structure;
}
/**********************************************************************
函数名: ComInfo
功能: Interface,通过串口与UE通信,控制UE
//
参数: int ComType:Command type,具体定义见Comm.h
参数: int comno:串口编号选择,有1和2两个值供选择
参数: int *data:需要从外部输入和输出的整型变量指针
参数: int *Buf:需要从外部输入和输出的char型变量指针
参数: EnumErrorCode *errinfo:需要从外部输入的整型变量指针,用于存放产生的错误代码
//
返回值: 无
注释:
遗留的问题:无
//
**************************************************************************/
void DLLEXPORT ComInfo(int ComType, int comno,int *data,char *Buf,EnumErrorCode *errinfo)
{
unsigned long int MsgLen;
int temp,i;
char str[100];
BOOL bTemp;
// EnumCommand CommType;
// EnumAtom DataType;
MAN_AMT_COMMAND CommType;
// MAN_AMT_ATOM DataType;
#ifdef TESTCODE_DEBUG
char Msg[300];
#endif
if(comno==1) Rs232=sharedata->handle_com1; ////select com port
else Rs232=sharedata->handle_com2;
switch (ComType) //command type
{
//Read Flash
//输入:data[0]: AMT_DATAADDR_ATOM, Flash address
// data[1]: AMT_DATALENGTH_ATOM, Data length
//输出:*Buf
// *errinfo
//备注:目前无用
case RDFLASH: ////FLASH 读命令
amt_set_commandtype(cmdbuf,AMT_READFLASH_CMD); ////set command type
amt_set_int(cmdbuf,AMT_DATAADDR_ATOM,data[0]); ////set command para 1(flash address)
amt_set_int(cmdbuf,AMT_DATALENGTH_ATOM,data[1]); ////set command para 2(data length)
//DataType=AMT_DATA_ATOM; ////set data type
for(i=0;i<3;i++) ////check if there is com error
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //success
}
if(*errinfo!=0) break; ////there is error
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_READFLASH_RSPCMD)
{
*errinfo=ComRspTypeErr; ////command type error
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
if(*errinfo!=0)break; ////there is error,break
MsgLen=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,0);
amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,MsgLen);
break;
//Write Flash
//输入:data[0]: AMT_DATAADDR_ATOM, Flash address
// data[1]: data length
// *Buf: data
//输出:*errinfo
//备注:目前无用
case WRFLASH: ////FLASH 写命令
amt_set_commandtype(cmdbuf,AMT_WRITEFLASH_CMD); ////set command type
amt_set_int(cmdbuf,AMT_DATAADDR_ATOM,data[0]); //para 1
//amt_set_int(cmdbuf,AMT_DATALENGTH_ATOM,data[1]);
amt_set_bytes(cmdbuf,AMT_DATA_ATOM,Buf,data[1]);//para 2
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_WRITEFLASH_RSPCMD) //
{
*errinfo=ComRspTypeErr; //command type wrong
break;
}
temp=amt_get_int(cmdbuf,AMT_DATALENGTH_ATOM); //get data length
if(temp!=data[1]) //write data length not equal written data length?
{
*errinfo=5; //set error no.
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//读取电池电压ADC值
//*Buf: NULL
//输出:*data(data[0])
// *errinfo
//备注:
case RDBATT: ////电池电压ADC值读取
amt_set_commandtype(cmdbuf,AMT_READ_BATTERY_CMD);
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_READ_BATTERY_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
if(*errinfo!=0) break;
*data=amt_get_int(cmdbuf,AMT_BATTERYVALUE_ATOM);
break;
//TX turn on
//输入:
//*data: data[0] TX Mode 1: 单码道单时隙TD-SCDMA信号
// 2: 单码道双时隙TD-SCDMA信号
// 3: 双码道单时隙TD-SCDMA信号
// 4: 双码道双时隙TD-SCDMA信号
// data[1] 扩频因子0: SF8
// 1: SF16
// data[2] Time Slot
// data[3] Channel No.:Frequency(MHz)*5
// data[4] Uppts 0: 不输出Uppts
// 1: 输出Uppts
// data[5] Power Level:Power(dBm)+120
//*Buf: NULL
//输出:*errinfo
//备注:
case TXON: ////开始发射命令
amt_set_commandtype(cmdbuf,AMT_STARTTX_CMD);
amt_set_int(cmdbuf,AMT_TXMODE_ATOM,data[0]); //
amt_set_int(cmdbuf,AMT_SF_ATOM,data[1]); //
amt_set_int(cmdbuf,AMT_TIMESLOT_ATOM,data[2]); //
amt_set_int(cmdbuf,AMT_POWER_ATOM,data[3]); //
amt_set_int(cmdbuf,AMT_FREQ_ATOM,data[4]); //
amt_set_bool(cmdbuf,AMT_UPPTS_ATOM,data[5]); //
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_STARTTX_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//TX turn off
//*data: NULL
//*Buf: NULL
//输入:无
//输出:*errinfo
//备注:本功能必须在TXON执行成功后方可使用
case TXSTOP: ////停止发射命令
amt_set_commandtype(cmdbuf,AMT_STOPTX_CMD);
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==-100) //测试线程退出
{
//sharedata->TestStop=0;
*errinfo=ComRw(); //
//sharedata->TestStop=1;
}
if(*errinfo==enNoneErr) break;
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_STOPTX_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//改变发射功率
//*Buf: NULL
//输入:*data(data[0]) Power Level:Power(dBm)+120
//输出:*errinfo
//备注:本功能必须在TXON执行成功后方可使用
case TXPWR: ////改变发射功率命令
amt_set_commandtype(cmdbuf,AMT_CHANGETXPOWER_CMD);
amt_set_int(cmdbuf,AMT_POWER_ATOM, data[0]); //para 1:transmit power
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_CHANGETXPOWER_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//改变发射频率
//*Buf: NULL
//输入:*data(data[0]) Channel No.:Frequency(MHz)*5
//输出:*errinfo
//备注:本功能必须在TXON执行成功后方可使用
case TXFREQ: ////改变发射频点命令
amt_set_commandtype(cmdbuf,AMT_CHANGETXFREQ_CMD);
amt_set_int(cmdbuf,AMT_FREQ_ATOM, data[0]); //para 1:transmit frequency
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_CHANGETXFREQ_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//进入接收状态
//*Buf: NULL
//输入:*data(data[0]) Channel No.:Frequency(MHz)*5
//输出:*errinfo
//备注:
case RXON: ////进入接收状态
amt_set_commandtype(cmdbuf,AMT_STARTRX_CMD);
amt_set_int(cmdbuf,AMT_FREQ_ATOM, data[0]); //DL channel no.
for(i=0;i<1;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo>-1) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_STARTRX_RSPCMD)
{
*errinfo=ComRspTypeErr;
#ifdef TESTCODE_DEBUG
memset(Msg,0,sizeof(Msg));
temp=(int)CommType;
sprintf(Msg,"Command Type is error!\n error Command type is %d\n",temp);
SetCtrlVal(msgpanel, TEXTPANEL_TEXTBOX, Msg);
#endif
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//退出接收状态
//*data: NULL
//*Buf: NULL
//输入:无
//输出:*errinfo
//备注:本功能必须在RXON执行成功后方可使用
case RXSTOP: ////退出接收状态
amt_set_commandtype(cmdbuf,AMT_STOPRX_CMD);
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==-100) ////测试线程退出
{
//sharedata->TestStop=0;
*errinfo=ComRw();
//sharedata->TestStop=1;
}
if(*errinfo==enNoneErr) break;
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_STOPRX_RSPCMD)
{
*errinfo=ComRspTypeErr; //
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
break;
//读取接收到的业务数据
//输入:*data: data[0] Time Slot(默认为4)
// data[1] Frame number,需要读取的帧数
// data[2] Power Level:Power(dBm)+110
//输出:*data: data[i*2+3]返回的每帧数据的帧号,i=0,1,...,data[1]-1
// data[i*2+4]返回的每帧数据的长度,i=0,1,...,data[1]-1
// *Buf: 读取到的业务数据,byte型
// *errinfo
//备注:本功能必须在RXON执行成功后方可使用
case RXDATA: ////传送译码过后的数据
//Com_init();
FlushInQ (Rs232); //Removes all characters from the input queue of the COM port
FlushOutQ (Rs232);
amt_set_commandtype(cmdbuf,AMT_RXDATA_CMD);
amt_set_int(cmdbuf,AMT_TIMESLOT_ATOM,data[0]); //时隙点
amt_set_int(cmdbuf,AMT_FRAMECOUNT_ATOM,data[1]); //帧数
amt_set_int(cmdbuf,AMT_POWER_ATOM,data[2]); //功率
for(i=0;i<3;i++)
{
*errinfo=ComRw(); //send command and read response
if(*errinfo==enNoneErr) break; //
}
if(*errinfo!=0) break;
CommType=amt_get_commandtype(cmdbuf); //get response command type
if(CommType!=AMT_RXDATA_RSPCMD)
{
*errinfo=ComRspTypeErr;
break;
}
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code
if(*errinfo!=0) break;
data[3]=amt_get_int(cmdbuf,AMT_FRAMEINDEX_ATOM); //帧号(索引号)
data[4]=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,0); //第一帧长度
amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,data[4]); //第一帧译码后的数据
if(data[1]>1) //接收不止1帧,
{
temp=data[1]; //帧数
MsgLen=data[4]; //长度
for(i=1;i<data[1];i++)
{
*errinfo=Com_Rd(5); //0.5更改
if(*errinfo==0)
{
CommType=amt_get_commandtype(cmdbuf); //get response command type
*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);
if(*errinfo==0)
{
data[i*2+3]=amt_get_int(cmdbuf,AMT_FRAMEINDEX_ATOM); //data[5] 桢号(索引号)
data[i*2+4]=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,0,0); //data[6] 数据长度
amt_get_bytes(cmdbuf,AMT_DATA_ATOM,&Buf[MsgLen],data[i*2+4]);//数据
MsgLen=MsgLen+data[i*2+4];
}
}
if(*errinfo!=0) temp=temp-1;
}
data[1]=temp; //data[1]:实际接收到的帧数
}
break;
//传送IQ的数据
//输入:*data: data[1] Power Level:Power(dBm)+110
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -