/*******************************************************************************
* ALMA - Atacama Large Millimiter Array
* (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
*/
package alma.TT;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import alma.ACS.ROdoubleSeq;
import alma.ACS.ROdoubleSeqHelper;
import alma.ACS.ROdoubleSeqPOATie;
import alma.ACS.ROfloatSeq;
import alma.ACS.ROfloatSeqHelper;
import alma.ACS.ROfloatSeqPOATie;
import alma.ACS.ROlongSeq;
import alma.ACS.ROlongSeqHelper;
import alma.ACS.ROlongSeqPOATie;
import alma.ACS.ROpattern;
import alma.ACS.ROpatternHelper;
import alma.ACS.ROpatternPOATie;
import alma.ACS.RWdoubleSeq;
import alma.ACS.RWdoubleSeqHelper;
import alma.ACS.RWdoubleSeqPOATie;
import alma.ACS.RWfloatSeq;
import alma.ACS.RWfloatSeqHelper;
import alma.ACS.RWfloatSeqPOATie;
import alma.ACS.RWlongSeq;
import alma.ACS.RWlongSeqHelper;
import alma.ACS.RWlongSeqPOATie;
import alma.ACS.impl.CharacteristicComponentImpl;
import alma.ACS.impl.ROdoubleSeqImpl;
import alma.ACS.impl.ROfloatSeqImpl;
import alma.ACS.impl.ROlongSeqImpl;
import alma.ACS.impl.ROpatternImpl;
import alma.ACS.impl.RWdoubleSeqImpl;
import alma.ACS.impl.RWfloatSeqImpl;
import alma.ACS.impl.RWlongSeqImpl;
import alma.ACS.jbaci.DataAccess;
import alma.ACS.jbaci.DataAccessSupport;
import alma.ACS.jbaci.MemoryDataAccess;
import alma.ACSErr.CompletionHolder;
import alma.ACSErrTypeCommon.wrappers.AcsJCouldntPerformActionEx;
import alma.acs.component.ComponentLifecycleException;
import alma.acs.container.ContainerServices;
import alma.acs.exceptions.AcsJException;
/**
* Implementation of <code>test.jbaci.SimpleMasterComponent</code>.
* @author <a href="mailto:cmenayATcsrg.inf.utfsm.cl">Camilo Menay</a>
* @version $id$
*/
public class SeqComponentImpl extends CharacteristicComponentImpl
implements SeqComponentOperations {
//protected ROdouble readback;
//protected RWdouble current;
protected ROpattern status;
protected ROlongSeq longSeqRO;
protected RWlongSeq longSeqRW;
protected ROdoubleSeq doubleSeqRO;
protected RWdoubleSeq doubleSeqRW;
protected ROfloatSeq floatSeqRO;
protected RWfloatSeq floatSeqRW;
/**
* @see alma.acs.component.ComponentLifecycle#initialize(alma.acs.container.ContainerServices)
*/
public void initialize(ContainerServices containerServices)
throws ComponentLifecycleException {
super.initialize(containerServices);
try
{
DataAccess currentDataAccess = new MemoryDataAccess();
DataAccess currentDataAccess2 = new MemoryDataAccess();
DataAccess currentDataAccess3 = new MemoryDataAccess();
ROlongSeqImpl readbackLongSeqImpl = new ROlongSeqImpl("longSeqRO", this, new readbackLongSeqDataAccess());
ROlongSeqPOATie readbackLongSeqTie = new ROlongSeqPOATie(readbackLongSeqImpl);
longSeqRO = ROlongSeqHelper.narrow(this.registerProperty(readbackLongSeqImpl, readbackLongSeqTie));
RWlongSeqImpl readbackLongSeqRWImpl = new RWlongSeqImpl("longSeqRW", this, currentDataAccess2);
RWlongSeqPOATie readbackLongSeqRWTie = new RWlongSeqPOATie(readbackLongSeqRWImpl);
longSeqRW = RWlongSeqHelper.narrow(this.registerProperty(readbackLongSeqRWImpl, readbackLongSeqRWTie));
ROdoubleSeqImpl readbackDoubleSeqImpl = new ROdoubleSeqImpl("doubleSeqRO", this, new readbackDoubleSeqDataAccess());
ROdoubleSeqPOATie readbackDoubleSeqTie = new ROdoubleSeqPOATie(readbackDoubleSeqImpl);
doubleSeqRO = ROdoubleSeqHelper.narrow(this.registerProperty(readbackDoubleSeqImpl, readbackDoubleSeqTie));
RWdoubleSeqImpl readbackDoubleSeqRWImpl = new RWdoubleSeqImpl("doubleSeqRW", this, currentDataAccess);
RWdoubleSeqPOATie readbackDoubleSeqRWTie = new RWdoubleSeqPOATie(readbackDoubleSeqRWImpl);
doubleSeqRW = RWdoubleSeqHelper.narrow(this.registerProperty(readbackDoubleSeqRWImpl, readbackDoubleSeqRWTie));
ROfloatSeqImpl readbackFloatSeqImpl = new ROfloatSeqImpl("floatSeqRO", this, new readbackFloatSeqDataAccess());
ROfloatSeqPOATie readbackFloatSeqTie = new ROfloatSeqPOATie(readbackFloatSeqImpl);
floatSeqRO = ROfloatSeqHelper.narrow(this.registerProperty(readbackFloatSeqImpl, readbackFloatSeqTie));
RWfloatSeqImpl readbackFloatSeqRWImpl = new RWfloatSeqImpl("floatSeqRW", this, currentDataAccess3);
RWfloatSeqPOATie readbackFloatSeqRWTie = new RWfloatSeqPOATie(readbackFloatSeqRWImpl);
floatSeqRW = RWfloatSeqHelper.narrow(this.registerProperty(readbackFloatSeqRWImpl, readbackFloatSeqRWTie));
ROpatternImpl statusImpl = new ROpatternImpl("status", this, new StatusDataAccess());
ROpatternPOATie statusTie = new ROpatternPOATie(statusImpl);
status = ROpatternHelper.narrow(this.registerProperty(statusImpl, statusTie));
}
catch (Throwable th)
{
throw new ComponentLifecycleException("Failed to create properties.", th);
}
}
/******************* [ Implementations of actions ] *******************/
/**
* On/off state.
*/
protected AtomicBoolean onState = new AtomicBoolean(false);
/**
* Implementation of 'on' method.
* @throws ACS exception on any failure.
*/
public synchronized void onImpl() throws AcsJException
{
if (onState.getAndSet(true) == true)
throw new AcsJCouldntPerformActionEx("Already 'on'.");
}
/**
* Implementation of 'off' method.
* @throws ACS exception on any failure.
*/
public synchronized void offImpl() throws AcsJException
{
if (onState.getAndSet(false) == false)
throw new AcsJCouldntPerformActionEx("Already 'off'.");
}
/**
* Implementation of 'reset' method.
* @throws ACS exception on any failure.
*/
public void resetImpl() throws AcsJException
{
if (onState.get() == false)
throw new AcsJCouldntPerformActionEx("In 'off' state.");
}
/******************* [ DataAccess implementations ] *******************/
protected class StatusDataAccess extends DataAccessSupport
{
/**
* @see alma.ACS.jbaci.DataAccess#initializeValue()
*/
public boolean initializeValue() {
return false;
}
/**
* @see alma.ACS.jbaci.DataAccess#get(alma.ACSErr.CompletionHolder)
*/
public Object get(CompletionHolder completionHolder)
throws AcsJException {
return new Integer(onState.get() ? 1 : 0);
}
/**
* @see alma.ACS.jbaci.DataAccess#set(java.lang.Object, alma.ACSErr.CompletionHolder)
*/
public void set(Object value, CompletionHolder completion)
throws AcsJException {
if ((((Integer)value).intValue() % 2) == 1)
onImpl();
else
offImpl();
// TODO no notify here...
}
}
/**
* Implementation of readback data access (adds some random noise and responds to on/off status).
*/
protected class readbackLongSeqDataAccess implements DataAccess
{
/**
* Noise random generator.
*/
protected Random noise = new Random();
/**
* @see alma.ACS.jbaci.DataAccess#addValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void addValueChangeListener(ValueChangeListener listener)
throws OnChangeNotSupportedException {
// we do not support on-change notifications,
// as default implementation of MemoryDataAccess does
// but can be done simply by registering ValueChangeListener on sourceSignals
// recommend 1s pooling
throw new OnChangeNotSupportedException(1000);
}
/**
* @see alma.ACS.jbaci.DataAccess#removeValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void removeValueChangeListener(ValueChangeListener listener) {
// noop
}
/**
* @see alma.ACS.jbaci.DataAccess#initializeValue()
*/
public boolean initializeValue() {
return false;
}
/**
* @see alma.ACS.jbaci.DataAccess#get(alma.ACSErr.CompletionHolder)
*/
public Object get(CompletionHolder completionHolder)
throws AcsJException {
// random
int max = ( Math.abs(noise.nextInt()) % 30 ) +1;
int [] a = new int[max];
for (int i= 0;i< max; i++)
a[i] = Math.abs(noise.nextInt()) % 10000;
return a;
}
/**
* @see alma.ACS.jbaci.DataAccess#set(java.lang.Object, alma.ACSErr.CompletionHolder)
*/
public void set(Object value, CompletionHolder completion)
throws AcsJException {
throw new AcsJCouldntPerformActionEx("'RO only' cannot be set.");
}
}
/**
*
*
* DoubleSeq
*
*/
protected class readbackDoubleSeqDataAccess implements DataAccess
{
/**
* Noise random generator.
*/
protected Random noise = new Random();
/**
* @see alma.ACS.jbaci.DataAccess#addValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void addValueChangeListener(ValueChangeListener listener)
throws OnChangeNotSupportedException {
// we do not support on-change notifications,
// as default implementation of MemoryDataAccess does
// but can be done simply by registering ValueChangeListener on sourceSignals
// recommend 1s pooling
throw new OnChangeNotSupportedException(1000);
}
/**
* @see alma.ACS.jbaci.DataAccess#removeValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void removeValueChangeListener(ValueChangeListener listener) {
// noop
}
/**
* @see alma.ACS.jbaci.DataAccess#initializeValue()
*/
public boolean initializeValue() {
return false;
}
/**
* @see alma.ACS.jbaci.DataAccess#get(alma.ACSErr.CompletionHolder)
*/
public Object get(CompletionHolder completionHolder)
throws AcsJException {
// random
int max = ( Math.abs(noise.nextInt()) % 30 ) +1;
double [] a = new double[max];
for (int i= 0;i< max; i++)
a[i] = Math.abs(noise.nextDouble());
return a;
}
/**
* @see alma.ACS.jbaci.DataAccess#set(java.lang.Object, alma.ACSErr.CompletionHolder)
*/
public void set(Object value, CompletionHolder completion)
throws AcsJException {
throw new AcsJCouldntPerformActionEx("'RO only' cannot be set.");
}
}
/**
*
* floatSeq
*
*/
protected class readbackFloatSeqDataAccess implements DataAccess
{
/**
* Noise random generator.
*/
protected Random noise = new Random();
/**
* @see alma.ACS.jbaci.DataAccess#addValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void addValueChangeListener(ValueChangeListener listener)
throws OnChangeNotSupportedException {
// we do not support on-change notifications,
// as default implementation of MemoryDataAccess does
// but can be done simply by registering ValueChangeListener on sourceSignals
// recommend 1s pooling
throw new OnChangeNotSupportedException(1000);
}
/**
* @see alma.ACS.jbaci.DataAccess#removeValueChangeListener(alma.ACS.jbaci.DataAccess.ValueChangeListener)
*/
public void removeValueChangeListener(ValueChangeListener listener) {
// noop
}
/**
* @see alma.ACS.jbaci.DataAccess#initializeValue()
*/
public boolean initializeValue() {
return false;
}
/**
* @see alma.ACS.jbaci.DataAccess#get(alma.ACSErr.CompletionHolder)
*/
public Object get(CompletionHolder completionHolder)
throws AcsJException {
// random
int max = ( Math.abs(noise.nextInt()) % 30 ) +1;
float [] a = new float[max];
for (int i= 0;i< max; i++)
a[i] = Math.abs(noise.nextFloat());
return a;
}
/**
* @see alma.ACS.jbaci.DataAccess#set(java.lang.Object, alma.ACSErr.CompletionHolder)
*/
public void set(Object value, CompletionHolder completion)
throws AcsJException {
throw new AcsJCouldntPerformActionEx("'RO only' cannot be set.");
}
}
/**
*
* Methods for returning the properties
*
*
*/
public RWdoubleSeq doubleSeqRW() {
return doubleSeqRW;
}
public ROdoubleSeq doubleSeqRO() {
return doubleSeqRO;
}
public RWfloatSeq floatSeqRW() {
return floatSeqRW;
}
public ROfloatSeq floatSeqRO() {
return floatSeqRO;
}
public RWlongSeq longSeqRW() {
return longSeqRW;
}
public ROlongSeq longSeqRO() {
return longSeqRO;
}
public ROpattern status() {
return status;
}
}