std::string AbstractParameterisedSystem<VECTOR>::DumpState(const std::string& rMessage, VECTOR Y, double time) { std::stringstream extra_message; extra_message << std::endl << "At independent variable (usually time) = " << time; std::string new_message = rMessage + extra_message.str(); return GetStateMessage(new_message, Y); }
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); } }
std::string AbstractParameterisedSystem<VECTOR>::DumpState(const std::string& rMessage, VECTOR Y) { return GetStateMessage(rMessage, Y); }
std::string AbstractParameterisedSystem<VECTOR>::DumpState(const std::string& rMessage) { return GetStateMessage(rMessage, mStateVariables); }