int svrGwsPolling(bool _debug_output,SerialCom* comm,int* nTimer) { int nData = 0; char sData[512]; if (*nTimer > 0) { memset(sData, 0x00, 512); SVR_DEBUG(_debug_output,VT100_RESET VT100_INVERT "\b\b\b\b\b\b<%02d>", *nTimer); nData = ScRead(comm, sData, 512); SVR_DEBUG(_debug_output,"%d",nData); if (nData > 0) { idel_times = 0; BufAppend(&local_gws_buff, sData); return TASK_POLLING_RADIO; } else { //If we have read something, and after 5 times of reading nothing, if (!BufIsEmpty(&local_gws_buff)) { idel_times ++; } if (idel_times >= 5) { //consider it was over BufAppend(&local_gws_buff, NULL); idel_times = 0; SetTimerOut(*nTimer); return TASK_UPDATE_RADIO; } else return TASK_POLLING_RADIO; } } else return TASK_IDEL; }
//打开并初始化串口 BOOL CSerialPorts::InitComPortSet(int nCom, int nBaud,int nParity) { //检查串口是否已经打开 if(TRUE==CheckPortOpen()) CloseComPort(); //设置异步读写事件 if(FALSE==SetEventToReadWrite()) AfxMessageBox(_T("串口连接设置失败,请重新连接!")); //设置波特率、串口名和校验方式 m_nBaud=nBaud; m_nParity=nParity; switch(nCom) { case 0: m_cName=_T("COM1"); break; case 1: m_cName=_T("COM2"); break; case 2: m_cName=_T("COM3"); break; case 3: m_cName=_T("COM4"); break; case 4: m_cName=_T("COM5"); break; case 5: m_cName=_T("COM6"); break; case 6: m_cName=_T("COM7"); break; case 7: m_cName=_T("COM8"); break; } //打开端口 hCom=CreateFile(m_cName, //端口名 GENERIC_READ|GENERIC_WRITE, //访问类型:读写 0, //是否共享端口,0为独占 NULL, //默认安全性 OPEN_EXISTING, //只打开而不创建 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式 NULL); //端口打开时不需要,参数为0 if(INVALID_HANDLE_VALUE==hCom) return FALSE; //设置串口缓冲区大小 SetPortBuffSize(); //设置DCB结构体 if(FALSE==SetDCBParam()) return FALSE; //设置超时结构体 SetTimerOut(); //清空串口数据缓冲区 PurgeComm(hCom,PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_TXABORT); return TRUE; }
int svrCmdHandler(SerialCom* comm,GWS_MESSAGE* gws_msg,CommandHandlerPara* para) { char command[64]; char parameter[32]; int* nTimer = &(para->m_nCommBusy); int region = 0; int nId = para->m_nIdentifier; P_GWS_KPI pKpi = para->m_pKpi; RW_KPI_VAR(nId,region,pKpi->m_radio.m_nRegion); strcpy(parameter, gws_msg->m_command.m_sPara); switch (gws_msg->m_command.m_nReq) { case SCAN_CHAN: case SCAN_FIXED_CHAN: if (MIN_CHANNEL(region) <= para->m_nOriginChannel && para->m_nOriginChannel <= MAX_CHANNEL(region)) { COM_LOCK(1000 * MSEC_TICKS); //occupy serial port for 500 ms RW_KPI_VAR(nId,latest_rxcal,pKpi->m_radio.m_bRXCal); RW_KPI_VAR(nId,latest_rxgain,pKpi->m_radio.m_nRXGain); PRE_SCAN_COMMAND(comm,"setrxcal 0"); PRE_SCAN_COMMAND(comm,"setrxgain 0"); para->m_nCurrentChannel = para->m_nOriginChannel; CHANNEL_SCAN_ON_OFF(para->m_uChanScan,gws_msg->m_command.m_nReq == SCAN_FIXED_CHAN ? SCANNING_FIXED_INIT : SCANNING_ALL_INIT); gws_msg->m_nType = 0; } else { svrSetErrorNo(GWS_ERROR_INVALIDATE_CHANNEL); } break; case STOP_CHAN: if (para->m_uChanScan == SCANNING_FIXED_READ) { CHANNEL_SCAN_ON_OFF(para->m_uChanScan, SCANNING_FIXED_DONE); } else { CHANNEL_SCAN_ON_OFF(para->m_uChanScan, SCANNING_DONE); APP_SCAN_COMMAND(comm,static_chp.m_nOriginChannel); } gws_msg->m_nType = 0; break; case SET_TXON: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "tx%s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_RXON: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "rx%s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_TXCAL: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "settxcal %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } case SET_RXCAL: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "setrxcal %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_REGION: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "setregion %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_CHAN: if (*nTimer <= 0) { int new_channel = para->m_nOriginChannel; COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms CHANNEL_SCAN_ON_OFF(para->m_uChanScan,false); if (IsNumber(parameter)) { new_channel = atoi(parameter); } else if (parameter[0] == 'x') { new_channel --; if (new_channel < MIN_CHANNEL(region)) new_channel = MAX_CHANNEL(region); } else if (parameter[0] == 'v') { new_channel ++; if (new_channel > MAX_CHANNEL(region)) new_channel = MIN_CHANNEL(region); } para->m_nCurrentChannel = new_channel; para->m_nOriginChannel = svrSetChannel(comm, region,para->m_nCurrentChannel,&timer_chan_switch); gws_msg->m_nType = 0; } break; case SET_TXPWR: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "settxpwr %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_GAIN: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "setrxgain %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_MODE: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "config_%s", parameter); system(command); usleep(1000000); system("reboot"); gws_msg->m_nType = 0; } break; case SET_TXATT: if (*nTimer <= 0) { COM_LOCK(500 * MSEC_TICKS); //occupy serial port for 500 ms sprintf(command, "settxatten %s\n", parameter); ScSend(comm, command, strlen(command)); gws_msg->m_nType = 0; } break; case SET_BANDWIDTH: set_wifi_bandwidth(parameter); gws_msg->m_nType = 0; break; case WIFI_TXPW: PipeShellCommand( para->m_shell, "iw", "dev", para->m_ifName, "set", "txpower", "fixed", gws_msg->m_command.m_sPara, NULL); gws_msg->m_nType = 0; break; case 'Q': case 'q': CHANNEL_SCAN_ON_OFF(para->m_uChanScan,false); SetTimerOut(*nTimer); gws_msg->m_nType = 0; break; case SHUTDOWN: #ifdef _GWS_DEBUG ShowStatusBar("Shutdown Server."); #endif gws_msg->m_nType = 0; return 0; default: gws_msg->m_nType = 0; } return 1; }