#!/usr/bin/env python # @(#) $Id: acspyexmplFridgeNCClient.py,v 1.21 2006/03/30 17:45:14 dfugate Exp $ #******************************************************************************* # ALMA - Atacama Large Millimiter Array # (c) Associated Universities Inc., 2002 # (c) European Southern Observatory, 2002 # Copyright by ESO (in the framework of the ALMA collaboration) # and Cosylab 2002, All rights reserved # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # ''' DESCRIPTION This example shows how to consume events from a notification channel in Python using the standard FRIDGE::temperatureDataBlockEvent example. Unlike Fridge Event Channel Consumer, this script forces events to be published by invoking some methods on a C++ Fridge component which contains a FRIDGE::temperatureDataBlockEvent event Supplier. WHAT CAN I GAIN FROM THIS EXAMPLE? - PySimpleClient usage. - Accessing (remote) components. - Consumer class usage. - Consuming events. - Implementation of so-called handler functions to process event data. LINKS - Fridge IDL Documentation ''' #--REGULAR IMPORTS------------------------------------------------------------- from time import sleep #--CORBA STUBS----------------------------------------------------------------- import FRIDGE from ACS import CBDescIn #--ACS Imports----------------------------------------------------------------- from Acspy.Nc.Consumer import Consumer from Acspy.Clients.SimpleClient import PySimpleClient from Acspy.Common.Log import getLogger #--GLOBALS--------------------------------------------------------------------- #count is a global integer used to make sure we don't print more than five #events to standard out. really this is done just to make this module's modular # test happy. count = 0 LOGGER = getLogger("FridgeNCClient") #------------------------------------------------------------------------------ def fridgeDataHandler(someParam): ''' This function serves only one purpose...it must do something with the extracted data from the structured event. That is, it must be capable of processing filterable_data[0].any in the structured event. We can be certain of the real type of someParam because handlers are registered only for specific types (i.e., the type_name field of a structured event). Parameters: someParam is the real CORBA type extracted from the CORBA Any at filterable_data[0]. In this case, it will always be a FRIDGE.temperatureDataBlockEvent. Returns: event handler functions return nothing. Raises: If any exception is thrown by this function, the Consumer class will catch it and call processEvent(...) which will hopefully have been overriden. ''' global count if count < 5: count = count + 1 LOGGER.logInfo('The temperature difference is ' + str(someParam.absoluteDiff)) return #------------------------------------------------------------------------------ if __name__ == "__main__": print 'Making sure there is a fridge available...' #Start publishing events through a C++ Supplier simpleClient = PySimpleClient() aFridge = simpleClient.getComponent("FRIDGE1") aFridge.on() #Create a FridgeConsumer simpleClient.getLogger().logInfo('Creating FridgeConsumer') g = Consumer(FRIDGE.CHANNELNAME_FRIDGE) #Subscribe to temperatureDataBlockEvent events and register this handler to process #those events g.addSubscription(FRIDGE.temperatureDataBlockEvent, fridgeDataHandler) #Let the Notification Service know we are ready to start processing events. g.consumerReady() #After five events have been received, disconnect from the channel simpleClient.getLogger().logInfo("Waiting for events . . .") while(count<5): sleep(1) simpleClient.getLogger().logInfo("Events all done . . . exiting") g.disconnect() #Turn the C++ Fridge device off. aFridge.off() # Release it simpleClient.releaseComponent("FRIDGE1") simpleClient.disconnect() #------------------------------------------------------------------------------