static int Set(systimer* p, int No, const void* Data, int Size) { int Result = ERR_INVALID_PARAM; switch (No) { case TIMER_TIME: assert(Size == sizeof(tick_t)); LockEnter(p->Section); p->TickStart = *(tick_t*)Data; p->TimeRef = GetTimeTick(); LockLeave(p->Section); Result = ERR_NONE; break; case TIMER_SPEED: assert(Size == sizeof(fraction)); if (!EqFrac(&p->Speed, (const fraction*)Data)) { LockEnter(p->Section); if (p->Play) { int t = GetTimeTick(); p->TickStart += Scale(t-p->TimeRef,p->SpeedTime.Num,p->SpeedTime.Den); p->TimeRef = t; } p->Speed = *(fraction*)Data; p->SpeedTime = p->Speed; p->SpeedTime.Num *= TICKSPERSEC; p->SpeedTime.Den *= GetTimeFreq(); LockLeave(p->Section); } Result = ERR_NONE; break; case TIMER_PLAY: assert(Size == sizeof(bool_t)); if (p->Play != *(bool_t*)Data) { int t; LockEnter(p->Section); t = GetTimeTick(); p->Play = *(bool_t*)Data; if (!p->Play) // save time p->TickStart += Scale(t-p->TimeRef,p->SpeedTime.Num,p->SpeedTime.Den); p->TimeRef = t; LockLeave(p->Section); } Result = ERR_NONE; break; } return Result; }
void TestDotMatrix(void) { if(GetTimeTick() - g_TestTimer >= 62) { SetPixel(g_X, g_Y, g_Color); if(++g_X >= MATRIX_WIDTH) { g_X = 0; if(++g_Y >= MATRIX_HEIGHT) { g_Y = 0; if(g_Color == RED_COLOR) g_Color = GREEN_COLOR; else if(g_Color == GREEN_COLOR) g_Color = RED_COLOR; } } g_TestTimer = GetTimeTick(); } }
BOOL CBypassQueue::SingleJob(CZigbeeWorker * pWorker, BITEM *pItem) { TIMETICK tmNow; int nElapse, nError; BYTE nAttr; GetTimeTick(&tmNow); nElapse = GetTimeInterval(&pItem->invokeTime, &tmNow); // IF4 Forwarding을 한다 CIF4Invoke invoke(m_szFepServer, m_nFepPort, DEFAULT_TIMEOUT); invoke.AddParamFormat("1.14", VARSMI_EUI64, &pItem->id, sizeof(EUI64)); // Source ID invoke.AddParam("1.6", pItem->trSeq); // Transaction Sequence invoke.AddParam("1.4", pItem->nSeq); // Message Sequence invoke.AddParam("1.5", pItem->nLength); // Message Length invoke.AddParamFormat("1.12", VARSMI_STREAM, pItem->szData, pItem->nLength); // Message #ifdef _WIN32 invoke.AddParam("1.6", (UINT)pItem->invokeTime.t); // Invoke Time #else invoke.AddParam("1.6", (UINT)pItem->invokeTime.t.tv_sec); // Invoke Time #endif invoke.AddParam("1.6", (UINT)nElapse); // Waiting Delay nAttr = IF4_CMDATTR_REQUEST | IF4_CMDATTR_RESPONSE; nError = IF4API_Command(invoke.GetHandle(), "111.1", nAttr); if(nError == IF4ERR_NOERROR) { pItem->bSent = TRUE; } else { char szGUID[17]; EUI64ToStr(&pItem->id,szGUID); XDEBUG("Bypass Fail %s : %s(%d)\r\n", szGUID, IF4API_GetErrorMessage(nError), nError); } return TRUE; }
static int Get(systimer* p, int No, void* Data, int Size) { int Result = ERR_INVALID_PARAM; switch (No) { case TIMER_PLAY: GETVALUE(p->Play,bool_t); break; case TIMER_SPEED: GETVALUE(p->Speed,fraction); break; case TIMER_TIME: assert(Size == sizeof(tick_t)); LockEnter(p->Section); if (p->Speed.Num==0) // benchmark mode *(tick_t*)Data = TIME_BENCH; else if (p->Play) *(tick_t*)Data = p->TickStart + Scale(GetTimeTick()-p->TimeRef,p->SpeedTime.Num,p->SpeedTime.Den); else *(tick_t*)Data = p->TickStart; LockLeave(p->Section); Result = ERR_NONE; break; } return Result; }
/****************************************************************************************************** * * 函数介绍: GetValue,从服务端获取值 * 输入参数说明: * 输出参数说明:无 * 返回值: 执行结果 ******************************************************************************************************* */ int GetValue(int DstModule,int MsgID,int SrcModule,int MsgType,int *Param1,int *Param2, char **str, int buf_size) { DEBUG("DstModule=%d type=%d, SrcModule=%d, cmd=%d\n", DstModule, MsgID, SrcModule,MsgType); struct sockaddr_un address; char szbuffer[RECV_BUF_LEN]; int iret = 0; memset(szbuffer,0,sizeof(szbuffer)); MSG_HEAD *MsgHead = (MSG_HEAD *)szbuffer; MSG_BODY *MsgBody = (MSG_BODY *)(szbuffer+HEAD_LEN); MsgHead->magic = MSG_MAGIC; MsgHead->srcmodule = sg_moduleid; MsgHead->msgid = ++sg_msgid; MsgHead->appid = MsgID; MsgHead->len = 0; MsgBody->iParam[0] = SrcModule; MsgBody->iParam[1] = MsgType; MsgBody->iParam[2] = 0; MsgBody->iParam[3] = 0; MsgBody->iParam[4] = 0; //printf("send msg id:%d\n",MsgHead->msgid); MsgHead->len += BODY_INT_LEN ; pthread_mutex_lock(&sg_sendermutex); sg_sendermsgid[0] = MsgHead->msgid; //sktDebugMsg("send to %d app:%d len:%d\n",ToModule,Appid,len); iret = UnSendTo(sg_hSendFd,szbuffer,MsgHead->len+HEAD_LEN, DstModule); if(iret > 0) { unsigned long iEndClock =0,iCurClock = 0; iEndClock= GetTimeTick() + ONE_SECOND*2; if (MsgType == MSG_SBS_FTP_TEST) { iEndClock= GetTimeTick() + ONE_SECOND*10; } if (MsgType == MSG_SBS_METER_STATUS) { iEndClock= GetTimeTick() + ONE_SECOND*5; } iCurClock = GetTimeTick(); while (!sg_quit && TimeAfterEq(iEndClock,iCurClock)) { if(MsgHead->msgid != sg_sendermsgid[0]) { DEBUG("get response\n"); break; } usleep(1000); iCurClock = GetTimeTick(); } iret = sg_sendermsgid[1]; #if 1 //debug DEBUG("g_iSendResult[0]=%d g_iSendResult[1]=%d g_sSendResult = %s \n",g_iSendResult[0],g_iSendResult[1], g_sSendResult); #endif //返回参数值 if (Param1 != NULL){ *Param1 = g_iSendResult[0]; } if (Param2 != NULL){ *Param2 = g_iSendResult[1]; } if (str != NULL){ DEBUG("user buf size = %d, result size = %d\n",buf_size, g_iSendResultLen); if (buf_size >= strlen(g_sSendResult)) { memcpy(str, g_sSendResult, g_iSendResultLen); iret = g_iSendResultLen;//如果是获取字符串的函数,返回字符串长度 } else { iret = -1; } } } pthread_mutex_unlock(&sg_sendermutex); //clear sg_sendermsgid[0] = -1; sg_sendermsgid[1] = -1; g_iSendResult[0] = -1; g_iSendResult[1] = -1; if (g_sSendResult != NULL) memset(g_sSendResult, 0, MAX_LENGTH); return iret; }
/****************************************************************************************************** * * 函数介绍: SendMessage 发送数据包,并等待返回值,2秒超时。 * 输入参数说明: * 输出参数说明:无 * 返回值: 执行结果 ******************************************************************************************************* */ int SendMessage(int ToModule,int Appid,int Param1,int Param2,int Param3,int Param4,int Param5, char *Param6,int len) { if (Param6 != NULL) DEBUG("dst=%d type=%d, src=%d, cmd=%d, %d, %d, %d, %s\n", ToModule, Appid, Param1,Param2,Param3,Param4,Param5,Param6); else DEBUG("dst=%d type=%d, src=%d, cmd=%d, %d, %d, %d\n", ToModule, Appid, Param1,Param2,Param3,Param4,Param5); struct sockaddr_un address; char szbuffer[RECV_BUF_LEN]; int iret = 0; memset(szbuffer,0,sizeof(szbuffer)); MSG_HEAD *MsgHead = (MSG_HEAD *)szbuffer; MSG_BODY *MsgBody = (MSG_BODY *)(szbuffer+HEAD_LEN); MsgHead->magic = MSG_MAGIC; MsgHead->srcmodule = sg_moduleid; MsgHead->msgid = ++sg_msgid; MsgHead->appid = Appid; MsgHead->len = 0; MsgBody->iParam[0] = Param1; MsgBody->iParam[1] = Param2; MsgBody->iParam[2] = Param3; MsgBody->iParam[3] = Param4; MsgBody->iParam[4] = Param5; if(Param6 != NULL) { //char str[128]; if(len==0) len = strlen(Param6); if(len > MSG_STRING_LEN) len = MSG_STRING_LEN; memcpy(MsgBody->sParam,Param6,len); MsgHead->len += len; /*strcpy(str,MsgBody->sParam); printf("PostMessage 0x %x,%x,%x,%x,%x,%x,%x\n",str[0],str[1],str[2],str[3],str[4],str[5],str[6]);*/ } //printf("send msg id:%d\n",MsgHead->msgid); MsgHead->len += BODY_INT_LEN ; pthread_mutex_lock(&sg_sendermutex); sg_sendermsgid[0] = MsgHead->msgid; //sktDebugMsg("send to %d app:%d len:%d\n",ToModule,Appid,len); iret = UnSendTo(sg_hSendFd,szbuffer,MsgHead->len+HEAD_LEN, ToModule); if(iret > 0) { unsigned long iEndClock =0,iCurClock = 0; iEndClock= GetTimeTick() + ONE_SECOND*2; iCurClock = GetTimeTick(); while (!sg_quit && TimeAfterEq(iEndClock,iCurClock)) { if(MsgHead->msgid != sg_sendermsgid[0]) break; usleep(1000); iCurClock = GetTimeTick(); } iret = sg_sendermsgid[1]; sg_sendermsgid[0] = -1; sg_sendermsgid[1] = -1; } pthread_mutex_unlock(&sg_sendermutex); return iret; }
int main(int argc, char **argv) { #ifndef _WIN32 struct sigaction handler; #endif HANDLE codi; int nError; int nDebugMode = 1; int nPermit=-1, nPowerMode=-1; int nListSerial = 0; signed char nRfPower=254; int opt; char *pDevicePath = NULL; #ifndef _WIN32 // 보편적인 시그널 핸들러를 설치한다. handler.sa_handler = signal_handler; sigfillset(&handler.sa_mask); sigaction(SIGINT, &handler, 0); sigaction(SIGTERM, &handler, 0); sigaction(SIGCHLD, &handler, 0); #endif #ifndef _WIN32 while((opt=getopt(argc, argv, "dp:q:G:")) != -1) { #else while((opt=getopt(argc, argv, "d")) != -1) { #endif switch(opt) { case 'd': nDebugMode = 0; break; case 'l': nListSerial = 1; break; case 'q': nPermit = (int)strtol(optarg,(char **)NULL,10) == 0 ? 0 : 255; break; case 'G': nPowerMode = (int)strtol(optarg,(char **)NULL,10); break; case 'p': nRfPower = (signed char)strtol(optarg,(char **)NULL,10); break; case 'h': default : Usage(argv[0]); return (1); } } if((argc - optind) < 1) { Usage(argv[0]); return (2); } // 디버깅 화면 출력(0), 해제(1) SET_DEBUG_FILE(stderr); SET_DEBUG_MODE(nDebugMode); pDevicePath = strdup(argv[optind]); memset(g_szCodiId, 0, sizeof(g_szCodiId)); memset(codiDevice.szDevice, 0, sizeof(codiDevice.szDevice)); strncpy(codiDevice.szDevice, pDevicePath, MIN(strlen(pDevicePath), sizeof(codiDevice.szDevice)-1)); // CODIAPI를 초기화 한다. nError = codiInit(); if (nError != CODIERR_NOERROR) { ReportError(NULL, nError); return (3); } // 새로운 Coordinator 장치를 등록한다. nError = codiRegister(&codi, &codiDevice); if (nError != CODIERR_NOERROR) { ReportError(NULL, nError); codiExit(); return (3); } // Coordinator 서비스를 시작 시킨다. nError = codiStartup(codi); if (nError != CODIERR_NOERROR) { ReportError(NULL, nError); codiUnregister(codi); codiExit(); return (3); } // 사용자 프로그램을 여기에 코딩한다. MainProcedure(codi, nPermit, nRfPower, nPowerMode); // Coordinator 서비스를 종료한다. nError = codiShutdown(codi); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); // 등록된 디바이스를 해제한다. nError = codiUnregister(codi); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); // API를 종료한다. codiExit(); return (0); } const char *GetStateMessage(int nState) { switch(nState) { case CODISTATE_NORMAL : return "Normal"; case CODISTATE_NOT_STARTED : return "Coordinator not started"; case CODISTATE_NOT_CONNECTED : return "Coordinator not connected"; case CODISTATE_STACK_NOT_READY : return "Coordinator Stack not ready"; case CODISTATE_STACK_DOWN : return "Coordinator Stack down"; case CODISTATE_JOIN_FAIL : return "Coordinator Join Fail"; case CODISTATE_NO_RESPONSE : return "Coordinator No Response"; case CODISTATE_ERROR : return "Coordinator Error"; } return "Unknown State"; } #define STATE_INIT 0 #define STATE_READY 1 #define STATE_PERMIT 17 #define STATE_SET_PERMIT 40 #define STATE_RF_POWER 41 #define STATE_POWER_MODE 42 #define STATE_RESET 55 #define STATE_WAIT 100 void MainProcedure(HANDLE codi, int nPermit, signed char nRfPower, int nPowerMode) { TIMETICK start, prev, cur; //BYTE szBuffer[1024]; int nError = CODIERR_NOERROR, nLength; int nState, nElapse; BOOL bSet; CODI_PERMIT_PAYLOAD permit; CODI_NETWORK_PAYLOAD network; GetTimeTick(&start); for(nState=STATE_INIT; !m_bCodiExitPending;) { GetTimeTick(&prev); //nError = codiGetState(codi); //XDEBUG("CODINATOR STATE(%d) = %s\r\n", nError, GetStateMessage(nError)); //XDEBUG("m_bCodiExitPending %d\r\n", m_bCodiExitPending); switch(nState) { case STATE_INIT : nState = STATE_READY; break; case STATE_READY : nError = codiGetState(codi); XDEBUG("CODINATOR STATE(%d) = %s\r\n", nError, GetStateMessage(nError)); if (nError != CODISTATE_NORMAL) { nState = STATE_RESET; break; } nState = STATE_SET_PERMIT; break; case STATE_RESET : nError = codiReset(codi); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); USLEEP(10000000); nState = STATE_READY; break; case STATE_SET_PERMIT: #ifdef __FN_RFSET__ if(nPermit >=0 && nPermit <= 255) { memset(&permit, 0, sizeof(CODI_CMD_PERMIT)); permit.permit_time = (BYTE)(nPermit & 0xFF); nError = codiSetProperty(codi, CODI_CMD_PERMIT, (BYTE *)&permit, sizeof(CODI_PERMIT_PAYLOAD), 3000); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); } #endif nState = STATE_PERMIT; break; case STATE_PERMIT : memset(&permit, 0, sizeof(CODI_PERMIT_PAYLOAD)); nError = codiGetProperty(codi, CODI_CMD_PERMIT, (BYTE *)&permit, &nLength, 5000); if (nError != CODIERR_NOERROR) { ReportError(NULL, nError); } #ifdef __FN_RFSET__ else { PRINT("OUT:PERMIT:%d\n", permit.permit_time); } #endif nState = STATE_RF_POWER; break; case STATE_RF_POWER : bSet = FALSE; memset(&network, 0, sizeof(CODI_NETWORK_PAYLOAD)); nError = codiGetProperty(codi, CODI_CMD_NETWORK_PARAM, (BYTE *)&network, &nLength, 5000); if (nError != CODIERR_NOERROR) { ReportError(NULL, nError); } #ifdef __FN_RFSET__ else { if(nRfPower != 254) { network.power = nRfPower; bSet = TRUE; } if(nPowerMode >= 0) { network.txpowermode = (BYTE)nPowerMode; bSet = TRUE; } if(bSet) { nError = codiSetProperty(codi, CODI_CMD_NETWORK_PARAM, (BYTE *)&network, nLength, 3000); } PRINT("OUT:CINFO:%d,%d,%d\n", network.channel, network.panid, network.power); } #endif nState = STATE_WAIT; break; case STATE_WAIT : GetTimeTick(&cur); nElapse = GetTimeInterval(&start, &cur); USLEEP(30000000); nState = STATE_WAIT; break; } GetTimeTick(&cur); nElapse = GetTimeInterval(&prev, &cur); //XDEBUG("Elapse=%d ms\r\n", nElapse); } }
void MainProcedure(HANDLE codi) { TIMETICK start, prev, cur; char szFileName[256] = ""; BYTE szBuffer[1024]; int nError, nLength; int nState, nElapse; strcpy(szFileName, "/app/sw/ZNet3_Coordinator_v10_B16.ebl"); GetTimeTick(&start); for(nState=STATE_INIT; !m_bCodiExitPending && (nState!=STATE_DONE);) { GetTimeTick(&prev); nError = codiGetState(codi); printf("CODINATOR STATE(%d) = %s\r\n", nError, GetStateMessage(nError)); switch(nState) { case STATE_INIT : nState = STATE_READY; break; case STATE_READY : nError = codiGetState(codi); printf("CODINATOR STATE(%d) = %s\r\n", nError, GetStateMessage(nError)); if (nError != CODISTATE_NORMAL) { USLEEP(1000000); break; } nState = STATE_MODULE_PARAM; break; case STATE_MODULE_PARAM : codiSync(codi, 3); GetTimeTick(&start); nError = codiGetProperty(codi, CODI_CMD_MODULE_PARAM, (BYTE *)szBuffer, &nLength, 5000); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); nState = STATE_NETWORK_PARAM; break; case STATE_NETWORK_PARAM : nError = codiGetProperty(codi, CODI_CMD_NETWORK_PARAM, (BYTE *)szBuffer, &nLength, 5000); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); nState = STATE_SECURITY_PARAM; break; case STATE_SECURITY_PARAM : nError = codiGetProperty(codi, CODI_CMD_SECURITY_PARAM, (BYTE *)szBuffer, &nLength, 5000); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); nState = STATE_PERMIT; break; case STATE_PERMIT : nError = codiGetProperty(codi, CODI_CMD_PERMIT, (BYTE *)szBuffer, &nLength, 5000); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); nState = STATE_DOWNLOAD; break; case STATE_DOWNLOAD : nError = codiDownload(codi, CODI_MODEMTYPE_XMODEM, szFileName, "ebl"); if (nError != CODIERR_NOERROR) ReportError(NULL, nError); USLEEP(3000000); nState = STATE_WAIT; break; case STATE_WAIT : GetTimeTick(&cur); nElapse = GetTimeInterval(&start, &cur); printf("\r\n"); printf("-----------------------------------------------------\r\n"); printf(" TOTAL Elapse Time = %d ms\r\n", nElapse); printf("-----------------------------------------------------\r\n"); nState = STATE_DONE; break; } GetTimeTick(&cur); nElapse = GetTimeInterval(&prev, &cur); printf("Elapse=%d ms\r\n", nElapse); } }