?? 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);
/*********************************************************
//函數(shù)名:ShareM
//功能:initialize share memory
//參數(shù): ShareMem *structure,int panel
//返回值:無
//注釋:
//遺留的問題:無
*********************************************************/
void DLLEXPORT ShareM(ShareMem *structure)
{
sharedata=structure;
}
/**********************************************************************
函數(shù)名: ComInfo
功能: Interface,通過串口與UE通信,控制UE
//
參數(shù): int ComType:Command type,具體定義見Comm.h
參數(shù): int comno:串口編號選擇,有1和2兩個值供選擇
參數(shù): int *data:需要從外部輸入和輸出的整型變量指針
參數(shù): int *Buf:需要從外部輸入和輸出的char型變量指針
參數(shù): EnumErrorCode *errinfo:需要從外部輸入的整型變量指針,用于存放產(chǎn)生的錯誤代碼
//
返回值: 無
注釋:
遺留的問題:無
//
**************************************************************************/
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] 擴(kuò)頻因子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: ////開始發(fā)射命令
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執(zhí)行成功后方可使用
case TXSTOP: ////停止發(fā)射命令
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;
//改變發(fā)射功率
//*Buf: NULL
//輸入:*data(data[0]) Power Level:Power(dBm)+120
//輸出:*errinfo
//備注:本功能必須在TXON執(zhí)行成功后方可使用
case TXPWR: ////改變發(fā)射功率命令
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;
//改變發(fā)射頻率
//*Buf: NULL
//輸入:*data(data[0]) Channel No.:Frequency(MHz)*5
//輸出:*errinfo
//備注:本功能必須在TXON執(zhí)行成功后方可使用
case TXFREQ: ////改變發(fā)射頻點(diǎn)命令
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;
//進(jìn)入接收狀態(tài)
//*Buf: NULL
//輸入:*data(data[0]) Channel No.:Frequency(MHz)*5
//輸出:*errinfo
//備注:
case RXON: ////進(jìn)入接收狀態(tài)
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;
//退出接收狀態(tài)
//*data: NULL
//*Buf: NULL
//輸入:無
//輸出:*errinfo
//備注:本功能必須在RXON執(zhí)行成功后方可使用
case RXSTOP: ////退出接收狀態(tài)
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;
//讀取接收到的業(yè)務(wù)數(shù)據(jù)
//輸入:*data: data[0] Time Slot(默認(rèn)為4)
// data[1] Frame number,需要讀取的幀數(shù)
// data[2] Power Level:Power(dBm)+110
//輸出:*data: data[i*2+3]返回的每幀數(shù)據(jù)的幀號,i=0,1,...,data[1]-1
// data[i*2+4]返回的每幀數(shù)據(jù)的長度,i=0,1,...,data[1]-1
// *Buf: 讀取到的業(yè)務(wù)數(shù)據(jù),byte型
// *errinfo
//備注:本功能必須在RXON執(zhí)行成功后方可使用
case RXDATA: ////傳送譯碼過后的數(shù)據(jù)
//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]); //時隙點(diǎn)
amt_set_int(cmdbuf,AMT_FRAMECOUNT_ATOM,data[1]); //幀數(shù)
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]); //第一幀譯碼后的數(shù)據(jù)
if(data[1]>1) //接收不止1幀,
{
temp=data[1]; //幀數(shù)
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] 數(shù)據(jù)長度
amt_get_bytes(cmdbuf,AMT_DATA_ATOM,&Buf[MsgLen],data[i*2+4]);//數(shù)據(jù)
MsgLen=MsgLen+data[i*2+4];
}
}
if(*errinfo!=0) temp=temp-1;
}
data[1]=temp; //data[1]:實際接收到的幀數(shù)
}
break;
//傳送IQ的數(shù)據(jù)
//輸入:*data: data[1] Power Level:Power(dBm)+110
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -