?? taichen_yuntai.c
字號:
TCBASELIB(void) TCDivString(LPCTSTR lpStr, LPCTSTR lpSubStr, CStringArray* lpaDiv)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int Pos, OldPos = 0;
lpaDiv->RemoveAll();
CString Str, SubStr;
Str = lpStr;
while(TRUE){
//抽取數據庫信息,以“,”號分割
Pos = Str.Find(lpSubStr,OldPos);
if(Pos==-1){ //最后的信息
SubStr = Str.Right(Str.GetLength()-OldPos);
SubStr.TrimLeft();
SubStr.TrimRight();
if(SubStr!="")
lpaDiv->Add(SubStr);
break;
}
//中間的信息
SubStr = Str.Mid(OldPos,Pos-OldPos);
SubStr.TrimLeft();
SubStr.TrimRight();
if(SubStr!="")
lpaDiv->Add(SubStr);
OldPos = Pos+1;
}
}
void TCVSSendYTCommand(int Index, CString &Address, CString &Command, TCYTCtrlInfo* YTInfo)
{
int i,j;
int Value,Sum,sumIndex,Xor,xorIndex,Count;
int Address_count = 0;
int Command_count = 0;
char Address_buf[TCVYTCodeLength];
char Command_buf[TCVYTCodeLength];
CStringArray DataList,TempList;
CString Info,Temp;
memset(Address_buf,0,TCVYTCodeLength);
memset(Command_buf,0,TCVYTCodeLength);
TCDivString(Address,",",&DataList);
for(i=0;i<DataList.GetSize();i++){
Info = DataList[i];
if(Info.GetLength()==3&&Info.Left(1)=="["&&Info.Right(1)=="]"){
Temp = Info.Mid(1,Info.GetLength()-2);
sscanf(Temp,"%c",&Value);
}
else{
sscanf(Info,"%x",&Value);
}
Address_buf[Address_count] = Value;
Address_count++;
}
BYTE Mod = 0;
BYTE Mask = 0xFF;
BYTE Dec = 0;
int Wait = 20;
int WaitThread = 0;
TCDivString(Command,",",&DataList);
for(i=0;i<DataList.GetSize();i++){
Info = DataList[i];
if(Info.Left(1)=="%"){ //取模
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
Mod = Value;
}
else if(Info.Left(1)=="~"){ //減處理(減校驗和)
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
Dec = Value;
}
else if(Info.Left(1)=="M"){ //Mask處理(與操作)
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
Mask = Value;
}
else if(Info.Left(1)=="#"){ //連續指令間隔時間
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
Wait = Value;
}
else if(Info.Left(1)=="&"){ //連續發碼間隔時間
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
WaitThread = Value;
}
else if(Info=="^"){ //解碼器地址
for(j=0;j<Address_count;j++){
Command_buf[Command_count] = Address_buf[j];
Command_count++;
}
}
else if(Info=="!"){ //云臺預置點
Command_buf[Command_count] = YTInfo->PointID;
Command_count++;
}
else if(Info.Left(1)=="+"){ //求校驗和
Temp = Info.Right(Info.GetLength()-1);
TCDivString(Temp,".",&TempList);
Count = TempList.GetSize();
if(Count==1){
sscanf(TempList[0],"%x",&Value);
Sum = 0;
for(j=0;j<Value;j++){
sumIndex = Command_count-j-1;
if(sumIndex<0){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Sum+=Command_buf[sumIndex];
}
if(Mod!=0)
Command_buf[Command_count] = Sum%Mod;
else
Command_buf[Command_count] = Sum;
if(Mask!=0xFF)
Command_buf[Command_count] &= Mask;
if(Dec!=0)
Command_buf[Command_count] = Dec - Command_buf[Command_count];
Command_count++;
}
else{ //計算固定位校驗值
Sum = 0;
for(j=0;j<Count;j++){
//計算固定累加值(2004-07-20)
if(TempList[j].Right(1)=="+"){
Temp = TempList[j].Left(TempList[j].GetLength()-1);
sscanf(Temp,"%x",&Value);
Sum+=Value;
}
else{
sscanf(TempList[j],"%x",&Value);
sumIndex = Command_count-Value;
if(sumIndex<0){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Sum+=Command_buf[sumIndex];
}
}
if(Mod!=0)
Command_buf[Command_count] = Sum%Mod;
else
Command_buf[Command_count] = Sum;
if(Mask!=0xFF)
Command_buf[Command_count] &= Mask;
if(Dec!=0)
Command_buf[Command_count] = Dec - Command_buf[Command_count];
Command_count++;
}
}
else if(Info.Left(1)=="-"){ //求校驗和(取反)
Temp = Info.Right(Info.GetLength()-1);
TCDivString(Temp,".",&TempList);
Count = TempList.GetSize();
if(Count==1){
sscanf(TempList[0],"%x",&Value);
Sum = 0;
for(j=0;j<Value;j++){
sumIndex = Command_count-j-1;
if(sumIndex<0){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Sum+=Command_buf[sumIndex];
}
if(Mod!=0)
Command_buf[Command_count] = ~(Sum%Mod);
else
Command_buf[Command_count] = ~(Sum);
if(Mask!=0xFF)
Command_buf[Command_count] &= Mask;
if(Dec!=0)
Command_buf[Command_count] = Dec - Command_buf[Command_count];
Command_count++;
}
else{ //計算固定位校驗和取反
Sum = 0;
for(j=0;j<Count;j++){
sscanf(TempList[j],"%x",&Value);
sumIndex = Command_count-Value;
if(sumIndex<0){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Sum+=Command_buf[sumIndex];
}
if(Mod!=0)
Command_buf[Command_count] = ~(Sum%Mod);
else
Command_buf[Command_count] = ~(Sum);
if(Mask!=0xFF)
Command_buf[Command_count] &= Mask;
if(Dec!=0)
Command_buf[Command_count] = Dec - Command_buf[Command_count];
Command_count++;
}
}
else if(Info.Left(1)=="="){ //求異或校驗值
Temp = Info.Right(Info.GetLength()-1);
sscanf(Temp,"%x",&Value);
xorIndex = Command_count-Value;
if(xorIndex<0){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Xor = Command_buf[xorIndex];
for(j=1;j<Value;j++){
xorIndex++;
if(xorIndex>=Command_count){
TCVSErrLog(_LL("解碼器協議錯誤!","PTZ command code error!"));
return;
}
Xor^=Command_buf[xorIndex];
}
Command_buf[Command_count] = Xor;
Command_count++;
}
else if(Info=="|"){ //連續指令
//確保當前操作線程已經結束(2004-03-20)
if(g_YTThread.IsRunning()){
g_YTThread.Break();
for(j=0;j<500;j++){
if(!g_YTThread.IsRunning())
break;
Sleep(1);
}
if(g_YTThread.IsRunning())
g_YTThread.Delete();
}
ASSERT(Index>=0&&Index<TCVS_MAX_YUNTAI);
ASSERT(uCfg.YunTai.YTCommInfo[Index]>=0&&uCfg.YunTai.YTCommInfo[Index]<TCVS_MAX_COMM);
g_SerialPort[uCfg.YunTai.YTCommInfo[Index]].Send(Command_buf,Command_count);
#ifdef _DEBUG
TCVSMakeCommBufferInfo(Command_buf,Command_count);
#endif
memset(Command_buf,0,TCVYTCodeLength);
Command_count = 0;
Sleep(Wait);
}
//ASCII數值處理(2004-08-21)
else if(Info.GetLength()>=3&&Info.Left(1)=="["&&Info.Right(1)=="]"){
Temp = Info.Mid(1,Info.GetLength()-2);
if(Temp=="STX"){
Value = 0x02;
}
else if(Temp=="ETX"){
Value = 0x03;
}
else{
sscanf(Temp,"%c",&Value);
}
Command_buf[Command_count] = Value;
Command_count++;
}
//直接轉換成16進制數值
else{
sscanf(Info,"%x",&Value);
Command_buf[Command_count] = Value;
Command_count++;
}
}
//確保當前操作線程已經結束(2004-03-20)
if(g_YTThread.IsRunning()){
g_YTThread.Break();
for(i=0;i<500;i++){
if(!g_YTThread.IsRunning())
break;
Sleep(1);
}
if(g_YTThread.IsRunning())
g_YTThread.Delete();
}
//發送云臺控制命令
if(WaitThread==0){
ASSERT(Index>=0&&Index<TCVS_MAX_YUNTAI);
ASSERT(uCfg.YunTai.YTCommInfo[Index]>=0&&uCfg.YunTai.YTCommInfo[Index]<TCVS_MAX_COMM);
if(g_SerialPort[uCfg.YunTai.YTCommInfo[Index]].Send(Command_buf,Command_count)!=(UINT)Command_count){
TCVSWarnLog(_LL("云臺控制命令發送錯誤!","PTZ command send failed!"));
}
#ifdef _DEBUG
TCVSMakeCommBufferInfo(Command_buf,Command_count);
#endif
}
else{
static TCVSSendYTCommandInfo YTCI;
YTCI.Index = Index;
YTCI.Wait = WaitThread;
YTCI.Command_count = Command_count;
memcpy(YTCI.Command_buf,Command_buf,Command_count);
g_YTThread.BeginThread(TCVSSendYTCommandProc,&YTCI);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -