#include #include #include "module1.h" void Com0_CallBack(pCOMPORT com, int mode); void Com0_LoopFun(void); void ProcessSystemCommand(int key); //void (*MyCom_CallBack)(pCOMPORT com, int mode)=SlaveMode_CallBack; #define BUF_SIZE 256 char Buf[BUF_SIZE]; COMPORT MyCom={ 0, //int Port; // 0:COM0, 1:COM1,... Buf, //char *Buf; BUF_SIZE, //unsigned Bufsize; '\r', //char EndChar; 150, //unsigned TriggerLevel; 25, //long Timeout; 0, //long StartTimeTicks; 0, //long LastTimeTicks; 0, //long MasterTimeout; 0, //long MasterStartTimeTicks; 0, //unsigned Size; ReadComn_0, //int (*ReadComn)(unsigned char *buf,int n); Com0_CallBack, //MyCom_CallBack, //void (*CallbackFun)(pCOMPORT, int mode); 0, //pCOMPORT next; }; #if 0 static int oldCnt=0; //COM0_DMA #define ResetCom0Cnt() oldCnt=0 //COM0_DMA int MyReadComn_0(unsigned char *buf,int n) //COM0_DMA : 使用 DMA 時加上 { int newcnt,cnt; // buf,n 都先不管 (void)buf; (void)n; newcnt=Com0GetDataSize(); cnt=newcnt-oldCnt; if(cnt){ //printCom_1("[%d(%x)=%d-%d]",cnt,cnt,newcnt,oldCnt); oldCnt=newcnt; } return cnt; } #endif int Com87K=0; long Baud87K=115200; int DataBit87K=8; int Parity87K=0; int Stop87K=1; long TestTimeout=100; int bWaitReply=0; typedef struct { int skt; int slot; char *cmd; void (*fun)(pCOMPORT com); } SLOT_DCON_CMD, *pSLOT_DCON_CMD; #define MAX_CMD_NO_0 10 #define MAX_CMD_NO_1 20 static SLOT_DCON_CMD Com0Cmd_0[MAX_CMD_NO_0]; static SLOT_DCON_CMD Com0Cmd_1[MAX_CMD_NO_1]; static int CmdInIdx_0=0,CmdOutIdx_0=0; static int CmdInIdx_1=0,CmdOutIdx_1=0; pSLOT_DCON_CMD CurCom0Cmd; int Add87kCmd_0(int slot,int skt,char *cmd,void (*fun)(pCOMPORT)) { int NextIdx; NextIdx=CmdInIdx_0+1; if(NextIdx >= MAX_CMD_NO_0) NextIdx=0; if(NextIdx==CmdOutIdx_0) return -1; // Buffer 已滿。 Com0Cmd_0[CmdInIdx_0].skt=skt; Com0Cmd_0[CmdInIdx_0].slot=slot; Com0Cmd_0[CmdInIdx_0].cmd=cmd; Com0Cmd_0[CmdInIdx_0].fun=fun; CmdInIdx_0=NextIdx; return 0; //No error } int Add87kCmd_1(int slot,int skt,char *cmd,void (*fun)(pCOMPORT)) { int NextIdx; NextIdx=CmdInIdx_1+1; if(NextIdx >= MAX_CMD_NO_1) NextIdx=0; if(NextIdx==CmdOutIdx_1) return -1; // Buffer 已滿。 Com0Cmd_1[CmdInIdx_1].skt=skt; Com0Cmd_1[CmdInIdx_1].slot=slot; Com0Cmd_1[CmdInIdx_1].cmd=cmd; Com0Cmd_1[CmdInIdx_1].fun=fun; CmdInIdx_1=NextIdx; //printCom_1("[skt=%d,slot=%d,cmd=%s]",skt,slot,cmd); return 0; //No error } /* 命令 Queue 一共有兩個: _1 這一組是給平常排好的命令,例如讀取 D/I,A/I,counter 等 input 命令。 _0 這一組是當 master 端下命令過來。得插入一個命令時使用。例如 D/O,A/O 輸出的命令。 這一組有較高的優先權。全部處理完了才處理 _1 那一組。 新的命令加入,還是得等已經在處理的命令處理完才可以開始新的命令。 */ #define DMA0_CONTROL 0xFFCA #define DMA0_TC 0xFFC8 void Com0SendNextCmd(void) { static long CmdCnt=0; if(CmdInIdx_0 != CmdOutIdx_0){ // _0 這一組優先處理 CurCom0Cmd=Com0Cmd_0+CmdOutIdx_0; CmdOutIdx_0++; if(CmdOutIdx_0>=MAX_CMD_NO_0) CmdOutIdx_0=0; goto SendCmd; } else if(CmdInIdx_1!=CmdOutIdx_1){ CurCom0Cmd=Com0Cmd_1+CmdOutIdx_1; CmdOutIdx_1++; if(CmdOutIdx_1>=MAX_CMD_NO_1) CmdOutIdx_1=0; SendCmd: //printCom_1("\r\n[Cmd_0:%s]",CurCom0Cmd->cmd); ChangeToSlot(CurCom0Cmd->slot); ToComStr_[Com87K](CurCom0Cmd->cmd); ToCom_[Com87K]('\r'); MyCom.MasterTimeout=TestTimeout; MyCom.MasterStartTimeTicks=CurrentLoopTimeTicks; } else { CurCom0Cmd=0; //printCom_1("\r\n[No Command]\r\n"); } } void Com0_CallBack(pCOMPORT com, int mode) { // printCom_1("==>{%d}",mode); if(com->Size){ if(com->Buf[com->Size-1]=='\r') com->Buf[com->Size-1]=0; else com->Buf[com->Size]=0; //printCom_1("size=%d,[%s]\r\n",com->Size,com->Buf); } switch(mode){ case 0: // 超過 Timeout 時間沒再收到字元 printCom_1("{0}\r\n"); // printCom_1("\r\n"); break; case 1: // 收到 EndChar (CR) com->Size--; com->Buf[com->Size]=0; // 去掉 CR CurCom0Cmd->fun(com); break; case 2: // 收到字元個數到達 TriggerLevel printCom_1("{2}\r\n"); // printCom_1("\r\n"); break; case 3: // buffer 已經滿了 printCom_1("{3}\r\n"); // printCom_1("\r\n"); break; case 4: //超過 MasterTimeout 時間都沒有收到任何回應字元,就是都沒有回應 printCom_1("{4}\r\n"); // printCom_1("\r\n"); break; default: printCom_1("{%d}\r\n",mode); // printCom_1("\r\n"); break; } bWaitReply=0; com->MasterStartTimeTicks=0; com->Size=0; // 已經處理完回應值,接著送出下一個命令。 Com0SendNextCmd(); } void Com0_LoopFun(void) { if(!MyCom.MasterStartTimeTicks){ // 目前沒有正在處理的命令,送出下一個命令。 Com0SendNextCmd(); } /* if(IsCom_0()){ printCom_1("[%c]",ReadCom_0()); } */ }