www.pudn.com > TMS320F2812Sci.rar > communication.c
#include "DSP28_Device.h" //ControllerCommand Table[command index][command data] //to controller command format: ////from controller message format: // // CR = 0x0D = Carriage Return // LF = 0x0A = Line Feed // SP = 0x20 = Space char CtrlCmdTable[32][32]= { "\\1", "\\2", "ANZERO", "CLREEPROM", "CONFIG", "DIS", "EN", "ENCINIT", "ENCSTART", "ERR", "FLTCLR", "FLTHIST", "J 00000", "K", "MA 000000 0000", "MH", "MI 000000 0000", "RECORD 000 0000 000 000", "RSTVAR", "S", "SAVE", "SETP 0000 0000", "STOP", "T 000", "TUNE 000 0 0000" }; //send command to azimuth and elevation controller void SendCommand(int cmd_index) { int cmd_cnt = 0; while(CtrlCmdTable[cmd_index][cmd_cnt] != 0) { SciSend(SLAV, CtrlCmdTable[cmd_index][cmd_cnt]); cmd_cnt ++; } SciSend(SLAV, 0x0D); //CR return ; } void SendJogCmd(int Velocity) { int vel; int VelBuff[4]; SciSend(SLAV, 'J'); SciSend(SLAV, ' '); if(Velocity > 3000) Velocity = 3000; if(Velocity < -3000) Velocity = -3000; if(Velocity < 0) { Velocity = -Velocity; SciSend(SLAV, '-'); } vel = Velocity%10; VelBuff[3] = 0x30+vel; vel = (Velocity/10)%10; VelBuff[2] = 0x30+vel; vel = (Velocity/100)%10; VelBuff[1] = 0x30+vel; vel = (Velocity/1000)%10; VelBuff[0] = 0x30+vel; if(VelBuff[0] != 0x30) { SciSend(SLAV, VelBuff[0]); SciSend(SLAV, VelBuff[1]); SciSend(SLAV, VelBuff[2]); SciSend(SLAV, VelBuff[3]); } else if(VelBuff[1] != 0x30) { SciSend(SLAV, VelBuff[1]); SciSend(SLAV, VelBuff[2]); SciSend(SLAV, VelBuff[3]); } else if(VelBuff[2] != 0x30) { SciSend(SLAV, VelBuff[2]); SciSend(SLAV, VelBuff[3]); } else { SciSend(SLAV, VelBuff[3]); } SciSend(SLAV, 0x0D); } int CurrentController = AZ; void SetCurrentController(int axis) { if(axis == AZ) { CurrentController = AZ; SendCommand(0); } if(axis == EL) { CurrentController = EL; SendCommand(1); } } //Receiver controller status int AzCtrlCnt = 0; int ElCtrlCnt = 0; char AzCtrlSts[32]; char ElCtrlSts[32]; int AzCtrlErrCode = 0; int ElCtrlErrCode = 0; int RecvCtrlSts(void) { int recv_ch; int index_cnt; while(SciRecv(SLAV, &recv_ch) == 1) { if(CurrentController == AZ) { if(recv_ch != 0x0D) { AzCtrlSts[AzCtrlCnt] = recv_ch; AzCtrlCnt ++; if(AzCtrlCnt >= 32) AzCtrlCnt = 0; } else { for(index_cnt = 0; index_cnt < (AzCtrlCnt-4); index_cnt ++) { if((AzCtrlSts[index_cnt] == 'E') && (AzCtrlSts[index_cnt+1] == 'R') && (AzCtrlSts[index_cnt+2] == 'R')) { AzCtrlErrCode = AzCtrlSts[index_cnt+3]*10 +AzCtrlSts[index_cnt+4]; AzCtrlCnt = 0; return -1; } } } } if(CurrentController == EL) { if(recv_ch != 0x0D) { ElCtrlSts[ElCtrlCnt] = recv_ch; ElCtrlCnt ++; if(ElCtrlCnt >= 32) ElCtrlCnt = 0; } else { for(index_cnt = 0; index_cnt < (ElCtrlCnt-4); index_cnt ++) { if((ElCtrlSts[index_cnt] == 'E') && (ElCtrlSts[index_cnt+1] == 'R') && (ElCtrlSts[index_cnt+2] == 'R')) { ElCtrlErrCode = ElCtrlSts[index_cnt+3]*10 +ElCtrlSts[index_cnt+4]; ElCtrlCnt = 0; return -1; } } } } } return 0; } int Bcd2Bin(unsigned char *buff) { int bin, decade; decade = buff[0]&0x0F; bin = decade*10000; decade = (buff[1]>>4)&0x0F; bin += decade*1000; decade = buff[1] &0x0F; bin += decade*100; decade = (buff[2]>>4)&0x0F; bin += decade*10; decade = buff[2]&0x0F; bin += decade; return bin; } //convert a integer to BCD code void Bin2Bcd(int bin, unsigned char *buff) { int decade; decade= bin%100; buff[2] = decade%10; buff[2] |= (decade/10)<<4; decade = (bin%10000)/100; buff[1] = decade%10; buff[1] |= (decade/10)<<4; buff[0] = bin/10000; return; } //send encoder value to center computer void SendEncoder(int axis, int code) { unsigned char code_buff[3]; Bin2Bcd(code, code_buff); if(axis == AZ) { code_buff[0] &= 0x0F; code_buff[0] |= 0xA0; SciSend(PRIM, code_buff[0]); SciSend(PRIM, code_buff[1]); SciSend(PRIM, code_buff[2]); } if(axis == EL) { code_buff[0] &= 0x0F; code_buff[0] |= 0xE0; SciSend(PRIM, code_buff[0]); SciSend(PRIM, code_buff[1]); SciSend(PRIM, code_buff[2]); } return; } int AzRecvCnt = 0; int ElRecvCnt = 0; int CmdRecvCnt = 0; int AzCmdFlag = 0; int ElCmdFlag = 0; int CmdFlag = 0; int Azimuth = 0; int Elevation = 0; int Command = 0; unsigned char AzBuff[3]; unsigned char ElBuff[3]; unsigned char CmdBuff[3]; //Receive command from center computer int RecvCmd(void) { int rch; if(SciRecv(PRIM, &rch) == 1) { if((rch&0x0F0) == 0x0A0) { AzRecvCnt = 1; ElRecvCnt = 0; CmdRecvCnt = 0; AzBuff[0] = rch; } else if((rch&0x0F0) == 0x0E0) { ElRecvCnt = 1; AzRecvCnt = 0; CmdRecvCnt = 0; ElBuff[0] = rch; } else if((rch&0x0F0) == 0x0C0) { AzRecvCnt = 0; ElRecvCnt = 0; CmdRecvCnt = 1; CmdBuff[0] = rch; } else if(AzRecvCnt >= 1) { AzBuff[AzRecvCnt] = rch; AzRecvCnt ++; if(AzRecvCnt >= 3) { Azimuth = Bcd2Bin(AzBuff); AzRecvCnt = 0; AzCmdFlag = 1; } } else if(ElRecvCnt >= 1) { ElBuff[ElRecvCnt] = rch; ElRecvCnt ++; if(ElRecvCnt >= 3) { Elevation = Bcd2Bin(ElBuff); ElRecvCnt = 0; ElCmdFlag = 1; } } else if(CmdRecvCnt >= 1) { CmdBuff[CmdRecvCnt] = rch; CmdRecvCnt ++; if(CmdRecvCnt >= 3) { CmdRecvCnt = 0; CmdFlag = 1; } } else { //NOP } } return 0; } int ReadAzCmd(int *val) { if(AzCmdFlag == 1) { AzCmdFlag = 0; *val = Azimuth; return 1; } else return 0; } int ReadElCmd(int *val) { if(ElCmdFlag == 1) { ElCmdFlag = 0; *val = Elevation; return 1; } else return 0; } int ReadCmd(int *val) { if(CmdFlag == 1) { CmdFlag = 0; *val = Command; return 1; } else return 0; }