Receiving Channel Data based on Conditions

Conditional listening enables you to receive sensor data feeds based on a specific condition. For example, you can choose to receive sensor feeds that are only movement specific.

Before listening for channel data, you must open the sensor channel.

  1. Create channel condition items using CSensrvChannelCondition constructor. These conditions can be used to filter the sensor data feeds.
    //Comparison values needed for condition
    ...
    TInt firstNumber=45;
    HBufC8 *firstBufNumber=NULL;
    InetProtTextUtils::ConvertIntToDescriptorL(firstNumber,firstBufNumber);
    CleanupStack::PushL(firstBufNumber);
    
    TInt secondNumber=150;
    HBufC8 *secondBufNumber=NULL;
    InetProtTextUtils::ConvertIntToDescriptorL(secondNumber,secondBufNumber);
    CleanupStack::PushL(secondBufNumber);
    
    //Creates a SingleLimit Condition with a GreaterThan operator
    CSensrvChannelCondition *firstCondition = CSensrvChannelCondition::NewL(ESensrvSingleLimitCondition,ESensrvOperatorGreaterThan,1,*firstBufNumber);
    
    //Creates a SingleLimit Condition with a LessThan operator
    CSensrvChannelCondition *secondCondition = CSensrvChannelCondition::NewL(ESensrvSingleLimitCondition,ESensrvOperatorLessThan,2,*secondBufNumber);
  2. Create a channel condition set using CSensrvChannelConditionSet constructor. Add the condition items to the condition set using the CSensrvChannelConditionSet::AddConditionL() function.
    //Creates a ConditionSet with ConditionType OR 
        CSensrvChannelConditionSet *ConditionSet=CSensrvChannelConditionSet::NewLC(ESensrvAndConditionSet);
        
        //Add channel1 and channel2 to conditonset
        ConditionSet->AddChannelConditionL(firstCondition);
        ConditionSet->AddChannelConditionL(secondCondition);
  3. Add the condition set to the required channel using the CSensrvChannel::AddConditionL() function.
    CSensrvChannel* channel;
    channel->AddConditionL(*ConditionSet);   
    
  4. Create a condition listener implementation for the MSensrvChannelConditionListener interface, which listens for sensor data feeds based on CSensrvChannelConditionSet.
    class ConditionListener:public MSensrvChannelConditionListener
        {
        public:
            void ConditionMet(CSensrvChannel &aChannel, CSensrvChannelConditionSet &aChannelConditionSet, TDesC8 &avalue)
            {
            ...
             //Implementation
            }
        void ConditionError(CSensrvChannel &aChannel, TSensrvErrorSeverity aError)
            {
            ...
             //Implementation
            }
        void GetChannelConditionListenerInterfaceL(TUid aInterfaceUid, TAny *&aInterface)
            {
            ...
             //Implementation
            }
        };
  5. Start conditional listening by passing an instance of the condition listener implementation, using the CSensrvChannel::StartConditionListeningL() function.
    //Instance of the condition listener implementation
    ConditionListener conditionListener;   
    ...
    channel->StartConditionListeningL(conditionListener,1,1);
    ...
  6. Once you get the required sensor data feeds from the sensor channel based on the conditions set, you can stop conditional listening using the CSensrvChannel::StopConditionListening() function.
    channel->StopConditionListening();
    

End the session with the sensor channel using the CSensrvChannel::CloseChannel() function.