From 97f713ab4d48866e14a28d02f85ccc56214ca72e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni <giuseppecarboni89@live.com> Date: Tue, 8 Apr 2025 17:04:43 +0200 Subject: [PATCH] Integration of new SRT LDO derotators into centos_7_compatibility branch (#925) * Moved some method from GenericDerotator to SRTKBandDerotator The methods were not generic, they were specific methods of the old SRTKBandDerotator decommissioned interface. These methods are not even called by the DewarPositioner component, therefore it was safe to remove them from the GenericDerotator interface. * Moved another unused method * Updated GenericDerotator interface * Fix #865, fix #869, updated SRTMinorServo component The component now handles correctly a SETUP command. The component is also capable of commanding the gregorian air blade with the 'setGregorianAirBladeStatus' command. A few bugs were fixed here and there. This branch MUST be tested with the real hardware before merging it onto the centos_7_compatibility branch. * Fixed small bug * Removed redundant script * Uploading files in order to test a clean repository * Updated PyDewarPositioner for Python 3 * First LDO Derotators working implementation This commit also brings some clean up inside the SRT test CDB. All the stuff that is not used in the production environment has been moved out of the production and test environment and into the Outdated CDB. * KBand derotator updates * Moved SRTDerotators out of SRTMinorServoBossCore Each derotator now has its thread for updating its status --- .../idl/GenericDerotator.idl | 51 +- .../config/CDB/schemas/DewarPositioner.xsd | 1 + .../DewarPositioner/DewarPositionerImpl.py | 176 +++--- .../src/DewarPositioner/cdbconf.py | 1 + .../src/DewarPositioner/posgenerator.py | 135 ++--- .../src/DewarPositioner/positioner.py | 115 ++-- .../NoiseGenerator/NoiseGenerator.xml | 18 - .../BACKENDS/XBackends/XBackends.xml | 17 - .../{PFP/PFP.xml => DR_GFR1/DR_GFR1.xml} | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 4 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/SRP.xml | 3 +- .../MACI/Components/RECEIVERS/LO_LP/LO_LP.xml | 18 - .../SRTIFDistributor/SRTIFDistributor.xml | 18 - .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 18 - .../HolographyContainer.xml | 30 - .../HolographyDXCContainer.xml | 30 - .../LocalOscillatorLPContainer.xml | 37 -- .../LocalOscillatorsContainer.xml | 37 -- .../NoiseGeneratorContainer.xml | 30 - .../PyIFDistributorContainer.xml | 27 - .../SRTLPBandContainer/SRTLPBandContainer.xml | 35 -- .../MACI/Containers/XContainer/XContainer.xml | 29 - .../DewarPositioner/KKG/Mapping/Mapping.xml | 2 +- .../DR_GFR1/Properties/Properties.xml | 18 + .../MinorServo/PFP/Properties/Properties.xml | 36 -- .../DataBlock/MinorServo/Tabella Setup.csv | 2 +- SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml | 40 ++ SRT/CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../DewarPositioner/DewarPositioner.xml | 3 +- .../Components/MINORSERVO/DR_GFR1/DR_GFR1.xml | 14 + .../DewarPositioner/KKG/Mapping/Mapping.xml | 2 +- .../DR_GFR1/Properties/Properties.xml | 18 + .../CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml | 40 ++ .../CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../DewarPositioner/DewarPositioner.xml | 3 +- .../idl/SRTDerotator.idl | 44 ++ .../idl/SRTMinorServo.idl | 55 +- .../idl/SRTMinorServoCommon.midl | 60 ++ .../SRTMinorServoInterface/src/Makefile | 3 +- .../idl/SRTKBandDerotator.idl | 47 +- .../include/SRTMinorServoContainers.h | 23 +- .../app-defaults/simulationStartup.xml | 10 +- .../Components/MINORSERVO/DR_GFR2/DR_GFR2.xml | 14 + .../Components/MINORSERVO/DR_GFR3/DR_GFR3.xml | 14 + .../Components/MINORSERVO/DR_PFP/DR_PFP.xml | 14 + .../MACI/Components/MINORSERVO/PFP/PFP.xml | 5 +- .../SRTSBandMFReceiver/SRTSBandMFReceiver.xml | 0 .../TestNamespace/Positioner/Positioner.xml | 0 .../Positioner00/Positioner00.xml | 0 .../Positioner01/Positioner01.xml | 0 .../Positioner02/Positioner02.xml | 0 .../Positioner03/Positioner03.xml | 0 .../AntennaBossSimContainer.xml | 0 .../PositionerContainer.xml | 0 .../Containers/PyLOContainer/PyLOContainer.py | 0 .../SRTSBandContainer/SRTSBandContainer.xml | 0 .../DR_GFR2/Properties/Properties.xml | 18 + .../DR_GFR3/Properties/Properties.xml | 18 + .../DR_PFP/Properties/Properties.xml | 18 + .../CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml | 40 ++ .../CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml | 40 ++ .../CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml | 40 ++ .../CDB/alma/MINORSERVO/PFP/PFP.xml | 0 .../config/CDB/schemas/SRTMinorServo.xsd | 45 +- SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 15 +- .../SRTMinorServo/include/SRTDerotatorImpl.h | 545 ++++++++++++++++++ .../include/SRTDerotatorStatusThread.h | 63 ++ SRT/Servers/SRTMinorServo/src/Makefile | 8 +- .../SRTMinorServo/src/SRTDerotatorImpl.cpp | 490 ++++++++++++++++ .../src/SRTDerotatorStatusThread.cpp | 46 ++ 71 files changed, 1974 insertions(+), 726 deletions(-) delete mode 100644 SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml delete mode 100644 SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml rename SRT/CDB/MACI/Components/MINORSERVO/{PFP/PFP.xml => DR_GFR1/DR_GFR1.xml} (70%) delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml delete mode 100644 SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/XContainer/XContainer.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml rename SRT/{ => Outdated}/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml (100%) create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml rename SRT/{Configuration => Outdated}/CDB/alma/MINORSERVO/PFP/PFP.xml (100%) create mode 100644 SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp diff --git a/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl b/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl index c336518c0..4a2a2ab70 100644 --- a/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl +++ b/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl @@ -43,10 +43,7 @@ module Receivers { * <h3>Methods</h3>: * <ul> * <li>setup(): allow the derotator to be ready to move</li> - * <li>powerOff(): switch the power amplifier off </li> * <li>setPosition(): set the derotator position</li> - * <li>setSpeed(): set the derotator speed, in rpm</li> - * <li>getSpeed(): get the derotator speed, in rpm</li> * <li>getActPosition(): return the actPosition value</li> * <li>getCmdPosition(): return the cmdPosition value</li> * <li>getPositionFromHistory(t): return the the derotator position at @@ -61,7 +58,8 @@ module Receivers { * <li>isSlewing(): return true when the derotator is moving</li> * </ul> */ - interface GenericDerotator : ACS::CharacteristicComponent { + interface GenericDerotator + { /** * This property returns the sensor encoder position in the user @@ -125,14 +123,6 @@ module Receivers { ); - /** Switch the power amplifier off - * - * @throw CORBA::SystemException - * @throw ComponentErrors::ComponentErrorsEx - */ - void powerOff() raises (ComponentErrors::ComponentErrorsEx); - - /** * @return the actPosition property value * @@ -147,6 +137,17 @@ module Receivers { ); + /** + * This method loads a position that has to be tracked by the derotator + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the derotator and the points after are always spaced by the same amount of time from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param position the position to track at the given time + * @param restart flag that says the given point is the first of a new trajectory + */ + void loadTrackingPoint(in ACS::Time point_time, in double position, in boolean restart) raises (DerotatorErrors::DerotatorErrorsEx); + + /** * @return the cmdPosition property value * @@ -178,32 +179,6 @@ module Receivers { double getPositionFromHistory(in ACS::Time t) raises (ComponentErrors::ComponentErrorsEx); - /** - * Set the derotator speed - * - * @arg speed speed in rpm - * @throw ComponentErrors::ComponentErrorsEx, - * @throw DerotatorErrors::DerotatorErrorsEx - */ - void setSpeed(in unsigned long speed) raises ( - ComponentErrors::ComponentErrorsEx, - DerotatorErrors::DerotatorErrorsEx - ); - - - /** - * Get the derotator speed - * - * @return the derotator speed in rpm - * @throw ComponentErrors::ComponentErrorsEx, - * @throw DerotatorErrors::DerotatorErrorsEx - */ - unsigned long getSpeed() raises ( - ComponentErrors::ComponentErrorsEx, - DerotatorErrors::DerotatorErrorsEx - ); - - /** * Return the maximum position value allowed. * @throw CORBA::SystemException diff --git a/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd b/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd index d9bb3de64..45d7b2f39 100644 --- a/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd +++ b/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd @@ -25,6 +25,7 @@ <!--xs:attribute name="actionThreadStackSize" type="xs:unsignedLong" use="optional" default="1024" /> <xs:attribute name="monitoringThreadStackSize" type="xs:unsignedLong" use="optional" default="2048" /--> <xs:attribute name="UpdatingTime" type="xs:double" use="required" /> + <xs:attribute name="TrackingLeadTime" type="xs:double" use="required" /> <xs:attribute name="RewindingSleepTime" type="xs:double" use="required" /> <xs:attribute name="RewindingTimeout" type="xs:double" use="required" /> <xs:attribute name="DefaultConfiguration" type="xs:string" use="required" /> diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py index f41d8a955..2d03721d2 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py @@ -75,9 +75,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.supplier = Supplier(Receivers.DEWAR_POSITIONER_DATA_CHANNEL) except CORBAProblemExImpl as ex: logger.logError('cannot create the dewar positioner data channel') - logger.logDebug('cannot create the data channel: %s' %ex.message) + logger.logDebug('cannot create the data channel: %s' %ex) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) try: @@ -89,9 +89,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.statusThread.start() except AttributeError as ex: logger.logWarning('supplier not available') - logger.logDebug('supplier not available: %s' %ex.message) + logger.logDebug('supplier not available: %s' %ex) except Exception as ex: - logger.logError('cannot create the status thread: %s' %ex.message) + logger.logError('cannot create the status thread: %s' %ex) def initialize(self): addProperty(self, 'status', devio_ref=StatusDevIO(self.positioner)) @@ -104,9 +104,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): if self.statusThread.isAlive(): logger.logError('thread %s is alive' %self.statusThread.getName()) except AttributeError as ex: - logger.logDebug('self has no attribute `supplier`: %s' %ex.message) + logger.logDebug('self has no attribute `supplier`: %s' %ex) except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) finally: self.control.stop = False @@ -119,15 +119,15 @@ class DewarPositionerImpl(POA, cc, services, lcycle): deviceName = self.cdbconf.getAttribute('DerotatorName') device = self.client.getComponent(deviceName) except CannotGetComponentEx as ex: - reason = "cannot get the %s component: %s" %(deviceName, ex.message) + reason = "cannot get the %s component: %s" %(deviceName, ex) logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() try: @@ -137,7 +137,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): latitude_dec, compl = lat_obj.get_sync() latitude = radians(latitude_dec) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logWarning('cannot get the site information: %s' %reason) latitude = radians(float(self.cdbconf.getAttribute('Latitude'))) logger.logWarning('setting the default latitude value: %.2f radians' %latitude) @@ -163,9 +163,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.actualSetup = self.commandedSetup logger.logNotice('derotator %s setup done' %self.commandedSetup) except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except ComponentErrors.ComponentErrorsEx as ex: data_list = ex.errorTrace.data # A list @@ -175,7 +175,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', reason) @@ -191,14 +191,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): logger.logWarning('positioner not ready: a setup() is required') self.positioner.park() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() finally: self._setDefaultSetup() @@ -209,19 +209,19 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getPosition() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position") raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -229,14 +229,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getMaxLimit() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -244,14 +244,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getMinLimit() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -259,33 +259,33 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getPositionFromHistory(t) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position at the time %s" %s) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def getCmdPosition(self): try: return self.positioner.getCmdPosition() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -293,14 +293,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setPosition(position) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -355,19 +355,19 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.startUpdating(axis, sector, az, el, ra, dec) except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) - exc = ComponentErrorsImpl.UnexpectedExImpl(ex.message) - exc.setData('Reason', ex.message) + logger.logError(ex) + exc = ComponentErrorsImpl.UnexpectedExImpl(ex) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def stopUpdating(self): @@ -375,14 +375,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.stopUpdating() except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() logger.logNotice('derotator position updating stopped') @@ -391,9 +391,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setAutoRewindingSteps(steps) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() @@ -409,15 +409,15 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.rewind(steps) except (PositionerError, NotAllowedError) as ex: - reason = "cannot rewind the derotator: %s" %ex.message + reason = "cannot rewind the derotator: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -433,14 +433,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getRewindingStep() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -454,45 +454,45 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.isReady() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is ready: %s" %ex.message + reason = "cannot known if the derotator is ready: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isSlewing(self): try: return self.positioner.isSlewing() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is slewing: %s" %ex.message + reason = "cannot known if the derotator is slewing: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isTracking(self): try: return self.positioner.isTracking() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is tracking: %s" %ex.message + reason = "cannot known if the derotator is tracking: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isUpdating(self): @@ -502,40 +502,40 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setOffset(offset) except (PositionerError, NotAllowedError) as ex: - reason = "cannot set the derotator offset: %s" %ex.message + reason = "cannot set the derotator offset: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def clearOffset(self): try: self.positioner.clearOffset() except PositionerError as ex: - reason = "cannot set the derotator offset: %s" %ex.message + reason = "cannot set the derotator offset: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -556,7 +556,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): mode = mode.upper().strip() self.positioner.setRewindingMode(mode) except PositionerError as ex: - reason = 'cannot set the rewinding mode: %s' %ex.message + reason = 'cannot set the rewinding mode: %s' %ex logger.logError(reason) exc = ComponentErrorsImpl.ValidationErrorExImpl() exc.setReason(reason) @@ -584,7 +584,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.positioner.control.clearScanInfo() self.cdbconf.setConfiguration(confCode.upper()) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', reason) @@ -633,7 +633,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): supplier.publishEvent(simple_data=event) error = False except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex if not error: logger.logError('cannot publish the status: %s' %reason) error = True @@ -658,7 +658,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): answer = 'Error - invalid command: maybe there are too many symbols of =' except Exception as ex: success = False - answer = ex.message + answer = ex else: success = True @@ -712,7 +712,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): except (ValueError, TypeError) as ex: success = False answer = 'Error - wrong parameter usage.\nType help(%s) for details' %command - logger.logError('%s\n%s' %(ex.message, answer)) + logger.logError('%s\n%s' %(ex, answer)) return (success, answer) except ComponentErrors.ComponentErrorsEx as ex: success = False @@ -723,7 +723,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): return (success, answer) except Exception as ex: success = False - msg = ex.message if ex.message else 'unexpected exception' + msg = ex if ex else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) logger.logError(answer) return (success, answer) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py index e31369e9e..40b7a3b58 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py @@ -11,6 +11,7 @@ class CDBConf(object): componentAttributes = ( 'UpdatingTime', + 'TrackingLeadTime', 'RewindingSleepTime', 'RewindingTimeout', 'DefaultConfiguration', diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py index 935a1dc74..f6f6820e8 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py @@ -1,124 +1,98 @@ -"""This module implements the position generators""" +"""This module implements the position calculation functions""" import datetime import time -from math import sin, cos, tan, atan2, degrees +from math import sin, cos, tan, atan2, degrees, isclose from IRAPy import logger from Acspy.Common.TimeHelper import getTimeStamp class PosGenerator(object): - def __init__(self, zdtimeout=5): - self.zdtimeout = zdtimeout # Timeout in case of zero division error + def __init__(self, updatingTime, trackingLeadTime): + self.updatingTime = updatingTime + self.trackingLeadTime = trackingLeadTime self.mapping = { 'parallactic': { - 'getAngleFunction': PosGenerator.getParallacticAngle, + 'getAngleFunction': PosGenerator.getParallacticAngle, 'coordinateFrame': 'horizontal' }, 'galacticParallactic': { - 'getAngleFunction': PosGenerator.getGalacticParallacticAngle, + 'getAngleFunction': PosGenerator.getGalacticParallacticAngle, 'coordinateFrame': 'equatorial' }, } - + def goto(self, iStaticPos): yield iStaticPos - # TODO: refactoring required, in order to put all the parallactic and - # galacticParallactic common code in one place - def parallactic(self, source, siteInfo): + def parallactic(self, source, siteInfo, t): """Return the parallactic angle""" + latitude = PosGenerator.getLatitude(siteInfo) + try: - latitude = siteInfo['latitude'] - except (KeyError, TypeError) as ex: - raise PosGeneratorError('cannot get the latitude: %s' %ex.message) + coordinates = source.getApparentCoordinates(t) # Values in radians + az, el = coordinates[:2] # The first two elements are (az, el) + position = PosGenerator.getParallacticAngle(latitude, az, el) + return position except Exception as ex: - raeson = 'unexpected exception getting the site latitude' - logger.logNotice(raeson) + raeson = 'cannot get the %s (az, el) values' %source._get_name() + logger.logNotice('%s: %s' %(raeson, ex)) raise PosGeneratorError(raeson) - last_zerodiv_time = datetime.datetime.now() - while True: - try: - t = getTimeStamp().value + 1*10*6 # 100 ms in the future - coordinates = source.getApparentCoordinates(t) # Values in radians - az, el = coordinates[:2] # The first two elements are (az, el) - position = PosGenerator.getParallacticAngle(latitude, az, el) - yield position - last_zerodiv_time = datetime.datetime.now() - except ZeroDivisionError: - logger.logWarning('zero division error computing the parallactic angle') - zerodiv_time = datetime.datetime.now() - last_zerodiv_time - if zerodiv_time.seconds >= self.zdtimeout: - raeson = 'zero division for more than %ds' %self.zdtimeout - logger.logError(raeson) - raise PosGeneratorError(raeson) - else: - time.sleep(0.5) - continue - except GeneratorExit: # Required in Python 2.5: - # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ - raise - except Exception as ex: - raeson = 'cannot get the %s (az, el) values' %source._get_name() - logger.logNotice('%s: %s' %(raeson, ex.message)) - raise PosGeneratorError(raeson) - - def galacticParallactic(self, source, siteInfo): + def galacticParallactic(self, source, siteInfo, t): """Return the galactic parallactic angle""" + latitude = PosGenerator.getLatitude(siteInfo) + + try: + coordinates = source.getApparentCoordinates(t) # Values in radians + az, el, ra, dec = coordinates[:4] + position = PosGenerator.getGalacticParallacticAngle(latitude, az, el, ra, dec) + return position + except Exception as ex: + raeson = 'cannot get the %s (az, el) values' %source._get_name() + logger.logNotice('%s: %s' %(raeson, ex)) + raise PosGeneratorError(raeson) + + @staticmethod + def getLatitude(siteInfo): + """Return the site latitude""" try: - latitude = siteInfo['latitude'] + return siteInfo['latitude'] except (KeyError, TypeError) as ex: - raise PosGeneratorError('cannot get the latitude: %s' %ex.message) + raise PosGeneratorError('cannot get the latitude: %s' %ex) except Exception as ex: - raeson = 'unexpected exception getting the site latitude' + raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) - last_zerodiv_time = datetime.datetime.now() - while True: - try: - t = getTimeStamp().value + 1*10*6 # 100 ms in the future - coordinates = source.getApparentCoordinates(t) # Values in radians - az, el, ra, dec = coordinates[:4] - pg = PosGenerator.getGalacticParallacticAngle(latitude, az, el, ra, dec) - yield pg - last_zerodiv_time = datetime.datetime.now() - except ZeroDivisionError: - logger.logWarning('zero division error computing the galactic parallactic angle') - zerodiv_time = datetime.datetime.now() - last_zerodiv_time - if zerodiv_time.seconds >= self.zdtimeout: - raeson = 'zero division for more than %ds' %self.zdtimeout - logger.logError(raeson) - raise PosGeneratorError(raeson) - else: - time.sleep(0.5) - continue - except GeneratorExit: # Required in Python 2.5: - # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ - raise - except Exception as ex: - raeson = 'cannot get the %s (az, el) values' %source._get_name() - logger.logNotice('%s: %s' %(raeson, ex.message)) - raise PosGeneratorError(raeson) - @staticmethod def getParallacticAngle(latitude, az, el): """Arguments in radians""" - p = atan2(-sin(az), tan(latitude)*cos(el) - sin(el)*cos(az)) - return degrees(p) + denominator = tan(latitude) * cos(el) - sin(el) * cos(az) + + # Avoid division by zero and keep continuity + if isclose(denominator, 0, abs_tol=1e-10): + return -90.0 if sin(az) > 0 else 90.0 + + return degrees(atan2(-sin(az), denominator)) @staticmethod def getGalacticAngle(ra, dec): """Arguments in radians""" - # North celestial pole coordinates in equatorial celestial frame (j200) - # ncp = ('12 51 26.28', '27 07 41.7') + # North celestial pole coordinates in equatorial celestial frame (j2000) + # ncp = ('12 51 26.28', '27 07 41.7') # ra0 = ephem.hours(ncp[0]) # dec0 = ephem.degrees(ncp[1]) ra0 = 3.3660332687500043 dec0 = 0.47347728280415174 - g = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) - return degrees(g) + + denominator = cos(dec) * tan(dec0) - sin(dec) * cos(ra-ra0) + + # Avoid division by zero and keep continuity + if isclose(denominator, 0, abs_tol=1e-10): + return 90.0 if sin(ra-ra0) > 0 else -90.0 + + return degrees(atan2(sin(ra-ra0), denominator)) @staticmethod def getGalacticParallacticAngle(latitude, az, el, ra, dec): @@ -127,7 +101,6 @@ class PosGenerator(object): g = PosGenerator.getGalacticAngle(ra, dec) return p + g - + class PosGeneratorError(Exception): pass - diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py index 03fbc071b..62471aaa5 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py @@ -25,7 +25,9 @@ class Positioner(object): The `cdbconf` parameter is a CDBConf instance. """ self.conf = cdbconf - self.posgen = PosGenerator() + self.updatingTime = int(float(self.conf.getAttribute('UpdatingTime')) * 10**7) + self.trackingLeadTime = int(float(self.conf.getAttribute('TrackingLeadTime')) * 10**7) + self.posgen = PosGenerator(self.updatingTime, self.trackingLeadTime) self._setDefault() @@ -57,12 +59,11 @@ class Positioner(object): self.is_setup = True time.sleep(0.4) # Give the device the time to accomplish the setup self.control.updateScanInfo({'iStaticPos': setupPosition}) - self._start(self.posgen.goto, setupPosition) - time.sleep(0.1) # Give the thread the time to finish + self._setPosition(setupPosition) except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: - raise PositionerError("cannot set the position: %s" %ex.message) + raise PositionerError("cannot set the position: %s" %ex) except Exception as ex: - raise PositionerError(ex.message) + raise PositionerError(ex) finally: Positioner.generalLock.release() @@ -120,7 +121,7 @@ class Positioner(object): # Set the initialPosition, in order to add it to the dynamic one self.control.user_position = position except Exception as ex: - raise PositionerError('cannot set the position: %s' %ex.message) + raise PositionerError('cannot set the position: %s' %ex) def _setPosition(self, position): @@ -130,11 +131,11 @@ class Positioner(object): self.device.setPosition(self.control.target) except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: raeson = "cannot set the %s position" %self.device._get_name() - logger.logError('%s: %s' %(raeson, ex.message)) + logger.logError('%s: %s' %(raeson, ex)) raise PositionerError(raeson) except Exception as ex: raeson = "unknown exception setting the %s position" %self.device._get_name() - logger.logError('%s: %s' %(raeson, ex.message)) + logger.logError('%s: %s' %(raeson, ex)) raise PositionerError(raeson) else: raise OutOfRangeError("position %.2f out of range {%.2f, %.2f}" @@ -179,22 +180,20 @@ class Positioner(object): dParallacticPos=0, rewindingOffset=0, ) - self._start(self.posgen.goto, position) + self._setPosition(position) + self.control.mustUpdate = False else: posgen = getattr(self.posgen, functionName) angle_mapping = self.posgen.mapping[functionName] getAngleFunction = self.posgen.mapping[functionName]['getAngleFunction'] coordinateFrame = self.posgen.mapping[functionName]['coordinateFrame'] lat = self.siteInfo['latitude'] - try: - if coordinateFrame == 'horizontal': - iParallacticPos = getAngleFunction(lat, az, el) - elif coordinateFrame == 'equatorial': - iParallacticPos = getAngleFunction(lat, az, el, ra, dec) - else: - raise PositionerError('coordinate frame %s unknown' %coordinateFrame) - except ZeroDivisionError: - raise NotAllowedError('zero division error computing p(%.2f, %.2f)' %(az, el)) + if coordinateFrame == 'horizontal': + iParallacticPos = getAngleFunction(lat, az, el) + elif coordinateFrame == 'equatorial': + iParallacticPos = getAngleFunction(lat, az, el, ra, dec) + else: + raise PositionerError('coordinate frame %s unknown' %coordinateFrame) self.control.setScanInfo( axis=axis, @@ -204,15 +203,19 @@ class Positioner(object): dParallacticPos=0, rewindingOffset=0, ) - self._start(posgen, self.source, self.siteInfo) - self.control.mustUpdate = True + self._start( + posgen, + self.source, + self.siteInfo + ) + self.control.mustUpdate = True except Exception as ex: - raise PositionerError('configuration problem: %s' %ex.message) + raise PositionerError('configuration problem: %s' %ex) finally: Positioner.generalLock.release() - def _updatePosition(self, posgen, vargs): + def _updatePosition(self, posgen, source, siteInfo): try: self.control.isRewindingRequired = False self.control.isRewinding = False @@ -229,20 +232,48 @@ class Positioner(object): else: isOptimized = False - for position in posgen(*vargs): + new_trajectory = True + while True: if self.control.stop: break else: try: + if new_trajectory: + t = getTimeStamp().value + self.trackingLeadTime + position = posgen(source, siteInfo, t) Pis = self.control.scanInfo['iStaticPos'] + self.control.scanInfo['rewindingOffset'] Pip = self.control.scanInfo['iParallacticPos'] - Pdp = 0 if posgen.__name__ == 'goto' else (position - Pip) + Pdp = position - Pip target = Pis + Pdp if isOptimized else Pis + Pip + Pdp self.control.scanInfo.update({'dParallacticPos': Pdp}) - self._setPosition(target) # _setPosition() will add the offset - time.sleep(float(self.conf.getAttribute('UpdatingTime'))) + + self.control.target = target + self.control.offset + if self.device.getMinLimit() < self.control.target < self.device.getMaxLimit(): + try: + self.device.loadTrackingPoint(t, self.control.target, new_trajectory) + new_trajectory = False + t += self.updatingTime + except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: + raeson = "cannot set the %s position" %self.device._get_name() + logger.logError('%s: %s' %(raeson, ex)) + raise PositionerError(raeson) + except Exception as ex: + raeson = "unknown exception setting the %s position" %self.device._get_name() + logger.logError('%s: %s' %(raeson, ex)) + raise PositionerError(raeson) + else: + raise OutOfRangeError("position %.2f out of range {%.2f, %.2f}" + %(self.control.target, self.device.getMinLimit(), self.device.getMaxLimit())) + # We calculate the time to sleep + # Next point of the trajectory - TrackingLeadTime - now + # slightly less than UpdatingTime + # The resulting cycle should be around + # TrackingLeadTime seconds before the next point + time_to_sleep = max(0, t - self.trackingLeadTime - getTimeStamp().value) + time.sleep(float(time_to_sleep) / 10**7) except OutOfRangeError as ex: - logger.logInfo(ex.message) + new_trajectory = True + logger.logInfo(ex) self.control.isRewindingRequired = True if self.control.modes['rewinding'] == 'AUTO': try: @@ -250,7 +281,7 @@ class Positioner(object): except Exception as ex: # In case of wrong autoRewindingSteps self.control.isRewindingRequired = True - logger.logError('cannot rewind: %s' %ex.message) + logger.logError('cannot rewind: %s' %ex) break else: if self.control.modes['rewinding'] == 'MANUAL': @@ -262,16 +293,16 @@ class Positioner(object): else: logger.logError('wrong rewinding mode: %s' %self.control.modes['rewinding']) except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) break self.control.mustUpdate = False except KeyboardInterrupt: logger.logInfo('stopping Positioner._updatePosition() due to KeyboardInterrupt') except AttributeError as ex: logger.logError('Positioner._updatePosition(): attribute error') - logger.logDebug('Positioner._updatePosition(): %s' %ex.message) + logger.logDebug('Positioner._updatePosition(): %s' %ex) except PositionerError as ex: - logger.logError('Positioner._updatePosition(): %s' %ex.message) + logger.logError('Positioner._updatePosition(): %s' %ex) except Exception as ex: logger.logError('unexcpected exception in Positioner._updatePosition(): %s' %ex) finally: @@ -315,7 +346,7 @@ class Positioner(object): self.control.isRewindingRequired = False except Exception as ex: self.control.isRewindingRequired = True - raise PositionerError(ex.message) + raise PositionerError(ex) finally: self.control.isRewinding = False Positioner.rewindingLock.release() @@ -417,7 +448,7 @@ class Positioner(object): try: Positioner.generalLock.acquire() self.control.updateScanInfo({'iStaticPos': parkPosition}) - self._start(self.posgen.goto, parkPosition) + self._setPosition(parkPosition) finally: Positioner.generalLock.release() time.sleep(0.5) # Wait the thread stops before to set the defaults @@ -466,7 +497,7 @@ class Positioner(object): Positioner.generalLock.acquire() self.stopUpdating() self.control.updateScanInfo({'iStaticPos': position}) - self._start(self.posgen.goto, position) + self._setPosition(position) finally: Positioner.generalLock.release() @@ -481,7 +512,7 @@ class Positioner(object): else: self.stopUpdating() actPosition = self.getPosition() - self._start(self.posgen.goto, actPosition) + self._setPosition(actPosition) def clearOffset(self): @@ -569,17 +600,17 @@ class Positioner(object): def clearAutoRewindingSteps(self): self.control.autoRewindingSteps = None - def _start(self, posgen, *vargs): + def _start(self, posgen, source, siteInfo): """Start a new process that computes and sets the position""" if self.isSetup(): # self.stopUpdating() # Raise a PositionerError if the process stills alive self.t = ContainerServices.ContainerServices().getThread( name=posgen.__name__, target=self._updatePosition, - args=(posgen, vargs) + args=(posgen, source, siteInfo) ) self.t.start() - time.sleep(0.10) # In case of goto, take the time to command the position + # time.sleep(0.10) # In case of goto, take the time to command the position else: raise NotAllowedError('not configured: a setConfiguration() is required') @@ -613,12 +644,12 @@ class Positioner(object): try: status_obj = self.device._get_status() except Exception as ex: - raise PositionerError('cannot get the device status property: %s' %ex.message) + raise PositionerError('cannot get the device status property: %s' %ex) try: device_status, compl = status_obj.get_sync() except Exception as ex: - raise PositionerError('cannot get the device status value: %s' %ex.message) + raise PositionerError('cannot get the device status value: %s' %ex) if compl.code: raise PositionerError('the device status value is not valid') @@ -641,7 +672,7 @@ class Positioner(object): try: binrepr = Status.dec2bin(device_status, 6) # A string of 6 values except Exception as ex: - raise PositionerError('error in Status.dec2bin(): %s' %ex.message) + raise PositionerError('error in Status.dec2bin(): %s' %ex) po, f, ce, nr, s, w = [bool(int(item)) for item in reversed(binrepr)] if po: @@ -665,7 +696,7 @@ class Positioner(object): except NotAllowedError as ex: return '000000' # Not ready except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) return '100000' # Failure finally: Positioner.generalLock.release() diff --git a/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml deleted file mode 100644 index 431cf8a1d..000000000 --- a/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version='1.0' encoding='ISO-8859-1'?> -<!-- - - History: - - ---> -<Component xmlns="urn:schemas-cosylab-com:Component:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - - Name="NoiseGenerator" - Code="NoiseGeneratorImpl" - Type="IDL:alma/Backends/NoiseGenerator:1.0" - Container="NoiseGeneratorContainer" - Default="false" - KeepAliveTime="-1" - ImplLang="cpp" -/> diff --git a/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml b/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml deleted file mode 100644 index f008110b9..000000000 --- a/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version='1.0' encoding='ISO-8859-1'?> -<!-- - - History: - - ---> -<Component xmlns="urn:schemas-cosylab-com:Component:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - - Name="XBackends" - Code="XBackendsImpl" - Type="IDL:alma/Backends/XBackends:1.0" - Container="XContainer" - ImplLang="cpp" -/> -<!--"BackendsContainer"--> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml similarity index 70% rename from SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml rename to SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml index a5801b66d..8e6e427d6 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -5,11 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="PFP" - Code="SRTProgramTrackMinorServoImpl" + Name="DR_GFR1" + Code="SRTDerotatorImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index 23da6db86..0b019b829 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -5,10 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="GFR" + Name="GFR" Code="SRTGenericMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 94efe94c9..1d904b987 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -5,10 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="M3R" + Name="M3R" Code="SRTGenericMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index b957480d6..ebfabed00 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -10,6 +10,5 @@ ImplLang="cpp" Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml b/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml deleted file mode 100644 index 8b5d8351b..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version='1.0' encoding='ISO-8859-1'?> -<!-- - - History: - - ---> -<Component xmlns="urn:schemas-cosylab-com:Component:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - - Name="LO_LP" - Code="LocalOscillatorSimImpl.LocalOscillator" - Type="IDL:alma/Receivers/LocalOscillator:1.0" - Container="LocalOscillatorLPContainer" - KeepAliveTime="10" - Default="false" - ImplLang="py" -/> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml deleted file mode 100644 index 42b5b7832..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Giuseppe Carboni <gcarboni@oa-cagliari.inaf.it> ---> - -<Component - xmlns="urn:schemas-cosylab-com:Component:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - - Name="SRTIFDistributor" - Code="IFDistributor.SRTIFDistributorImpl" - Type="IDL:alma/Receivers/SRTIFDistributor:1.0" - Container="PyIFDistributorContainer" - ImplLang="py" - Default="true" -/> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml deleted file mode 100644 index d6732b963..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version='1.0' encoding='ISO-8859-1'?> -<!-- - - History: - - ---> -<Component xmlns="urn:schemas-cosylab-com:Component:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - - Name="LPBandReceiver" - Code="SRTLPBandReceiverImpl" - Type="IDL:alma/Receivers/SRTLPBand:1.0" - Container="SRTLPBandContainer" - KeepAliveTime="-1" - Default="false" - ImplLang="cpp" -/> diff --git a/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml b/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml deleted file mode 100644 index b6cba5510..000000000 --- a/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> - -<Container - xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="cpp" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - diff --git a/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml b/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml deleted file mode 100644 index 9d7d96a62..000000000 --- a/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<Container xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - ImplLang="py" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - - - diff --git a/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml b/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml deleted file mode 100644 index 46868e13a..000000000 --- a/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - * Author Infos - * ============ - * Name: Marco Buttu - * E-mail: mbuttu@oa-cagliari.inaf.it - * Personal Web: http://www.pypeople.com/ ---> -<Container xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="py" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - - - diff --git a/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml b/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml deleted file mode 100644 index 3ea1b6d4d..000000000 --- a/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - * Author Infos - * ============ - * Name: Marco Buttu - * E-mail: mbuttu@oa-cagliari.inaf.it - * Personal Web: http://www.pypeople.com/ ---> -<Container xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="cpp" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - - - diff --git a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml b/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml deleted file mode 100644 index b6cba5510..000000000 --- a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> - -<Container - xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="cpp" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - diff --git a/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml b/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml deleted file mode 100644 index 6b7298a73..000000000 --- a/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<Container xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - ImplLang="py" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> diff --git a/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml b/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml deleted file mode 100644 index c555569cc..000000000 --- a/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - * Author - * ================= - * Name: Marco Buttu ---> -<Container xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="cpp" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> - -</Container> - - - diff --git a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml b/SRT/CDB/MACI/Containers/XContainer/XContainer.xml deleted file mode 100644 index d807ff223..000000000 --- a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> - -<Container - xmlns="urn:schemas-cosylab-com:Container:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="30.0" - UseIFR="true" - ManagerRetry="10" - ImplLang="cpp" - Recovery="false"> - - <Autoload> - <cdb:e string="baci" /> - </Autoload> - - <LoggingConfig - centralizedLogger="Log" - minLogLevel="5" - minLogLevelLocal="5" - dispatchPacketSize="0" - immediateDispatchLevel="8" - flushPeriodSeconds="1" - > - </LoggingConfig> -</Container> - diff --git a/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml b/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml index 93d131c69..7899633de 100644 --- a/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml +++ b/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml @@ -4,7 +4,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DerotatorName="RECEIVERS/SRTKBandDerotator" + DerotatorName="MINORSERVO/DR_GFR1" ObservatoryName="ANTENNA/Observatory" CoordinateSourceName="ANTENNA/Boss" SetupPosition="0.0" diff --git a/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml @@ -0,0 +1,18 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + - Author: Giuseppe Carboni + - History: + - 14-03-23 Created +--> + +<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <physical_axes_enabled><property_name>ROTARY_AXIS_ENABLED</property_name></physical_axes_enabled> + <physical_positions><property_name>ROTATION</property_name></physical_positions> + <virtual_positions><property_name>ROTATION</property_name></virtual_positions> + <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> + <virtual_offsets><property_name>OFFSET</property_name></virtual_offsets> +</SRTMinorServoProperties> diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml deleted file mode 100644 index 688491e30..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version='1.0' encoding='ISO-8859-1'?> -<!-- - - Author: Giuseppe Carboni - - History: - - 14-03-23 Created ---> - -<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" - xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" - xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - - <physical_axes_enabled><property_name>X_ENABLED</property_name></physical_axes_enabled> - <physical_axes_enabled><property_name>Z_MASTER_ENABLED</property_name></physical_axes_enabled> - <physical_axes_enabled><property_name>Z_SLAVE_ENABLED</property_name></physical_axes_enabled> - <physical_axes_enabled><property_name>THETA_MASTER_ENABLED</property_name></physical_axes_enabled> - <physical_axes_enabled><property_name>THETA_SLAVE_ENABLED</property_name></physical_axes_enabled> - - <physical_positions><property_name>ELONG_X</property_name></physical_positions> - <physical_positions><property_name>ELONG_Z_MASTER</property_name></physical_positions> - <physical_positions><property_name>ELONG_Z_SLAVE</property_name></physical_positions> - <physical_positions><property_name>ELONG_THETA_MASTER</property_name></physical_positions> - <physical_positions><property_name>ELONG_THETA_SLAVE</property_name></physical_positions> - - <virtual_positions><property_name>TX</property_name></virtual_positions> - <virtual_positions><property_name>TZ</property_name></virtual_positions> - <virtual_positions><property_name>RTHETA</property_name></virtual_positions> - - <virtual_axes_units><property_name>mm</property_name></virtual_axes_units> - <virtual_axes_units><property_name>mm</property_name></virtual_axes_units> - <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> - - <virtual_offsets><property_name>OFFSET_TX</property_name></virtual_offsets> - <virtual_offsets><property_name>OFFSET_TZ</property_name></virtual_offsets> - <virtual_offsets><property_name>OFFSET_RTHETA</property_name></virtual_offsets> -</SRTMinorServoProperties> diff --git a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv index 1a9f02b7e..a686bb1a5 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv +++ b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv @@ -1,7 +1,7 @@ CONFIGURATION;PFP_TX;PFP_TZ;PFP_RTHETA;SRP_TX;SRP_TY;SRP_TZ;SRP_RX;SRP_RY;SRP_RZ;M3R_RZ;GFR_RZ;DR_GFR1;DR_GFR2;DR_GFR3;DR_PFP;GREGORIAN_CAP; Primario;0;0;0;-5;5;-120;0;0;0;*;*;*;*;*;*;*; Gregoriano1;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-88.70659;*;*;*;*;4; -Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;*;*;*;*;4; +Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;12.5;*;*;*;4; Gregoriano3;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;90.97161;*;*;*;*;4; Gregoriano4;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;162.771;*;*;*;*;4; Gregoriano5;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;55.373967;*;*;*;*;4; diff --git a/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + Authors: Giuseppe Carboni giuseppe.carboni@inaf.it +--> +<SRTDerotator + xmlns="urn:schemas-cosylab-com:SRTMinorServo:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + physical_axes="1" + virtual_axes="1" + max_speed="3.276" + acceleration="2.67" + min_range="-130" + max_range="130" + step="60" + tracking_delta="0.1" + zero_offset="12.5"> + + <enabled description="All physical axes enabled" /> + <drive_cabinet_status description="Drive cabinet status" /> + <block description="Minor servo in block status" /> + <operative_mode description="Minor servo operating mode" /> + <physical_axes description="Number of physical axes" /> + <physical_axes_enabled description="Sequence, physical axes enabled" /> + <physical_positions description="Sequence, physical axes positions" /> + <virtual_axes description="Number of virtual axes" /> + <plain_virtual_positions description="Sequence, plain virtual axes positions, with offsets" /> + <virtual_positions description="Sequence, virtual axes positions, without offsets" /> + <virtual_offsets description="Sequence, sum of user and system virtual axis offsets" /> + <tracking description="Boolean indicating whether the servo is tracking the given coordinates" /> + <trajectory_id description="Unsigned int, the UNIX Epoch * 1000 indicating the start time of the current trajectory" /> + <total_trajectory_points description="Number of points sent for the current trajectory" /> + <remaining_trajectory_points description="Remaining points of the current trajectory" /> + <actPosition description="Current position, with sign inverted in respect to the LDO one"/> + <cmdPosition description="Latest commanded position, with sign inverted in respect to the LDO one" /> + <positionDiff description="Difference between the commanded and the current position" /> + <status description="Bit pattern indicating the status of the derotator" /> + +</SRTDerotator> diff --git a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml index 4f67761f9..6f82987bb 100644 --- a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ <AvailableReceiver Code="CCG" Derotator="false" Component="RECEIVERS/SRT5GHzReceiver"/> -<AvailableReceiver Code="KKG" Derotator="false" Component="RECEIVERS/SRTKBandMFReceiver"/> +<AvailableReceiver Code="KKG" Derotator="true" Component="RECEIVERS/SRTKBandMFReceiver"/> <AvailableReceiver Code="LLP" Derotator="false" Component="RECEIVERS/SRTLPBandReceiver"/> diff --git a/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml b/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml index 12b213ea4..8a57982ba 100644 --- a/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml +++ b/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml @@ -4,7 +4,8 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - UpdatingTime="0.1" + UpdatingTime="0.2" + TrackingLeadTime="2.6" RewindingSleepTime="0.1" RewindingTimeout="200" DefaultConfiguration="FIXED" diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..8e6e427d6 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Component + xmlns="urn:schemas-cosylab-com:Component:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + + Name="DR_GFR1" + Code="SRTDerotatorImpl" + ImplLang="cpp" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" + Container="MinorServoContainer" + Default="false" +/> diff --git a/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml b/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml index 93d131c69..7899633de 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml @@ -4,7 +4,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DerotatorName="RECEIVERS/SRTKBandDerotator" + DerotatorName="MINORSERVO/DR_GFR1" ObservatoryName="ANTENNA/Observatory" CoordinateSourceName="ANTENNA/Boss" SetupPosition="0.0" diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml @@ -0,0 +1,18 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + - Author: Giuseppe Carboni + - History: + - 14-03-23 Created +--> + +<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <physical_axes_enabled><property_name>ROTARY_AXIS_ENABLED</property_name></physical_axes_enabled> + <physical_positions><property_name>ROTATION</property_name></physical_positions> + <virtual_positions><property_name>ROTATION</property_name></virtual_positions> + <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> + <virtual_offsets><property_name>OFFSET</property_name></virtual_offsets> +</SRTMinorServoProperties> diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + Authors: Giuseppe Carboni giuseppe.carboni@inaf.it +--> +<SRTDerotator + xmlns="urn:schemas-cosylab-com:SRTMinorServo:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + physical_axes="1" + virtual_axes="1" + max_speed="3.276" + acceleration="2.67" + min_range="-130" + max_range="130" + step="60" + tracking_delta="0.1" + zero_offset="12.5"> + + <enabled description="All physical axes enabled" /> + <drive_cabinet_status description="Drive cabinet status" /> + <block description="Minor servo in block status" /> + <operative_mode description="Minor servo operating mode" /> + <physical_axes description="Number of physical axes" /> + <physical_axes_enabled description="Sequence, physical axes enabled" /> + <physical_positions description="Sequence, physical axes positions" /> + <virtual_axes description="Number of virtual axes" /> + <plain_virtual_positions description="Sequence, plain virtual axes positions, with offsets" /> + <virtual_positions description="Sequence, virtual axes positions, without offsets" /> + <virtual_offsets description="Sequence, sum of user and system virtual axis offsets" /> + <tracking description="Boolean indicating whether the servo is tracking the given coordinates" /> + <trajectory_id description="Unsigned int, the UNIX Epoch * 1000 indicating the start time of the current trajectory" /> + <total_trajectory_points description="Number of points sent for the current trajectory" /> + <remaining_trajectory_points description="Remaining points of the current trajectory" /> + <actPosition description="Current position, with sign inverted in respect to the LDO one"/> + <cmdPosition description="Latest commanded position, with sign inverted in respect to the LDO one" /> + <positionDiff description="Difference between the commanded and the current position" /> + <status description="Bit pattern indicating the status of the derotator" /> + +</SRTDerotator> diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml index 4f67761f9..b098cecce 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ <AvailableReceiver Code="CCG" Derotator="false" Component="RECEIVERS/SRT5GHzReceiver"/> -<AvailableReceiver Code="KKG" Derotator="false" Component="RECEIVERS/SRTKBandMFReceiver"/> +<AvailableReceiver Code="KKG" Derotator="true" Component="RECEIVERS/SRTKBandMFReceiver"/> <AvailableReceiver Code="LLP" Derotator="false" Component="RECEIVERS/SRTLPBandReceiver"/> diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml b/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml index 12b213ea4..8a57982ba 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml @@ -4,7 +4,8 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - UpdatingTime="0.1" + UpdatingTime="0.2" + TrackingLeadTime="2.6" RewindingSleepTime="0.1" RewindingTimeout="200" DefaultConfiguration="FIXED" diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl new file mode 100644 index 000000000..aa65c3ccc --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl @@ -0,0 +1,44 @@ +#ifndef __SRTDEROTATOR_IDL__ +#define __SRTDEROTATOR_IDL__ +/***************************************************************\ + * Authors: + * Giuseppe Carboni <giuseppe.carboni@inaf.it> + * + * Created: Mon May 06 10:00:00 CEST 2024 +\***************************************************************/ + +#include "GenericDerotator.idl" +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + /** + * This IDL interface describes the CORBA interface of a common Leonardo Derotator component. + */ + interface SRTDerotator : SRTLDOBaseProperties, Receivers::GenericDerotator, ACS::CharacteristicComponent + { + /** + * This property indicates the ID of the trajectory. It always corresponds to starting time of the trajectory, expressed as the UNIX Epoch * 1000 (long) + */ + readonly attribute ACS::ROlong trajectory_id; + + /** + * This property indicates the total number of points loaded into the current trajectory + */ + readonly attribute ACS::ROlong total_trajectory_points; + + /** + * This property indicates the number of points of the current trajectory which remain to be tracked + */ + readonly attribute ACS::ROlong remaining_trajectory_points; + + /** + * This method asks the hardware its status and updates the properties. + */ + boolean updateStatus(); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index b88d58942..6cd48ffbe 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -17,61 +17,8 @@ module MinorServo * This IDL interface describes the CORBA interface of a common SRTMinorServo component. * This is simply the base interface from which the SRTGenericMinorServo and SRTProgramTrackMinorServo interfaces inherit. */ - interface SRTBaseMinorServo : ACS::CharacteristicComponent + interface SRTBaseMinorServo : SRTLDOBaseProperties, ACS::CharacteristicComponent { - /** - * This property tells if all the servo axes are enabled - */ - readonly attribute Management::ROTBoolean enabled; - - /** - * This property tells the status of the servo drive cabinet - */ - readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; - - /** - * This property tells if the servo is in blocked state and cannot move - */ - readonly attribute Management::ROTBoolean block; - - /** - * This property returns the current operative mode of the servo - */ - readonly attribute ROSRTMinorServoOperativeMode operative_mode; - - /** - * This property returns the sequence of statuses of the servo physical axes - */ - readonly attribute ACS::RObooleanSeq physical_axes_enabled; - - /** - * This property returns the sequence of current positions of the physical axes of the servo - */ - readonly attribute ACS::ROdoubleSeq physical_positions; - - /** - * This property returns the number of virtual axes of the servo - */ - readonly attribute ACS::ROlong virtual_axes; - - /** - * This property returns the current plain positions of the virtual axes of the servo - * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets - */ - readonly attribute ACS::ROdoubleSeq plain_virtual_positions; - - /** - * This property returns the current positions of the virtual axes of the servo - * The positions returned by this property equals to the plain virtual positions minus the offsets - */ - readonly attribute ACS::ROdoubleSeq virtual_positions; - - /** - * This property returns the current offsets of the virtual axes of the servo - * The offset values are the sum of user and system offsets - */ - readonly attribute ACS::ROdoubleSeq virtual_offsets; - /** * This property returns the current user offsets of the virtual axes of the servo */ diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 45980430f..54c6585a6 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -126,5 +126,65 @@ module MinorServo ERROR_DRIVE_CABINET }; ACS_ENUM(SRTMinorServoError); + + /* + * This IDL interface describes the CORBA interface of a common Leonardo Minor Servo System component. + * This interface contains the properties that are common to a focus path minor servo system and a derotator minor servo system. + */ + interface SRTLDOBaseProperties + { + /** + * This property tells if all the servo axes are enabled + */ + readonly attribute Management::ROTBoolean enabled; + + /** + * This property tells the status of the servo drive cabinet + */ + readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; + + /** + * This property tells if the servo is in blocked state and cannot move + */ + readonly attribute Management::ROTBoolean block; + + /** + * This property returns the current operative mode of the servo + */ + readonly attribute ROSRTMinorServoOperativeMode operative_mode; + + /** + * This property returns the sequence of statuses of the servo physical axes + */ + readonly attribute ACS::RObooleanSeq physical_axes_enabled; + + /** + * This property returns the sequence of current positions of the physical axes of the servo + */ + readonly attribute ACS::ROdoubleSeq physical_positions; + + /** + * This property returns the number of virtual axes of the servo + */ + readonly attribute ACS::ROlong virtual_axes; + + /** + * This property returns the current plain positions of the virtual axes of the servo + * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets + */ + readonly attribute ACS::ROdoubleSeq plain_virtual_positions; + + /** + * This property returns the current positions of the virtual axes of the servo + * The positions returned by this property equals to the plain virtual positions minus the offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_positions; + + /** + * This property returns the current offsets of the virtual axes of the servo + * The offset values are the sum of user and system offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_offsets; + }; }; #endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile index 9cac56365..2ddc48b82 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile +++ b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile @@ -24,11 +24,12 @@ CSOURCENAMES = \ # # IDL FILES # -IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTMinorServoCommon +IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTDerotator SRTMinorServoCommon SRTMinorServoCommonStubs_LIBS = baciStubs ManagmentDefinitionsStubs MinorServoDefinitionsStubs ComponentErrorsStubs MinorServoErrorsStubs SRTMinorServoStubs_LIBS = SRTMinorServoCommonStubs SRTMinorServoBossStubs_LIBS = SRTMinorServoCommonStubs MinorServoBossStubs +SRTDerotatorStubs_LIBS = SRTMinorServoCommonStubs GenericDerotatorStubs # # INCLUDE STANDARDS diff --git a/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl b/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl index 2710d184f..d06172932 100644 --- a/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl +++ b/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl @@ -10,7 +10,17 @@ module Receivers { - interface SRTKBandDerotator : GenericDerotator { + interface SRTKBandDerotator : GenericDerotator, ACS::CharacteristicComponent + { + + /** + * <h3>Methods</h3>: + * <ul> + * <li>powerOff(): switch the power amplifier off </li> + * <li>setSpeed(): set the derotator speed, in rpm</li> + * <li>getSpeed(): get the derotator speed, in rpm</li> + * </ul> + */ /** Computation of the sensor lenght * @@ -104,9 +114,42 @@ module Receivers { ComponentErrors::ComponentErrorsEx ); - }; + + /** Switch the power amplifier off + * + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + */ + void powerOff() raises (ComponentErrors::ComponentErrorsEx); + + + /** + * Set the derotator speed + * + * @arg speed speed in rpm + * @throw ComponentErrors::ComponentErrorsEx, + * @throw DerotatorErrors::DerotatorErrorsEx + */ + void setSpeed(in unsigned long speed) raises ( + ComponentErrors::ComponentErrorsEx, + DerotatorErrors::DerotatorErrorsEx + ); + + + /** + * Get the derotator speed + * + * @return the derotator speed in rpm + * @throw ComponentErrors::ComponentErrorsEx, + * @throw DerotatorErrors::DerotatorErrorsEx + */ + unsigned long getSpeed() raises ( + ComponentErrors::ComponentErrorsEx, + DerotatorErrors::DerotatorErrorsEx + ); + }; }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index e966f532d..e4474676c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -583,7 +583,7 @@ namespace MinorServo const std::string getPlainCommand() const { std::shared_lock<std::shared_mutex> lock(m_mutex); - return this->get<std::string>("PLAIN_COMMAND"); + return this->count("PLAIN_COMMAND") > 0 ? this->get<std::string>("PLAIN_COMMAND") : ""; } /** @@ -593,7 +593,7 @@ namespace MinorServo const std::string getPlainAnswer() const { std::shared_lock<std::shared_mutex> lock(m_mutex); - return this->get<std::string>("PLAIN_ANSWER"); + return this->count("PLAIN_ANSWER") > 0 ? this->get<std::string>("PLAIN_ANSWER") : ""; } protected: @@ -883,6 +883,25 @@ namespace MinorServo */ const std::vector<std::string> m_virtual_offsets; }; + + /** + * This class is a specialization of the SRTMinorServoStatus for a derotator of the Leonardo Minor Servo System. + */ + class SRTDerotatorStatus : public SRTMinorServoStatus + { + public: + using SRTMinorServoStatus::SRTMinorServoStatus; + + /** + * This method returns the current derotator position. There is a sign inversion since the LDO derotator sign is opposite to the required one. + * @return the current derotator position + */ + double getActualPosition() const + { + double position = getVirtualPositions()[0]; + return position == 0 ? position : -position; + } + }; } #endif diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index 55d8ba5ca..197c93cfa 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -14,7 +14,7 @@ <toolAgainstInterfaceRepository></toolAgainstInterfaceRepository> <toolAgainstNameService></toolAgainstNameService> <containers> - <select>34</select> + <select>31</select> <againstManagerHost></againstManagerHost> <againstManagerPort></againstManagerPort> <againstCDB></againstCDB> @@ -64,7 +64,7 @@ <remoteHost>MASTERHOST</remoteHost> <remoteAccount>discos</remoteAccount> </container> - <container> + <!--container> <name>LocalOscillatorLPContainer</name> <type>py</type> <heapSizeMB></heapSizeMB> @@ -72,7 +72,7 @@ <scriptBase>0</scriptBase> <remoteHost>MASTERHOST</remoteHost> <remoteAccount>discos</remoteAccount> - </container> + </container--> <container> <name>LocalOscillatorCContainer</name> <type>py</type> @@ -190,7 +190,7 @@ <remoteHost>MASTERHOST</remoteHost> <remoteAccount>discos</remoteAccount> </container> - <container> + <!--container> <name>SRTLPBandContainer</name> <type>cpp</type> <heapSizeMB></heapSizeMB> @@ -198,7 +198,7 @@ <scriptBase>0</scriptBase> <remoteHost>MASTERHOST</remoteHost> <remoteAccount>discos</remoteAccount> - </container> + </container--> <container> <name>TotalPowerContainer</name> <type>cpp</type> diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml new file mode 100644 index 000000000..7f7a82187 --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Component + xmlns="urn:schemas-cosylab-com:Component:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + + Name="DR_GFR2" + Code="SRTDerotatorImpl" + ImplLang="cpp" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" + Container="MinorServoContainer" + Default="false" +/> diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml new file mode 100644 index 000000000..3b329339a --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Component + xmlns="urn:schemas-cosylab-com:Component:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + + Name="DR_GFR3" + Code="SRTDerotatorImpl" + ImplLang="cpp" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" + Container="MinorServoContainer" + Default="false" +/> diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml new file mode 100644 index 000000000..05bdc74fb --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<Component + xmlns="urn:schemas-cosylab-com:Component:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + + Name="DR_PFP" + Code="SRTDerotatorImpl" + ImplLang="cpp" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" + Container="MinorServoContainer" + Default="false" +/> diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index a5801b66d..f3b9c99df 100644 --- a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -5,11 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="PFP" + Name="PFP" Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml similarity index 100% rename from SRT/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml diff --git a/SRT/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml b/SRT/Outdated/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml diff --git a/SRT/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml b/SRT/Outdated/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml diff --git a/SRT/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py b/SRT/Outdated/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py similarity index 100% rename from SRT/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py rename to SRT/Outdated/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py diff --git a/SRT/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml b/SRT/Outdated/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml @@ -0,0 +1,18 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + - Author: Giuseppe Carboni + - History: + - 14-03-23 Created +--> + +<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <physical_axes_enabled><property_name>ROTARY_AXIS_ENABLED</property_name></physical_axes_enabled> + <physical_positions><property_name>ROTATION</property_name></physical_positions> + <virtual_positions><property_name>ROTATION</property_name></virtual_positions> + <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> + <virtual_offsets><property_name>OFFSET</property_name></virtual_offsets> +</SRTMinorServoProperties> diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml @@ -0,0 +1,18 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + - Author: Giuseppe Carboni + - History: + - 14-03-23 Created +--> + +<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <physical_axes_enabled><property_name>ROTARY_AXIS_ENABLED</property_name></physical_axes_enabled> + <physical_positions><property_name>ROTATION</property_name></physical_positions> + <virtual_positions><property_name>ROTATION</property_name></virtual_positions> + <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> + <virtual_offsets><property_name>OFFSET</property_name></virtual_offsets> +</SRTMinorServoProperties> diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml @@ -0,0 +1,18 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + - Author: Giuseppe Carboni + - History: + - 14-03-23 Created +--> + +<SRTMinorServoProperties xmlns="urn:schemas-cosylab-com:SRTMinorServoProperties:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <physical_axes_enabled><property_name>ROTARY_AXIS_ENABLED</property_name></physical_axes_enabled> + <physical_positions><property_name>ROTATION</property_name></physical_positions> + <virtual_positions><property_name>ROTATION</property_name></virtual_positions> + <virtual_axes_units><property_name>degree</property_name></virtual_axes_units> + <virtual_offsets><property_name>OFFSET</property_name></virtual_offsets> +</SRTMinorServoProperties> diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + Authors: Giuseppe Carboni giuseppe.carboni@inaf.it +--> +<SRTDerotator + xmlns="urn:schemas-cosylab-com:SRTMinorServo:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + physical_axes="1" + virtual_axes="1" + max_speed="3.276" + acceleration="2.67" + min_range="-130" + max_range="130" + step="60" + tracking_delta="0.1" + zero_offset="12.5"> + + <enabled description="All physical axes enabled" /> + <drive_cabinet_status description="Drive cabinet status" /> + <block description="Minor servo in block status" /> + <operative_mode description="Minor servo operating mode" /> + <physical_axes description="Number of physical axes" /> + <physical_axes_enabled description="Sequence, physical axes enabled" /> + <physical_positions description="Sequence, physical axes positions" /> + <virtual_axes description="Number of virtual axes" /> + <plain_virtual_positions description="Sequence, plain virtual axes positions, with offsets" /> + <virtual_positions description="Sequence, virtual axes positions, without offsets" /> + <virtual_offsets description="Sequence, sum of user and system virtual axis offsets" /> + <tracking description="Boolean indicating whether the servo is tracking the given coordinates" /> + <trajectory_id description="Unsigned int, the UNIX Epoch * 1000 indicating the start time of the current trajectory" /> + <total_trajectory_points description="Number of points sent for the current trajectory" /> + <remaining_trajectory_points description="Remaining points of the current trajectory" /> + <actPosition description="Current position, with sign inverted in respect to the LDO one"/> + <cmdPosition description="Latest commanded position, with sign inverted in respect to the LDO one" /> + <positionDiff description="Difference between the commanded and the current position" /> + <status description="Bit pattern indicating the status of the derotator" /> + +</SRTDerotator> diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml new file mode 100644 index 000000000..df76d9833 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + Authors: Giuseppe Carboni giuseppe.carboni@inaf.it +--> +<SRTDerotator + xmlns="urn:schemas-cosylab-com:SRTMinorServo:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + physical_axes="1" + virtual_axes="1" + max_speed="3.276" + acceleration="2.67" + min_range="-127" + max_range="127" + step="60" + tracking_delta="0.1" + zero_offset="12.5"> + + <enabled description="All physical axes enabled" /> + <drive_cabinet_status description="Drive cabinet status" /> + <block description="Minor servo in block status" /> + <operative_mode description="Minor servo operating mode" /> + <physical_axes description="Number of physical axes" /> + <physical_axes_enabled description="Sequence, physical axes enabled" /> + <physical_positions description="Sequence, physical axes positions" /> + <virtual_axes description="Number of virtual axes" /> + <plain_virtual_positions description="Sequence, plain virtual axes positions, with offsets" /> + <virtual_positions description="Sequence, virtual axes positions, without offsets" /> + <virtual_offsets description="Sequence, sum of user and system virtual axis offsets" /> + <tracking description="Boolean indicating whether the servo is tracking the given coordinates" /> + <trajectory_id description="Unsigned int, the UNIX Epoch * 1000 indicating the start time of the current trajectory" /> + <total_trajectory_points description="Number of points sent for the current trajectory" /> + <remaining_trajectory_points description="Remaining points of the current trajectory" /> + <actPosition description="Current position, with sign inverted in respect to the LDO one"/> + <cmdPosition description="Latest commanded position, with sign inverted in respect to the LDO one" /> + <positionDiff description="Difference between the commanded and the current position" /> + <status description="Bit pattern indicating the status of the derotator" /> + +</SRTDerotator> diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml @@ -0,0 +1,40 @@ +<?xml version='1.0' encoding='ISO-8859-1'?> +<!-- + Authors: Giuseppe Carboni giuseppe.carboni@inaf.it +--> +<SRTDerotator + xmlns="urn:schemas-cosylab-com:SRTMinorServo:1.0" + xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" + xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + physical_axes="1" + virtual_axes="1" + max_speed="3.276" + acceleration="2.67" + min_range="-130" + max_range="130" + step="60" + tracking_delta="0.1" + zero_offset="12.5"> + + <enabled description="All physical axes enabled" /> + <drive_cabinet_status description="Drive cabinet status" /> + <block description="Minor servo in block status" /> + <operative_mode description="Minor servo operating mode" /> + <physical_axes description="Number of physical axes" /> + <physical_axes_enabled description="Sequence, physical axes enabled" /> + <physical_positions description="Sequence, physical axes positions" /> + <virtual_axes description="Number of virtual axes" /> + <plain_virtual_positions description="Sequence, plain virtual axes positions, with offsets" /> + <virtual_positions description="Sequence, virtual axes positions, without offsets" /> + <virtual_offsets description="Sequence, sum of user and system virtual axis offsets" /> + <tracking description="Boolean indicating whether the servo is tracking the given coordinates" /> + <trajectory_id description="Unsigned int, the UNIX Epoch * 1000 indicating the start time of the current trajectory" /> + <total_trajectory_points description="Number of points sent for the current trajectory" /> + <remaining_trajectory_points description="Remaining points of the current trajectory" /> + <actPosition description="Current position, with sign inverted in respect to the LDO one"/> + <cmdPosition description="Latest commanded position, with sign inverted in respect to the LDO one" /> + <positionDiff description="Difference between the commanded and the current position" /> + <status description="Bit pattern indicating the status of the derotator" /> + +</SRTDerotator> diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Outdated/CDB/alma/MINORSERVO/PFP/PFP.xml similarity index 100% rename from SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml rename to SRT/Outdated/CDB/alma/MINORSERVO/PFP/PFP.xml diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index 88b054568..34ec43182 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -19,7 +19,7 @@ <xs:import namespace="urn:schemas-cosylab-com:Managment:1.0" schemaLocation="Managment.xsd"/> <xs:import namespace="urn:schemas-cosylab-com:SRTMinorServoCommon:1.0" schemaLocation="SRTMinorServoCommon.xsd"/> - <xs:complexType name="SRTBaseMinorServoType"> + <xs:complexType name="SRTLDOBasePropertiesType"> <xs:complexContent> <xs:extension base="baci:CharacteristicComponent"> <xs:sequence> @@ -34,12 +34,6 @@ <xs:element name="plain_virtual_positions" type="baci:ROdoubleSeq" /> <xs:element name="virtual_positions" type="baci:ROdoubleSeq" /> <xs:element name="virtual_offsets" type="baci:ROdoubleSeq" /> - <xs:element name="virtual_user_offsets" type="baci:ROdoubleSeq" /> - <xs:element name="virtual_system_offsets" type="baci:ROdoubleSeq" /> - <xs:element name="commanded_virtual_positions" type="baci:ROdoubleSeq" /> - <xs:element name="in_use" type="mng:BooleanType" /> - <xs:element name="current_setup" type="baci:ROstring" /> - <xs:element name="error_code" type="ms:SRTMinorServoErrorType" /> </xs:sequence> <xs:attribute name="physical_axes" type="xs:unsignedShort" use="required" /> <xs:attribute name="virtual_axes" type="xs:unsignedShort" use="required" /> @@ -51,6 +45,21 @@ </xs:complexContent> </xs:complexType> + <xs:complexType name="SRTBaseMinorServoType"> + <xs:complexContent> + <xs:extension base="SRTLDOBasePropertiesType"> + <xs:sequence> + <xs:element name="virtual_user_offsets" type="baci:ROdoubleSeq" /> + <xs:element name="virtual_system_offsets" type="baci:ROdoubleSeq" /> + <xs:element name="commanded_virtual_positions" type="baci:ROdoubleSeq" /> + <xs:element name="in_use" type="mng:BooleanType" /> + <xs:element name="current_setup" type="baci:ROstring" /> + <xs:element name="error_code" type="ms:SRTMinorServoErrorType" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="SRTProgramTrackMinorServoType"> <xs:complexContent> <xs:extension base="SRTBaseMinorServoType"> @@ -66,7 +75,29 @@ </xs:complexContent> </xs:complexType> + <xs:complexType name="SRTDerotatorType"> + <xs:complexContent> + <xs:extension base="SRTLDOBasePropertiesType"> + <xs:sequence> + <xs:element name="tracking" type="mng:BooleanType" /> + <xs:element name="trajectory_id" type="baci:ROlong" /> + <xs:element name="total_trajectory_points" type="baci:ROlong" /> + <xs:element name="remaining_trajectory_points" type="baci:ROlong" /> + <xs:element name="actPosition" type="baci:ROdouble" /> + <xs:element name="cmdPosition" type="baci:RWdouble" /> + <xs:element name="positionDiff" type="baci:ROdouble" /> + <xs:element name="status" type="baci:ROpattern" /> + </xs:sequence> + <xs:attribute name="status_thread_period" type="xs:double" use="optional" default="0.05" /> + <xs:attribute name="step" type="xs:string" use="required" /> + <xs:attribute name="tracking_delta" type="xs:string" use="required" /> + <xs:attribute name="zero_offset" type="xs:string" use="optional" default="0.0" /> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:element name="SRTGenericMinorServo" type="SRTBaseMinorServoType" /> <xs:element name="SRTProgramTrackMinorServo" type="SRTProgramTrackMinorServoType" /> + <xs:element name="SRTDerotator" type="SRTDerotatorType" /> </xs:schema> diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index 49749dc7f..8a53266bf 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -47,6 +47,8 @@ namespace MinorServo /** * It writes values into controller. Unused because all the properties are read-only. + * Derotator update, the cmdPosition is actually a RW property, but the position is never set anywhere by using the DevIO. + * I will keep this implementation that does nothing and the position will be set by the setPosition or programTrack methods. */ void write(const T& value, ACS::Time& timestamp) { @@ -237,7 +239,7 @@ namespace MinorServo * The templates is specialized for the types listed right below and compilation will fail if the developer attempts to use it for an unknown MSDevIO type. */ template <typename X, typename Y, typename = std::enable_if< - is_any_v<Y, SRTMinorServoGeneralStatus, SRTMinorServoStatus> + is_any_v<Y, SRTMinorServoGeneralStatus, SRTMinorServoStatus, SRTDerotatorStatus> && is_any_v<X, Management::TBoolean, CORBA::Double, @@ -306,7 +308,7 @@ namespace MinorServo const std::string m_property_name; /** - * The reference to the SRTMinorServoAnswerMap in which the readings from the PLC appear. This could be either a SRTMinorServoGeneralStatus or a SRTMinorServoStatus. + * The reference to the SRTMinorServoAnswerMap in which the readings from the PLC appear. This could be either a SRTMinorServoGeneralStatus, a SRTMinorServoStatus or a SRTDerotatorStatus. */ const Y& m_map; @@ -322,7 +324,14 @@ namespace MinorServo * The templates is specialized for the combinations of types listed right below and the compilation will fail if the developer attempts to use it with any other types combination. */ template <typename C, typename A, typename = std::enable_if_t< - is_any_v<C, Management::TSystemStatus, Management::TBoolean, ACE_CString, CORBA::Long, SRTMinorServoError> || (std::is_same_v<C, ACS::doubleSeq> && std::is_same_v<A, std::vector<double>>) + is_any_v<C, + Management::TSystemStatus, + Management::TBoolean, + ACE_CString, + CORBA::Long, + SRTMinorServoError, + double, + ACS::pattern> || (std::is_same_v<C, ACS::doubleSeq> && std::is_same_v<A, std::vector<double>>) >> class MSGenericDevIO : public MSBaseDevIO<C> { diff --git a/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h b/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h new file mode 100644 index 000000000..546b7f55c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h @@ -0,0 +1,545 @@ +#ifndef __SRTDEROTATORIMPL_H__ +#define __SRTDEROTATORIMPL_H__ + +/** + * SRTDerotatorImpl.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +//#include <regex> +#include <IRA> +#include <baciCharacteristicComponentImpl.h> +#include <baciSmartPropertyPointer.h> +#include <baciROlong.h> +#include <baciRObooleanSeq.h> +#include <baciROdoubleSeq.h> +#include <baciROstring.h> +#include <baciROdouble.h> +#include <baciRWdouble.h> +#include <enumpropROImpl.h> +#include <SRTMinorServoS.h> +#include <maciACSComponentDefines.h> +#include <ManagmentDefinitionsS.h> +#include "ManagementErrors.h" +#include "DerotatorErrors.h" +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" +#include "SRTDerotatorStatusThread.h" +#include <SRTDerotatorS.h> + +class SRTDerotatorStatusThread; + + +using namespace MinorServo; + +/** + * This class implements the base ACS::CharacteristicComponent CORBA interface for a SRTDerotator component. + * It is inherited by the other classes declared below. + */ +class SRTDerotatorImpl : public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTDerotator +{ + friend class SRTDerotatorStatusThread; + +public: + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTDerotatorImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ + virtual ~SRTDerotatorImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ + void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ + void aboutToAbort(); + + /** + * Asks the servo system to get ready. + * @throw DerotatorErrors::DerotatorErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + void setup(); + + // TODO: this should be a simple preset command + void setPosition(CORBA::Double position); + + // TODO easy implementation, return last commanded preset or programTrack position + double getCmdPosition() { return m_commanded_position.load(); }; + + // TODO return current position, just read the devio or the AnswerMap + double getActPosition() { return getPositionFromHistory(0); }; + + /** + * Returns the rotation the derotator was at the given time acs_time. + * @param acs_time the epoch we want to retrieve the derotator position. + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty. + * @throw ComponentErrors::ComponentErrorsEx when the position history is empty + * @return a double object containing the derotator position at the given epoch. + */ + double getPositionFromHistory(ACS::Time acs_time); + + // TODO: easy implementation, return the min and max values read from the CDB + double getMinLimit() { return m_min; }; + double getMaxLimit() { return m_max; }; + + // TODO: degrees between 2 lateral feeds. How to implement this with new receivers? + double getStep() { return m_step; }; + + // TODO: easy implementation + bool isReady(); + bool isSlewing(); + + /** + * Returns the tracking status of the minor servo. + * @return true if the minor servo is tracking within the tracking error, false otherwise + */ + bool isTracking() { return m_tracking.load() == Management::MNG_TRUE; } + + /** + * This method loads a position that has to be tracked by the derotator + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the derotator and the points after are always spaced by the same amount of time from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param position the position to track at the given time + * @param restart flag that restarts the tracking with a new trajectory + */ + void loadTrackingPoint(ACS::Time point_time, CORBA::Double position, CORBA::Boolean restart); + + /** + * Asks the component to calculate the servo system position starting from the given elevation. + * @param elevation the elevation we want to use to calculate and retrieve the servo system coordinates, expressed in degrees. + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation. + * @return a pointer to the double sequence object containing the calculated coordinates of the servo system. + */ + //ACS::doubleSeq* calcCoordinates(CORBA::Double elevation); + + /** + * Asks the component the virtual axes user offsets. + * @return a pointer to the double sequence object containing the current virtual axes user offsets of the servo system. + */ + //ACS::doubleSeq* getUserOffsets(); + + /** + * Load a single virtual axis user offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired user offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis_name is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + //void setUserOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes user offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void clearUserOffsets(); + + /** + * Asks the component the virtual axes system offsets. + * @return a pointer to the double sequence object containing the current virtual axes system offsets of the servo system. + */ + //ACS::doubleSeq* getSystemOffsets(); + + /** + * Load a single virtual axis system offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired system offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + //void setSystemOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes system offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void clearSystemOffsets(); + + /** + * Reload the user and the system offsets to the minor servo when the Leonardo offsets do not correspond to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void reloadOffsets(); + + /** + * Returns the maximum travel time to get from a starting position to a destination position. + * @param start a double sequence containing the starting position. If the provided sequence is empty, the current axes positions are used for the calculation. + * @param dest a double sequence containing the destination position. + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + //ACS::TimeInterval getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest); + + /** + * Returns the minimum and maximum range of the virtual axes of the servo system, as reference arguments. + * @param min_ranges_out a double sequence object containing the minimum ranges of the virtual axes of the servo system. + * @param max_ranges_out a double sequence object containing the maximum ranges of the virtual axes of the servo system. + */ + //void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out); + + /** + * Returns a reference to the enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean property enabled. + */ + virtual Management::ROTBoolean_ptr enabled(); + + /** + * Returns a reference to the drive_cabinet_status property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. + */ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + + /** + * Returns a reference to the block property implementation of the IDL interface. + * @return pointer to the read-only boolean property block. + */ + virtual Management::ROTBoolean_ptr block(); + + /** + * Returns a reference to the operative_mode property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. + */ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode(); + + /** + * Returns a reference to the physical_axes_enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_axes_enabled. + */ + virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); + + /** + * Returns a reference to the physical_positions property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_positions. + */ + virtual ACS::ROdoubleSeq_ptr physical_positions(); + + /** + * Returns a reference to the virtual_axes property implementation of the IDL interface. + * @return pointer to the read-only long property virtual_axes. + */ + virtual ACS::ROlong_ptr virtual_axes(); + + /** + * Returns a reference to the plain_virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property plain_virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions(); + + /** + * Returns a reference to the virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr virtual_positions(); + + /** + * Returns a reference to the virtual_offsets property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_offsets. + */ + virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to the read-only boolean property tracking. + */ + virtual Management::ROTBoolean_ptr tracking(); + + /** + * Returns a reference to the trajectory_id property implementation of the IDL interface. + * @return pointer to the read-only long property trajectory_id. + */ + virtual ACS::ROlong_ptr trajectory_id(); + + /** + * Returns a reference to the total_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property total_trajectory_points. + */ + virtual ACS::ROlong_ptr total_trajectory_points(); + + /** + * Returns a reference to the remaining_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property remaining_trajectory_points. + */ + virtual ACS::ROlong_ptr remaining_trajectory_points(); + + virtual ACS::RWdouble_ptr cmdPosition(); + + virtual ACS::ROdouble_ptr actPosition(); + + /** + * Returns a reference to the positionDiff property implementation of the IDL interface. + * @return pointer to the read-only double sequence property positionDiff. + */ + virtual ACS::ROdouble_ptr positionDiff(); + + virtual ACS::ROpattern_ptr status(); + +private: + /** + * Updates the status of the component by asking the hardware its status. + */ + bool updateStatus(); + + /** + * Checks if the socket is connected and if the minor servo system is in a good state. + * @throw MinorServoErrors::MinorServoErrorsEx when the socket is not connected or when the minor servo system is blocked or the drive cabinet is in error state. + */ + void checkLineStatus(); + + /** + * Static function used to retrieve some constants from the component CDB xml schema. + * @param object the instance of this class, used inside the function logic. + * @param constant the name of the constants we want to retrieve from the CDB. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB or when it has a non meaningful value. + * @return a vector of doubles containing the retrieved constants, its length is the same as the number of virtual axes of the servo system. + */ + //static std::vector<double> getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant); + + /** + * Static function used to retrieve a table from the CDB DataBlock directory. Used inside the initialization list. + * @param object the instance of this class, used inside the function logic. + * @param properties_name the name of the block to retrieve as written inside the DataBlock file. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB. + * @return a vector of strings containing the retrieved table fields. + */ + static std::vector<std::string> getPropertiesTable(SRTDerotatorImpl& object, const std::string& properties_name); + + /** + * Attributes. + * Keep the same order for the initialization list. + */ + + /** + * Name of the component. + */ + const std::string m_component_name; + + /** + * Name of the servo system. + */ + const std::string m_servo_name; + + /** + * Number of virtual axes of the servo system. + */ + const size_t m_virtual_axes; + + /** + * Number of physical axes of the servo system. + */ + const size_t m_physical_axes; + + /** + * Name of the virtual axes of the servo system. + */ + const std::vector<std::string> m_virtual_axes_names; + + /** + * Units of the virtual axes of the servo system. + */ + const std::vector<std::string> m_virtual_axes_units; + + /** + * Dictionary containing the last status retrieved form the servo system. + */ + SRTDerotatorStatus m_status; + + /** + * Commanded user offsets for each axis of the servo system. + */ + std::vector<double> m_user_offsets; + + /** + * Commanded system offsets for each axis of the servo system. + */ + std::vector<double> m_system_offsets; + + /** + * Queue of positions assumed by the servo system in time. + */ + SRTMinorServoPositionsQueue m_positions_queue; + + /** + * The offset to apply to bring the derotator to the receiver rest position. + */ + const double m_zero_offset; + + /** + * Minimum ranges of the axes of the servo system. + */ + const double m_min; + + /** + * Maximum ranges of the axes of the servo system. + */ + const double m_max; + + /** + * Queue of positions to be assumed by the servo system when tracking a trajectory. + */ + SRTMinorServoPositionsQueue m_tracking_queue; + + /** + * Degrees between 2 adjacent lateral feeds. + */ + const double m_step; + + /** + * Tracking delta values for all minor servo system virtual axes. + */ + const double m_tracking_delta; + + /** + * Tracking error values for all minor servo system virtual axes. + */ + std::vector<double> m_tracking_error; + + /** + * Indicates if the servo system is tracking or not. It is tracking when the position error is lower than the tracking delta for all the virtual axes. + */ + std::atomic<Management::TBoolean> m_tracking; + + /** + * Current trajectory ID. + */ + std::atomic<unsigned int> m_trajectory_id; + + /** + * Total trajectory points of the current trajectory. + */ + std::atomic<unsigned int> m_total_trajectory_points; + + /** + * Remaining trajectory points of the current trajectory. + */ + std::atomic<unsigned int> m_remaining_trajectory_points; + + std::atomic<double> m_commanded_position; + + std::atomic<double> m_position_difference; + + std::atomic<long> m_status_pattern; + + /** + * Current speed of rotation + */ + double m_c_s; + + /** + * Pointer to the enabled property. + */ + baci::SmartPropertyPointer<ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>> m_enabled_ptr; + + /** + * Pointer to the drive_cabinet_status property. + */ + baci::SmartPropertyPointer<ROEnumImpl<ACS_ENUM_T(SRTMinorServoCabinetStatus), POA_MinorServo::ROSRTMinorServoCabinetStatus>> m_drive_cabinet_status_ptr; + + /** + * Pointer to the block property. + */ + baci::SmartPropertyPointer<ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>> m_block_ptr; + + /** + * Pointer to the operative_mode property. + */ + baci::SmartPropertyPointer<ROEnumImpl<ACS_ENUM_T(SRTMinorServoOperativeMode), POA_MinorServo::ROSRTMinorServoOperativeMode>> m_operative_mode_ptr; + + /** + * Pointer to the physical_axes_enabled property. + */ + baci::SmartPropertyPointer<baci::RObooleanSeq> m_physical_axes_enabled_ptr; + + /** + * Pointer to the physical_positions property. + */ + baci::SmartPropertyPointer<baci::ROdoubleSeq> m_physical_positions_ptr; + + /** + * Pointer to the virtual_axes property. + */ + baci::SmartPropertyPointer<baci::ROlong> m_virtual_axes_ptr; + + /** + * Pointer to the plain_virtual_positions property. + */ + baci::SmartPropertyPointer<baci::ROdoubleSeq> m_plain_virtual_positions_ptr; + + /** + * Pointer to the virtual_positions property. + */ + baci::SmartPropertyPointer<baci::ROdoubleSeq> m_virtual_positions_ptr; + + /** + * Pointer to the virtual_offsets property. + */ + baci::SmartPropertyPointer<baci::ROdoubleSeq> m_virtual_offsets_ptr; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer<ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>> m_tracking_ptr; + + /** + * Pointer to the trajectory_id property. + */ + baci::SmartPropertyPointer<baci::ROlong> m_trajectory_id_ptr; + + /** + * Pointer to the total_trajectory_points property. + */ + baci::SmartPropertyPointer<baci::ROlong> m_total_trajectory_points_ptr; + + /** + * Pointer to the remaining_trajectory_points property. + */ + baci::SmartPropertyPointer<baci::ROlong> m_remaining_trajectory_points_ptr; + + baci::SmartPropertyPointer<baci::ROdouble> m_actual_position_ptr; + baci::SmartPropertyPointer<baci::RWdouble> m_commanded_position_ptr; + baci::SmartPropertyPointer<baci::ROdouble> m_position_difference_ptr; + baci::SmartPropertyPointer<baci::ROpattern> m_status_ptr; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; + + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; + + /** + * Pointer to the status thread. + */ + SRTDerotatorStatusThread* m_status_thread; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h new file mode 100644 index 000000000..b0c3ece33 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h @@ -0,0 +1,63 @@ +#ifndef _SRTDEROTATORSTATUSTHREAD_H_ +#define _SRTDEROTATORSTATUSTHREAD_H_ + +/** + * SRTDerotatorStatusThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include <acsThread.h> +#include <ComponentErrors.h> +#include "SRTMinorServoSocket.h" +#include "SRTDerotatorImpl.h" + +class SRTDerotatorImpl; + + +/** + * This class implements a status thread. This thread is in charge of updating the status of the relative derotator component. + */ +class SRTDerotatorStatusThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTDerotatorStatusThread(const ACE_CString& name, SRTDerotatorImpl& component, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTDerotatorStatusThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +private: + SRTDerotatorImpl& m_component; + + /** + * The sleeping time of the thread. + * The thread should be cycling at a constant rate, therefore the inner sleeping time is always updated taking into account this and the thread execution time. + */ + ACS::TimeInterval m_sleep_time; +}; + +#endif /*_SRTDEROTATORSTATUSTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index 141c676de..3cf5a0bcd 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -18,12 +18,12 @@ CDB_SCHEMAS = SRTMinorServoCommon SRTMinorServoBoss SRTMinorServo SRTMinorServoS # ---------------------------- # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl +LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl SRTDerotatorImpl USER_CFLAGS = SRTMinorServoBossImpl_OBJECTS = SRTMinorServoBossCore SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoScanThread SRTMinorServoBossImpl SRTMinorServoStatusThread -SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs SRTDerotatorStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc SRTMinorServoBossImpl_CFLAGS = -std=c++17 -fconcepts SRTMinorServoBossCore_CFLAGS = -std=c++17 -fconcepts SRTMinorServoStatusThread_CFLAGS = -std=c++17 -fconcepts @@ -39,6 +39,10 @@ SRTGenericMinorServoImpl_CFLAGS = -std=c++17 -fconcepts SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTDerotatorImpl_OBJECTS = SRTDerotatorImpl SRTDerotatorStatusThread +SRTDerotatorImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary GenericDerotatorStubs SRTDerotatorStubs DerotatorErrors DiscosVersion +SRTDerotatorImpl_CFLAGS = -std=c++17 -fconcepts +SRTDerotatorStatusThread_CFLAGS = -std=c++17 -fconcepts # ---------------------------------------------------------------------- diff --git a/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp new file mode 100644 index 000000000..b00a29420 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp @@ -0,0 +1,490 @@ +#include "SRTDerotatorImpl.h" + +using namespace MinorServo; + +SRTDerotatorImpl::SRTDerotatorImpl(const ACE_CString& component_name, maci::ContainerServices* container_services): + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_servo_name(std::string(strchr(component_name.c_str(), '/') + 1)), + m_virtual_axes(getCDBValue<size_t>(container_services, "virtual_axes")), + m_physical_axes(getCDBValue<size_t>(container_services, "physical_axes")), + m_virtual_axes_names(SRTDerotatorImpl::getPropertiesTable(*this, "virtual_positions")), + m_virtual_axes_units(SRTDerotatorImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_status( + m_servo_name, + SRTDerotatorImpl::getPropertiesTable(*this, "physical_axes_enabled"), + SRTDerotatorImpl::getPropertiesTable(*this, "physical_positions"), + m_virtual_axes_names, + SRTDerotatorImpl::getPropertiesTable(*this, "virtual_offsets") + ), + m_positions_queue(5 * 60 * int(1 / getCDBValue<double>(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), + m_zero_offset(getCDBValue<double>(container_services, "zero_offset")), + m_min(-(getCDBValue<double>(container_services, "max_range") - m_zero_offset)), + m_max(-(getCDBValue<double>(container_services, "min_range") - m_zero_offset)), + m_tracking_queue(1500, m_virtual_axes), + m_step(getCDBValue<double>(container_services, "step")), + m_tracking_delta(getCDBValue<double>(container_services, "tracking_delta")), + m_tracking_error(m_virtual_axes, 0.0), + m_tracking(Management::MNG_FALSE), + m_trajectory_id(0), + m_total_trajectory_points(0), + m_remaining_trajectory_points(0), + m_commanded_position(0), + m_position_difference(0), + m_status_pattern(0), + m_c_s(0), + m_enabled_ptr(this), + m_drive_cabinet_status_ptr(this), + m_block_ptr(this), + m_operative_mode_ptr(this), + m_physical_axes_enabled_ptr(this), + m_physical_positions_ptr(this), + m_virtual_axes_ptr(this), + m_plain_virtual_positions_ptr(this), + m_virtual_positions_ptr(this), + m_virtual_offsets_ptr(this), + m_tracking_ptr(this), + m_trajectory_id_ptr(this), + m_total_trajectory_points_ptr(this), + m_remaining_trajectory_points_ptr(this), + m_actual_position_ptr(this), + m_commanded_position_ptr(this), + m_position_difference_ptr(this), + m_status_ptr(this), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) +{ + AUTO_TRACE(m_servo_name + "::SRTDerotatorImpl()"); +} + +SRTDerotatorImpl::~SRTDerotatorImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTDerotatorImpl()"); + + if(m_status_thread != nullptr) + { + m_status_thread->terminate(); + getContainerServices()->getThreadManager()->destroy(m_status_thread); + } +} + +void SRTDerotatorImpl::initialize() +{ + AUTO_TRACE(m_servo_name + "::initialize()"); + + try + { + m_enabled_ptr = new ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>((m_component_name + ":enabled").c_str(), getComponent(), + new MSAnswerMapDevIO<Management::TBoolean, SRTMinorServoStatus>("enabled", m_status, &SRTMinorServoStatus::isEnabled), true); + m_drive_cabinet_status_ptr = new ROEnumImpl<ACS_ENUM_T(SRTMinorServoCabinetStatus), POA_MinorServo::ROSRTMinorServoCabinetStatus>((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), + new MSAnswerMapDevIO<SRTMinorServoCabinetStatus, SRTMinorServoStatus>("drive_cabinet_status", m_status, &SRTMinorServoStatus::getDriveCabinetStatus), true); + m_block_ptr = new ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>((m_component_name + ":block").c_str(), getComponent(), + new MSAnswerMapDevIO<Management::TBoolean, SRTMinorServoStatus>("block", m_status, &SRTMinorServoStatus::isBlocked), true); + m_operative_mode_ptr = new ROEnumImpl<ACS_ENUM_T(SRTMinorServoOperativeMode), POA_MinorServo::ROSRTMinorServoOperativeMode>((m_component_name + ":operative_mode").c_str(), getComponent(), + new MSAnswerMapDevIO<SRTMinorServoOperativeMode, SRTMinorServoStatus>("operative_mode", m_status, &SRTMinorServoStatus::getOperativeMode), true); + m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO<ACS::booleanSeq, SRTMinorServoStatus>("physical_axes_enabled", m_status, &SRTMinorServoStatus::getPhysicalAxesEnabled), true); + m_physical_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":physical_positions").c_str(), getComponent(), + new MSAnswerMapDevIO<ACS::doubleSeq, SRTMinorServoStatus>("physical_positions", m_status, &SRTMinorServoStatus::getPhysicalPositions), true); + m_virtual_axes_ptr = new baci::ROlong((m_component_name + ":virtual_axes").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Long, const size_t>(m_virtual_axes), true); + m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO<ACS::doubleSeq, SRTMinorServoStatus>("plain_virtual_positions", m_status, &SRTMinorServoStatus::getPlainVirtualPositions), true); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO<ACS::doubleSeq, SRTMinorServoStatus>("virtual_positions", m_status, &SRTMinorServoStatus::getVirtualPositions), true); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), + new MSAnswerMapDevIO<ACS::doubleSeq, SRTMinorServoStatus>("virtual_offsets", m_status, &SRTMinorServoStatus::getVirtualOffsets), true); + m_tracking_ptr = new ROEnumImpl<ACS_ENUM_T(Management::TBoolean), POA_Management::ROTBoolean>((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO<Management::TBoolean, std::atomic<Management::TBoolean>>(m_tracking), true); + m_trajectory_id_ptr = new baci::ROlong((m_component_name + ":trajectory_id").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Long, std::atomic<unsigned int>>(m_trajectory_id), true); + m_total_trajectory_points_ptr = new baci::ROlong((m_component_name + ":total_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Long, std::atomic<unsigned int>>(m_total_trajectory_points), true); + m_remaining_trajectory_points_ptr = new baci::ROlong((m_component_name + ":remaining_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Long, std::atomic<unsigned int>>(m_remaining_trajectory_points), true); + m_actual_position_ptr = new baci::ROdouble((m_component_name + ":actPosition").c_str(), getComponent(), + new MSAnswerMapDevIO<CORBA::Double, SRTDerotatorStatus>("actPosition", m_status, &SRTDerotatorStatus::getActualPosition), true); + m_commanded_position_ptr = new baci::RWdouble((m_component_name + ":cmdPosition").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Double, std::atomic<double>>(m_commanded_position), true); + m_position_difference_ptr = new baci::ROdouble((m_component_name + ":positionDiff").c_str(), getComponent(), + new MSGenericDevIO<CORBA::Double, std::atomic<double>>(m_position_difference), true); + m_status_ptr = new baci::ROpattern((m_component_name + ":status").c_str(), getComponent(), + new MSGenericDevIO<ACS::pattern, std::atomic<long>>(m_status_pattern), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + // Try to read the current status of the derotator + try + { + updateStatus(); + } + catch(...) + { + // This block is necessary since the socket might not be connected yet. If the Leonardo system is not reachable the status(); call will fail, but we want to instantiate the component anyway + // A non connected socket will try to connect every time a new command is sent, therefore the status thread will establish the connection as soon as possible. + } +} + +void SRTDerotatorImpl::execute() +{ + AUTO_TRACE(m_servo_name + "::execute()"); + + try + { + m_status_thread = getContainerServices()->getThreadManager()->create<SRTDerotatorStatusThread, SRTDerotatorImpl&>((m_component_name + "StatusThread").c_str(), *this); + m_status_thread->setSleepTime(getCDBValue<double>(getContainerServices(), "status_thread_period") * 10000000); + m_status_thread->resume(); + } + catch(acsthreadErrType::CanNotSpawnThreadExImpl& impl) + { + // The thread failed to start for some reason + _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, (m_component_name + "::startThread()").c_str()); + ex.setThreadName((m_component_name + "StatusThread").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +void SRTDerotatorImpl::cleanUp() +{ + AUTO_TRACE(m_servo_name + "::cleanUp()"); +} + +void SRTDerotatorImpl::aboutToAbort() +{ + AUTO_TRACE(m_servo_name + "::aboutToAbort()"); +} + +/////////////////// PUBLIC methods +bool SRTDerotatorImpl::updateStatus() +{ + AUTO_TRACE(m_servo_name + "::status()"); + + // Initialize the status variable + long status = 0; + + // We don't check if the socket is connected here since a status command will try to reconnect it automatically + try + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); + + ACS::Time last_timestamp = m_status.getTimestamp(); + + // Send the zero offset if not correct + if(m_status.getVirtualOffsets()[0] != m_zero_offset) + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, { m_zero_offset })); + } + + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + { + // Set to failure + status |= (1L << 1); + // Not ready as well + status |= (1L << 3); + } + + if(!isReady()) + { + // No failures but not ready + status |= (1L << 3); + } + + if(isSlewing()) + { + status |= (1L << 4); + } + + double current_point = m_status.getActualPosition(); + + // Calculate the current speed of the axes, °/s + try + { + std::pair<ACS::Time, const std::vector<double>> previous_point = m_positions_queue.get(last_timestamp); + m_c_s = (current_point - previous_point.second[0]) * ((double(last_timestamp - previous_point.first)) / 10000000); + } + catch(...) + { + // Empty queue, first reading, skip the speed calculation + } + + if(m_status.getOperativeMode() == OPERATIVE_MODE_PROGRAMTRACK) + { + try + { + m_commanded_position = m_tracking_queue.get(last_timestamp).second[0]; + m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); + } + catch(...) + { + // Weird, we should have at least one tracking point by now, just skip + } + } + + m_positions_queue.put(last_timestamp, { current_point }); + m_position_difference.store(m_commanded_position - current_point); + if(std::fabs(m_position_difference.load()) <= m_tracking_delta) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } + } + catch(...) + { + // Communication error, sets failure, communication error and not ready bits + status |= (1L << 1); + status |= (1L << 2); + status |= (1L << 3); + + m_status_pattern.store(status); + return false; + } + + m_status_pattern.store(status); + return true; +} + +void SRTDerotatorImpl::setup() +{ + AUTO_TRACE(m_servo_name + "::setup()"); +} + +void SRTDerotatorImpl::setPosition(CORBA::Double position) +{ + AUTO_TRACE(m_servo_name + "::setPosition()"); + + checkLineStatus(); + + if(position < m_min || position > m_max) + { + _EXCPT(DerotatorErrors::OutOfRangeErrorExImpl, ex, (m_servo_name + "::setPosition()").c_str()); + ex.addData("Reason", std::string("Resulting position " + std::to_string(position) + " out of range.").c_str()); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + // Sign inversion required + double pos = position * -1; + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, std::vector<double>{ pos })).checkOutput()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setPosition()").c_str()); + ex.addData("Reason", "Received NAK in response to a PRESET command."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + m_commanded_position.store(position); +} + +double SRTDerotatorImpl::getPositionFromHistory(ACS::Time acs_time) +{ + AUTO_TRACE(m_servo_name + "::getPositionFromHistory()"); + + // Get the latest position + if(acs_time == 0) + { + acs_time = getTimeStamp(); + } + + try + { + return m_positions_queue.get(acs_time).second[0]; + } + catch(std::logic_error& le) + { + // TODO: change this to ComponentErrors + _EXCPT(ComponentErrors::OperationErrorExImpl, ex, (m_servo_name + "::getPositionFromHistory()").c_str()); + ex.setReason("Positions history is empty!"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +bool SRTDerotatorImpl::isReady() +{ + // Always ready unless it has errors + return (m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) ? false : true; +} + +bool SRTDerotatorImpl::isSlewing() +{ + SRTMinorServoOperativeMode operative_mode = m_status.getOperativeMode(); + if(operative_mode == OPERATIVE_MODE_PROGRAMTRACK) + { + if(m_remaining_trajectory_points.load() > 0) + { + // We are still tracking a trajectory, therefore we are slewing + return true; + } + else + { + // Trajectory is finished, the derotator might still be slowing down to 0°/s but for simplicity we say it's not slewing anymore + return false; + } + } + else if(operative_mode == OPERATIVE_MODE_UNKNOWN) + { + // We trust the protocol, this means the derotator is moving due to a preset command + return true; + } + + return false; +} + +void SRTDerotatorImpl::loadTrackingPoint(ACS::Time point_time, CORBA::Double position, CORBA::Boolean restart) +{ + AUTO_TRACE(m_servo_name + "::loadTrackingPoint()"); + + checkLineStatus(); + + if(position < m_min || position > m_max) + { + _EXCPT(DerotatorErrors::OutOfRangeErrorExImpl, ex, (m_servo_name + "::loadTrackingPoint()").c_str()); + ex.addData("Reason", std::string("Resulting position " + std::to_string(position) + " out of range.").c_str()); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + unsigned int trajectory_id, point_id; + + if(restart) + { + trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(point_time)); + point_id = 0; + } + else + { + trajectory_id = m_trajectory_id.load(); + point_id = m_total_trajectory_points.load(); + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, std::vector<double>{ -position }, restart ? IRA::CIRATools::ACSTime2UNIXEpoch(point_time) : 0)).checkOutput()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::loadTrackingPoint()").c_str()); + ex.addData("Reason", "Received NAK in response to a PROGRAMTRACK command."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + if(restart) + { + // Clear the tracking queue to avoid interpolation between 2 different trajectories + m_tracking_queue.clear(); + } + + m_trajectory_id.store(trajectory_id); + m_tracking_queue.put(point_time, { position }); + m_total_trajectory_points.store(point_id + 1); +} + + +/////////////////// PROTECTED methods +void SRTDerotatorImpl::checkLineStatus() +{ + if(!m_socket.isConnected()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "checkLineStatus()").c_str()); + ex.addData("Reason", "Socket not connected."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + { + _EXCPT(DerotatorErrors::UnexpectedErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); + ex.addData("Reason", "Servo system blocked or drive cabinet error."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } +} + +/////////////////// PRIVATE methods +std::vector<std::string> SRTDerotatorImpl::getPropertiesTable(SRTDerotatorImpl& object, const std::string& properties_name) +{ + AUTO_STATIC_TRACE(object.m_servo_name + "::getPropertiesTable()"); + + std::vector<std::string> properties; + + IRA::CDBTable table(object.getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + object.m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field property_name", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + properties.push_back(std::string(table["property_name"]->asString())); + } + table.closeTable(); + + size_t expected_size = 0; + + if(properties_name.find("virtual_") == 0) + { + expected_size = object.m_virtual_axes; + } + else if(properties_name.find("physical_") == 0) + { + expected_size = object.m_physical_axes; + } + + if(expected_size == 0 || properties.size() != expected_size) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::initialize()").c_str()); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return properties; +} + + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(ROSRTMinorServoCabinetStatus, SRTDerotatorImpl, m_drive_cabinet_status_ptr, drive_cabinet_status); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_block_ptr, block); +GET_PROPERTY_REFERENCE(ROSRTMinorServoOperativeMode, SRTDerotatorImpl, m_operative_mode_ptr, operative_mode); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, SRTDerotatorImpl, m_physical_axes_enabled_ptr, physical_axes_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_virtual_axes_ptr, virtual_axes); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_plain_virtual_positions_ptr, plain_virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_virtual_positions_ptr, virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_virtual_offsets_ptr, virtual_offsets); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_tracking_ptr, tracking); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_trajectory_id_ptr, trajectory_id); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_total_trajectory_points_ptr, total_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_remaining_trajectory_points_ptr, remaining_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTDerotatorImpl, m_actual_position_ptr, actPosition); +GET_PROPERTY_REFERENCE(ACS::RWdouble, SRTDerotatorImpl, m_commanded_position_ptr, cmdPosition); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTDerotatorImpl, m_position_difference_ptr, positionDiff); +GET_PROPERTY_REFERENCE(ACS::ROpattern, SRTDerotatorImpl, m_status_ptr, status); + +MACI_DLL_SUPPORT_FUNCTIONS(SRTDerotatorImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp new file mode 100644 index 000000000..e9ddd980c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp @@ -0,0 +1,46 @@ +#include "SRTDerotatorStatusThread.h" + +using namespace MinorServo; + +SRTDerotatorStatusThread::SRTDerotatorStatusThread(const ACE_CString& name, SRTDerotatorImpl& component, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_component(component), + m_sleep_time(this->getSleepTime()) +{ + AUTO_TRACE("SRTDerotatorStatusThread::SRTDerotatorStatusThread()"); +} + +SRTDerotatorStatusThread::~SRTDerotatorStatusThread() +{ + AUTO_TRACE("SRTDerotatorStatusThread::~SRTDerotatorStatusThread()"); +} + +void SRTDerotatorStatusThread::onStart() +{ + AUTO_TRACE("SRTDerotatorStatusThread::onStart()"); + + ACS_LOG(LM_FULL_INFO, "SRTDerotatorStatusThread::onStart()", (LM_DEBUG, "STATUS THREAD STARTED")); +} + +void SRTDerotatorStatusThread::onStop() +{ + AUTO_TRACE("SRTDerotatorStatusThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTDerotatorStatusThread::onStop()", (LM_DEBUG, "STATUS THREAD STOPPED")); +} + +void SRTDerotatorStatusThread::runLoop() +{ + AUTO_TRACE("SRTDerotatorStatusThread::runLoop()"); + + ACS::Time t0 = getTimeStamp(); + unsigned long sleep_time = 10000000; + + if(m_component.updateStatus()) + { + // Update the sleep time in order to not drift away by adding latency + sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + } + + this->setSleepTime(sleep_time); +} -- GitLab