1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957 |
- #include "OSAL.h"
- #include "OSAL_Clock.h"
- #include "OSAL_Nv.h"
- #include "ZDApp.h"
- #include "ZDObject.h"
- #include "AddrMgr.h"
- #include "se.h"
- #include "simplemeter.h"
- #include "zcl_general.h"
- #include "zcl_se.h"
- #include "zcl_key_establish.h"
- #include "onboard.h"
- #include "hal_lcd.h"
- #include "hal_led.h"
- #include "hal_key.h"
- #define zcl_MandatoryReportableAttribute( a ) ( a == NULL )
- #define SIMPLEMETER_MIN_REPORTING_INTERVAL 5
- static uint8 simpleMeterTaskID;
- static uint8 simpleMeterTransID;
- static afAddrType_t ESPAddr;
- static zclReportCmd_t *pSeReportCmd;
- static zclReportCmd_t *pBasicReportCmd;
- static uint8 numSeAttr = 5;
- static uint8 numBasicAttr = 2;
- extern uint8 simpleMeterCurrentSummationDelivered[];
- extern const uint8 simpleMeterZCLVersion;
- extern const uint8 simpleMeterPowerSource;
- extern uint8 simpleMeterStatus;
- extern uint8 simpleMeterUnitOfMeasure;
- extern uint8 simpleMeterSummationFormating;
- extern uint8 simpleMeterDeviceType;
- #if SECURE
- static uint8 linkKeyStatus;
- #endif
- #if defined ( SE_UK_EXT ) && defined ( SE_MIRROR )
- static afAddrType_t mirrorAddr;
- #endif
- static void simplemeter_HandleKeys( uint8 shift, uint8 keys );
- #if SECURE
- static uint8 simplemeter_KeyEstablish_ReturnLinkKey( uint16 shortAddr );
- #endif
- static void simplemeter_ProcessIdentifyTimeChange( void );
- static uint8 simplemeter_ValidateAttrDataCB( zclAttrRec_t *pAttr, zclWriteRec_t *pAttrInfo );
- static void simplemeter_BasicResetCB( void );
- static void simplemeter_IdentifyCB( zclIdentify_t *pCmd );
- static void simplemeter_IdentifyQueryRspCB( zclIdentifyQueryRsp_t *pRsp );
- static void simplemeter_AlarmCB( zclAlarm_t *pAlarm );
- #ifdef SE_UK_EXT
- static void simplemeter_GetEventLogCB( uint8 srcEP, afAddrType_t *srcAddr,
- zclGetEventLog_t *pEventLog, uint8 seqNum );
- static void simplemeter_PublishEventLogCB( afAddrType_t *srcAddr,
- zclPublishEventLog_t *pEventLog );
- #endif
- static void simplemeter_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg );
- static void simplemeter_GetProfileCmdCB( zclCCGetProfileCmd_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_GetProfileRspCB( zclCCGetProfileRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_ReqMirrorRspCB( zclCCReqMirrorRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_MirrorRemRspCB( zclCCMirrorRemRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- #if defined ( SE_UK_EXT )
- static void simplemeter_GetSnapshotCmdCB( zclCCReqGetSnapshotCmd_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_TakeSnapshotCmdCB( afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_MirrorReportAttrRspCB( zclCCReqMirrorReportAttrRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishTariffInformationCB( zclCCPublishTariffInformation_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishPriceMatrixCB( zclCCPublishPriceMatrix_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishBlockThresholdsCB( zclCCPublishBlockThresholds_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishConversionFactorCB( zclCCPublishConversionFactor_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishCalorificValueCB( zclCCPublishCalorificValue_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishCO2ValueCB( zclCCPublishCO2Value_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishCPPEventCB( zclCCPublishCPPEvent_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishBillingPeriodCB( zclCCPublishBillingPeriod_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishConsolidatedBillCB( zclCCPublishConsolidatedBill_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_PublishCreditPaymentInfoCB( zclCCPublishCreditPaymentInfo_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_ChangeDebtCB( zclCCChangeDebt_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_EmergencyCreditSetupCB( zclCCEmergencyCreditSetup_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_ConsumerTopupCB( zclCCConsumerTopup_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_CreditAdjustmentCB( zclCCCreditAdjustment_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_ChangePaymentModeCB( zclCCChangePaymentMode_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_GetPrepaySnapshotCB( zclCCGetPrepaySnapshot_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_GetTopupLogCB( uint8 numEvents,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_SetLowCreditWarningLevelCB( uint8 numEvents,
- afAddrType_t *srcAddr, uint8 seqNum );
- static void simplemeter_GetDebtRepaymentLogCB( zclCCGetDebtRepaymentLog_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum );
- #endif
- static void simplemeter_ProcessZCLMsg( zclIncomingMsg_t *msg );
- #if defined ( ZCL_READ )
- static uint8 simplemeter_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- #if defined ( ZCL_WRITE )
- static uint8 simplemeter_ProcessInWriteRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- #if defined ( ZCL_REPORT )
- static uint8 simplemeter_ProcessInConfigReportCmd( zclIncomingMsg_t *pInMsg );
- static uint8 simplemeter_ProcessInConfigReportRspCmd( zclIncomingMsg_t *pInMsg );
- static uint8 simplemeter_ProcessInReadReportCfgCmd( zclIncomingMsg_t *pInMsg );
- static uint8 simplemeter_ProcessInReadReportCfgRspCmd( zclIncomingMsg_t *pInMsg );
- static uint8 simplemeter_ProcessInReportCmd( zclIncomingMsg_t *pInMsg );
- #endif
- static uint8 simplemeter_ProcessInDefaultRspCmd( zclIncomingMsg_t *pInMsg );
- #if defined ( ZCL_DISCOVER )
- static uint8 simplemeter_ProcessInDiscRspCmd( zclIncomingMsg_t *pInMsg );
- #endif
- static zclGeneral_AppCallbacks_t simplemeter_GenCmdCallbacks =
- {
- simplemeter_BasicResetCB,
- simplemeter_IdentifyCB,
- simplemeter_IdentifyQueryRspCB,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- simplemeter_AlarmCB,
- #ifdef SE_UK_EXT
- simplemeter_GetEventLogCB,
- simplemeter_PublishEventLogCB,
- #endif
- NULL,
- NULL
- };
- static zclSE_AppCallbacks_t simplemeter_SECmdCallbacks =
- {
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- simplemeter_PublishTariffInformationCB,
- simplemeter_PublishPriceMatrixCB,
- simplemeter_PublishBlockThresholdsCB,
- simplemeter_PublishConversionFactorCB,
- simplemeter_PublishCalorificValueCB,
- simplemeter_PublishCO2ValueCB,
- simplemeter_PublishCPPEventCB,
- simplemeter_PublishBillingPeriodCB,
- simplemeter_PublishConsolidatedBillCB,
- simplemeter_PublishCreditPaymentInfoCB,
- #endif
- NULL,
- NULL,
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- #endif
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- simplemeter_GetProfileRspCB,
- NULL,
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- NULL,
- #endif
- simplemeter_GetProfileCmdCB,
- simplemeter_ReqMirrorRspCB,
- simplemeter_MirrorRemRspCB,
- NULL,
- #if defined ( SE_UK_EXT )
- simplemeter_GetSnapshotCmdCB,
- simplemeter_TakeSnapshotCmdCB,
- simplemeter_MirrorReportAttrRspCB,
- #endif
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- NULL,
- NULL,
- #endif
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- NULL,
- #endif
- NULL,
- #if defined ( SE_UK_EXT )
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- #endif
- NULL,
- NULL,
- #if defined ( SE_UK_EXT )
- simplemeter_ChangeDebtCB,
- simplemeter_EmergencyCreditSetupCB,
- simplemeter_ConsumerTopupCB,
- simplemeter_CreditAdjustmentCB,
- simplemeter_ChangePaymentModeCB,
- simplemeter_GetPrepaySnapshotCB,
- simplemeter_GetTopupLogCB,
- simplemeter_SetLowCreditWarningLevelCB,
- simplemeter_GetDebtRepaymentLogCB,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- #endif
- };
- void simplemeter_Init( uint8 task_id )
- {
- simpleMeterTaskID = task_id;
- simpleMeterTransID = 0;
-
-
-
-
- ESPAddr.addrMode = (afAddrMode_t)Addr16Bit;
- ESPAddr.endPoint = SIMPLEMETER_ENDPOINT;
- ESPAddr.addr.shortAddr = 0;
-
- zclSE_Init( &simpleMeterSimpleDesc );
-
- zclGeneral_RegisterCmdCallbacks( SIMPLEMETER_ENDPOINT, &simplemeter_GenCmdCallbacks );
-
- zclSE_RegisterCmdCallbacks( SIMPLEMETER_ENDPOINT, &simplemeter_SECmdCallbacks );
-
- zcl_registerAttrList( SIMPLEMETER_ENDPOINT, SIMPLEMETER_MAX_ATTRIBUTES, simpleMeterAttrs );
-
- zcl_registerClusterOptionList( SIMPLEMETER_ENDPOINT, SIMPLEMETER_MAX_OPTIONS, simpleMeterOptions );
-
- zcl_registerValidateAttrData( simplemeter_ValidateAttrDataCB );
-
- zcl_registerForMsg( simpleMeterTaskID );
-
- RegisterForKeys( simpleMeterTaskID );
-
- ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp);
-
- osal_start_timerEx( simpleMeterTaskID, SIMPLEMETER_UPDATE_TIME_EVT, SIMPLEMETER_UPDATE_TIME_PERIOD );
-
- pBasicReportCmd = (zclReportCmd_t *)osal_mem_alloc( sizeof( zclReportCmd_t ) + ( numBasicAttr * sizeof( zclReport_t ) ) );
- if ( pBasicReportCmd != NULL )
- {
- pBasicReportCmd->numAttr = numBasicAttr;
- pBasicReportCmd->attrList[0].attrID = ATTRID_BASIC_ZCL_VERSION;
- pBasicReportCmd->attrList[0].dataType = ZCL_DATATYPE_UINT8;
- pBasicReportCmd->attrList[0].attrData = (uint8*) &simpleMeterZCLVersion;
- pBasicReportCmd->attrList[1].attrID = ATTRID_BASIC_POWER_SOURCE;
- pBasicReportCmd->attrList[1].dataType = ZCL_DATATYPE_ENUM8;
- pBasicReportCmd->attrList[1].attrData = (uint8*) &simpleMeterPowerSource;
- }
- pSeReportCmd = (zclReportCmd_t *)osal_mem_alloc( sizeof( zclReportCmd_t ) + ( numSeAttr * sizeof( zclReport_t ) ) );
- if ( pSeReportCmd != NULL )
- {
- pSeReportCmd->numAttr = numSeAttr;
-
- pSeReportCmd->attrList[0].attrID = ATTRID_SE_CURRENT_SUMMATION_DELIVERED;
- pSeReportCmd->attrList[0].dataType = ZCL_DATATYPE_UINT48;
- pSeReportCmd->attrList[0].attrData = simpleMeterCurrentSummationDelivered;
- pSeReportCmd->attrList[1].attrID = ATTRID_SE_STATUS;
- pSeReportCmd->attrList[1].dataType = ZCL_DATATYPE_BITMAP8;
- pSeReportCmd->attrList[1].attrData = &simpleMeterStatus;
- pSeReportCmd->attrList[2].attrID = ATTRID_SE_UNIT_OF_MEASURE;
- pSeReportCmd->attrList[2].dataType = ZCL_DATATYPE_ENUM8;
- pSeReportCmd->attrList[2].attrData = &simpleMeterUnitOfMeasure;
- pSeReportCmd->attrList[3].attrID = ATTRID_SE_SUMMATION_FORMATTING;
- pSeReportCmd->attrList[3].dataType = ZCL_DATATYPE_BITMAP8;
- pSeReportCmd->attrList[3].attrData = &simpleMeterSummationFormating;
- pSeReportCmd->attrList[4].attrID = ATTRID_SE_METERING_DEVICE_TYPE;
- pSeReportCmd->attrList[4].dataType = ZCL_DATATYPE_BITMAP8;
- pSeReportCmd->attrList[4].attrData = &simpleMeterDeviceType;
-
- }
- }
- uint16 simplemeter_event_loop( uint8 task_id, uint16 events )
- {
- afIncomingMSGPacket_t *MSGpkt;
- if ( events & SYS_EVENT_MSG )
- {
- while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( simpleMeterTaskID )) )
- {
- switch ( MSGpkt->hdr.event )
- {
- case ZDO_CB_MSG:
- simplemeter_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
- break;
- case ZCL_INCOMING_MSG:
-
- simplemeter_ProcessZCLMsg( (zclIncomingMsg_t *)MSGpkt );
- break;
- case KEY_CHANGE:
- simplemeter_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
- break;
- case ZDO_STATE_CHANGE:
- if ((DEV_END_DEVICE == (devStates_t)(MSGpkt->hdr.status)) ||
- (DEV_ROUTER == (devStates_t)(MSGpkt->hdr.status)))
- {
- #if SECURE
- {
-
- linkKeyStatus = simplemeter_KeyEstablish_ReturnLinkKey(ESPAddr.addr.shortAddr);
- if (linkKeyStatus != ZSuccess)
- {
- cId_t cbkeCluster = ZCL_CLUSTER_ID_GEN_KEY_ESTABLISHMENT;
- zAddrType_t dstAddr;
-
- dstAddr.addrMode = AddrBroadcast;
- dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
- ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR, ZCL_SE_PROFILE_ID,
- 1, &cbkeCluster, 0, NULL, FALSE );
- }
- else
- {
-
- osal_set_event( simpleMeterTaskID, SIMPLEMETER_CONNECTED_EVT );
- }
- }
- #else
- {
- osal_set_event( simpleMeterTaskID, SIMPLEMETER_CONNECTED_EVT );
- }
- #endif
-
- NLME_SetPollRate ( SE_DEVICE_POLL_RATE );
- }
- break;
- #if defined( ZCL_KEY_ESTABLISH )
- case ZCL_KEY_ESTABLISH_IND:
- if ((MSGpkt->hdr.status) == TermKeyStatus_Success)
- {
- ESPAddr.endPoint = SIMPLEMETER_ENDPOINT;
- osal_set_event( simpleMeterTaskID, SIMPLEMETER_CONNECTED_EVT );
- }
- break;
- #endif
- default:
- break;
- }
-
- osal_msg_deallocate( (uint8 *)MSGpkt );
- }
-
- return (events ^ SYS_EVENT_MSG);
- }
-
- if ( events & SIMPLEMETER_KEY_ESTABLISHMENT_REQUEST_EVT )
- {
- zclGeneral_KeyEstablish_InitiateKeyEstablishment(simpleMeterTaskID, &ESPAddr, simpleMeterTransID);
- return ( events ^ SIMPLEMETER_KEY_ESTABLISHMENT_REQUEST_EVT );
- }
-
- if ( events & SIMPLEMETER_CONNECTED_EVT )
- {
- #if defined ( SE_UK_EXT ) && defined ( SE_MIRROR )
-
- zclSE_SimpleMetering_Send_ReqMirrorCmd(SIMPLEMETER_ENDPOINT, &ESPAddr, TRUE, 0);
- #endif
-
- osal_start_timerEx( simpleMeterTaskID, SIMPLEMETER_REPORT_ATTRIBUTE_EVT, SIMPLEMETER_REPORT_PERIOD );
- return ( events ^ SIMPLEMETER_CONNECTED_EVT );
- }
-
- if ( events & SIMPLEMETER_REPORT_ATTRIBUTE_EVT )
- {
- if ( pSeReportCmd != NULL )
- {
- zcl_SendReportCmd( SIMPLEMETER_ENDPOINT, &ESPAddr,
- ZCL_CLUSTER_ID_SE_SIMPLE_METERING, pSeReportCmd,
- ZCL_FRAME_SERVER_CLIENT_DIR, 1, 0 );
- osal_start_timerEx( simpleMeterTaskID, SIMPLEMETER_REPORT_ATTRIBUTE_EVT, SIMPLEMETER_REPORT_PERIOD );
- }
- return ( events ^ SIMPLEMETER_REPORT_ATTRIBUTE_EVT );
- }
-
- if ( events & SIMPLEMETER_IDENTIFY_TIMEOUT_EVT )
- {
- if ( simpleMeterIdentifyTime > 0 )
- {
- simpleMeterIdentifyTime--;
- }
- simplemeter_ProcessIdentifyTimeChange();
- return ( events ^ SIMPLEMETER_IDENTIFY_TIMEOUT_EVT );
- }
-
- if ( events & SIMPLEMETER_UPDATE_TIME_EVT )
- {
- simpleMeterTime = osal_getClock();
- osal_start_timerEx( simpleMeterTaskID, SIMPLEMETER_UPDATE_TIME_EVT, SIMPLEMETER_UPDATE_TIME_PERIOD );
- return ( events ^ SIMPLEMETER_UPDATE_TIME_EVT );
- }
-
- return 0;
- }
- static void simplemeter_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg )
- {
- if (pMsg->clusterID == Match_Desc_rsp)
- {
- ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( pMsg );
- if (pRsp)
- {
- if (pRsp->cnt)
- {
-
- ESPAddr.endPoint = pRsp->epList[0];
- ESPAddr.addr.shortAddr = pMsg->srcAddr.addr.shortAddr;
-
- osal_set_event( simpleMeterTaskID, SIMPLEMETER_KEY_ESTABLISHMENT_REQUEST_EVT);
- }
- osal_mem_free(pRsp);
- }
- }
- }
- static void simplemeter_ProcessIdentifyTimeChange( void )
- {
- if ( simpleMeterIdentifyTime > 0 )
- {
- osal_start_timerEx( simpleMeterTaskID, SIMPLEMETER_IDENTIFY_TIMEOUT_EVT, 1000 );
- HalLedBlink ( HAL_LED_4, 0xFF, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME );
- }
- else
- {
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- osal_stop_timerEx( simpleMeterTaskID, SIMPLEMETER_IDENTIFY_TIMEOUT_EVT );
- }
- }
- #if SECURE
- static uint8 simplemeter_KeyEstablish_ReturnLinkKey( uint16 shortAddr )
- {
- uint8 status = ZFailure;
- AddrMgrEntry_t entry;
-
- entry.user = ADDRMGR_USER_DEFAULT;
- entry.nwkAddr = shortAddr;
- if ( AddrMgrEntryLookupNwk( &entry ) )
- {
-
- if ( APSME_IsLinkKeyValid( entry.extAddr ) == TRUE )
- {
- status = ZSuccess;
- }
- }
- else
- {
-
- status = ZInvalidParameter;
- }
- return status;
- }
- #endif
- static void simplemeter_HandleKeys( uint8 shift, uint8 keys )
- {
-
- if ( shift )
- {
- if ( keys & HAL_KEY_SW_1 )
- {
- }
- if ( keys & HAL_KEY_SW_2 )
- {
- }
- if ( keys & HAL_KEY_SW_3 )
- {
- }
- if ( keys & HAL_KEY_SW_4 )
- {
- }
- }
- else
- {
- if ( keys & HAL_KEY_SW_1 )
- {
- ZDOInitDevice(0);
- }
- if ( keys & HAL_KEY_SW_2 )
- {
-
- zclSE_SimpleMetering_Send_RemMirrorCmd(SIMPLEMETER_ENDPOINT, &ESPAddr, TRUE, 0);
- }
- if ( keys & HAL_KEY_SW_3 )
- {
- }
- if ( keys & HAL_KEY_SW_4 )
- {
- }
- }
- }
- static uint8 simplemeter_ValidateAttrDataCB( zclAttrRec_t *pAttr, zclWriteRec_t *pAttrInfo )
- {
- uint8 valid = TRUE;
- switch ( pAttrInfo->dataType )
- {
- case ZCL_DATATYPE_BOOLEAN:
- if ( ( *(pAttrInfo->attrData) != 0 ) && ( *(pAttrInfo->attrData) != 1 ) )
- valid = FALSE;
- break;
- default:
- break;
- }
- return ( valid );
- }
- static void simplemeter_BasicResetCB( void )
- {
-
- }
- static void simplemeter_IdentifyCB( zclIdentify_t *pCmd )
- {
- simpleMeterIdentifyTime = pCmd->identifyTime;
- simplemeter_ProcessIdentifyTimeChange();
- }
- static void simplemeter_IdentifyQueryRspCB( zclIdentifyQueryRsp_t *pRsp )
- {
-
- }
- static void simplemeter_AlarmCB( zclAlarm_t *pAlarm )
- {
-
- }
- #ifdef SE_UK_EXT
- static void simplemeter_GetEventLogCB( uint8 srcEP, afAddrType_t *srcAddr,
- zclGetEventLog_t *pEventLog, uint8 seqNum )
- {
-
-
-
-
-
-
- }
- static void simplemeter_PublishEventLogCB( afAddrType_t *srcAddr, zclPublishEventLog_t *pEventLog )
- {
-
- }
- #endif
- static void simplemeter_GetProfileCmdCB( zclCCGetProfileCmd_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
- #if defined ( ZCL_SIMPLE_METERING )
-
-
-
-
-
- uint32 endTime;
- uint8 status = zclSE_SimpleMeter_GetProfileRsp_Status_Success;
- uint8 profileIntervalPeriod = PROFILE_INTERVAL_PERIOD_60MIN;
- uint8 numberOfPeriodDelivered = 5;
- uint24 intervals[] = {0xa00001, 0xa00002, 0xa00003, 0xa00004, 0xa00005};
-
-
-
-
-
-
-
-
-
-
- endTime = pCmd->endTime;
-
- zclSE_SimpleMetering_Send_GetProfileRsp( SIMPLEMETER_ENDPOINT, srcAddr, endTime,
- status,
- profileIntervalPeriod,
- numberOfPeriodDelivered, intervals,
- FALSE, seqNum );
- #endif
- }
- static void simplemeter_GetProfileRspCB( zclCCGetProfileRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_ReqMirrorRspCB( zclCCReqMirrorRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
- #if defined ( ZCL_SIMPLE_METERING )
- #if defined ( SE_UK_EXT ) && defined ( SE_MIRROR )
- if ( pCmd != NULL )
- {
- if (pCmd->endpointId == 0xFFFF)
- {
-
-
- }
- else
- {
-
- osal_memcpy(&mirrorAddr, srcAddr, sizeof(afAddrType_t));
- mirrorAddr.endPoint = pCmd->endpointId;
-
- if (pSeReportCmd)
- {
- zcl_SendReportCmd( SIMPLEMETER_ENDPOINT, &mirrorAddr,
- ZCL_CLUSTER_ID_SE_SIMPLE_METERING, pSeReportCmd,
- ZCL_FRAME_SERVER_CLIENT_DIR, 1, 0 );
- }
- if (pBasicReportCmd)
- {
- zcl_SendReportCmd( SIMPLEMETER_ENDPOINT, &mirrorAddr,
- ZCL_CLUSTER_ID_GEN_BASIC, pBasicReportCmd,
- ZCL_FRAME_SERVER_CLIENT_DIR, 1, 0 );
- }
- }
- }
- #endif
- #endif
- }
- static void simplemeter_MirrorRemRspCB( zclCCMirrorRemRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
- #if defined ( ZCL_SIMPLE_METERING )
- osal_stop_timerEx( simpleMeterTaskID, SIMPLEMETER_REPORT_ATTRIBUTE_EVT );
- #endif
- }
- #if defined ( SE_UK_EXT )
- static void simplemeter_GetSnapshotCmdCB( zclCCReqGetSnapshotCmd_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_TakeSnapshotCmdCB( afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_MirrorReportAttrRspCB( zclCCReqMirrorReportAttrRsp_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishTariffInformationCB( zclCCPublishTariffInformation_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishPriceMatrixCB( zclCCPublishPriceMatrix_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishBlockThresholdsCB( zclCCPublishBlockThresholds_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishConversionFactorCB( zclCCPublishConversionFactor_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishCalorificValueCB( zclCCPublishCalorificValue_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishCO2ValueCB( zclCCPublishCO2Value_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishCPPEventCB( zclCCPublishCPPEvent_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishBillingPeriodCB( zclCCPublishBillingPeriod_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishConsolidatedBillCB( zclCCPublishConsolidatedBill_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_PublishCreditPaymentInfoCB( zclCCPublishCreditPaymentInfo_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_ChangeDebtCB( zclCCChangeDebt_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_EmergencyCreditSetupCB( zclCCEmergencyCreditSetup_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_ConsumerTopupCB( zclCCConsumerTopup_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_CreditAdjustmentCB( zclCCCreditAdjustment_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_ChangePaymentModeCB( zclCCChangePaymentMode_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_GetPrepaySnapshotCB( zclCCGetPrepaySnapshot_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_GetTopupLogCB( uint8 numEvents,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_SetLowCreditWarningLevelCB( uint8 numEvents,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- static void simplemeter_GetDebtRepaymentLogCB( zclCCGetDebtRepaymentLog_t *pCmd,
- afAddrType_t *srcAddr, uint8 seqNum )
- {
-
- }
- #endif
- static void simplemeter_ProcessZCLMsg( zclIncomingMsg_t *pInMsg )
- {
- switch ( pInMsg->zclHdr.commandID )
- {
- #if defined ( ZCL_READ )
- case ZCL_CMD_READ_RSP:
- simplemeter_ProcessInReadRspCmd( pInMsg );
- break;
- #endif
- #if defined ( ZCL_WRITE )
- case ZCL_CMD_WRITE_RSP:
- simplemeter_ProcessInWriteRspCmd( pInMsg );
- break;
- #endif
- #if defined ( ZCL_REPORT )
- case ZCL_CMD_CONFIG_REPORT:
- simplemeter_ProcessInConfigReportCmd( pInMsg );
- break;
- case ZCL_CMD_CONFIG_REPORT_RSP:
- simplemeter_ProcessInConfigReportRspCmd( pInMsg );
- break;
- case ZCL_CMD_READ_REPORT_CFG:
- simplemeter_ProcessInReadReportCfgCmd( pInMsg );
- break;
- case ZCL_CMD_READ_REPORT_CFG_RSP:
- simplemeter_ProcessInReadReportCfgRspCmd( pInMsg );
- break;
- case ZCL_CMD_REPORT:
- simplemeter_ProcessInReportCmd( pInMsg );
- break;
- #endif
- case ZCL_CMD_DEFAULT_RSP:
- simplemeter_ProcessInDefaultRspCmd( pInMsg );
- break;
- #if defined ( ZCL_DISCOVER )
- case ZCL_CMD_DISCOVER_RSP:
- simplemeter_ProcessInDiscRspCmd( pInMsg );
- break;
- #endif
- default:
- break;
- }
- if ( pInMsg->attrCmd != NULL )
- {
-
- osal_mem_free( pInMsg->attrCmd );
- pInMsg->attrCmd = NULL;
- }
- }
- #if defined ( ZCL_READ )
- static uint8 simplemeter_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclReadRspCmd_t *readRspCmd;
- uint8 i;
- readRspCmd = (zclReadRspCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < readRspCmd->numAttr; i++)
- {
-
-
-
- }
- return TRUE;
- }
- #endif
- #if defined ( ZCL_WRITE )
- static uint8 simplemeter_ProcessInWriteRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclWriteRspCmd_t *writeRspCmd;
- uint8 i;
- writeRspCmd = (zclWriteRspCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < writeRspCmd->numAttr; i++)
- {
-
-
- }
- return TRUE;
- }
- #endif
- #if defined ( ZCL_REPORT )
- static uint8 simplemeter_ProcessInConfigReportCmd( zclIncomingMsg_t *pInMsg )
- {
- zclCfgReportCmd_t *cfgReportCmd;
- zclCfgReportRec_t *reportRec;
- zclCfgReportRspCmd_t *cfgReportRspCmd;
- zclAttrRec_t attrRec;
- uint8 status;
- uint8 i, j = 0;
- cfgReportCmd = (zclCfgReportCmd_t *)pInMsg->attrCmd;
-
- cfgReportRspCmd = (zclCfgReportRspCmd_t *)osal_mem_alloc( sizeof ( zclCfgReportRspCmd_t ) + \
- sizeof ( zclCfgReportStatus_t) * cfgReportCmd->numAttr );
- if ( cfgReportRspCmd == NULL )
- return FALSE;
-
- for ( i = 0; i < cfgReportCmd->numAttr; i++ )
- {
- reportRec = &(cfgReportCmd->attrList[i]);
- status = ZCL_STATUS_SUCCESS;
- if ( zclFindAttrRec( SIMPLEMETER_ENDPOINT, pInMsg->clusterId, reportRec->attrID, &attrRec ) )
- {
- if ( reportRec->direction == ZCL_SEND_ATTR_REPORTS )
- {
- if ( reportRec->dataType == attrRec.attr.dataType )
- {
-
- if ( zcl_MandatoryReportableAttribute( &attrRec ) == TRUE )
- {
- if ( reportRec->minReportInt < SIMPLEMETER_MIN_REPORTING_INTERVAL ||
- ( reportRec->maxReportInt != 0 &&
- reportRec->maxReportInt < reportRec->minReportInt ) )
- {
-
- status = ZCL_STATUS_INVALID_VALUE;
- }
- else
- {
-
-
- status = ZCL_STATUS_UNREPORTABLE_ATTRIBUTE;
- }
- }
- else
- {
-
- status = ZCL_STATUS_UNREPORTABLE_ATTRIBUTE;
- }
- }
- else
- {
-
- status = ZCL_STATUS_INVALID_DATA_TYPE;
- }
- }
- else
- {
-
- if ( zcl_MandatoryReportableAttribute( &attrRec ) == TRUE )
- {
-
-
- status = ZCL_STATUS_UNSUPPORTED_ATTRIBUTE;
- }
- else
- {
-
- status = ZCL_STATUS_UNSUPPORTED_ATTRIBUTE;
- }
- }
- }
- else
- {
-
- status = ZCL_STATUS_UNSUPPORTED_ATTRIBUTE;
- }
-
- if ( status != ZCL_STATUS_SUCCESS )
- {
- cfgReportRspCmd->attrList[j].status = status;
- cfgReportRspCmd->attrList[j++].attrID = reportRec->attrID;
- }
- }
- if ( j == 0 )
- {
-
-
-
- cfgReportRspCmd->attrList[0].status = ZCL_STATUS_SUCCESS;
- cfgReportRspCmd->numAttr = 1;
- }
- else
- {
- cfgReportRspCmd->numAttr = j;
- }
-
- zcl_SendConfigReportRspCmd( SIMPLEMETER_ENDPOINT, &(pInMsg->srcAddr),
- pInMsg->clusterId, cfgReportRspCmd, ZCL_FRAME_SERVER_CLIENT_DIR,
- TRUE, pInMsg->zclHdr.transSeqNum );
- osal_mem_free( cfgReportRspCmd );
- return TRUE ;
- }
- static uint8 simplemeter_ProcessInConfigReportRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclCfgReportRspCmd_t *cfgReportRspCmd;
- zclAttrRec_t attrRec;
- uint8 i;
- cfgReportRspCmd = (zclCfgReportRspCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < cfgReportRspCmd->numAttr; i++)
- {
- if ( zclFindAttrRec( SIMPLEMETER_ENDPOINT, pInMsg->clusterId,
- cfgReportRspCmd->attrList[i].attrID, &attrRec ) )
- {
-
-
- }
- }
- return TRUE;
- }
- static uint8 simplemeter_ProcessInReadReportCfgCmd( zclIncomingMsg_t *pInMsg )
- {
- zclReadReportCfgCmd_t *readReportCfgCmd;
- zclReadReportCfgRspCmd_t *readReportCfgRspCmd;
- zclReportCfgRspRec_t *reportRspRec;
- zclAttrRec_t attrRec;
- uint8 reportChangeLen;
- uint8 *dataPtr;
- uint8 hdrLen;
- uint8 dataLen = 0;
- uint8 status;
- uint8 i;
- readReportCfgCmd = (zclReadReportCfgCmd_t *)pInMsg->attrCmd;
-
- for ( i = 0; i < readReportCfgCmd->numAttr; i++ )
- {
-
-
- if ( zclFindAttrRec( SIMPLEMETER_ENDPOINT, pInMsg->clusterId,
- readReportCfgCmd->attrList[i].attrID, &attrRec ) )
- {
- if ( zclAnalogDataType( attrRec.attr.dataType ) )
- {
- reportChangeLen = zclGetDataTypeLength( attrRec.attr.dataType );
-
- if ( PADDING_NEEDED( reportChangeLen ) )
- reportChangeLen++;
- dataLen += reportChangeLen;
- }
- }
- }
- hdrLen = sizeof( zclReadReportCfgRspCmd_t ) + ( readReportCfgCmd->numAttr * sizeof( zclReportCfgRspRec_t ) );
-
- readReportCfgRspCmd = (zclReadReportCfgRspCmd_t *)osal_mem_alloc( hdrLen + dataLen );
- if ( readReportCfgRspCmd == NULL )
- return FALSE;
- dataPtr = (uint8 *)( (uint8 *)readReportCfgRspCmd + hdrLen );
- readReportCfgRspCmd->numAttr = readReportCfgCmd->numAttr;
- for (i = 0; i < readReportCfgCmd->numAttr; i++)
- {
- reportRspRec = &(readReportCfgRspCmd->attrList[i]);
- if ( zclFindAttrRec( SIMPLEMETER_ENDPOINT, pInMsg->clusterId,
- readReportCfgCmd->attrList[i].attrID, &attrRec ) )
- {
- if ( zcl_MandatoryReportableAttribute( &attrRec ) == TRUE )
- {
-
-
- status = ZCL_STATUS_UNREPORTABLE_ATTRIBUTE;
- if ( status == ZCL_STATUS_SUCCESS && zclAnalogDataType( attrRec.attr.dataType ) )
- {
- reportChangeLen = zclGetDataTypeLength( attrRec.attr.dataType );
-
- reportRspRec->reportableChange = dataPtr;
-
- if ( PADDING_NEEDED( reportChangeLen ) )
- reportChangeLen++;
- dataPtr += reportChangeLen;
- }
- }
- else
- {
-
- status = ZCL_STATUS_UNREPORTABLE_ATTRIBUTE;
- }
- }
- else
- {
-
- status = ZCL_STATUS_UNSUPPORTED_ATTRIBUTE;
- }
- reportRspRec->status = status;
- reportRspRec->attrID = readReportCfgCmd->attrList[i].attrID;
- }
-
- zcl_SendReadReportCfgRspCmd( SIMPLEMETER_ENDPOINT, &(pInMsg->srcAddr),
- pInMsg->clusterId, readReportCfgRspCmd, ZCL_FRAME_SERVER_CLIENT_DIR,
- TRUE, pInMsg->zclHdr.transSeqNum );
- osal_mem_free( readReportCfgRspCmd );
- return TRUE;
- }
- static uint8 simplemeter_ProcessInReadReportCfgRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclReadReportCfgRspCmd_t *readReportCfgRspCmd;
- zclReportCfgRspRec_t *reportRspRec;
- uint8 i;
- readReportCfgRspCmd = (zclReadReportCfgRspCmd_t *)pInMsg->attrCmd;
- for ( i = 0; i < readReportCfgRspCmd->numAttr; i++ )
- {
- reportRspRec = &(readReportCfgRspCmd->attrList[i]);
-
-
- if ( reportRspRec->status == ZCL_STATUS_SUCCESS )
- {
- if ( reportRspRec->direction == ZCL_SEND_ATTR_REPORTS )
- {
-
- }
- else
- {
-
- }
- }
- }
- return TRUE;
- }
- static uint8 simplemeter_ProcessInReportCmd( zclIncomingMsg_t *pInMsg )
- {
- zclReportCmd_t *reportCmd;
- uint8 i;
- reportCmd = (zclReportCmd_t *)pInMsg->attrCmd;
- for (i = 0; i < reportCmd->numAttr; i++)
- {
-
- }
- return TRUE;
- }
- #endif
- static uint8 simplemeter_ProcessInDefaultRspCmd( zclIncomingMsg_t *pInMsg )
- {
-
-
- return TRUE;
- }
- #if defined ( ZCL_DISCOVER )
- static uint8 simplemeter_ProcessInDiscRspCmd( zclIncomingMsg_t *pInMsg )
- {
- zclDiscoverRspCmd_t *discoverRspCmd;
- uint8 i;
- discoverRspCmd = (zclDiscoverRspCmd_t *)pInMsg->attrCmd;
- for ( i = 0; i < discoverRspCmd->numAttr; i++ )
- {
-
- }
- return TRUE;
- }
- #endif
|