#!/usr/bin/env python
#*******************************************************************************
# 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
#
# @(#) $Id: acspyexmplMountCallback.py,v 1.10 2006/03/30 16:58:36 dfugate Exp $
#------------------------------------------------------------------------------
'''
DESCRIPTION
Mount Callback is a complex example of a PySimpleClient which provides the
complete implementation of a BACI callback class and then retrieves a reference
to one of a Mount components
BACI properties. Once it is has the BACI property, a monitor is created which
is destroyed after ten seconds.
WHAT CAN I GAIN FROM THIS EXAMPLE?
- PySimpleClient usage.
- Accessing (remote) components.
- Manipulating BACI properties.
- Providing your own implementation of callback classes instead of using the Acspy.Common.Callbacks package.
- Creating monitors for BACI properties.
LINKS
- MyMonitor Class Documentation
- Mount IDL Documentation
'''
#------------------------------------------------------------------------------
from Acspy.Clients.SimpleClient import PySimpleClient # Import the acspy.PySimpleClient class
import ACS, ACS__POA # Import the Python CORBA stubs for BACI
from omniORB.CORBA import TRUE, FALSE
#------------------------------------------------------------------------------
#First a callback implementation class must be defined
class MyMonitor(ACS__POA.CBdouble):
#------------------------------------------------------------------------------
'''
This class defines the method(s) that will be invoked asynchronously by the
mount device for any monitors we may create.
'''
#------------------------------------------------------------------------------
def __init__ (self, propName = None):
'''
If the propertys name is specified, it is printed to STDOUT later on.
'''
self.count = 0
if propName != None:
self.propName = propName
else:
self.propName = "NoName"
#------------------------------------------------------------------------------
def __del__(self):
'''
Do nothing
'''
#------------------------------------------------------------------------------
def working (self, value, completion, desc):
'''
Really this is the method that does all the work and the developer should
be concerned with.
Parameters: value = the double we are interested in
completion = completion structure
desc = callback struct description
'''
self.count = self.count + 1
if self.count <= 5:
print "Working: ", str(self.propName), " is ", str(value)
#------------------------------------------------------------------------------
def done (self, value, completion, desc):
'''
Invoked asynchronously when the DO has finished. Normally this is invoked
just before a monitor is destroyed.
Parameters: value = the final value of the double we are interested in
completion = completion structure
desc = callback struct description
'''
print "Done: ", str(self.propName), " is ", str(value)
#------------------------------------------------------------------------------
def negotiate (self, time_to_transmit, desc):
'''
For simplicitys sake, we always return true. If you want more detailed,
information on this method, please see the BACI specs.
Parameters: See the BACI specs.
'''
return TRUE
#------------------------------------------------------------------------------
# Make an instance of the PySimpleClient
simpleClient = PySimpleClient()
# Do something on a device.
simpleClient.getLogger().logInfo("We can directly manipulate a device once we get it, which is easy!!")
# Get the standard MOUNT1 Mount device
mount = simpleClient.getComponent("MOUNT1")
# Get the actAz property
actAzProperty = mount._get_actAz()
# Create a callback monitor for the actAz Property
cbMon = MyMonitor("actAz")
# Activate the callback monitor
cbMonServant = simpleClient.activateOffShoot(cbMon)
# Create the real monitor registered with MOUNT1
desc = ACS.CBDescIn(0L, 0L, 0L)
actMon = actAzProperty.create_monitor(cbMonServant, desc)
# Tell MOUNT1 that the monitor's working method should be invoked 1 once second
actMon.set_timer_trigger(10000000)
# destroy the monitor after ten seconds
from time import sleep
sleep(10)
actMon.destroy()
sleep(5)
# Release it
simpleClient.releaseComponent("MOUNT1")
simpleClient.disconnect()
print "The end __oOo__"